git-svn-id: https://192.168.0.254/svn/Proyectos.LuisLeon_FactuGES/tags/1.8.0@17 c93665c3-c93d-084d-9b98-7d5f4a9c3376
377 lines
14 KiB
SQL
377 lines
14 KiB
SQL
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ó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ículos de un mismo albarán (ya que en un albarán puede existir varias lineas con el mismo artículo).
|
|
Para cada artículo de albarán le ponemos el pedido con el que esta asociado y el almacén donde se recibio.
|
|
Se quitan todos los artículos que no tengamos en catálogo (ID_ARTICULO nulo, lineas de detalle libres)
|
|
Se quitan también aquellos que no seá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ículos de un mismo pedido (ya que en un pedido puede existir varias lineas con el mismo artículo).
|
|
Para cada artículo de pedido le ponemos el pedido con el que esta asociado y el almacén donde será recibido.
|
|
Se quitan todos los artículos que no tengamos en catálogo (ID_ARTICULO nulo, lineas de detalle libres)
|
|
Se quitan también aquellos que no seá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í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ó ya que un mismo pedido podría tener varios albaranes con distintos almacenes de destino*/
|
|
/*Aquellos articulos que no tengan ID_PEDIDO es porque el albará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ía la consulta de la segunda disparando tiempos, por ello teniendo las dos vistas ejecutadas hacemos una union*/
|
|
/*obteniendo todos los artículos del pedido, tanto recibidos como pendientes, luego haremos la agrupació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ículos del pedido de proveedor*/
|
|
/*Despreciamos aquellas tuplas cuya cantidad pedida sea null, porque son articulos añadidos en el albarán que*/
|
|
/*no está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ículos de un mismo albarán (ya que en un albarán puede existir varias lineas con el mismo artículo).
|
|
Para cada artículo de albarán le ponemos el pedido con el que esta asociado, la situacion y el almacén de donde salió.
|
|
Se quitan todos los artículos que no tengamos en catálogo (ID_ARTICULO nulo, lineas de detalle libres)
|
|
Se quitan también aquellos que no seá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ículos de un mismo pedido (ya que en un pedido puede existir varias lineas con el mismo artículo).
|
|
Se quitan todos los artículos que no tengamos en catálogo (ID_ARTICULO nulo, lineas de detalle libres)
|
|
Se quitan también aquellos que no seá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í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ó o va a salir ya que un mismo pedido podría tener varios albaranes con distintos almacenes de origen*/
|
|
/*Aquellos articulos que no tengan ID_PEDIDO es porque el albará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í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ía la consulta de la segunda disparando tiempos, por ello teniendo las*/
|
|
/*dos vistas ejecutadas hacemos una union obteniendo todos los artículos del pedido, tanto recibidos como pendientes,*/
|
|
/*luego haremos la agrupació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ículos del pedido de cliente*/
|
|
/*Despreciamos aquellas tuplas cuya cantidad pedida sea null, porque son articulos añadidos en el albarán que*/
|
|
/*no está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í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)
|
|
; |