Generar un reporte de CXC

Buena tarde comunidad, espero se encuentre bien.

Tengo una consulta, actualmente estoy ingresando al mundo de SAP BO con SQL Server, pero me están solicitando un reporte de cxc, de cliente extranjeros.

Manejamos facturas en reserva, por lo que no utilizan la fecha de vencimiento de la factura, sino la fecha de vencimiento que utilizan es del documento de entrega de mercaderia.

Estuve validando con los reportes nativos de SAP, pero no me funciona, alguien ha realizado algo similiar que me pueda apoyar disculpen.

Hola, lamento si no entiendo por completo tu solicitud.

Si necesitas crear una consulta SQL o un informe en Crystal para las Facturas proveedor en este caso mencionas que son de Reserva la tabla que se ocupa es la OPCH, para discriminar cuáles son de Reserva podrías usar el campo [isIns] y para la fecha de vencimiento el [DocDueDate]

Si compartes lo que llevas avanzado, a que resultados has llegado y cuáles quieres obtener es seguro que la ayuda sea más amplia y concreta.

Saludines.

2 Me gusta

Por otro lado aprovechar para recordarte pasar por la zona de #presentaciones porque es de gran ayuda el conocer de ti, tu experiencia y más detalles que le sirvan a los miembros del foro para que puedan darte una ayuda u orientación más certera en cada consulta que llegues a requerir.

1 me gusta

Hola @Cassales muchas gracias por su respuesta, puede revisar estos documentos txt,
donde se ha intentado generar esta informacion, pero no muestra todas las facturas que estan pendientes, mi formato ya esta en crystal, solo tengo problemas con el Query por que no salen todas las facturas de los clientes extranjeros.

Con el tema de la presentación estoy buscando donde colocar esa información, pero con todo gusto muchas gracias por su respuesta.

Hola, lamento no usar tu enlace pero por regla personal no abro vínculos de externos, por otro lado con gusto si puedes compartir con imágenes o ejemplos dentro del foro, seguro alguna ayuda vendrá. No solo de mí sino de los demás miembros.

Algo no me queda muy claro, según yo la Factura de Reserva se usa cuando se tiene que generar (aplicar) un pago en el sistema antes de recibir la mercancía, entonces bajo esa idea para cuando el destino de esas Facturas de Reserva es la entrada de mercancía es porque ya debería estar pagada, y en ese caso ya no aparecer en el reporte de cuentas por pagar.

En caso contrario, cuando recibo en el sistema y luego la entrada se convierte en Factura Proveedor, éstas sí son cuentas pendientes por pagar. Puedo estar equivocado en la apreciación por lo que te pediría si puedes ampliar el tema.

Por alguna razón están usando las facturas de reserva en lugar de seguir el camino “regular” de compras. Me he topado con empresas que hacen eso para evadir las restricciones propias de la licencia que no permite a una de “logística” crear facturas de proveedor pero sí te permite hacer de reserva y luego dan entradas con inconvenientes similares al que planteas aquí.

1 me gusta

Ahí donde dice Presentaciones ( :point_left:es un vínculo) de verdad es de gran ayuda la información que puedes dejar ahí.

Aquí hay un tema de facturas de reserva, tal vez no sea de ayuda, tal vez sí. Dale una revisada.

relacion-de-factura-reserva-de-proveedores

Hola buen día @Cassales muchas gracias por su respuesta y comprendo el tema de los enlaces, no te preocupes intentaré explicarte más a detalle por acá.

Nosotros manejamos Factura en reserva de clientes, esto para nuestras exportaciones,
pero la fecha de vencimiento de la factura no se utiliza como tal, sino nuestro documento base es que la entrega que se le da al cliente puede que la factura se la emitieron en una fecha x, pero la entrega la realizamos hasta el día de hoy, entonces nuestra fecha de vencimiento de la factura es el día hoy, porque se emitio la entrega.

es un poco tedioso a como lo manejan pero la cuenta por cobrar, actualmente no se visualizan todos nuestras factura te envio el SP, que se tiene pero no muestra todas las facturas posiblemente hay un calculo mal realizado.

puedes apoyarme por favor.

