Como crear una factura con RV_INVOICE_CREATE

Hola a todos, espero se encuentran bien.

Estoy usando la función “RV_INVOICE_CREATE” para crear una factura a partir de una entrega que ya está contabilizada.
Ya llevo varios días probando con función en ABAP pero no consigo hacerla funcionar.
Algún ABAP de buen corazón que me pueda dar una mano?, mi problema radica en que no tengo claro como llenar las tablas.
Si tienen algún ejemplo que yo pueda adaptar me sería de gran utilidad, ojalá que se muestre de donde sacan la información y como lo hacen para llenar las tablas.
Tengan en cuenta que yo tengo el número de entrega que ya está contabilizada, y lo único que necesito es crear la factura.
Estye es mi código pero me sale el error: VF063

PARAMETERS: p_entreg TYPE vbeln.

* Declaración de tablas internas
DATA: lt_xkomfk TYPE TABLE OF komfk,
      lt_xkomv  TYPE TABLE OF komv,
      lt_xthead TYPE TABLE OF theadvb,
      lt_xvbfs  TYPE TABLE OF vbfs,
      lt_xvbpa  TYPE TABLE OF vbpavb,
      lt_xvbrk  TYPE TABLE OF vbrkvb,
      lt_xvbrp  TYPE TABLE OF vbrpvb,
      lt_xvbss  TYPE TABLE OF vbss,
      lt_pedido TYPE TABLE OF vbap.

* Declaración de estructuras
DATA: ls_vbsk_i TYPE vbsk,
      ls_xkomfk TYPE komfk,
      ls_xkomv  TYPE komv,
      ls_xthead TYPE theadvb,
      ls_xvbfs  TYPE vbfs,
      ls_xvbpa  TYPE vbpavb,
      ls_xvbrk  TYPE vbrkvb,
      ls_xvbrp  TYPE vbrpvb,
      ls_xvbss  TYPE vbss,
      ls_pedido TYPE vbap.

* Declaración de variables
DATA: lv_smart   TYPE vbsk-smart,
      lv_factura TYPE vbrkvb-vbeln,
      lv_pedido  TYPE lips-vgbel, "Pedido
      lv_auart   TYPE vbak-auart, "Clase de documento de ventas
      lv_fkara   TYPE tvak-fkara. " Clase de factura

* Inicialización de estructuras y tablas
CLEAR: ls_vbsk_i, ls_xkomfk, ls_xkomv, ls_xthead,
       ls_xvbfs, ls_xvbpa, ls_xvbrk,
       ls_xvbss, ls_pedido.

REFRESH: lt_xkomfk, lt_xkomv, lt_xthead,
         lt_xvbfs, lt_xvbpa, lt_xvbrk, lt_xvbrp,
         lt_xvbss, lt_pedido.

* Recupero el número de pedido a partir de la entrega
SELECT SINGLE vgbel INTO lv_pedido FROM lips WHERE vbeln = p_entreg.
IF sy-subrc <> 0.
  WRITE: /'1. No se encontró número de pedido para la entrega', p_entreg.
  EXIT.
ENDIF.

WRITE: /'Pedido:', lv_pedido.

* Recupero datos de la tabla VBAK este es la clase de doc de ventas
SELECT SINGLE auart INTO lv_auart FROM vbak WHERE vbeln = lv_pedido.
IF sy-subrc <> 0.
  WRITE: /'2. No se encontró la clase de documento de ventas'.
  EXIT.
ENDIF.

* Poblando estructura XKOMFK
ls_xkomfk-vbeln = p_entreg. "Entrega
ls_xkomfk-vbtyp = 'ZTA'. "Tipo de documento de factura
APPEND ls_xkomfk TO lt_xkomfk.

* Poblando estructura VBSK_I
ls_vbsk_i-mandt = sy-mandt.
ls_vbsk_i-sammg = 'X'.
ls_vbsk_i-smart = 'F'. "Clase de Grupo

* Obtener la clase de factura propuesta (Order Billing Type) desde la tabla TVAK
SELECT SINGLE fkara INTO lv_fkara FROM tvak WHERE auart = lv_auart.
IF sy-subrc <> 0.
  WRITE: /'3. No se encontró la clase de factura propuesta'.
  EXIT.
ENDIF.

* Recupero los datos del pedido
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_pedido FROM vbap WHERE vbeln = lv_pedido.
IF sy-subrc <> 0.
  WRITE: / '6. No se encontraron pedidos para la entrega:', p_entreg.
  EXIT.
ENDIF.

