Error Documento facturado completamente con BAPI

Hola gente espero esta vez me puedan dar una luz ya que llevo casi 3 semanas sin poder saber que puede estar pasando.

El problema que tengo es que cuando uso la RFC desde el programa ABAP me arroja el error en los mensajes de la tabla return Documento facturado completamente, sin embargo si llego a ejecutar la RFC directamente por la SE37 con los mismos valores que tengo en el programa genera la Nota credito sin ningun problema.
La RFC utiliza la BAPI: BAPI_BILLINGDOC_CREATEMULTIPLE

Tambien envio los datos directamente a la BAPI y sale lo mismo, pero si ejecuto la BAPI por la se37 me genera la NC sin problema.

Ya revisamos los temas de permisos pero sigue saliendo lo mismo.

Este es parte del codigo:

CLEAR ls_billingdatain.
REFRESH lt_billingdatain.
ls_billingdatain-salesorg = 'CO01'.
ls_billingdatain-distr_chan = '75'.
ls_billingdatain-division = '10'.
ls_billingdatain-doc_type = 'ZNCD'
ls_billingdatain-sold_to = '0000003002'.
ls_billingdatain-plant = 'CS06'.
ls_billingdatain-ref_doc = 'el num de entrega'.
ls_billingdatain-ref_doc_ca = 'J'." Para que haga la NC con referencia a la entrega
APPEND ls_billingdatain TO lt_billingdatain.

CALL FUNCTION 'Z_MFSD_GDC0085'
IMPORTING
NUM_FACTURA = gv_NUM_FACTURA
TABLES
lt_return = lt_return2
lt_billingdatain = lt_billingdatain.

Importante : La siguiente respuesta es generada por nuestro Robot de la comunidad de Consultoria-SAP.com denominado “CSAPBOT” usando tecnología de inteligencia artificial. Por lo tanto, puede haber datos incorrectos. No garantizamos que la información sea 100% correcta, solo consultores SAP profesionales podrían verificar la información.

Si deseas aportar tus ideas para mejorar nuestros sistemas, te esperamos en este debate de la comunidad.


:receipt: ABAP – Problema con ejecución de BAPI_BILLINGDOC_CREATEMULTIPLE desde RFC vs SE37 (Mensaje: “Documento facturado completamente”)

Hola, gracias por tu explicación clara y el código compartido. Lo que estás enfrentando es un caso clásico de comportamiento diferente entre la ejecución directa en SE37 y la ejecución desde un programa ABAP o RFC, lo cual muchas veces no tiene que ver con permisos, sino con contexto de ejecución, buffers o data inconsistente.


:dart: Entendamos primero el mensaje:

Mensaje en RETURN: “Documento facturado completamente”

Esto viene del control estándar de facturación que indica que el documento de referencia (entrega o factura) ya fue completamente facturado, y por tanto no permite crear una nueva Nota de Crédito con referencia.

Pero si al probar en SE37 la BAPI sí permite la creación… entonces algo no está igual entre ambos escenarios.


:white_check_mark: Posibles causas (y cómo resolverlas)

1. Buffer de memoria / commit / entorno de ejecución

Cuando ejecutas en SE37, estás en un entorno de prueba limpio, sin variables previas ni conflictos en memoria.

Pero al ejecutarse desde el programa ABAP o una RFC, el sistema puede:

  • Mantener variables internas cargadas.
  • No hacer COMMIT WORK en el momento adecuado.
  • Tener conflictos por ejecución en segundo plano o sesión sin sincronización.

:wrench: Sugerencia:

  • Asegúrate de ejecutar COMMIT WORK después de la BAPI (algunas implementaciones requieren confirmarlo).
  • Verifica si el programa ABAP tiene llamadas previas a otras BAPIs que estén bloqueando o modificando el estado de la entrega/factura.

2. Referencia inválida o sin disponibilidad para NC

En tu código estás pasando:

ls_billingdatain-ref_doc = 'el num de entrega'.
ls_billingdatain-ref_doc_ca = 'J'.
  • 'J' = referencia a entrega
  • La entrega debe estar:
    • Ya facturada
    • Pero aún disponible para una NC
    • Tener documentos relevantes en su historial

:bulb: Verifica en la entrega (VL03N) si el estado de facturación es completamente facturado (campo VBUK-FKSTA = C). Si es así, SAP bloquea nuevas facturas/NCs, a menos que se habilite manualmente.


3. Datos incompletos o incorrectos en el lt_billingdatain

Aunque lo ves bien en la SE37, en ejecución vía programa puede estar llegando vacío o mal formado.

:heavy_check_mark: Revisa antes del CALL FUNCTION que los campos obligatorios estén correctos:

  • ref_doc
  • ref_doc_ca
  • salesorg, distr_chan, division, doc_type
  • Y el flag de referencia correcta (ej. si es “Delivery” o “Invoice”)

:test_tube: Prueba haciendo un BREAK-POINT o WRITE en el programa antes del CALL FUNCTION para confirmar que el lt_billingdatain tiene realmente la misma data que en tu prueba manual.


4. Incompatibilidad en ejecución RFC/BATCH

Si estás ejecutando la BAPI desde:

  • Un job batch
  • Un entorno RFC externo
  • Un WebService o PI/PO

…entonces es posible que:

  • El RFC no tenga el mismo contexto de usuario
  • La entrega no esté desbloqueada en ese momento
  • Se necesite hacer un BAPI_TRANSACTION_COMMIT explícito después de la llamada

:hammer_and_wrench: ¿Qué puedes hacer para depurar esto?

A. Usa el ST05 (SQL Trace)

Activa el trace antes de ejecutar desde tu programa y luego compáralo con el trace cuando ejecutas desde SE37.

Te permitirá ver:

  • Si hay SELECTs distintos
  • Si hay bloqueos o skips por buffering

B. Valida la entrega con VBFA o VBUK

Revisa en tablas como VBFA si ya hay una relación de factura para esa entrega.
Revisa también el campo VBUK-FKSAK y FKSTK.


C. Verifica el mensaje de retorno exacto

LOOP AT lt_return2 INTO DATA(ls_ret).
  WRITE: / ls_ret-type, ls_ret-id, ls_ret-number, ls_ret-message.
ENDLOOP.

Esto puede darte un ID y Número que puedes buscar en transacción SE91 y rastrear el mensaje exacto para saber qué validación lo lanza.


:white_check_mark: Resumen Consultoria-SAP

Si al ejecutar BAPI_BILLINGDOC_CREATEMULTIPLE desde un programa ABAP (o RFC) te devuelve el mensaje “Documento facturado completamente”, pero al ejecutar desde SE37 sí funciona:

:heavy_check_mark: Revisa que los datos en lt_billingdatain estén correctos (estructura completa y campos llenos)
:heavy_check_mark: Verifica si la entrega está completamente facturada (VBUK-FKSTA = C)
:heavy_check_mark: Usa ST05 para comparar comportamiento
:heavy_check_mark: Revisa si necesitas ejecutar BAPI_TRANSACTION_COMMIT
:heavy_check_mark: Asegúrate de que no hay buffering o contexto distinto entre RFC y ejecución directa

Desde Consultoria-SAP.com, recomendamos crear un pequeño programa standalone de prueba que haga solo el CALL FUNCTION con el mismo lt_billingdatain, para aislar el problema del entorno completo.

¿Quieres que te ayudemos a simularlo paso a paso? Pasa el contenido real que cargas en lt_billingdatain y te ayudamos a validarlo.

¡Estamos aquí para ayudarte! :computer::mag: