DROP VIEW V_INVENTARIO; DROP VIEW V_INVENTARIO_AUX; DROP VIEW V_INV_RESERVAS; DROP VIEW V_INV_ENTRADAS_PENDIENTES; DROP VIEW V_INV_STOCK; DROP VIEW V_INV_STOCK_AUX; DROP VIEW V_INV_SALIDAS; DROP VIEW V_INV_SALIDAS_AUX; DROP VIEW V_INV_SALIDAS_MOV; DROP VIEW V_INV_SALIDAS_ALB; DROP VIEW V_INV_ENTRADAS; DROP VIEW V_INV_ENTRADAS_AUX; DROP VIEW V_INV_ENTRADAS_MOV; DROP VIEW V_INV_ENTRADAS_ALB; DROP TABLE MOVIMIENTOS; /* Tabla en la que guardaremos las salidas, entradas de articulos en los distintos almacenes (regularizaciones)*/ /* El campo tipo tendra una E (para entradas) y una S (para salidas)*/ CREATE TABLE MOVIMIENTOS ( ID TIPO_ID NOT NULL, ID_ALMACEN TIPO_ID, ID_ARTICULO TIPO_ID, FECHA_MOVIMIENTO DATE, TIPO VARCHAR(1), CANTIDAD INTEGER, CAUSA TIPO_CONCEPTO ); ALTER TABLE MOVIMIENTOS ADD CONSTRAINT PK_MOVIMIENTOS PRIMARY KEY (ID); ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS FOREIGN KEY (ID_ARTICULO) REFERENCES ARTICULOS (ID); ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS2 FOREIGN KEY (ID_ALMACEN) REFERENCES ALMACENES (ID); CREATE INDEX MOVIMIENTOS_IDX1 ON MOVIMIENTOS (TIPO); /*Todas las entradas de articulos a partir de los albaranes de proveedor*/ /*No tendremos en cuenta los albaranes que no tengan un almacén destino, es decir que no se contabilizarán*/ /*aquellos albaranes que se manden directamente al cliente*/ CREATE VIEW V_INV_ENTRADAS_ALB( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) FROM V_ALB_PROV_DETALLES WHERE (ID_ALMACEN IS NOT NULL) GROUP BY ID_ALMACEN, ID_ARTICULO; /*Todas las entradas de articulos a partir de los movimientos libres realizados por el usuario*/ CREATE VIEW V_INV_ENTRADAS_MOV( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) FROM MOVIMIENTOS WHERE TIPO = 'E' GROUP BY ID_ALMACEN, ID_ARTICULO; /*Al igual que en las vistas de articulos de pedido de proveedor y cliente, es mucho más rápido y mejor para este*/ /*caso una unión y luego una agrupación que un FULL OUTER JOIN*/ CREATE VIEW V_INV_ENTRADAS_AUX( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD FROM V_INV_ENTRADAS_ALB UNION SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD FROM V_INV_ENTRADAS_MOV; /*Todas las entradas en almacen, bien por albarán o por movimiento libre, a partir de la vista auxiliar anterior*/ CREATE VIEW V_INV_ENTRADAS( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) as CANTIDAD FROM V_INV_ENTRADAS_AUX GROUP BY ID_ALMACEN, ID_ARTICULO; /*Todas las salidas de articulos a partir de los albaranes de cliente*/ /*No tendremos en cuenta los albaranes que no tengan un almacén origen, es decir que no se contabilizarán*/ /*aquellos albaranes que se manden directamente al cliente sin pasar por almacén*/ /*Serán salidas en el momento que el albarán este enviado o servido, si esta pendiente estará reservado*/ CREATE VIEW V_INV_SALIDAS_ALB( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) FROM V_ALB_CLI_DETALLES WHERE (ID_ALMACEN IS NOT NULL) AND (SITUACION in ('ENVIADO', 'SERVIDO')) GROUP BY ID_ALMACEN, ID_ARTICULO; /*Todas las salidas de articulos a partir de los movimientos libres realizados por el usuario*/ CREATE VIEW V_INV_SALIDAS_MOV( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) FROM MOVIMIENTOS WHERE TIPO = 'S' GROUP BY ID_ALMACEN, ID_ARTICULO; /*Al igual que en las vistas de articulos de pedido de proveedor y cliente, es mucho más rápido y mejor para este*/ /*caso una unión y luego una agrupación que un FULL OUTER JOIN*/ CREATE VIEW V_INV_SALIDAS_AUX( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD FROM V_INV_SALIDAS_ALB UNION SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD FROM V_INV_SALIDAS_MOV; /*Todas las salidas de almacen, bien por albarán o por movimiento libre, a partir de la vista auxiliar anterior*/ CREATE VIEW V_INV_SALIDAS( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) as CANTIDAD FROM V_INV_SALIDAS_AUX GROUP BY ID_ALMACEN, ID_ARTICULO; /*Al igual que en las vistas de articulos de pedido de proveedor y cliente, es mucho más rápido y mejor para este*/ /*caso una unión y luego una agrupación que un FULL OUTER JOIN*/ CREATE VIEW V_INV_STOCK_AUX( ID_ALMACEN, ID_ARTICULO, CANTIDAD_ENTRADA, CANTIDAD_SALIDA) AS SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD as CANTIDAD_ENTRADA, 0 as CANTIDAD_SALIDA FROM V_INV_ENTRADAS UNION SELECT ID_ALMACEN, ID_ARTICULO, 0 as CANTIDAD_ENTRADA, CANTIDAD as CANTIDAD_SALIDA FROM V_INV_SALIDAS; /* Stock actual por articulo y almacén, calculado a partir de la vista auxiliar anterior*/ CREATE VIEW V_INV_STOCK( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, (SUM(CANTIDAD_ENTRADA) - SUM(CANTIDAD_SALIDA)) as CANTIDAD FROM V_INV_STOCK_AUX GROUP BY ID_ALMACEN, ID_ARTICULO; /*Todos los articulos pedidos a proveedor y que todavía no he recibido, y que tienen un almacén destino*/ CREATE VIEW V_INV_ENTRADAS_PENDIENTES( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD_PENDIENTE) FROM V_PED_PROV_ARTICULOS WHERE (ID_ALMACEN IS NOT NULL) GROUP BY ID_ALMACEN, ID_ARTICULO; /*Todos los articulos reservados en almacén para algún albarán (Pendiente))*/ CREATE VIEW V_INV_RESERVAS( ID_ALMACEN, ID_ARTICULO, CANTIDAD) AS SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD) FROM V_ALB_CLI_DETALLES WHERE (ID_ALMACEN IS NOT NULL) AND (SITUACION = 'PENDIENTE') GROUP BY ID_ALMACEN, ID_ARTICULO; /*Tomamos la misma filosofia que en los casos anteriores ya que los tiempos se reducen, que es una barbaridad*/ CREATE VIEW V_INVENTARIO_AUX( ID_ALMACEN, ID_ARTICULO, STOCK, RESERVA, PENDIENTE_RECEPCION) AS SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD as STOCK, 0 as PENDIENTES, 0 as RESERVADAS FROM V_INV_STOCK UNION SELECT ID_ALMACEN, ID_ARTICULO, 0 as STOCK, CANTIDAD as PENDIENTES, 0 AS RESERVADAS FROM V_INV_ENTRADAS_PENDIENTES UNION SELECT ID_ALMACEN, ID_ARTICULO, 0 as STOCK, 0 as PENDIENTES, CANTIDAD AS RESERVADAS FROM V_INV_RESERVAS; /*Vista de inventario final OPTIMIZADISIMAAAA*/ CREATE VIEW V_INVENTARIO( ID_ALMACEN, ID_EMPRESA, NOMBRE, ID_ARTICULO, REFERENCIA, FAMILIA, DESCRIPCION, REFERENCIA_PROV, STOCK, RESERVA, PENDIENTE_RECEPCION) AS SELECT ID_ALMACEN, ALMACENES.ID_EMPRESA, ALMACENES.NOMBRE, ID_ARTICULO, ARTICULOS.REFERENCIA, ARTICULOS.FAMILIA, ARTICULOS.DESCRIPCION, ARTICULOS.REFERENCIA_PROV, SUM(STOCK) as STOCK, SUM(RESERVA) as RESERVA, SUM(PENDIENTE_RECEPCION) as PENDIENTE_RECEPCION FROM V_INVENTARIO_AUX LEFT JOIN ARTICULOS ON (ARTICULOS.ID = V_INVENTARIO_AUX.ID_ARTICULO) LEFT JOIN ALMACENES ON (ALMACENES.ID = V_INVENTARIO_AUX.ID_ALMACEN) GROUP BY ID_ALMACEN, ALMACENES.ID_EMPRESA, ALMACENES.NOMBRE, ID_ARTICULO, ARTICULOS.REFERENCIA, ARTICULOS.FAMILIA, ARTICULOS.DESCRIPCION, ARTICULOS.REFERENCIA_PROV;