cancel
Showing results for 
Search instead for 
Did you mean: 

Query de facturas de proveedores por pagar

former_member211460
Participant
0 Kudos

Buenos dias tengo este query para que apuntara a la tabla de facturas de proveedores, con los docuemtos abiertos y en base a la fecha de vencimiento , pero me arroja la fecha de contabilizacion? que estara mal del query? tambien es posible que no aparezcan las fechas cuando no haya ningun dato? en este caso algun pago pendiente

gracias por el apoyo

SET LANGUAGE Spanish   

DECLARE @TOP INT, @F_INI DATETIME, @F_FIN DATETIME, @COND_1 CHAR(1), @COND_2 CHAR(1) 

SET @TOP=(SELECT TOP 1 A.TransId FROM [dbo].[JDT1] A WHERE A.RefDate>='[%0]' AND A.RefDate<='[%1]')   

SET @F_INI='[%0]'   

SET @F_FIN='[%1]' 

SET @COND_1='N' 

SET @COND_2='S' 

 

SELECT DISTINCT B.DocDueDate AS DocDueDate, CONVERT(NVARCHAR, B.DocDueDate, 103) AS Fecha 

INTO #FECHAS 

FROM OPCH B 

WHERE B.DocDueDate BETWEEN @F_INI AND @F_FIN AND DocStatus = 'O'  

ORDER BY 1 

 

DECLARE @pvt_table NVARCHAR(MAX)   

SELECT @pvt_table = COALESCE(@pvt_table + ',[' + C.Fecha + ']', '[' + C.Fecha + ']')   

FROM #FECHAS C 

ORDER BY C.DocDueDate 

 

DECLARE @Pvt NVARCHAR(MAX)   

SET @Pvt =    

          N'   

          SELECT *   

          FROM ( 

                                        SELECT DISTINCT T0.CardCode AS CardCode, T0.CardName AS CardName, CONVERT(NVARCHAR, T0.DocDueDate, 103) AS Fecha, SUM(T0.DocTotal) AS Pagos 

                                        FROM OVPM T0 

                                        WHERE T0.DocDueDate BETWEEN (@INI) AND (@FIN) AND T0.Canceled=(@C_1) AND T0.DocType=(@C_2) 

                                        GROUP BY T0.CardCode, T0.CardName, T0.DocDueDate 

 

          ) AS A   

          PIVOT (   

                    SUM(Pagos)   

                    FOR Fecha IN ('+ @pvt_table +')   

          ) AS Pvt   

          ORDER BY 1,3 

          '   

 

EXEC sp_executesql @pvt, N'@pvt_table NVARCHAR(MAX), @INI DATETIME, @FIN DATETIME, @C_1 CHAR(1), @C_2 CHAR(1)',@pvt_table, @F_INI, @F_FIN, @COND_1, @COND_2 

 

 

DROP TABLE #FECHAS

Accepted Solutions (0)

Answers (1)

Answers (1)

felipe_loyolarodriguez
Active Contributor
0 Kudos

Primero: Te trae la fecha de contabilización porque las variables en SAP están siendo sacadas desde el campo RefDate de la tabla JDT1. Cambia el RefDate por DueDate y asunto arreglado. Aquí puedes ver eso

SET @TOP=(SELECT TOP 1 A.TransId FROM [dbo].[JDT1] A WHERE A.RefDate>='[%0]' AND A.RefDate<='[%1]')

Segundo: El query no fue pensado para que aparezcan todos los días del año,para eso debes tener o hacer una tabla donde esté dicho dato.

Tercero: Este query esta armado para pagos efectuados no para deuda futura y se arma de la siguiente manera:

-Se establece el idioma del SQL en español, por si esta en inglés.

-Se declaran las variables que se usaran en el SQL dinámico, se llama a las variables de fecha en SAP y se le asignan las condiciones de los pagos

SET LANGUAGE Spanish  

DECLARE @TOP INT, @F_INI DATETIME, @F_FIN DATETIME, @COND_1 CHAR(1), @COND_2 CHAR(1)

SET @TOP=(SELECT TOP 1 A.TransId FROM [dbo].[JDT1] A WHERE A.RefDate>='[%0]' AND A.RefDate<='[%1]')  

SET @F_INI='[%0]'  

SET @F_FIN='[%1]'

SET @COND_1='N'

SET @COND_2='S'

-Este query es para traer los días que tienen pagos dentro del rango de fechas establecido, si 1 día no tiene datos no aparecerá la columna de ese día. Si hubiese una tabla de todos los días no sería necesario esta parte

SELECT DISTINCT B.DocDueDate AS DocDueDate, CONVERT(NVARCHAR, B.DocDueDate, 103) AS Fecha

INTO #FECHAS

FROM OPCH B

WHERE B.DocDueDate BETWEEN @F_INI AND @F_FIN AND DocStatus = 'O' 

ORDER BY 1

-Esta sentencia la explique en un documento que escribí (http://scn.sap.com/docs/DOC-30796), es para pivotear dinamicamente los datos del query de más abajo

DECLARE @pvt_table NVARCHAR(MAX)  

SELECT @pvt_table = COALESCE(@pvt_table + ',[' + C.Fecha + ']', '[' + C.Fecha + ']')  

FROM #FECHAS C

ORDER BY C.DocDueDate

-Este es el query que trae los datos, si quieres modificar lo que el query arroja (pagos) a otra cosa debes modificar esta parte.

DECLARE @Pvt NVARCHAR(MAX)  

SET @Pvt =   

          N'  

          SELECT *  

          FROM (

                                        SELECT DISTINCT T0.CardCode AS CardCode, T0.CardName AS CardName, CONVERT(NVARCHAR, T0.DocDueDate, 103) AS Fecha, SUM(T0.DocTotal) AS Pagos

                                        FROM OVPM T0

                                        WHERE T0.DocDueDate BETWEEN (@INI) AND (@FIN) AND T0.Canceled=(@C_1) AND T0.DocType=(@C_2)

                                        GROUP BY T0.CardCode, T0.CardName, T0.DocDueDate

          ) AS A  

          PIVOT (  

                    SUM(Pagos)  

                    FOR Fecha IN ('+ @pvt_table +')  

          ) AS Pvt  

          ORDER BY 1,3

          '

-Por último la ejecución del SQL dinámico y la eliminación de la tabla temporal

EXEC sp_executesql @pvt, N'@pvt_table NVARCHAR(MAX), @INI DATETIME, @FIN DATETIME, @C_1 CHAR(1), @C_2 CHAR(1)',@pvt_table, @F_INI, @F_FIN, @COND_1, @COND_2

DROP TABLE #FECHAS

Espero haya resuelto las dudas de porque los errores.

Saludos

Felipe

PD: Yo hize el query

former_member203638
Active Contributor
0 Kudos

Exelente explicacion, no habia visto ese docto redactado, esta muy bien.

Saludos.

Alessandro.