Archivo

Posts Tagged ‘BAPI’

BAPI para liberar documentos de venta (VKM1)

Caso: se requería encontrar una BAPI para liberar documentos de venta por bloqueo de facturación (cliente bloqueado por gestión de crédito).

Solución: la función SD_ORDER_CREDIT_RELEASE funciona perfecto, indicándole el documento de venta y si queremos que sea sincrónica la actualización.

CALL FUNCTION 'SD_ORDER_CREDIT_RELEASE'
        EXPORTING
          vbeln       = lv_vbeln
          if_synchron = 'X'.

      

Anuncio publicitario
Categorías: ABAP/4, BAPIs Etiquetas: , , , , ,

BAPI_ACC_DOCUMENT_POST – Actualizar campo REBZG

Caso: Al querer modificar los campos REBZG, REBZZ, REBZJ, la BAPI_ACC_DOCUMENT_POST no tiene disponibles los campos.

Solución: Se debe revisar la nota SAP 487722, en la cual indica en la segunda opción (la que utilicé yo) la creación de una BTE por la FIBF.

Pasos:

1. Por lo pronto, se debe hacer la llamada a la BAPI BAPI BAPI_ACC_DOCUMENT_POST con la tabla EXTENSION1 (no agrego todo el código para no aburrir)

DATA:it_bapiacextc TYPE TABLE OF bapiacextc.

DATA lwa_bapiacextc TYPE bapiacextc.

CLEAR lwa_bapiacextc.

lwa_bapiacextc-field1 = lv_posnr.

lwa_bapiacextc-field2 = lwa_out-belnr. » Nro. documento factura

lwa_bapiacextc-field3 = lwa_out-gjahr. » Ejercicio doc.factura

lwa_bapiacextc-field4 = ‘001’. » Posición doc.factura (siempre 001)

APPEND lwa_bapiacextc TO it_bapiacextc.

CALL FUNCTION ‘BAPI_ACC_DOCUMENT_POST’

EXPORTING

documentheader = lwa_header

TABLES

accountgl = lit_accountgl

currencyamount = lit_curr

extension1 = it_bapiacextc » Se habilita esta tabla para enviar el doc.ref.fact

return = lit_return

extension2 = it_bapiparex.

2. Luego por la SE37, copiamos el módulo de función SAMPLE_INTERFACE_RWBAPI01 (en mi caso la copié al módulo ZACT_DOC_REF_FACT_RWBAPI01), en donde vamos a agregar el código para actualizar los campos. Se crea entonces el módulo de funciones: ZACT_DOC_REF_FACT_RWBAPI01.

3. Modificamos la función para modificar los campos

DATA: lw_bapiacextc TYPE bapiacextc.

LOOP AT extension.

MOVE extension TO lw_bapiacextc.

LOOP AT it_accit WHERE posnr = lw_bapiacextc-field1.

it_accit-rebzg = lw_bapiacextc-field2.

it_accit-rebzj = lw_bapiacextc-field3.

it_accit-rebzz = lw_bapiacextc-field4.

modify it_accit.

ENDLOOP.

ENDLOOP.

4. Luego ingresamos a la transacción FIBF para crear una BTE:

5. Finalmente al ejecutar la BAPI, vemos que se actualizan los campos requeridos

Error RW022 en BAPI_ACC_DOCUMENT_POST o BAPI_ACC_DOCUMENT_CHECK

Caso: Al ejecutar la BAPI BAPI_ACC_DOCUMENT_CHECK o la BAPI_ACC_DOCUMENT_POST se genera el error RW022 “Interfase RW: Saldo en moneda de transacción” y el monto de diferencia es de un monto mínimo (ejemplo, 1 o 2 pesos chilenos –CLP-). También aparece como cabecera el error RW609: Error en el documento: BKPFF ….


Solución:
Luego de dar varias vueltas al tema y dado que estaba trabajando con una moneda distinta a la moneda de la sociedad, el problema era al traspasar los valores al campo AMT_DOCCUR. Utilicé entonces la BAPI_CURRENCY_CONV_TO_EXTERNAL y funcionó OK.

