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.
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.
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.
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.
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
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.
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”)
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
¿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.
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:
Revisa que los datos en lt_billingdatain
estén correctos (estructura completa y campos llenos)
Verifica si la entrega está completamente facturada (VBUK-FKSTA = C)
Usa ST05
para comparar comportamiento
Revisa si necesitas ejecutar BAPI_TRANSACTION_COMMIT
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! 
