Por qué su reporte de ventas de SAP Business One no cuadra: el descuento de cabecera en INV1
Por Zain Abbas, Kodenova · Actualizado el
El síntoma
Usted construye un reporte de ventas, un dashboard o un modelo de Power BI a partir de SAP Business One. El total se acerca a la cifra de SAP, pero no es igual. Contabilidad no confía en el dashboard, y tiene razón.
Nos pasó al probar el dashboard de Kodenova para SAP B1 en una empresa real. La primera versión sumaba las líneas de las facturas y devolvía 49,085.44. La cifra de SAP para el mismo periodo era 49,058.00. La diferencia de 27.44 venía de una sola cosa: un descuento escrito en el pie de la factura.
Por qué ocurre
Una factura de clientes guarda valores en dos niveles:
- INV1 (líneas):
LineTotal,GrssProfit,Quantity. LineTotal es después del descuento de la fila. - OINV (cabecera):
DiscPrcntyDiscSumpara el descuento del documento, además deDocTotal,VatSumyTotalExpns.
El descuento del pie se aplica a todo el documento y no se vuelve a escribir en cada línea. Por eso, cuando usted hace SUM(T1."LineTotal"), suma valores que todavía están antes de ese descuento. La mayoría de las facturas no tiene descuento en el pie, y por eso el error es pequeño y fácil de pasar por alto.
La corrección en SQL
Traiga el descuento de cabecera a la consulta de líneas y aplíquelo por documento:
SELECT T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt",
T1."ItemCode",
SUM(T1."LineTotal") AS "Net",
SUM(T1."GrssProfit") AS "GP"
FROM OINV T0
INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101'
GROUP BY T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt", T1."ItemCode"
Luego, para cada fila:
- venta neta después del descuento =
Net − Net × DiscPrcnt / 100 - utilidad bruta después del descuento =
GP − Net × DiscPrcnt / 100
Ejecute la misma consulta sobre ORIN y RIN1 para las notas de crédito y trate esos valores como negativos.
Aplicamos el porcentaje en código y no en SQL porque algunos entornos, como las SQLQueries del Service Layer con una lista de permitidos restringida, rechazan expresiones en la lista del select. Si su entorno permite aritmética, puede hacerlo directamente en SQL.
Cómo comprobar su cifra contra SAP
Antes de confiar en cualquier reporte, concílielo una vez con una consulta a nivel de cabecera. Las ventas netas sin IVA ni fletes son:
SELECT
(SELECT SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns")
FROM OINV T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')
-
(SELECT ISNULL(SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns"), 0)
FROM ORIN T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')
En SAP HANA, use IFNULL en lugar de ISNULL. En nuestra prueba esto devolvió 49,058.00, exactamente lo mismo que la consulta de líneas corregida.
Todavía pueden aparecer pequeñas diferencias si los documentos usan redondeo o anticipos, porque también viven en la cabecera. Si ve una diferencia, revise esos campos a continuación.
Lista de verificación para cualquier reporte de ventas de SAP B1
- Filtre
CANCELED = 'N'. - Reste las notas de crédito (ORIN/RIN1).
- Aplique el descuento de cabecera tanto a las ventas netas como a la utilidad bruta.
- Use un solo campo de moneda de forma consistente (
LineTotalpara moneda local). - Concilie una vez contra
DocTotal − VatSum − TotalExpnsantes de la salida en vivo.
Consultas listas que aplican esta corrección, ya sea leyendo los totales de cabecera o aplicando el factor de descuento a las líneas: Ventas por cliente en un rango de fechas, Los 20 artículos más vendidos, Ventas por empleado del departamento de ventas y Tendencia mensual de ventas.
Dónde importa más
Cualquier herramienta que lea líneas en lugar de cabeceras está expuesta: exportaciones a Excel, Crystal Reports, modelos de Power BI y dashboards a la medida. El dashboard de Kodenova para SAP B1 aplica el descuento de cabecera automáticamente a través de su conector local, por lo que sus totales coinciden con las cifras de SAP indicadas arriba.
Si sus reportes y SAP no coinciden y no encuentra la causa, envíenos la consulta. Este tipo de diferencia normalmente se encuentra en una sola sesión.
Fuentes
- SAP Learning: Managing SQL Queries Using Service Layer API
- SAP Learning: Creating Queries (SAP Business One)
Servicios relacionados
Preguntas frecuentes
¿INV1.LineTotal es antes o después del descuento del documento?
Antes. LineTotal es el total de la fila después del descuento de la fila, pero antes del descuento ingresado en el pie del documento. Ese descuento del pie se guarda en la cabecera como DiscPrcnt (porcentaje) y DiscSum (importe).
¿GrssProfit incluye el descuento de cabecera?
GrssProfit se calcula por fila, así que una suma a nivel de línea no ve el descuento del pie. Nosotros restamos el importe del descuento tanto de la utilidad bruta como de las ventas netas. Para confirmarlo con sus datos, compare con el campo de cabecera OINV.GrosProfit en una factura con descuento.
¿Hay que restar las notas de crédito?
Sí. Un reporte de ventas que ignora ORIN y RIN1 infla los ingresos. Trate las líneas de las notas de crédito como valores negativos y aplique su propio descuento de cabecera de la misma forma.
¿Se deben incluir las facturas canceladas?
No. Filtre por CANCELED = 'N'. Una factura cancelada y su documento de cancelación llevan ambos la marca CANCELED ('Y' y 'C'), e incluir cualquiera de los dos distorsiona los totales.
¿El resultado está en moneda local?
LineTotal está en moneda local. TotalFrgn guarda el valor en moneda extranjera. Use uno de los dos de forma consistente e indique la moneda en el reporte.
¿Listo para empezar?
Cuéntenos lo que necesita. Recibirá una respuesta técnica clara, un alcance definido y un precio fijo, normalmente en 24 horas.