CALL FUNCTION ‘BAPI_CURRENCY_CONV_TO_EXTERNAL’
EXPORTING
currency = wa_currencyamount-currency
amount_internal = wa_datos-monto_prov
IMPORTING
amount_external = wa_currencyamount-amt_doccur.

Va el código:

DATA: wa_documentheader TYPE bapiache09,
      it_accountgl      TYPE STANDARD TABLE OF bapiacgl09,
      wa_accountgl      TYPE bapiacgl09,
      it_currencyamount TYPE STANDARD TABLE OF bapiaccr09,
      wa_currencyamount TYPE bapiaccr09,
      it_return         TYPE STANDARD TABLE OF bapiret2,
      wa_return         TYPE bapiret2,
      lw_error          TYPE ty_error,
      lv_posnr_acc      TYPE posnr_acc,
      wa_datos          TYPE ty_datos,
      lv_gl_account     TYPE hkont,
      lv_importe        TYPE bapidoccur.
 
* Clear de tablas internas
REFRESH: it_accountgl,
         it_currencyamount,
         it_return.
 
* Cabecera del documento
CLEAR: wa_documentheader.
MOVE sy-uname                TO wa_documentheader-username.   " Usuario
MOVE p_bukrs                 TO wa_documentheader-comp_code.  " Sociedad
MOVE pa_stida                TO wa_documentheader-doc_date.   " Fecha del documento
MOVE p_fecha_doc             TO wa_documentheader-pstng_date. " Fecha de contabilización
MOVE 'AB'                    TO wa_documentheader-doc_type.   " Tipo de documento
MOVE p_texto_periodo         TO wa_documentheader-header_txt. " Texto cabecera documento
MOVE 'RFBU'                  TO wa_documentheader-bus_act.    " Operación empresarial
 
lv_posnr_acc = '0000000000'.                                  " Inicializo la Posición
* GL Account 001
CLEAR: lv_importe.
LOOP AT pt_datos INTO wa_datos.
 
  CLEAR : wa_accountgl, wa_currencyamount.
  ADD 1 TO lv_posnr_acc.
  MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = pa_gast          " Cuenta de gasto
    IMPORTING
      output = lv_gl_account.
 
  MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
  MOVE p_texto_periodo           TO wa_accountgl-item_text.   " Texto del ítem
  MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
  MOVE wa_datos-gsber            TO wa_accountgl-bus_area.    " División
  MOVE wa_datos-kostl            TO wa_accountgl-costcenter.  " Centro de costo = CeBe
  wa_accountgl-acct_type = 'S'.
  APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
  MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento /// curr_type ==>  10  Moneda de sociedad
  MOVE '00'                      TO wa_currencyamount-curr_type.  " Currency Type
  MOVE p_moneda                  TO wa_currencyamount-currency .  " Moneda
 
*      wa_currencyamount-amt_doccur = wa_datos-monto_prov.           " Aquí estaba el error, para CLP no funcionaba
  CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
    EXPORTING
      currency        = wa_currencyamount-currency
      amount_internal = wa_datos-monto_prov
    IMPORTING
      amount_external = wa_currencyamount-amt_doccur.
 
  ADD wa_currencyamount-amt_doccur TO lv_importe.                " MOD Q_EPURICELLI - 21.04.2016 -
  APPEND wa_currencyamount TO it_currencyamount.
ENDLOOP.
 
* GL Account 002
CLEAR : wa_accountgl, wa_currencyamount.
 
ADD 1 TO lv_posnr_acc.
MOVE lv_posnr_acc              TO wa_accountgl-itemno_acc.  " Line Item No
 
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = pa_prov          " Cuenta de provisión
  IMPORTING
    output = lv_gl_account.
 
MOVE lv_gl_account             TO wa_accountgl-gl_account.  " Cuenta contable - G/L Account
MOVE p_bukrs                   TO wa_accountgl-comp_code.   " Sociedad
MOVE 'Prov.incobrables'        TO wa_accountgl-item_text.   " Texto del ítem
wa_accountgl-acct_type = 'S'.
APPEND wa_accountgl TO it_accountgl.
 
