Empezamos a meter mano en nuestro motor de base de datos para sacarle más partido y optimizar nuestro trabajo. Para ello la primera pata en la que nos vamos a apoyar para este trabajo es en las vistas (la definición en nuestra socorrida wikipedia aquí)
Para resumirlo en una sola frase, la vista nos permite ponerle un nombre a una consulta concreta de una o varias tablas facilitando que no tengamos que preparar todo el calculo de la select cada vez.
Esto lo vamos a aplicar para poder reutilizar las consultas para nuestros informes y excel conectados (además de búsquedas dentro de geinfor), de manera que solo con definir la consulta una vez la tendremos disponible en muchos sitios y con corregir la estructura de la vista se actualizará en todos los sitios….
NINGUNA DE LAS ACCIONES QUE VOY A EXPLICAR TIENE SOPORTE POR PARTE DE GEINFOR. MUCHO OJO Y BAJO VUESTRA RESPONSABILIDAD
Todo esto suena muy bien, pero por ver un caso práctico, podemos coger la consulta que utilizamos de facturación en nuestro primer excel conectectado que era la siguiente:
SELECT CAB.FECHA AS "00_Fecha_factura", year(CAB.FECHA) AS "00_Fecha_año_factura", month(CAB.FECHA) AS "00_Fecha_mes_factura", CASE month(CAB.FECHA) WHEN 1 THEN '01-ENERO' WHEN 2 THEN '02-FEBRERO' WHEN 3 THEN '03-MARZO' WHEN 4 THEN '04-ABRIL' WHEN 5 THEN '05-MAYO' WHEN 6 THEN '06-JUNIO' WHEN 7 THEN '07-JULIO' WHEN 8 THEN '08-AGOSTO' WHEN 9 THEN '09-SEPTIEMBRE' WHEN 10 THEN '10-OCTUBRE' WHEN 11 THEN '11-NOVIEMBRE' WHEN 12 THEN '12-DICIEMBRE' ELSE 'ERROR' END AS "00_Fecha_mes_txt_factura", CLI.CODIGO_CLIENTE AS "01_cliente_codigo", CLI.RAZON_SOCIAL AS "01_cliente_RazonSocial", CLI.ESTADO AS "01_cliente_estado", CLI.FAMILIA AS "01_cliente_familia", CLI.SUBFAMILIA AS "01_cliente_subfamilia", DIR.CODPAIS AS "01_cliente_pais", DIR.REPRESENTANTE AS "01_cliente_representante", DIR.ZONADIRENVIO AS "01_cliente_zona", DIR.PROVINCIA AS "01_cliente_provincia", CLI.TIPO_CUENTA_VENTAS AS "01_cliente_tipoventa", ART.CODIGO_CONTABLE AS "02_articulo_codigocontable", ART.CODIGO_CONTABLE AS "02_articulo_clase", (LIN.SERIE||'-'||CHAR(LIN.NUMERO_FACTURA)||'-'||CHAR(LIN.NUMERO_LINEA)) AS "03_Factura", ART.TIPO AS "02_articulo_tipo", LIN.CANTIDAD AS "MED_Cantidad", lin.PRECIO AS "MED_Importe_Linea", LIN.CANTIDAD*LIN.PRECIO AS "Med_Importe_TotalLinea" FROM CABECERA_FACTURA CAB, LINEAS_DE_FACTURAS LIN, MAESTRO_DE_CLIENTES CLI, DIRECCIONES_DE_ENVIO DIR, MAESTRO_DE_ARTICULOS ART, SERIESCOMERCIALES SER WHERE year(CAB.FECHA) >= year(current_date) - 2 AND CAB.SERIE = LIN.SERIE AND CAB.FACTURA = LIN.NUMERO_FACTURA AND CAB.CLIENTE = CLI.CODIGO_CLIENTE AND CAB.CLIENTE = DIR.CODIGO AND CAB.DIRECCION_ENVIO = DIR.DIRECCION_ENVIO AND CAB.SERIE = SER.SERIE AND LIN.CODIGO_ARTICULO = ART.CODIGO_ARTICULO AND LIN.ESCOMENTARIO = 0 AND LIN.CODIGO_ARTICULO <> '';
Claro que podemos copiar esta consulta en todos los excel, informes y demás sitios donde queramos consultar la información pero ante cualquier cambio en la consulta sera muy engorroso (incluso la utilizaréis en sitios que ni recordáis) para lo que crearemos una vista de la siguiente manera:
CREATE OR REPLACE "NOMBRE_DE_LA_VISTA" AS "CONSULTA A UTILIZAR"
Como pautas de trabajo para tener orden en las vistas al verlas con el SQLDBX o el editor que utilicemos para atacar la base de datos os daría las siguientes pauta que me inculcaron con los años:
- Comienza todas las vistas por VW_
- La siguiente parte del nombre utilizarla para que todas las consultas relacionadas estén juntas
- La última parte del nombre debe ser descriptiva y intenta no utilizar abreviaturas que solo tú entiendas
- Añade un comentario en la creación de la vista. ¡Comenta tu código! no es un telegrama y no se cobra por palabras
Serían nuestras normas de los Gremlins para las vistas y aplicado a nuestro caso podría ser algo tal que así
create or replace view VW_FINANZAS_FACTURACIONVENTAS AS /* Vista de ventas a clientes de los últimos 2 años utilizamos grupos en los nombres de campos para ordenar las dimensiones siendo la siguiente estructura: 00_ para las fechas 01_ para la información de clientes 02_ Para la información del producto Med_ para la información cuantitativa */ SELECT CAB.FECHA AS "00_Fecha_factura", year(CAB.FECHA) AS "00_Fecha_año_factura", month(CAB.FECHA) AS "00_Fecha_mes_factura", CASE month(CAB.FECHA) WHEN 1 THEN '01-ENERO' WHEN 2 THEN '02-FEBRERO' WHEN 3 THEN '03-MARZO' WHEN 4 THEN '04-ABRIL' WHEN 5 THEN '05-MAYO' WHEN 6 THEN '06-JUNIO' WHEN 7 THEN '07-JULIO' WHEN 8 THEN '08-AGOSTO' WHEN 9 THEN '09-SEPTIEMBRE' WHEN 10 THEN '10-OCTUBRE' WHEN 11 THEN '11-NOVIEMBRE' WHEN 12 THEN '12-DICIEMBRE' ELSE 'ERROR' END AS "00_Fecha_mes_txt_factura", CLI.CODIGO_CLIENTE AS "01_cliente_codigo", CLI.RAZON_SOCIAL AS "01_cliente_RazonSocial", CLI.ESTADO AS "01_cliente_estado", CLI.FAMILIA AS "01_cliente_familia", CLI.SUBFAMILIA AS "01_cliente_subfamilia", DIR.CODPAIS AS "01_cliente_pais", DIR.REPRESENTANTE AS "01_cliente_representante", DIR.ZONADIRENVIO AS "01_cliente_zona", DIR.PROVINCIA AS "01_cliente_provincia", CLI.TIPO_CUENTA_VENTAS AS "01_cliente_tipoventa", ART.CODIGO_CONTABLE AS "02_articulo_codigocontable", ART.CODIGO_CONTABLE AS "02_articulo_clase", (LIN.SERIE||'-'||CHAR(LIN.NUMERO_FACTURA)||'-'||CHAR(LIN.NUMERO_LINEA)) AS "03_Factura", ART.TIPO AS "02_articulo_tipo", LIN.CANTIDAD AS "MED_Cantidad", lin.PRECIO AS "MED_Importe_Linea", LIN.CANTIDAD*LIN.PRECIO AS "Med_Importe_TotalLinea" FROM CABECERA_FACTURA CAB, LINEAS_DE_FACTURAS LIN, MAESTRO_DE_CLIENTES CLI, DIRECCIONES_DE_ENVIO DIR, MAESTRO_DE_ARTICULOS ART, SERIESCOMERCIALES SER WHERE year(CAB.FECHA) >= year(current_date) - 2 AND CAB.SERIE = LIN.SERIE AND CAB.FACTURA = LIN.NUMERO_FACTURA AND CAB.CLIENTE = CLI.CODIGO_CLIENTE AND CAB.CLIENTE = DIR.CODIGO AND CAB.DIRECCION_ENVIO = DIR.DIRECCION_ENVIO AND CAB.SERIE = SER.SERIE AND LIN.CODIGO_ARTICULO = ART.CODIGO_ARTICULO AND LIN.ESCOMENTARIO = 0 AND LIN.CODIGO_ARTICULO <> '';
Como vemos tenemos la explicación de la vista y la estructura de la misma en un vistazo rápido. Ahora para utilizarla solo basta con modificar nuestro excel con la siguiente consulta
SELECT * FROM VW_FINANZAS_FACTURACIONVENTAS
De esta forma es mucho más rápido reutilizar la información de facturación donde queramos y con añadir un campo a la vista (como veremos en próximas entradas) los tendríamos disponibles.
En la próxima entrada empezaremos con las Funciones, un complemento ideal para las vistas y que nos facilitará más si cabe este tipo de trabajos.
Espero que os sirva de ayuda y lo podáis aplicar, si necesitáis alguna aclaración o tenéis alguna aportación, espero vuestros comentarios…
… y si algo sale mal… La Culpa de Sistemas 😉
Un comentario en “DB2: Las vistas, ventajas y casos prácticos”