DB2: Las vistas, ventajas y casos prácticos

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.