* Fill Currency Line item
MOVE lv_posnr_acc              TO wa_currencyamount-itemno_acc.  " Line Item No
* curr_type ==>  00  Moneda del documento // curr_type ==>  10  Moneda de sociedad
MOVE '00'                      TO wa_currencyamount-curr_type.   " Currency Type
MOVE p_moneda                  TO wa_currencyamount-currency .   " Moneda
lv_importe = lv_importe * -1.
MOVE  lv_importe               TO wa_currencyamount-amt_doccur. " Monto
APPEND wa_currencyamount TO it_currencyamount.
 
* Llamado a la BAPI MODO TEST
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
  EXPORTING
    documentheader = wa_documentheader
  TABLES
    accountgl      = it_accountgl
    currencyamount = it_currencyamount
    return         = it_return.
 
LOOP AT it_return INTO wa_return WHERE type = 'E'.
  p_error = 'X'.
  CONCATENATE 'E' wa_return-id wa_return-number INTO lw_error-error.
  lw_error-mensaje = wa_return-message.
  APPEND lw_error TO pt_error.
ENDLOOP.

Obtener Tipo de cambio con BAPI_EXCHANGERATE_GETDETAIL

Caso: se desea obtener el tipo de cambio entre dos monedas.

Solución: Utilizamos el siguiente código de ejemplo:

DATA: lv_fecha_ini TYPE sy-datum,
lv_kurst TYPE kurst_curr,
lv_fcurr_ori TYPE fcurr_curr,
lv_fcurr_des TYPE tcurr_curr,
lv_ukurs TYPE ukursp,
lc_ukurs TYPE char20,
lv_mensaje TYPE string.

START-OF-SELECTION.

* Busca el último tipo de cambio guardado en la transacción OB08, a partir de la fecha del día
lv_fecha_ini = sy-datum.
lv_kurst = ‘M’.
lv_fcurr_ori = ‘USD’.
lv_fcurr_des = ‘CLP’.

PERFORM obtener_tc USING lv_fecha_ini " Fecha a partir de…
lv_kurst " Tipo de Cotización
lv_fcurr_ori " Moneda origen
lv_fcurr_des " Moneda destino
CHANGING lv_ukurs. " T/C

IF lv_ukurs IS INITIAL.
MESSAGE w001(00) WITH ‘No existe tipo cambio para:’ lv_fecha_ini.
ELSE.
WRITE lv_ukurs TO lc_ukurs.
CONDENSE lc_ukurs.
CONCATENATE ‘T/C para:’
lv_fecha_ini+6(2)
‘.’
lv_fecha_ini+4(2)
‘.’
lv_fecha_ini(4)
‘ -> 1 ‘
lv_fcurr_ori
space
‘ = ‘
lc_ukurs
space
lv_fcurr_des
INTO lv_mensaje.
MESSAGE i001(00) WITH lv_mensaje ».
ENDIF.

FORM obtener_tc USING pi_fecha TYPE sy-datum
pi_kurst TYPE kurst_curr
pi_fcurr_ori TYPE fcurr_curr
pi_fcurr_des TYPE tcurr_curr
CHANGING po_ukurs TYPE ukursp.

DATA : l_exch_rate TYPE bapi1093_0,
l_fecha TYPE c LENGTH 10 VALUE space,
l_return TYPE bapiret1,
l_tcurr TYPE tcurr,
l_ukurs TYPE ukursp,
l_tc_encontrado TYPE c,
l_fecha_inicial TYPE sy-datum.

CLEAR l_tc_encontrado.
l_fecha_inicial = pi_fecha.

WHILE l_tc_encontrado IS INITIAL.

WRITE : pi_fecha TO l_fecha DD/MM/YYYY.

CALL FUNCTION ‘CONVERSION_EXIT_INVDT_INPUT’
EXPORTING
input = l_fecha
IMPORTING
output = l_fecha.

* Busco el registro en la tabla TCURR
SELECT SINGLE * INTO l_tcurr
FROM tcurr AS tcurr
WHERE tcurr~kurst EQ pi_kurst
AND tcurr~fcurr EQ ‘USD’
AND tcurr~tcurr EQ ‘CLP’
AND tcurr~gdatu EQ l_fecha.

IF ( sy-subrc EQ 0 ).
* Obtengo el tipo de cambio
CALL FUNCTION ‘BAPI_EXCHANGERATE_GETDETAIL’
EXPORTING
rate_type = ‘M’
from_curr = pi_fcurr_ori
to_currncy = pi_fcurr_des
date = l_fecha_inicial
IMPORTING
exch_rate = l_exch_rate
return = l_return.

