Es mas fácil de lo que imaginas. Es mas fácil que pegarle a un bolo (borracho) dormido (así decimos en mi país). Te explico:
Voy a asumir que estas familiarizado con las tablas de SAP Business One, haz lo siguiente:
- Haz un UNION en las tablas OJDT y JDT1 por medio del campo TransId.
- En la tabla JDT1, debes hacer un sum a la resta del campo Debit - Credit, y condicionar que esa suma este en el rango de fechas menor a la fecha inicial que quieres mostrar. Ejemplo: si vas a sacar un reporte del 1 al 30 de octubre de 2025, tu fecha inicial es ‘2025-10-01’ y tu fecha final es ‘2025-10-31’, por lo tanto, tu rango a tomar en cuenta para sacar el saldo inicial sera WHERE RefDate < FechaInicial.
No se si me doy a entender, pero si tienes dudas, pregúntame.
Te dejare como ejemplo un Store Procedure que hice para armar un libro diario mayor en SAP B1 versión HANA. Si lo quieres replicar a SQL, copialo y daselo a una IA como Claude para que te lo traduzca a SQL Server.
En este reporte, estoy yendo a traer el nombre de las cuentas contables, el numero de las cuentas, detallando el saldo diario por cuenta hasta el nivel 5, y a su vez, estoy sacando el saldo inicial.
– SP libro diario mayor
CREATE PROCEDURE LIBRO_DIARIO_MAYOR (
IN FechaInicial DATE,
IN FechaFinal DATE
)
LANGUAGE SQLSCRIPT
AS
BEGIN
lt_result =
SELECT
T1.“RefDate” AS “Fecha”,
T0.“Segment_0” AS “Cuenta nivel 6”,
T0.“AcctName” AS “Nombre cuenta nv 6”,
SUM(T2.“Debit”) AS “Debito”,
SUM(T2.“Credit”) AS “Credito”,
IFNULL((SELECT SUM(N1.“Debit” - N1.“Credit”) FROM JDT1 N1 WHERE T0.“AcctCode” = N1.“Account” AND N1.“RefDate” < :FechaInicial),0) AS “Saldo Acumulado”,
LEFT(T0.“Segment_0”, 2) AS “Cuenta nivel 2”,
(SELECT TX.“AcctName” FROM OACT TX WHERE TX.“AcctCode” = LEFT(T0.“Segment_0”, 2)) AS “Nombre cuenta nv 2”,
LEFT(T0.“Segment_0”, 4) AS “Cuenta nivel 3”,
(SELECT TX.“AcctName” FROM OACT TX WHERE TX.“AcctCode” = LEFT(T0.“Segment_0”, 4)) AS “Nombre cuenta nv 3”,
LEFT(T0.“Segment_0”, 6) AS “Cuenta nivel 4”,
(SELECT TX.“AcctName” FROM OACT TX WHERE TX.“AcctCode” = LEFT(T0.“Segment_0”, 6)) AS “Nombre cuenta nv 4”,
LEFT(T0.“Segment_0”, 8) AS “Cuenta nivel 5”,
(SELECT TX.“AcctName” FROM OACT TX WHERE TX.“AcctCode” = LEFT(T0.“Segment_0”, 8)) AS “Nombre cuenta nv 5”,
UPPER((SELECT TY.“AcctName” FROM OACT TY WHERE TY.“Levels” = 1 AND LEFT(TY.“AcctCode”,1) = LEFT(T0.“Segment_0”, 1))) AS “Nombre cuenta nv 1”,
(SELECT TZ.“PrintHeadr” FROM OADM TZ) AS “NombreEmpresa”,
(SELECT TZ.“RevOffice” FROM OADM TZ) AS “NIT”,
(SELECT TZ.“TaxIdNum” FROM OADM TZ) AS “NRC”
FROM OACT T0
INNER JOIN JDT1 T2 ON T0.“AcctCode” = T2.“Account”
INNER JOIN OJDT T1 ON T2.“TransId” = T1.“TransId”
WHERE T1.“RefDate” BETWEEN :FechaInicial AND :FechaFinal
GROUP BY T1.“RefDate”, T0.“Segment_0”, T0.“AcctName”, T0.“AcctCode”
ORDER BY T0.“Segment_0”, T1.“RefDate”;
SELECT * FROM :lt_result;
END;
Esto debería solucionar tu duda.
Saludos. 