LOOP AT lt_pedido INTO ls_pedido.
  CLEAR: ls_xvbrp, ls_xvbrk.
  ls_xvbrp-posnr = ls_pedido-posnr. "Posición de factura
  ls_xvbrp-vbeln = ls_pedido-vbeln. "Documento de facturación
  ls_xvbrk-vbeln = ls_pedido-vbeln. "Documento de facturación
  ls_xvbrk-fkart = lv_fkara.  "Clase de factura
  APPEND ls_xvbrp TO lt_xvbrp.
  APPEND ls_xvbrk TO lt_xvbrk.
ENDLOOP.

CALL FUNCTION 'RV_INVOICE_CREATE'
  EXPORTING
    vbsk_i = ls_vbsk_i
  TABLES
    xkomfk = lt_xkomfk
    xkomv  = lt_xkomv
    xthead = lt_xthead
    xvbfs  = lt_xvbfs
    xvbpa  = lt_xvbpa
    xvbrk  = lt_xvbrk
    xvbrp  = lt_xvbrp
    xvbss  = lt_xvbss.

* Mostrar mensajes de retorno
LOOP AT lt_xvbfs INTO ls_xvbfs.
  WRITE: /'Tipo de Mensaje: ', ls_xvbfs-msgty,
        /'Mensaje1: ', ls_xvbfs-msgv1,
        /'Mensaje2: ', ls_xvbfs-msgv2,
        /'Mensaje3: ', ls_xvbfs-msgv3,
        /'Mensaje4: ', ls_xvbfs-msgv4.
ENDLOOP.

* Guarda si no hay errores
READ TABLE lt_xvbfs INTO ls_xvbfs WITH KEY msgty = 'E'.
IF sy-subrc <> 0.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.

* Mostrar el número de la factura creada
READ TABLE lt_xvbrk INTO ls_xvbrk INDEX 1.
IF sy-subrc = 0.
  lv_factura = ls_xvbrk-vbeln.
  WRITE: / 'Factura creada con éxito:', lv_factura.
ENDIF.

Paso un ejemplo que funciona, hay que llenar menos tablas entiendo:

DATA: lt_xkomfk TYPE TABLE OF komfk,
        lt_xkomv  TYPE TABLE OF komv,
        lt_xthead TYPE TABLE OF theadvb,
        lt_xvbfs  TYPE TABLE OF vbfs,
        lt_xvbpa  TYPE TABLE OF vbpavb,
        lt_xvbrk  TYPE TABLE OF vbrkvb,
        lt_xvbrp  TYPE TABLE OF vbrpvb,
        lt_xvbss  TYPE TABLE OF vbss.

  DATA: wa_vbsk_i TYPE vbsk,
        wa_xkomfk TYPE komfk,
        wa_xvbfs  TYPE vbfs.

  DATA: lv_date TYPE sy-datum.

  CLEAR wa_xkomfk.

  MOVE p_vbeln TO wa_xkomfk-vbeln.

  SELECT SINGLE vbtyp
    FROM vbak
    INTO wa_xkomfk-vbtyp
    WHERE vbeln EQ p_lv_vbeln.

  APPEND wa_xkomfk TO lt_xkomfk.

  lv_date = p_date.

  CALL FUNCTION 'RV_INVOICE_CREATE'
    EXPORTING
      delivery_date = lv_date
      invoice_date  = lv_date
      pricing_date  = lv_date
      vbsk_i        = wa_vbsk_i
      with_posting  = 'B'
    TABLES
      xkomfk        = lt_xkomfk
      xkomv         = lt_xkomv
      xthead        = lt_xthead
      xvbfs         = lt_xvbfs
      xvbpa         = lt_xvbpa
      xvbrk         = lt_xvbrk
      xvbrp         = lt_xvbrp
      xvbss         = lt_xvbss.

Bueno la solución es la siguiente:
Gracias a los que han respondido, les dejo la solución que a mi me funcionó por si alguien lo requiere:

