Consultas complejas para SAP Bussines One con Chat-GPT

Post image

Chat GPT se convirtió en una herramienta sumamente útil que ha impresionado a todos desde el lanzamiento de DALL-E. Pero más allá de simplemente pensar en generar videos para YouTube de forma automática utilizando inteligencia artificial, considero que lo ideal es tomar esta herramienta en nuestras manos y crear cosas innovadoras.

Fue así como me encontré con un problema hace un par de semanas cuando intenté comprender las tablas de SAP, específicamente en relación a las tablas de facturas y pagos. A pesar de haber estudiado SAP BO por mi cuenta durante varios años, los cursos resultan ser bastante costosos, por lo que he aprendido a manejar esta herramienta de manera empírica.


Mi problema parecía sencillo:

Crear un query que obtuviera todas las facturas por artículo, pero agrupándolas por descripción y regresando el saldo pagado, el saldo vencido y el saldo facturado.


Parecía fácil, pero no lo fue ya que no comprendía al 100% las relaciones en SAP. Así que decidí experimentar con Chat GPT y probar suerte.


Empecé con la siguiente pregunta para darle un poco de contexto:

¿Conoces SAP Business One?


Sí, como modelo de lenguaje de IA, estoy familiarizado con SAP Business One. SAP Business One es un software de gestión empresarial diseñado específicamente para pequeñas y medianas empresas (PYMES). Ofrece una amplia gama de funciones, como gestión financiera, gestión de inventario, gestión de compras, gestión de ventas, gestión de relaciones con clientes (CRM), gestión de proyectos y más. SAP Business One se utiliza comúnmente en empresas que operan en múltiples ubicaciones y necesitan integrar sus procesos empresariales. Además, SAP Business One se integra con otras aplicaciones de SAP, lo que lo convierte en una solución completa para la gestión empresarial.


Era obvio que supiera sobre la herramienta, pero comence a describirle mi problema.

Genera un query para obtener un reporte de facturado y pagado por mes


SELECT
    MONTH(invoice_date) AS mes,
    YEAR(invoice_date) AS anio,
    SUM(total) AS facturado,
    SUM(paid_amount) AS pagado
FROM
    invoices
WHERE
    status = 'pagada' AND
    invoice_date BETWEEN 'fecha_inicio' AND 'fecha_fin'
GROUP BY
    MONTH(invoice_date),
    YEAR(invoice_date)


Pareceria que entendio el contexto, pero no!, quizas fue mi error no especificar que lo obtuviera de SAP BO, asi que volvamos a intentar.


Genera un query para sap bussines one y obtener un reporte de facturado y juntalo con el monto pagado y la descripcion de la factura


SELECT
    MONTH(OINV.DocDate) AS mes,
    YEAR(OINV.DocDate) AS anio,
    OINV.DocNum AS numero_factura,
    OINV.CardName AS nombre_cliente,
    OINV.Comments AS descripcion_factura,
    OINV.DocTotal AS facturado,
    OINV.PaidToDate AS pagado,
    OINV.DocTotal - OINV.PaidToDate AS saldo_pendiente
FROM
    OINV
WHERE
    OINV.DocStatus = 'O' AND
    OINV.DocDate BETWEEN '[fecha_inicio]' AND '[fecha_fin]'


¡Voilà! Tomó al menos 2 intentos previos para que me comprendiera que necesitaba tablas como OINV para obtener las facturas. Entonces, comprendí que ya entendía el concepto al que necesitaba llegar, pero también comprendí que necesitaba ser mucho más específico. Entonces, me tomó un par de minutos y prompts llegar a lo siguiente.


SELECT
    OITM.ItemName AS Articulo,
    SUM(INV1.LineTotal) AS Facturado,
    SUM(INV1.LineTotal - ISNULL(Pagos.Pagado, 0)) AS Saldo,
    SUM(Pagos.Pagado) AS Pagado
FROM
    INV1
    INNER JOIN OINV ON INV1.DocEntry = OINV.DocEntry
    INNER JOIN OITM ON INV1.ItemCode = OITM.ItemCode
    LEFT JOIN (
        SELECT
            RCT2.DocEntry,
            SUM(RCT2.SumApplied) AS Pagado
        FROM
            RCT2
        GROUP BY
            RCT2.DocEntry
    ) Pagos ON INV1.DocEntry = Pagos.DocEntry
WHERE
    OINV.DocStatus = 'O'
GROUP BY
    OITM.ItemName


Este fue uno de mis queries finales, no fue el que realmente implementé, pero me dio el 80% de la estructura que necesitaba. Impresionan los conceptos que va tomando, como subqueries en tablas como RCT2.

Muchas veces fallaba el query que me arrojaba, pero es válido dar prompts como los siguientes.

El saldo_pendiente esta correcto?

El cálculo del saldo pendiente en la consulta que te proporcioné previamente puede no estar totalmente correcto, ya que se basa en la suposición de que no hay pagos parciales en las facturas. Si existen pagos parciales, el saldo pendiente se calcula de forma diferente.

Para obtener el saldo pendiente correctamente, debes unir la tabla RCT2 (tabla de pagos recibidos) con la tabla INV1 y hacer el cálculo utilizando la cantidad pagada en la tabla RCT2. Aquí te proporciono una consulta actualizada que realiza este cálculo:


Siempre recordandome que debes de ser especifico.

Incluye Dscription de inv1

or favor, para asegurarnos de estar entendiendo correctamente, ¿podrías confirmarnos si te refieres al campo "Description" de la tabla INV1 en SAP Business One?


Inclusive quise poner en duda sus querys ya que me retornaba campos que eran de versiones antiguas.

Puedes actualizar la consulta para la version v10 de sap bussines one

SELECT
    OPYM.TransId AS NumeroPago,
    OPYM.DocDate AS FechaPago,
    INV1.DocTotal AS TotalFactura,
    COALESCE(Pagos.Pagado, 0) AS TotalPagado,
    INV1.DocNum AS NumeroDocumento,
    INV1.CardCode,
    OPYM.PayType AS MetodoPago,
    INV1.Dscription,
    OINV.Series
FROM
    INV1
    INNER JOIN OINV ON INV1.DocEntry = OINV.DocEntry
    LEFT JOIN (
        SELECT
            RCT2.DocEntry,
            SUM(RCT2.SumApplied) AS Pagado
        FROM
            RCT2
            INNER JOIN ORCT ON RCT2.DocNum = ORCT.DocNum
        WHERE
            ORCT.Canceled = 'N'
            AND ORCT.DocDate BETWEEN '2023-01-01' AND '2023-02-20'
        GROUP BY
            RCT2.DocEntry
    ) Pagos ON INV1.DocEntry = Pagos.DocEntry
    LEFT JOIN OPYM ON Pagos.DocEntry = OPYM.DocEntry
WHERE
    OINV.[DocDate] BETWEEN '2023-01-01' AND '2023-02-20'
    AND OINV.Canceled = 'N'
ORDER BY
    OINV.CardCode,
    OINV.Series,
    INV1.DocNum


Simplemente impresionante, algunas de las consultas eran erroneas o estaban mal los campos, pero comprendia el conxtexto y la necesidad principal.

Me encantaria saber tus comentarios o algun experimento, asi que puedes mandarme un mensaje en mis redes o unirte a nuestro grupo de Facebook y charlamos.

Happy coding!!

También te puede interesar