[dbo].[_SBOSP_RPT_CXC] (@Fecha datetime)
AS
BEGIN
	SELECT  DISTINCT 
		T0.TransId, 
		T0.Linea, 
		CASE WHEN T0.TransType IN (13,14) THEN COALESCE(T3.U_DoctoNo, T7.U_DoctoNo, T0.Referencia) ELSE T0.Referencia END 'Referencia',
		T0.Fecha, 
		 dateadd(d,t2.ExtraDays,ol.DocDate) as FechaVence, 
		T3.U_FechaDespacho,
		T3.DocNum,
		OL.DocNum,
		N1.ShipDate as 'Fecha de Entrega',
		OL.DocDate as 'Fecha Documento',
		T0.Codigo, 
		T0.Nombre, 
		T3.SlpCode,
		T0.TipoDoc, 
		T0.Monto, 
		T0.Pagado, 
		T0.Saldo, 
		T0.TransType,
	
		
		DATEDIFF(DAY,  dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) 'Dias Atraso',
		CASE WHEN DATEDIFF(DAY, dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) < 0 THEN T0.Saldo ELSE 0 END 'Corriente',
		CASE WHEN DATEDIFF(DAY,  dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) BETWEEN 0 AND 30 THEN T0.Saldo ELSE 0 END '1 A 30 DIAS',
		CASE WHEN DATEDIFF(DAY,  dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) BETWEEN 31 AND 60 THEN T0.Saldo ELSE 0 END '31 A 60 DIAS',
		CASE WHEN DATEDIFF(DAY,  dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) BETWEEN 61 AND 90 THEN T0.Saldo ELSE 0 END '61 A 90 DIAS',
		CASE WHEN DATEDIFF(DAY,  dateadd(d,t2.ExtraDays,ol.DocDate), @Fecha) > 90 THEN T0.Saldo ELSE 0 END '91 + DIAS',
		T2.PymntGroup 'Condicion Credito', T1.CreditLine 'Limite Credito',
		CASE 
			WHEN T0.TransType = 24 AND COALESCE(T4.StornoToTr, 0) = 0 THEN T5.comments /*[dbo].[_SBOF_ObtenerFacturasPagadasClientes] (T5.DocEntry)*/
			WHEN T0.TransType = 24 AND COALESCE(T4.StornoToTr, 0) <> 0 THEN 'Pago anulado ' + T4.Ref2
			WHEN T0.TransType = 13 AND T3.CANCELED <> 'C' THEN T3.Comments
			WHEN T0.TransType = 13 AND T3.CANCELED = 'C' THEN 'Anulación de factura ' + T4.Ref2
			WHEN T0.TransType = 14 AND T7.CANCELED <> 'C' THEN 'NC ' + CONVERT(nvarchar(50), T7.NumAtCard)
			WHEN T0.TransType = 14 AND T7.CANCELED = 'C' THEN 'Anulación NC ' + CONVERT(nvarchar(50), T7.NumAtCard)
			ELSE T4.Ref2 
		END AS 'Comments',
		--T0.DocNum,
		T3.DocNum,
		OL.DocNum,
		T8.[SlpName]
	--	T3.Comments
	FROM
		[dbo].[_SBOF_CXC_TABLA_DETALLE_Export] (@Fecha) T0
		INNER JOIN OCRD T1 ON T1.CardCode = T0.Codigo
		INNER JOIN OCTG T2 ON T2.GroupNum = T1.GroupNum
		LEFT JOIN OINV T3 ON T3.TransId = T0.TransId
		LEFT JOIN INV1 NV ON T3.DocEntry = NV.DocEntry
		INNER JOIN DLN1 N1 ON NV.DocEntry = N1.BaseEntry
		LEFT JOIN ODLN OL ON  OL.DocEntry = N1.DocEntry		
		LEFT JOIN OJDT T4 ON T4.TransId = T0.TransId
		LEFT JOIN ORCT T5 ON T5.TransId = T0.TransId
		LEFT JOIN JDT1 T9 ON T9.TransId = T0.TransId 
		LEFT JOIN ORIN T7 ON T7.TransId = T0.TransId
		 INNER JOIN OSLP T8 ON T3.[SlpCode] = T8.[SlpCode]
    where T3.SlpCode = '14' and  NV.LineNum = 0 and N1.LineNum = 0 and T9.Line_ID = 0 AND OL.CANCELED = 'N'
	ORDER BY
		T0.Codigo,T0.Nombre ASC, [Dias Atraso] DESC
		
