PDA

Ver la Versión Completa : Edad de las cuentas por pagar


efelix
19-01-2007, 18:02:20
Hola a todos, disculpen por el titulo del hilo pero no encontré otro. Tengo el siguiente procedimiento almacenado:

CREATE PROCEDURE spSaldo
AS
SELECT Proveedores.IdProveedor, Proveedores.NombreProveedor, Facturas.IdFactura, Facturas.Descripcion, Facturas.Importe, Facturas.FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, CASE WHEN DATEDIFF(day,
FechaRecepcion, GETDATE()) > 0 AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 30 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END MENOSDE30dias,
CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 31 AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 60 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END ENTRE3060dias,
CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 61 AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 90 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END ENTRE6090dias,
CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END MASDE90dias
FROM Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE (Aplicada = 0)
GO

El mismo proviene de la unión de dos tablas, Proveedores y Facturas. Que deseo con él. Que me de el importe de las facturas por rango de edades, es decir entre 0 y 30 el Importe total de las que están en ese rango, entre 31 y 60 el importe total de las que están en ese rango y así sucesivamente, para luego utilizar esto en Reporte en delphi 7. Cuando ejecuto este procedimiento almacenado no me sale nada de lo esperado. Mi pregunta es la siguiente como utilizar el campo importe de la tabla factura en la expresión que aparece en la consulta para lograr lo que deseo. Espero me hayan entendido. Muchas gracias.

sinalocarlos
19-01-2007, 21:16:49
Código SQL [-] (http://www.clubdelphi.com/foros/#) CREATE PROCEDURE spSaldo AS SELECT Proveedores.IdProveedor, Proveedores.NombreProveedor, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 0 AND DATEDIFF(day, FechaRecepcion, GETDATE()) <= 30 THEN 1 --0 A 30 DIAS WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) >= 31 AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 60 THEN 2 --31 A 60 DIAS WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) >= 61 AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 90 THEN 3 --61 A 90 DIAS WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) >= 91 THEN 4 -- MAS DE 90 ELSE 0 END vida, --POR SI ACASO SUM(Facturas.importe) as SumaImporte -- SUMA DEL IMPORTE FROM Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor WHERE (Aplicada = 0) GROUP BY VIDA GO


esto es lo que creo que seria, agrupado por proveedor y vida de las facturas, si añades campos de las facturas entonces no te agruparia estas ultimas y la suma no seria valida

efelix
19-01-2007, 23:22:56
Gracias sinalocarlos, pero esto megenera un error en el nombre del campo vida, disculpa mi ignorancia, alo mejor lo estás utilizando a manera de ejemplo, en este preciso ejemplo a que campo te refieres específicamente. Te ereítero las gracias.

sinalocarlos
20-01-2007, 00:06:04
CREATE PROCEDURE spSaldo
AS
SELECT
Proveedores.IdProveedor,
Proveedores.NombreProveedor,
Facturas.IdFactura,
Facturas.Descripcion,
Facturas.Importe,
Facturas.FechaRecepcion,
DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo,

CASE WHEN
DATEDIFF(day, FechaRecepcion, GETDATE()) > 0
AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 30 THEN 1 WHEN
DATEDIFF(day, FechaRecepcion, GETDATE()) > 31
AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 60 THEN 2 WHEN
DATEDIFF(day, FechaRecepcion, GETDATE()) > 61
AND DATEDIFF(day, FechaRecepcion, GETDATE()) < 90 THEN 3 WHEN
DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN 4
ELSE 0 END as vida,
SUM(Facturas.importe) as SumaImporte

FROM Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE (Aplicada = 0)
GO


ups jeje es cierto por confiado no lo modifique directamente aqui y postie sin compilar

quearia asi

efelix
22-01-2007, 15:33:46
Hola sinalocarlos, muchas gracias por tu ayuda. Te cuento que ya resolví el probelma y logré lo que quería de la siguiente forma:

CREATE PROCEDURE spAntiguedad

AS
SELECT Proveedores.IdProveedor, Proveedores.NombreProveedor, Facturas.IdFactura, Facturas.Descripcion, Facturas.Importe, Facturas.FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo,
CASE
WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 0 AND DATEDIFF(day, FechaRecepcion, GETDATE()) <= 30 THEN Facturas.Importe ELSE 0 END MENOSDE30dias,
CASE
WHEN DATEDIFF(day, FechaRecepcion, GETDATE ()) >= 31 AND DATEDIFF(day, FechaRecepcion, GETDATE()) <= 60 THEN Facturas.Importe ELSE 0 END ENTRE3060dias,
CASE
WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) >= 61 AND DATEDIFF(day, FechaRecepcion, GETDATE()) <= 90 THEN Facturas.Importe ELSE 0 END ENTRE6090dias,
CASE
WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN Facturas.Importe ELSE 0 END MASDE90dias
FROM Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE (Aplicada = 0)
GO

Es decir ahora obtengo el importe por cada rango de edad que establecí, que era lo que me faltaba, el problema estaba cuando yo ponía then DATEDIFF(day,FechaRecepcion, GETDATE()) en vez de poner el campo Importe.
Gracias.