* Si no lo encuentra, busco hacia atrás
IF ( l_return-type CA ‘S ‘ ).
po_ukurs = l_exch_rate-exch_rate.
l_tc_encontrado = ‘X’. " Encontré un tipo de cambio
ELSE.
l_fecha_inicial = l_fecha_inicial – 1.
ENDIF.
ELSE.
l_fecha_inicial = l_fecha_inicial – 1.
ENDIF.

ENDWHILE.

ENDFORM.

BAPI_INCOMINGINVOICE_PARK – BAPI para la MIR7

Caso: se requiere encontrar una BAPI para crear un documento factura y grabarlo en la MIR7.

Solución: El siguiente programa es un ejemplo de como utilizar la BAPI_INCOMINGINVOICE_PARK; se debe tener en cuenta que difiere la forma de utilizarla, según si el pedido es de materiales o de servicios (está relacionado con el uso de los campos sheet_no y sheet_item):

REPORT  zprueba_bapi_mir7.
 
DATA: x_in_header LIKE bapi_incinv_create_header,
      i_in_item   LIKE bapi_incinv_create_item OCCURS 0 WITH HEADER LINE,
      lc_belnr    LIKE bapi_incinv_fld-inv_doc_no,
      lc_gjahr    LIKE bapi_incinv_fld-fisc_year,
      lw_ekko     TYPE ekko,
      d_msg(110),
      lw_ekpo     TYPE ekpo,
      i_return    LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
 
SELECT SINGLE * FROM ekko INTO lw_ekko
  WHERE ebeln = '0060000120'.
 
CHECK sy-subrc EQ 0.
x_in_header-invoice_ind   = 'X'.
x_in_header-doc_type      = 'K1'.             " Tipo de documento
x_in_header-pstng_date    = '20141028'.       " Fecha contabilización
x_in_header-doc_date      = '20141025'.       " Fecha documento
x_in_header-ref_doc_no    = '60000120'.       " Referencia
x_in_header-comp_code     = '1000'.           " Sociedad
x_in_header-currency      = lw_ekko-waers.    " Moneda
x_in_header-gross_amount  = '787500'.         " Monto
x_in_header-calc_tax_ind  = 'X'.              " Calcular impuestos
x_in_header-bus_area      = 'VAP'.            " División
x_in_header-pmnttrms      = lw_ekko-zterm.    " Cond. de pago
x_in_header-diff_inv      = lw_ekko-lifnr.    " Proveedor
 
i_in_item-invoice_doc_item = '000001'.        " #Ítem
i_in_item-po_number        = '0060000120'.    " Nro. Pedido SAP
i_in_item-po_item          = '00010'.         " Pos. Pedido SAP
i_in_item-sheet_no         = '1000000606'.    " Recepción
i_in_item-sheet_item       = '0000000010'.    " Posición
i_in_item-TAX_CODE         = 'C1'.            " Ind. Impuestos
APPEND i_in_item. CLEAR i_in_item.
 
CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK'
  EXPORTING
    headerdata       = x_in_header
  IMPORTING
    invoicedocnumber = lc_belnr
    fiscalyear       = lc_gjahr
  TABLES
    itemdata         = i_in_item
    return           = i_return.
 
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
    wait = 'X'.
LOOP AT i_return.
  PERFORM f_message_prepare USING sy-langu
                                  i_return-id
                                  i_return-number
                                  i_return-message_v1
                                  i_return-message_v2
                                  i_return-message_v3
                                  i_return-message_v4
                         CHANGING d_msg.
  WRITE: / d_msg.
ENDLOOP.
IF NOT lc_belnr IS INITIAL.
  WRITE: / 'Doc :', lc_belnr.
  WRITE: / 'Año :', lc_gjahr.
ENDIF.
 