END

esta el la segunda consulta

ALTER  FUNCTION [dbo].[_SBOF_CXC_TABLA_DETALLE_Export] (@FFin as datetime)
RETURNS @CXC TABLE

(
	TransId			bigint,
	Linea				int,
	Referencia		nvarchar(150),
	Fecha				datetime,
	FechaVence		datetime,
	Codigo				nvarchar(135),
	Nombre			nvarchar(max),
	TipoDoc			nvarchar(110),
	Monto				float,
	Pagado			float,
	Saldo				float,
	TransType		int
)

AS
BEGIN

	INSERT INTO @cxc
	SELECT *
	FROM
		(
			SELECT
				T0.TransId, 
				T1.Line_ID,
				CASE WHEN T0.TransType = '13' THEN T0.Ref2 ELSE T0.BaseRef END Referencia,
				T0.RefDate,
				T0.DueDate,
				T2.CardCode, 
				T2.CardName,
				T3.Abreviatura,
				ROUND(T1.FCDebit - T1.FCCredit,2) MontoOriginal,
				ROUND([dbo].[_SBOF_Obtener_Pagado_Fecha_export] (T0.TransId,@FFin,T1.Line_ID),2) Recuperado,
				CASE WHEN ROUND((T1.FCDebit-T1.FCCredit),2) < 0 THEN ROUND((T1.FCDebit-T1.FCCredit),2) + ROUND(ABS([dbo].[_SBOF_Obtener_Pagado_Fecha_export] (T0.TransId,@FFin,T1.Line_ID)),2)
				ELSE ROUND((T1.FCDebit-T1.FCCredit),2) - ROUND(ABS([dbo].[_SBOF_Obtener_Pagado_Fecha_export] (T0.TransId,@FFin,T1.Line_ID)),2) END Saldo, 
				T0.TransType

				--T1.[FCDebit], T1.[FCCredit]
				
			FROM
				OJDT T0
				INNER JOIN JDT1 T1 ON T0.TransId = T1.TransId
				INNER JOIN OCRD T2 ON T1.ShortName = T2.CardCode 
				INNER JOIN [dbo].[_SBOF_Tipos_Documento] () T3 ON T3.ObjType = T0.TransType

			WHERE
				T0.DueDate <= @FFin  AND T0.TransType NOT IN ('-3') AND T2.CardType = 'C' ) T0

		WHERE T0.Saldo < -0.01 OR T0.Saldo > 0.01
	ORDER BY T0.DueDate

	RETURN
END

esta el la tercera que depende de la segunda

ALTER FUNCTION [dbo].[_SBOF_Obtener_Pagado_Fecha_export]
(
	@TransId		int,
	@FFin			datetime,
	@Line			int
)
RETURNS money
AS
BEGIN
	DECLARE @TotalPagado money


	SELECT 
		@TotalPagado = SUM(T1.ReconSumSC)
		
	FROM
		OITR T0
		INNER JOIN ITR1 T1
			ON T0.ReconNum = T1.ReconNum
	WHERE
		T1.TransId = @TransId
	--AND T1.Account LIKE '11201%'
	AND T0.ReconDate <= @FFin
	--AND ISNULL((SELECT S1.MthDate FROM JDT1 S1 WHERE S1.TransId = @TransId AND S1.Line_ID = @Line),'20000101') <> '20000101'
	AND T0.ReconType NOT IN (11,9)
	AND T1.TransRowId = @Line

	RETURN ISNULL(@TotalPagado,0)
	
END

Las consultas que me proporcionaste están relacionadas para generar un informe de cuentas por cobrar como comentas. Y aunque entiendo la estructura en general, se me dificulta identificar algún cálculo incorrecto sin estar en la estructura de las tablas o los datos subyacentes.