FUNCTION z_mfsd_gdc0079.
*“----------------------------------------------------------------------
"“Interfase local
*” IMPORTING
*” VALUE(REF_DOC) TYPE VGBEL
*" EXPORTING
*" VALUE(NUM_FACTURA) TYPE BILL_DOC
*" TABLES
*" LT_RETURN STRUCTURE BAPIRET2
*"----------------------------------------------------------------------

  • Declaración de tablas internas
    DATA: lt_billing_data_in TYPE TABLE OF bapivbrk,
    lt_success TYPE TABLE OF bapivbrksuccess,
    lt_entrega TYPE TABLE OF lips.

  • Declaración de estructuras
    DATA: ls_billing_data_in TYPE bapivbrk,
    ls_success TYPE bapivbrksuccess,
    ls_return TYPE bapiret1,
    ls_entrega TYPE lips.

  • Declaración de variables
    DATA: lv_cliente TYPE vbak-kunnr, " Cliente
    lv_pedido TYPE lips-vgbel, "Pedido
    lv_vkorg TYPE likp-vkorg, "Organización de ventas
    lv_auart TYPE vbak-auart, "Clase de documento de ventas
    lv_fkara TYPE tvak-fkara, "Clase de factura propuesta para una factura por pedido
    lv_vbtyp TYPE vbak-vbtyp. "Tipo de documento

  • Obtener el cliente desde la entrega
    CLEAR: lv_cliente, lv_vkorg.
    SELECT SINGLE kunnr vkorg
    INTO (lv_cliente, lv_vkorg)
    FROM likp
    WHERE vbeln = ref_doc. " Número de entrega

  • Recupero el número de pedido a partir de la entrega
    CLEAR lv_pedido.
    SELECT SINGLE vgbel
    INTO lv_pedido
    FROM lips
    WHERE vbeln = ref_doc.

  • Recupero datos de la tabla VBAK este es la clase de doc de ventas
    CLEAR: lv_auart, lv_vbtyp.
    SELECT SINGLE auart vbtyp
    INTO (lv_auart, lv_vbtyp)
    FROM vbak
    WHERE vbeln = lv_pedido.

    " Obtener la clase de factura propuesta (Order Billing Type) desde la tabla TVAK
    CLEAR lv_fkara.
    SELECT SINGLE fkara
    INTO lv_fkara
    FROM tvak
    WHERE auart = lv_auart.

  • Recupero los datos del pedido
    REFRESH lt_entrega.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_entrega
    FROM lips
    WHERE vbeln = ref_doc.

    IF sy-subrc = 0.
    LOOP AT lt_entrega INTO ls_entrega.
    CLEAR: ls_billing_data_in.
    ls_billing_data_in-salesorg = lv_vkorg. " Organización de ventas
    ls_billing_data_in-distr_chan = ls_entrega-vtweg. " Canal de distribución
    ls_billing_data_in-division = ls_entrega-spart. " División (Sector)
    ls_billing_data_in-doc_type = lv_auart. " Tipo de documento de facturación - Clase de documento de venta ZTA
    ls_billing_data_in-ref_doc = ls_entrega-vbeln. " Número de entrega
    ls_billing_data_in-item_categ = ls_entrega-pstyv. "Tipo de posición de documento comercial
    ls_billing_data_in-doc_number = ls_entrega-vbeln. "Entrega
    ls_billing_data_in-itm_number = ls_entrega-posnr. "Posición del documento de venta
    ls_billing_data_in-ordbilltyp = lv_fkara. "Clase de factura propuesta para una factura por pedido
    ls_billing_data_in-price_date = sy-datum. "Fecha para la determinación de precios y tipo de cambio
    ls_billing_data_in-ref_doc_ca = lv_vbtyp. "Categoría del documento comercial anterior
    ls_billing_data_in-sold_to = lv_cliente. "Solicitante
    ls_billing_data_in-material = ls_entrega-matnr. " Material
    ls_billing_data_in-plant = ls_entrega-werks. " Planta
    ls_billing_data_in-ref_doc_ca = ‘J’.
    "ls_billing_data_in-req_qty = ls_entrega-kwmeng. "Cantidad de pedido acumulada en unidades de ventas
    "ls_billing_data_in-sales_unit = ls_entrega-vrkme. "Unidad de ventas
    "ls_billing_data_in-currency = ls_entrega-waerk. "Moneda del documento SD (SD document currency)
    APPEND ls_billing_data_in TO lt_billing_data_in.
    ENDLOOP.
    ENDIF.

  • Llamar a la BAPI para crear la factura
    CALL FUNCTION ‘BAPI_BILLINGDOC_CREATEMULTIPLE’
    TABLES
    billingdatain = lt_billing_data_in
    return = lt_return
    success = lt_success.

  • Guarda si no hay errores
    CLEAR: ls_return.
    READ TABLE lt_return INTO ls_return WITH KEY type = ‘E’.
    IF sy-subrc <> 0.
    CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
    EXPORTING
    wait = ‘X’.

  • Mostrar el número de la factura creada
    LOOP AT lt_success INTO ls_success.
    num_factura = ls_success-bill_doc.
    ENDLOOP.
    ENDIF.

ENDFUNCTION.

Este tema se cerró automáticamente 7 días después de la última publicación. No se permiten nuevas respuestas.