on 01-27-2011 9:15 PM
Tengo un query en la cual me traigo todas las facturas de proveedores pendientes por pagar con la informacion del proveedor, total de la factura, importe aplicado y monto pendiente por pagar, ademas muestro la cantidad de dias que tiene vencida la factura si es que esta vencida etc... Pero ahora es necesario mostrar en el mismo query subtotales del total de documento y subtotales de lo pendiente por pagar por proveedor, es decir que en el mismo query sume el total de documento y sume el total de pendiente por pagar pero agrupado por proveedor. aun no he podido mostrar subtotales de esa forma. hasta ahora tengo el siguiente query sin subtotales:
/SELECT FROM [dbo].[OPCH] T4/
Declare @Fecha1 as nvarchar(100)
/* WHERE */
set @Fecha1 = /* T4.CreateDate */ '[%0]'
SELECT T0.[CardCode] AS 'Codigo Proveedor', T0.[CardName] AS 'Nombre Proveedor', T0.[DocNum] AS 'Nro de Documento', T0.[DocDueDate] AS 'Fecha de Vencimiento', T0.[DocTotal] AS 'Total Documento', T0.[PaidToDate] as 'Importe', (T0.[DocTotal] - T0.[PaidToDate]) as 'Pendiente por Pagar', DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1 AS 'Dias', CASE WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<0 THEN 'Vencido' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>=0 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=30 THEN '30 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>30 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=60 THEN '60 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>60 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=90 THEN '90 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))*-1>90 THEN 'Mayor 90 Dias' END AS 'Plazo de Vencimiento','Factura' as 'Tipo Docum'
FROM OPCH T0 WHERE T0.[CreateDate]<=@Fecha1 AND T0.[DocStatus]<>'C'
union all
SELECT T0.[CardCode] AS 'Codigo Proveedor', T0.[CardName] AS 'Nombre Proveedor', T0.[DocNum] AS 'Nro de Documento', T0.[DocDueDate] AS 'Fecha de Vencimiento', - T0.[DocTotal] AS 'Total Documento', T0.[PaidToDate] as 'Importe', (-T0.[DocTotal] - T0.[PaidToDate]) as 'Pendiente por Pagar', DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1 AS 'Dias', CASE WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<0 THEN 'Vencido' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>=0 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=30 THEN '30 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>30 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=60 THEN '60 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1>60 AND DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))-1<=90 THEN '90 Dias' WHEN DATEDIFF(DAY, LEFT(CONVERT(VARCHAR, T0.[DocDueDate], 102), 10), LEFT(CONVERT(VARCHAR, GETDATE() , 102), 10))*-1>90 THEN 'Mayor 90 Dias' END AS 'Plazo de Vencimiento','Nota de Credito' as 'Tipo Docum'
FROM ORPC T0 WHERE T0.[CreateDate]<=@Fecha1 AND T0.[DocStatus]<>'C'
order by 2,4,3
Hola David,
¿Porque no utilizas la consulta de Antigüedad de proveedor" del estándar indicando en el intervalo "Días" y "30"?
Un saludo,
Tere
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola David,
¿Porqué no la llevas a un Crystal Report? ahí puedes hace rsubtotales y lo que necesites.
Un saludo,
Tere
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Yo uso este Query
select OCRD.cardcode,OCRD.cardname,
SUM(BalDueDeb-BalDueCred) "Saldo",
SUM(ISNULL(CASE
when (DATEDIFF(dd,duedate,current_timestamp))< 0
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "Futuro",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > -1
and (datediff(dd,duedate,current_timestamp))< 31)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "0-30",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 30
and (datediff(dd,duedate,current_timestamp))< 61)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "31-60",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 60
and (datediff(dd,duedate,current_timestamp))< 91)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "61-90",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 90
and (datediff(dd,duedate,current_timestamp))< 121)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "91-120",
SUM(ISNULL(CASE
when (DATEDIFF(dd,duedate,current_timestamp)) >120
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "121+"
from JDT1,OCRD where JDT1.shortname = OCRD.cardcode and cardtype = 'S' and intrnmatch = '0' AND OCRD.Balance <> 0
GROUP BY OCRD.cardcode,OCRD.cardname
ORDER BY OCRD.cardname
Puedes Decargar el reporte que hice en Crystal de siguiente enlace
http://cid-c6439b024f8d2ba6.office.live.com/self.aspx/Public/rpt%5E_AntiguedadProveedores.rar
en el mismo archivo esta el query para que crees el StoreProcedure con el que trabaja el Reporte.
Saludos
Pequeña corrección a Darwin' ¡esfuerzo de s!
select OCRD.cardcode,OCRD.cardname,
SUM(BalDueDeb-BalDueCred) "Saldo",
SUM(ISNULL(CASE
when (DATEDIFF(dd,duedate,current_timestamp))< 0
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "Futuro",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > -1
and (datediff(dd,duedate,current_timestamp))< 31)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "0-30",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 30
and (datediff(dd,duedate,current_timestamp))< 61)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "31-60",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 60
and (datediff(dd,duedate,current_timestamp))< 91)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "61-90",
SUM(ISNULL(case when ((datediff(dd,duedate,current_timestamp)) > 90
and (datediff(dd,duedate,current_timestamp))< 121)
then
case
when BalDueCred <> 0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "91-120",
SUM(ISNULL(CASE
when (DATEDIFF(dd,duedate,current_timestamp)) >120
then
case
when BalDueCred <>0 then BalDueCred * - 1
else BalDueDeb
end
end,0)) "121+"
from JDT1,OCRD where JDT1.shortname = OCRD.cardcode and cardtype = 'S' and intrnmatch = '0' AND OCRD.Balance = 0
GROUP BY OCRD.cardcode,OCRD.cardname
ORDER BY OCRD.cardname
Para empezar a mostrar por subtotales, te recomiendo eliminar campos que son de detalle, ejemplo si un proveedor te debe 5 facturas y quieres saber que facturas son, esa query te sirve. Pero si quiero saber cuanto me debe el proveedor, omito el campo de facturas para que solo me sume el saldo.
Creo que tendrias que hacer un query para cada caso, ese que tienes como detalle por porveedor. Sacale algunos campos muy detallistas para obtener sumas por proveedor y lo guardas como otro query. y asi suscesivamente.
Saludos
FLR
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Para la consulta a generar es imprecindible que muestre todos los detalles incluidos en el query, ya que la informacion mostrada es totalmente relevante y de suma importancia para los usuarios, en el query agregue la sentencia:
compute sum (T0.[DocTotal] - T0.[PaidToDate]) by T0.[CardName], T0.CardCode
me sirve para ejecutarlo desde SQL, pero en el query manager solo me muestra informacion de un solo proveedor. Se que llevando el query a un layout podria resolver usando la opcion de grupos pero no se como usarlo
User | Count |
---|---|
108 | |
12 | |
11 | |
6 | |
5 | |
4 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.