Aunque sí puedo proporcionarte algunas sugerencias para revisar y solucionar posibles problemas en la consulta:

  • Verifica las condiciones de filtrado: Revisa las condiciones utilizadas en la consulta para asegurarte de que estén seleccionando los datos correctos. Asegúrate de que los campos utilizados en las cláusulas WHERE y JOIN coincidan con las tablas y las columnas correspondientes en la base de datos.

  • Comprueba las funciones personalizadas: La consulta hace uso de algunas funciones personalizadas, como “dbo._SBOF_Obtener_Pagado_Fecha_export.” Asegúrate de que estas funciones estén definidas correctamente y estén devolviendo los resultados esperados.

  • Revisa los cálculos de saldos y pagos: Verifica los cálculos de saldos y pagos en las secciones relevantes de la consulta. Asegúrate de que los cálculos estén realizándose correctamente y estén considerando las fechas y los montos correctos.

  • Confirma las uniones de tablas: Revisa las uniones de tablas en la consulta para asegurarte de que estén configuradas correctamente y estén relacionando las tablas adecuadas según la estructura de la base de datos.

  • Verifica la precisión de los datos: Asegúrate de que los campos utilizados en los cálculos numéricos tengan la precisión adecuada para evitar posibles errores de redondeo.

Posteriormente para relacionar la fecha de vencimiento de la factura con la fecha de entrega realizada, tal vez tengas que ajustar la lógica de la consulta en sí. Actualmente, parece que la fecha de vencimiento se calcula utilizando la columna ol.DocDate y el número de días adicionales definidos en t2.ExtraDays. Sin embargo, no tiene en cuenta la fecha de entrega realizada.

También te puedo recomendar lo siguiente:

  • Agrega la tabla DLN1 nuevamente: Parece que la tabla DLN1 se utiliza para relacionar la entrega (OL) con la factura (T3). Asegúrate de incluir nuevamente la tabla DLN1 en la consulta y ajustar las uniones correspondientes para relacionar las tablas adecuadamente.

  • Utiliza la columna N1.ShipDate: Esta columna representa la fecha de entrega de la línea de entrega (OL). Puedes utilizar esta columna en lugar de OL.DocDate para calcular la fecha de vencimiento de la factura de reserva.

  • Ajusta la lógica de cálculo de la fecha de vencimiento: Modifica la parte de la consulta donde se calcula la fecha de vencimiento para que utilice la columna N1.ShipDate en lugar de OL.DocDate. Puedes agregar la función DATEADD con la cantidad correcta de días adicionales según sea necesario.

SELECT DISTINCT
    T0.TransId,
    T0.Linea,
    -- Aquí continuas con tu código

    -- Ajuste de la lógica de cálculo de la fecha de vencimiento
    DATEADD(DAY, t2.ExtraDays, N1.ShipDate) as FechaVence,

    -- Sigue con el código...
    
FROM
    [dbo].[_SBOF_CXC_TABLA_DETALLE_Export] (@Fecha) T0
    INNER JOIN OCRD T1 ON T1.CardCode = T0.Codigo
    INNER JOIN OCTG T2 ON T2.GroupNum = T1.GroupNum
    LEFT JOIN OINV T3 ON T3.TransId = T0.TransId
    LEFT JOIN INV1 NV ON T3.DocEntry = NV.DocEntry
    INNER JOIN DLN1 N1 ON NV.DocEntry = N1.BaseEntry
    LEFT JOIN ODLN OL ON OL.DocEntry = N1.DocEntry
    -- Y sigues con el código...

Es importante tener en cuenta que esto es solo una sugerencia en base a lo que amablemente pudiste compartir. No dejes sin considerar otros aspectos o condiciones que seguro hay en tu entorno y no pueden ignorarse.

Ya leí tu presentación GRACIAS, entiendo que tienes poca experiencia por lo que en este caso mi recomendación final es buscar el soporte del partner que deben tener ahí donde estás. Y bueno, la buena voluntad no falta en el foro, seguramente alguien más podrá aportar algo adicional que arroje algo de luz extra al tema.

Saludines.

Hola buen día muchas gracias por sus comentarios y orientación sobre como se tiene que manejar el nivel de información y de tener unas buenas practicas.

Estaré buscando ayuda con el partnert, les agradezco muchos.

Este tema se cerró automáticamente 30 días después de la última publicación. No se permiten nuevas respuestas.