*&---------------------------------------------------------------------*
*&      Form  F_MESSAGE_PREPARE
*&--------------------------------------------------------------------
FORM f_message_prepare USING    p_langu
                                p_msgid
                                p_msgno
                                p_msgv1
                                p_msgv2
                                p_msgv3
                                p_msgv4
                       CHANGING p_msg.
 
  DATA: lc_char(3).
 
  WRITE p_msgno TO lc_char.
  CLEAR p_msg.
 
  CALL FUNCTION 'MESSAGE_PREPARE'
    EXPORTING
      language               = p_langu
      msg_id                 = p_msgid
      msg_no                 = lc_char
      msg_var1               = p_msgv1(50)
      msg_var2               = p_msgv2(50)
      msg_var3               = p_msgv3(50)
      msg_var4               = p_msgv4(50)
    IMPORTING
      msg_text               = p_msg
    EXCEPTIONS
      function_not_completed = 1
      message_not_found      = 2
      OTHERS                 = 3.
 
ENDFORM.                    " F_MESSAGE_PREPARE

EXTENSIONIN en BAPI_PO_CREATE

Caso: completo un post anterior, en el cual no había podido utilizar el extensionin para la BAPI_PO_CREATE .

El problema que no me daba cuenta era que había que usar ‘BAPI_TE_PO_HEADER’ y ‘BAPI_TE_PO_HEADERX’ en la estructura. Notar que son distintas a cuando usé la BAPI_PO_CREATE1.

Sólo pego la parte importante, lo demás está por todos lados si lo buscan en Internet.

DATA: gs_mepoheader TYPE bapi_te_mepoheader,
gs_mepoheaderx TYPE bapi_te_mepoheaderx,
gs_extension_in TYPE bapiparex.

gs_mepoheader-zzcod_prop = ’77’. " Valor de mi campo Z

CLEAR gs_extension_in.
gs_extension_in-structure = ‘BAPI_TE_PO_HEADER’.
gs_extension_in-valuepart1 = gs_mepoheader.
APPEND gs_extension_in TO f1_extensionin.

gs_mepoheaderx-zzcod_prop = ‘X’.

CLEAR gs_extension_in.
gs_extension_in-structure = ‘BAPI_TE_PO_HEADERX’.
gs_extension_in-valuepart1 = gs_mepoheaderx.
APPEND gs_extension_in TO f1_extensionin.

CLEAR f1_return[].

CALL FUNCTION ‘BAPI_PO_CREATE’
EXPORTING
po_header = f1_po_header
skip_items_with_error = space
IMPORTING
purchaseorder = f1_purchaseorder
TABLES
po_items = f1_po_items
po_item_schedules = f1_po_item_schedules
po_item_account_assignment = f1_po_item_account_assignment
return = f1_return
po_services = f1_po_services
po_srv_accass_values = f1_po_srv_accass_values
extensionin = f1_extensionin.

Categorías: ABAP/4, BAPIs Etiquetas: , , ,

Crear hoja de entrada de servicio con BAPI_ENTRYSHEET_CREATE

Caso: se busca crear una hoja de entrada de servicios con la BAPI_ENTRYSHEET_CREATE, emulando la ME81n, sobre un pedido de servicios. Es un caso simple, adjunto abajo algunos links por si necesitan ver algo más.

La nota importante es que, si se ejecuta la BAPI luego de la creación del pedido, hay que ejecutar la función ME_STATISTICS_TABLES_REFRESH antes de la creación de la hoja de servicios, ya que sino tira un DUMP de registros duplicados (ITAB_DUPLICATE_KEY en SAPLEINS, LEINSF3I, XMCEKPO_CUT_LIS).

FORM crear_hoja USING p_ebeln TYPE ebeln
CHANGING p_hoja TYPE bapiessr-sheet_no.

* Selecciona item de pedido
DATA: BEGIN OF t_ped OCCURS 0,
ebeln TYPE ekko-ebeln, " Pedido
ebelp TYPE ekpo-ebelp, " Iten del pedido
txz01 TYPE essr-txz01, " Texto de la hoja de entrada de serv
dlort TYPE essr-dlort, " Local de Prest Servicios
lzvon TYPE essr-lzvon, " Periodo de
lzbis TYPE essr-lzbis, " Periodo hasta
sbnamag TYPE essr-sbnamag, " Resp Interno
packno TYPE ekpo-packno, " paquete de servivio
END OF t_ped.

