This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES/SCRIPTS/SCRIPT STOCK(ROBERTO).sql

377 lines
14 KiB
MySQL
Raw Permalink Normal View History

DROP VIEW V_PED_CLI_SITUACION;
DROP VIEW V_PED_CLI_ARTICULOS;
DROP VIEW V_PED_CLI_ARTICULOS_AUX;
DROP VIEW V_PED_CLI_ART_SITUACION_CANT;
DROP VIEW V_PED_CLI_ART_SITUACION;
DROP VIEW V_PED_CLI_DETALLES;
DROP VIEW V_ALB_CLI_DETALLES;
DROP VIEW V_PED_PROV_SITUACION;
DROP VIEW V_PED_PROV_ARTICULOS;
DROP VIEW V_PED_PROV_ARTICULOS_AUX;
DROP VIEW V_PED_PROV_ARTICULOS_RECIBIDOS;
DROP VIEW V_PED_PROV_DETALLES;
DROP VIEW V_ALB_PROV_DETALLES;
DROP VIEW V_ALB_CLI_SITUACION;
/* Situaci<63>n de los albaranes de cliente */
CREATE VIEW V_ALB_CLI_SITUACION (
ID,
SITUACION)
AS
SELECT ALBARANES_CLIENTE.ID,
case when (FECHA_RECEPCION is not null) then 'SERVIDO'
when (FECHA_ENVIO is null) then 'PENDIENTE'
when (FECHA_ENVIO <= current_date) then 'ENVIADO'
when (FECHA_ENVIO > current_date) then 'PENDIENTE'
else 'N/A'
end as SITUACION
FROM ALBARANES_CLIENTE
;
/*Agrupa los art<72>culos de un mismo albar<61>n (ya que en un albar<61>n puede existir varias lineas con el mismo art<72>culo).
Para cada art<EFBFBD>culo de albar<EFBFBD>n le ponemos el pedido con el que esta asociado y el almac<EFBFBD>n donde se recibio.
Se quitan todos los art<EFBFBD>culos que no tengamos en cat<EFBFBD>logo (ID_ARTICULO nulo, lineas de detalle libres)
Se quitan tambi<EFBFBD>n aquellos que no se<EFBFBD>n inventariables */
CREATE VIEW V_ALB_PROV_DETALLES(
ID_ALBARAN,
ID_PEDIDO,
ID_ALMACEN,
ID_ARTICULO,
CANTIDAD)
AS
SELECT ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN,
ALBARANES_PROVEEDOR.ID_PEDIDO,
ALBARANES_PROVEEDOR.ID_ALMACEN,
ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO,
SUM (COALESCE(ALBARANES_PROVEEDOR_DETALLES.CANTIDAD, 0)) AS CANTIDAD
FROM ALBARANES_PROVEEDOR_DETALLES
LEFT JOIN ALBARANES_PROVEEDOR
ON (ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN = ALBARANES_PROVEEDOR.ID)
LEFT JOIN ARTICULOS
ON (ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO = ARTICULOS.ID)
WHERE (ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO is not null)
AND (ARTICULOS.INVENTARIABLE = 1)
GROUP BY ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN,
ALBARANES_PROVEEDOR.ID_PEDIDO,
ALBARANES_PROVEEDOR.ID_ALMACEN,
ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO;
/*Agrupa los art<72>culos de un mismo pedido (ya que en un pedido puede existir varias lineas con el mismo art<72>culo).
Para cada art<EFBFBD>culo de pedido le ponemos el pedido con el que esta asociado y el almac<EFBFBD>n donde ser<EFBFBD> recibido.
Se quitan todos los art<EFBFBD>culos que no tengamos en cat<EFBFBD>logo (ID_ARTICULO nulo, lineas de detalle libres)
Se quitan tambi<EFBFBD>n aquellos que no se<EFBFBD>n inventariables */
CREATE VIEW V_PED_PROV_DETALLES(
ID_PEDIDO,
ID_ALMACEN,
ID_ARTICULO,
CANTIDAD)
AS
SELECT PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO,
PEDIDOS_PROVEEDOR.ID_ALMACEN,
PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO,
SUM(COALESCE(PEDIDOS_PROVEEDOR_DETALLES.CANTIDAD, 0))
FROM PEDIDOS_PROVEEDOR_DETALLES
LEFT JOIN PEDIDOS_PROVEEDOR
ON (PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO = PEDIDOS_PROVEEDOR.ID)
LEFT JOIN ARTICULOS
ON (PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO = ARTICULOS.ID)
WHERE (PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO is not null)
AND (ARTICULOS.INVENTARIABLE = 1)
GROUP BY PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO,
PEDIDOS_PROVEEDOR.ID_ALMACEN,
PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO;
/*Agrupa todos los art<72>culos recibidos (por albaranes de proveedor) de cada uno de los pedidos asociados en los albaranes existentes*/
/*No le ponemos el almacen donde se recibi<62> ya que un mismo pedido podr<64>a tener varios albaranes con distintos almacenes de destino*/
/*Aquellos articulos que no tengan ID_PEDIDO es porque el albar<61>n al que pertenecen no tiene pedido asociado por ello no los tendremos en cuenta*/
CREATE VIEW V_PED_PROV_ARTICULOS_RECIBIDOS(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD)
AS
SELECT ID_PEDIDO, ID_ARTICULO, SUM(CANTIDAD) AS CANTIDAD
FROM V_ALB_PROV_DETALLES
WHERE (ID_PEDIDO is not null)
GROUP BY ID_PEDIDO, ID_ARTICULO;
/*No hacemos LEFT JOIN entre V_PED_PROV_DETALLES y V_PED_PROV_ARTICULOS_RECIBIDOS, porque por cada tupla de la primera*/
/*repetir<EFBFBD>a la consulta de la segunda disparando tiempos, por ello teniendo las dos vistas ejecutadas hacemos una union*/
/*obteniendo todos los art<72>culos del pedido, tanto recibidos como pendientes, luego haremos la agrupaci<63>n sobre este resultado*/
CREATE VIEW V_PED_PROV_ARTICULOS_AUX(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD_PEDIDA,
CANTIDAD_RECIBIDA)
AS
SELECT
V_PED_PROV_DETALLES.ID_PEDIDO,
V_PED_PROV_DETALLES.ID_ARTICULO,
V_PED_PROV_DETALLES.CANTIDAD AS CANTIDAD_PEDIDA,
0 as CANTIDAD_RECIBIDA
FROM V_PED_PROV_DETALLES
UNION
SELECT
V_PED_PROV_ARTICULOS_RECIBIDOS.ID_PEDIDO,
V_PED_PROV_ARTICULOS_RECIBIDOS.ID_ARTICULO,
NULL as CANTIDAD_PEDIDA,
V_PED_PROV_ARTICULOS_RECIBIDOS.CANTIDAD AS CANTIDAD_RECIBIDA
FROM V_PED_PROV_ARTICULOS_RECIBIDOS;
/*A partir de la vista anterior obtenemos el estado de cada uno de los art<72>culos del pedido de proveedor*/
/*Despreciamos aquellas tuplas cuya cantidad pedida sea null, porque son articulos a<>adidos en el albar<61>n que*/
/*no est<73>n en su pedido correspondiente por lo tanto no los tendremos en cuenta para saber si los articulos del*/
/*pedido se han recibido todos. De todas formas no tiene mucho sentido este caso*/
CREATE VIEW V_PED_PROV_ARTICULOS(
ID_PEDIDO,
ID_ALMACEN,
ID_ARTICULO,
CANTIDAD_PEDIDA,
CANTIDAD_RECIBIDA,
CANTIDAD_PENDIENTE)
AS
SELECT ID_PEDIDO,
PEDIDOS_PROVEEDOR.ID_ALMACEN,
ID_ARTICULO,
SUM(CANTIDAD_PEDIDA) as CANTIDAD_PEDIDA,
SUM(CANTIDAD_RECIBIDA) as CANTIDAD_RECIBIDA,
SUM(CANTIDAD_PEDIDA) - SUM(CANTIDAD_RECIBIDA) as CANTIDAD_PENDIENTE
FROM V_PED_PROV_ARTICULOS_AUX
LEFT JOIN PEDIDOS_PROVEEDOR
ON (PEDIDOS_PROVEEDOR.ID = V_PED_PROV_ARTICULOS_AUX.ID_PEDIDO)
GROUP BY ID_PEDIDO,
PEDIDOS_PROVEEDOR.ID_ALMACEN,
ID_ARTICULO
HAVING SUM(CANTIDAD_PEDIDA) IS NOT NULL;
/*Agrupa los art<72>culos de un mismo albar<61>n (ya que en un albar<61>n puede existir varias lineas con el mismo art<72>culo).
Para cada art<EFBFBD>culo de albar<EFBFBD>n le ponemos el pedido con el que esta asociado, la situacion y el almac<EFBFBD>n de donde sali<EFBFBD>.
Se quitan todos los art<EFBFBD>culos que no tengamos en cat<EFBFBD>logo (ID_ARTICULO nulo, lineas de detalle libres)
Se quitan tambi<EFBFBD>n aquellos que no se<EFBFBD>n inventariables*/
CREATE VIEW V_ALB_CLI_DETALLES(
ID_ALBARAN,
ID_PEDIDO,
SITUACION,
ID_ALMACEN,
ID_ARTICULO,
CANTIDAD)
AS
SELECT ALBARANES_CLIENTE_DETALLES.ID_ALBARAN,
ALBARANES_CLIENTE.ID_PEDIDO,
V_ALB_CLI_SITUACION.SITUACION,
ALBARANES_CLIENTE.ID_ALMACEN,
ALBARANES_CLIENTE_DETALLES.ID_ARTICULO,
SUM(COALESCE(ALBARANES_CLIENTE_DETALLES.CANTIDAD, 0))
FROM ALBARANES_CLIENTE_DETALLES
LEFT JOIN ALBARANES_CLIENTE
ON (ALBARANES_CLIENTE_DETALLES.ID_ALBARAN = ALBARANES_CLIENTE.ID)
LEFT JOIN ARTICULOS
ON (ALBARANES_CLIENTE_DETALLES.ID_ARTICULO = ARTICULOS.ID)
LEFT JOIN V_ALB_CLI_SITUACION
ON (ALBARANES_CLIENTE_DETALLES.ID_ALBARAN = V_ALB_CLI_SITUACION.ID)
WHERE (ALBARANES_CLIENTE_DETALLES.ID_ARTICULO is not null)
AND (ARTICULOS.INVENTARIABLE = 1)
group BY ALBARANES_CLIENTE_DETALLES.ID_ALBARAN,
ALBARANES_CLIENTE.ID_PEDIDO,
V_ALB_CLI_SITUACION.SITUACION,
ALBARANES_CLIENTE.ID_ALMACEN,
ALBARANES_CLIENTE_DETALLES.ID_ARTICULO;
/*Agrupa los art<72>culos de un mismo pedido (ya que en un pedido puede existir varias lineas con el mismo art<72>culo).
Se quitan todos los art<EFBFBD>culos que no tengamos en cat<EFBFBD>logo (ID_ARTICULO nulo, lineas de detalle libres)
Se quitan tambi<EFBFBD>n aquellos que no se<EFBFBD>n inventariables */
CREATE VIEW V_PED_CLI_DETALLES(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD)
AS
SELECT PEDIDOS_CLIENTE_DETALLES.ID_PEDIDO,
PEDIDOS_CLIENTE_DETALLES.ID_ARTICULO,
SUM(COALESCE(PEDIDOS_CLIENTE_DETALLES.CANTIDAD, 0)) AS CANTIDAD
FROM PEDIDOS_CLIENTE_DETALLES
LEFT JOIN ARTICULOS
ON (PEDIDOS_CLIENTE_DETALLES.ID_ARTICULO = ARTICULOS.ID)
WHERE (PEDIDOS_CLIENTE_DETALLES.ID_ARTICULO is not null)
AND (ARTICULOS.INVENTARIABLE = 1)
GROUP BY PEDIDOS_CLIENTE_DETALLES.ID_PEDIDO,
PEDIDOS_CLIENTE_DETALLES.ID_ARTICULO;
/*Agrupa todos los art<72>culos de un pedido por situacion (a partir de albaranes de cliente) de cada uno de los pedidos asociados en los albaranes existentes*/
/*No le ponemos el almacen donde sali<6C> o va a salir ya que un mismo pedido podr<64>a tener varios albaranes con distintos almacenes de origen*/
/*Aquellos articulos que no tengan ID_PEDIDO es porque el albar<61>n al que pertenecen no tiene pedido asociado por ello no los tendremos en cuenta*/
CREATE VIEW V_PED_CLI_ART_SITUACION(
ID_PEDIDO,
SITUACION,
ID_ARTICULO,
CANTIDAD)
AS
SELECT ID_PEDIDO, SITUACION, ID_ARTICULO, SUM(CANTIDAD) AS CANTIDAD
FROM V_ALB_CLI_DETALLES
WHERE (ID_PEDIDO is not null)
GROUP BY ID_PEDIDO,
SITUACION,
ID_ARTICULO;
/*Nos desglosa las cantidades del art<72>culo*/
CREATE VIEW V_PED_CLI_ART_SITUACION_CANT(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD_RESERVADA,
CANTIDAD_ENVIADA,
CANTIDAD_SERVIDA)
AS
SELECT ID_PEDIDO, ID_ARTICULO,
COALESCE((CASE SITUACION when 'PENDIENTE' THEN CANTIDAD END), 0) as CANTIDAD_RESERVADA,
COALESCE((CASE SITUACION when 'ENVIADO' THEN CANTIDAD END), 0) as CANTIDAD_ENVIADA,
COALESCE((CASE SITUACION when 'SERVIDO' THEN CANTIDAD END), 0) as CANTIDAD_SERVIDA
FROM V_PED_CLI_ART_SITUACION;
/*Al igual que en la parte de proveedores, no hacemos LEFT JOIN entre V_PED_CLI_DETALLES y V_PED_CLI_ART_SITUACION_CANT,*/
/*porque por cada tupla de la primera repetir<69>a la consulta de la segunda disparando tiempos, por ello teniendo las*/
/*dos vistas ejecutadas hacemos una union obteniendo todos los art<72>culos del pedido, tanto recibidos como pendientes,*/
/*luego haremos la agrupaci<63>n sobre este resultado*/
CREATE VIEW V_PED_CLI_ARTICULOS_AUX(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD_PEDIDA,
CANTIDAD_RESERVADA,
CANTIDAD_ENVIADA,
CANTIDAD_SERVIDA)
AS
SELECT
V_PED_CLI_DETALLES.ID_PEDIDO,
V_PED_CLI_DETALLES.ID_ARTICULO,
V_PED_CLI_DETALLES.CANTIDAD AS CANTIDAD_PEDIDA,
0 AS CANTIDAD_RESERVADA,
0 AS CANTIDAD_ENVIADA,
0 AS CANTIDAD_SERVIDA
FROM V_PED_CLI_DETALLES
UNION
SELECT
V_PED_CLI_ART_SITUACION_CANT.ID_PEDIDO,
V_PED_CLI_ART_SITUACION_CANT.ID_ARTICULO,
NULL AS CANTIDAD_PEDIDA,
V_PED_CLI_ART_SITUACION_CANT.CANTIDAD_RESERVADA AS CANTIDAD_RESERVADA,
V_PED_CLI_ART_SITUACION_CANT.CANTIDAD_ENVIADA AS CANTIDAD_ENVIADA,
V_PED_CLI_ART_SITUACION_CANT.CANTIDAD_SERVIDA AS CANTIDAD_SERVIDA
FROM V_PED_CLI_ART_SITUACION_CANT;
/*A partir de la vista anterior obtenemos el estado de cada uno de los art<72>culos del pedido de cliente*/
/*Despreciamos aquellas tuplas cuya cantidad pedida sea null, porque son articulos a<>adidos en el albar<61>n que*/
/*no est<73>n en su pedido correspondiente por lo tanto no los tendremos en cuenta para saber si los articulos del*/
/*pedido se han recibido todos. De todas formas no tiene mucho sentido este caso*/
/*Esta vista nos determina el estado de cada uno de los art<72>culos del pedido de cliente*/
CREATE VIEW V_PED_CLI_ARTICULOS(
ID_PEDIDO,
ID_ARTICULO,
CANTIDAD_PEDIDA,
CANTIDAD_RESERVADA,
CANTIDAD_ENVIADA,
CANTIDAD_SERVIDA,
CANTIDAD_PENDIENTE)
AS
SELECT ID_PEDIDO,
ID_ARTICULO,
SUM(CANTIDAD_PEDIDA),
SUM(CANTIDAD_RESERVADA) as CANTIDAD_RESERVADA,
SUM(CANTIDAD_ENVIADA) as CANTIDAD_ENVIADA,
SUM(CANTIDAD_SERVIDA) as CANTIDAD_SERVIDA,
(SUM(CANTIDAD_PEDIDA) - (SUM(CANTIDAD_RESERVADA) +
SUM(CANTIDAD_ENVIADA) +
SUM(CANTIDAD_SERVIDA))) as CANTIDAD_PENDIENTE
FROM V_PED_CLI_ARTICULOS_AUX
GROUP BY ID_PEDIDO,
ID_ARTICULO
HAVING SUM(CANTIDAD_PEDIDA) IS NOT NULL;
CREATE VIEW V_PED_CLI_SITUACION (
ID_PEDIDO,
SITUACION)
AS
SELECT ID_PEDIDO,
CASE
WHEN HAY_ALBARANES = 0 THEN 'PENDIENTE'
WHEN (CANTIDAD_PENDIENTE <= 0) AND (CANTIDAD_PEDIDA <= CANTIDAD_SERVIDA) THEN 'SERVIDO'
ELSE 'EN PROCESO'
END AS SITUACION
FROM
(SELECT V_PED_CLI_ARTICULOS.ID_PEDIDO,
SUM(V_PED_CLI_ARTICULOS.CANTIDAD_PEDIDA) AS CANTIDAD_PEDIDA,
SUM(V_PED_CLI_ARTICULOS.CANTIDAD_RESERVADA) AS CANTIDAD_RESERVADA,
SUM(V_PED_CLI_ARTICULOS.CANTIDAD_ENVIADA) AS CANTIDAD_ENVIADA,
SUM(V_PED_CLI_ARTICULOS.CANTIDAD_SERVIDA) AS CANTIDAD_SERVIDA,
SUM(V_PED_CLI_ARTICULOS.CANTIDAD_PENDIENTE) AS CANTIDAD_PENDIENTE,
CASE
WHEN COUNT(ALBARANES_CLIENTE.ID) > 0 THEN 1
ELSE 0
END AS HAY_ALBARANES
FROM ALBARANES_CLIENTE
RIGHT OUTER JOIN V_PED_CLI_ARTICULOS ON (ALBARANES_CLIENTE.ID_PEDIDO =
V_PED_CLI_ARTICULOS.ID_PEDIDO)
GROUP BY V_PED_CLI_ARTICULOS.ID_PEDIDO);
CREATE VIEW V_PED_PROV_SITUACION(
ID_PEDIDO,
SITUACION)
AS
SELECT ID_PEDIDO,
CASE
WHEN (HAY_ALBARANES = 0) OR (CANTIDAD_RECIBIDA <= 0) THEN 'PENDIENTE'
WHEN (CANTIDAD_PENDIENTE <= 0) THEN 'RECIBIDO'
ELSE 'PARCIAL'
END AS SITUACION
FROM
(SELECT V_PED_PROV_ARTICULOS.ID_PEDIDO,
SUM(V_PED_PROV_ARTICULOS.CANTIDAD_PEDIDA) AS CANTIDAD_PEDIDA,
SUM(V_PED_PROV_ARTICULOS.CANTIDAD_RECIBIDA) AS CANTIDAD_RECIBIDA,
SUM(V_PED_PROV_ARTICULOS.CANTIDAD_PENDIENTE) AS CANTIDAD_PENDIENTE,
CASE
WHEN COUNT(ALBARANES_PROVEEDOR.ID) > 0 THEN 1
ELSE 0
END AS HAY_ALBARANES
FROM ALBARANES_PROVEEDOR
RIGHT OUTER JOIN V_PED_PROV_ARTICULOS ON (ALBARANES_PROVEEDOR.ID_PEDIDO =
V_PED_PROV_ARTICULOS.ID_PEDIDO)
GROUP BY V_PED_PROV_ARTICULOS.ID_PEDIDO)
;