DATA: t_uesll TYPE esll OCCURS 0 WITH HEADER LINE,
lc_mensaje TYPE string.

DATA: po_entrysheetheader TYPE bapiessrc,
po_entrysheet TYPE bapiessr-sheet_no,
po_services TYPE bapiesllc OCCURS 0 WITH HEADER LINE,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.

SELECT * FROM ekpo
INTO CORRESPONDING FIELDS OF TABLE t_ped
WHERE ebeln = p_ebeln.

LOOP AT t_ped.
t_ped-lzvon = sy-datum.
t_ped-lzbis = sy-datum.
t_ped-sbnamag = sy-uname.
MODIFY t_ped.
ENDLOOP.

LOOP AT t_ped.

REFRESH: po_services, t_uesll.
* busca los servicios del item de pedido
CALL FUNCTION ‘MS_READ_SERVICES’
EXPORTING
i_hpackno = t_ped-packno
TABLES
t_esll = t_uesll.

CHECK NOT t_uesll[] IS INITIAL.

* Llena tabla de cabecera y detalle de hoja de entrada de servicio
CLEAR po_entrysheetheader.
po_entrysheetheader-po_number = t_ped-ebeln.
po_entrysheetheader-po_item = t_ped-ebelp.
po_entrysheetheader-begdate = sy-datum.
po_entrysheetheader-enddate = sy-datum.
po_entrysheetheader-pckg_no = ‘1’.
po_entrysheetheader-person_int = t_ped-sbnamag.
po_entrysheetheader-short_text = t_ped-txz01.
po_entrysheetheader-location = t_ped-dlort.
po_entrysheetheader-acceptance = ‘X’.
po_entrysheetheader-doc_date = sy-datum.
po_entrysheetheader-post_date = sy-datum.

CLEAR po_services.
po_services-pckg_no = ‘1’.
po_services-line_no = ‘1’.
po_services-outl_ind = ‘X’.
po_services-subpckg_no = ‘2’.
po_services-quantity = ‘1’.
APPEND po_services.

LOOP AT t_uesll WHERE package IS INITIAL.
po_services-pckg_no = ‘2’.
po_services-line_no = po_services-line_no + 1.
po_services-outl_ind = ‘ ‘.
CLEAR po_services-subpckg_no.
po_services-quantity = t_uesll-menge.
po_services-base_uom = t_uesll-meins.
po_services-price_unit = t_uesll-peinh.
IF t_uesll-menge GT 0.
po_services-gr_price = t_uesll-netwr / t_uesll-menge.
ENDIF.
po_services-pln_pckg = t_uesll-packno.
po_services-pln_line = t_uesll-introw.
po_services-short_text = t_uesll-ktext1.
APPEND po_services.
ENDLOOP.

ENDLOOP.

CALL FUNCTION ‘ME_STATISTICS_TABLES_REFRESH’
EXPORTING
i_ebeln = p_ebeln.

* BAPI para crear hoja de entrada de servicios
CALL FUNCTION ‘BAPI_ENTRYSHEET_CREATE’
EXPORTING
entrysheetheader = po_entrysheetheader
IMPORTING
entrysheet = po_entrysheet
TABLES
entrysheetservices = po_services
return = lt_return.

IF po_entrysheet IS NOT INITIAL.

* Informo la Hoja de servicios generada
p_hoja = po_entrysheet.
CONCATENATE ‘Generada y liberada Hoja de Entrada de Servicios:’ po_entrysheet ‘ ‘ INTO lc_mensaje.
MESSAGE : lc_mensaje TYPE ‘I’.

ELSE.
PERFORM visualiza_log_ejecucion TABLES lt_return.
ENDIF.

ENDFORM. "crear_hoja

FORM visualiza_log_ejecucion TABLES p_return TYPE tty_bapiret2.
DATA:
lt_log TYPE TABLE OF string WITH HEADER LINE.

*PREPARA LOG
CLEAR lt_log[].

LOOP AT p_return.

CLEAR lt_log.

CONCATENATE p_return-type(1)
‘-‘
p_return-id(20)
‘-‘
p_return-number(3)
‘-‘
p_return-message(100)
‘-‘
p_return-message_v1(50)
INTO lt_log SEPARATED BY space.

APPEND lt_log.

ENDLOOP. "F1_RETURN
*MUESTRA LOG
CALL FUNCTION ‘POPUP_WITH_TABLE’
EXPORTING
endpos_col = 170
endpos_row = 20
startpos_col = 10
startpos_row = 5
titletext = ‘LOG de ejecución’
TABLES
valuetab = lt_log
EXCEPTIONS
break_off = 1
OTHERS = 2.

ENDFORM. "visualiza_log_ejecución

Links:

http://scn.sap.com/thread/1006844

http://www.sap4.com/wiki/index.php?title=BAPI_ENTRYSHEET_CREATE

http://www.mundosap.com/foro/showthread.php?t=62467

http://www.mundosap.com/foro/showthread.php?t=62347

Liberar pedido de Compras con BAPI_PO_RELEASE

Liberar pedido de Compras con BAPI_PO_RELEASE

Caso: se busca liberar un pedido de compras recién creado, con la BAPI_PO_RELEASE.

Nota: abajo les paso algunos links, ya que no me puse a averiguar mucho del tema porque al final para el caso que buscaba no se va a usar estrategia (digamos que trabajé de más, pero por ello dejo la entrada en el BLOG). Así que sólo espero que de algo les sirva, ya que está bastante incompleto el post (me hubiera gustado probar más sobre el tema).

Algunos tips:

– Hay que tener cuidado es con la estrategia de liberación. En mi caso hay una sola estrategia (código/nivel) de liberación, pero puede darse el caso de que haya más niveles y ahí hay que ver como tratarlo.

– El objeto de autorización necesario para ejecutar la BAPI es: M_EINK_FRG

AUTHORITY-CHECK OBJECT ‘M_EINK_FRG’

ID ‘FRGGR’ FIELD ekko-frggr

ID ‘FRGCO’ FIELD po_rel_code.

– La BAPI_PO_RELEASE parece que no necesitaría un COMMIT, ya que posee un parámetro en su llamada

– También puede serles útil saber que existe una BAPI para restaurar la liberación del pedido, llamada BAPI_PO_RESET_RELEASE.

FORM liberar_pedido USING p_ebeln TYPE ebeln.

DATA: l_grupo TYPE frggr,
l_est TYPE frgsx,
wa_t16fs TYPE t16fs,
lt_return TYPE bapireturn OCCURS 0,
l_rel_status_new TYPE bapimmpara-rel_status,
l_rel_indicator_new TYPE bapimmpara-po_rel_ind,
l_ret_code TYPE sy-subrc.

* Busco el grupo de liberación para la orden de compra.
SELECT SINGLE frggr frgsx
FROM ekko
INTO (l_grupo, l_est)
WHERE ebeln EQ p_ebeln.

* En base al grupo de la orden de compra traigo todos los códigos de liberación.
SELECT SINGLE *
FROM t16fs
INTO wa_t16fs
WHERE frggr EQ l_grupo
AND frgsx EQ l_est.

CALL FUNCTION ‘BAPI_PO_RELEASE’
EXPORTING
purchaseorder = p_ebeln
po_rel_code = wa_t16fs-frgc1
* USE_EXCEPTIONS = ‘X’
* NO_COMMIT = ‘ ‘
IMPORTING
rel_status_new = l_rel_status_new
rel_indicator_new = l_rel_indicator_new
ret_code = l_ret_code
TABLES
return = lt_return
EXCEPTIONS
authority_check_fail = 1
document_not_found = 2
enqueue_fail = 3
prerequisite_fail = 4
release_already_posted = 5
responsibility_fail = 6
OTHERS = 7.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.

* Espera hasta la actualización del documento (hasta que cambie el

* indicador de liberada)
DO 20 TIMES.
SELECT SINGLE mandt
FROM ekko
INTO ekko-mandt
WHERE ebeln = p_ebeln
AND frgke = ‘L’
AND frgzu = ‘X’.

IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 3 SECONDS.
ENDIF.
ENDDO.

ENDIF.

ENDFORM. «liberar_pedido

Algunos links:

http://www.mundosap.com/foro/showthread.php?t=16140

http://www.se80.co.uk/sapfms/b/bapi/bapi_po_release.htm

http://scn.sap.com/message/7896454#7896454