Archivo
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'.
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.
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
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
ABAP – Crear pedido de servicios con BAPI_PO_CREATE1
Caso: se busca crear un pedido de compras de servicios con la BAPI_PO_CREATE1. Antes había utilizado la BAPI_PO_CREATE, pero no me funcionaba bien cuando quería agregar la parte del extensionin, que se usa cuando se agregan campos Z al estándar (ejemplo a la EKKO), así que probé con esta última que se las recomiendo.
El ejemplo crea un pedido de servicios con una posición y un servicio con la BAPI, emulando la ME21n. Para el caso que necesiten armarán ustedes la lógica para crear las posiciones/servicios necesarios. Además contiene la sección extensionin, suponiendo que quiero actualizar un campo Z creado en la EKKO.
Copio directamente el código y alguna que otra aclaración, hay muchos campos que no he utilizado en mi ejemplo (por ejemplo los de imputación múltiple, ya que en mi caso era simple), pero pueden encontrar algo por ahí si necesitan más específica esa parte.
*&———————————————————————*
*& Form CREAR_ORDEN_SERVICIO
*&———————————————————————*
* Crea la orden de servicio
*———————————————————————-*
FORM crear_orden_servicio.
DATA: w_error TYPE c,
w_lifnr TYPE lifnr,
w_zterm TYPE dzterm,
w_ekgrp TYPE ekgrp,
w_kostl TYPE kostl.
DATA: f1_purchaseorder TYPE bapimepoheader-po_number,
f1_return TYPE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA: lk_ebelp LIKE ekpo-ebelp,
lk_ext_line LIKE esll-extrow,
lk_serno_line LIKE bapiesklc-serno_line,
lk_serial_no LIKE bapiekkn-serial_no,
lt_items_pckg_no LIKE bapiekpoc-pckg_no,
lt_services_line_no LIKE bapiesllc-line_no,
w_lt_services_line_no LIKE bapiesllc-line_no,
lk_services-subpckg_no LIKE bapiesllc-subpckg_no,
lk_line_no LIKE bapiesklc-line_no,
lc_resp,
lt_serial_no LIKE bapiekkn-serial_no,
lt_serno_line LIKE bapiesklc-serno_line,
lc_mensaje TYPE string,
l_srvpos TYPE asnum,
l_extrow TYPE extrow,
lv_total TYPE ukurs.
DATA: poheader TYPE bapimepoheader,
poheaderx TYPE bapimepoheaderx,
po_item TYPE bapimepoitem OCCURS 0 WITH HEADER LINE,
po_itemx TYPE bapimepoitemx OCCURS 0 WITH HEADER LINE,
poaccount TYPE bapimepoaccount OCCURS 0 WITH HEADER LINE,
poaccountx TYPE bapimepoaccountx OCCURS 0 WITH HEADER LINE,
poservice TYPE bapiesllc OCCURS 0 WITH HEADER LINE,
posrvaccessvalues TYPE bapiesklc OCCURS 0 WITH HEADER LINE,
poextensionin TYPE bapiparex OCCURS 0 WITH HEADER LINE,
lt_mepoheader TYPE bapi_te_mepoheader,
lt_mepoheaderx TYPE bapi_te_mepoheaderx,
wa_extension_in TYPE bapiparex.
****** Clear de las estructuras ******
CLEAR: poheader,
poheaderx,
po_item[],
po_itemx[],
poaccount[],
poaccountx[],
poservice[],
posrvaccessvalues[],
poextensionin[],
f1_return[],
f1_purchaseorder,
lt_mepoheader,
lt_mepoheaderx.
****** Datos de Cabecera ******
poheader-doc_type = ‘ZSER’. » Clase de Documento (EKKO-BSART)
poheader-comp_code = co_bukrs. » Sociedad (EKKO-BUKRS)
poheader-purch_org = co_ekorg. » Organización Compras (EKKO-EKORG)
poheader-pur_group = w_ekgrp. » Grupo de compras (EKKO-EKGRP)
poheader-vendor = w_lifnr. » Proveedor (EKKO-LIFNR)
poheader-pmnttrms = w_zterm. » Condición de pago (EKKO-ZTERM)
poheader-langu = sy-langu. » Idioma
poheader-currency = ‘CLP’. » Moneda
poheader-doc_date = sy-datum. » Fecha Documento (EKKO-AEDAT)
poheader-creat_date = sy-datum. » Fecha creación
poheader-created_by = sy-uname. » Creado por…
* CAB: FLAGs para que tome los campos seleccionados
poheaderx-doc_type = ‘X’.
poheaderx-comp_code = ‘X’.
poheaderx-purch_org = ‘X’.
poheaderx-pur_group = ‘X’.
poheaderx-vendor = ‘X’.
poheaderx-pmnttrms = ‘X’.
poheaderx-langu = ‘X’.
poheaderx-currency = ‘X’.
poheaderx-doc_date = ‘X’.
poheaderx-creat_date = ‘X’.
poheaderx-created_by = ‘X’.
****** Datos de posición ******
* Nota: se crea una sola posición que puede contener uno o varios servicios
CLEAR : lt_items_pckg_no.
w_lt_services_line_no = 1.
lt_items_pckg_no = 1.
lt_services_line_no = 1.
lk_ebelp = 10.
po_item-po_item = lk_ebelp. » Nro. posición
po_item-quantity = ‘1’. » Cantidad
po_item-short_text = text-z00. » Texto
po_item-acctasscat = ‘K’. » Tipo de imputación
po_item-item_cat = ‘9’. » Tipo de Posición «»»»» F
po_item-matl_group = ‘5066’. » Grupo Artículos (EKPO- WGBEZ)
po_item-plant = so_werks-low. » Centro
po_item-preq_name = sy-uname. » Solicitante (EKPO-AFNAM)
po_item-pckg_no = lt_items_pckg_no. » Paquete
po_item-distrib = ‘2’. » Distribución simple
APPEND po_item. CLEAR po_item.
* POS: FLAGs para que tome los campos seleccionados
po_itemx-po_item = lk_ebelp.
po_itemx-quantity = ‘X’.
po_itemx-short_text = ‘X’.
po_itemx-acctasscat = ‘X’.
po_itemx-item_cat = ‘X’.
po_itemx-matl_group = ‘X’.
po_itemx-plant = ‘X’.
po_itemx-preq_name = ‘X’.
po_itemx-pckg_no = ‘X’.
po_itemx-distrib = ‘X’.
APPEND po_itemx. CLEAR po_itemx.
****** Datos de asignaciones de cuentas ******
lt_serial_no = 1.
lt_serno_line = 1.
CLEAR l_extrow.
poaccount-po_item = lk_ebelp.
poaccount-serial_no = lt_serial_no.
poaccount-quantity = ‘1’.
poaccount-distr_perc = ‘0’.
poaccount-costcenter = w_kostl.
poaccount-creat_date = sy-datum.
APPEND poaccount. CLEAR poaccount.
* poaccount-g_l_acct = gt_alv_imod-sakto. » Se los dejo comentado por si desean asignar la cuenta contable
* ACC: Flags de imputacion
poaccountx-po_item = lk_ebelp.
poaccountx-serial_no = ‘X’.
poaccountx-quantity = ‘X’.
poaccountx-distr_perc = ‘X’.
poaccountx-costcenter = ‘X’.
poaccountx-creat_date = ‘X’.
APPEND poaccountx. CLEAR poaccountx.
* poaccountx-g_l_acct = ‘X’.
****** Extension – Estructuras adicionales (si hubiese) ******
lt_mepoheader-zzcod_prop = ‘1’. » Asigno el valor 1 al campo (valor por defecto)
lt_mepoheaderx-zzcod_prop = ‘X’. » FLAG para seleccionar el campo
CLEAR wa_extension_in.
wa_extension_in-structure = ‘BAPI_TE_MEPOHEADER’.
wa_extension_in-valuepart1 = lt_mepoheader.
APPEND wa_extension_in TO poextensionin.
CLEAR wa_extension_in.
wa_extension_in-structure = ‘BAPI_TE_MEPOHEADERX’.
wa_extension_in-valuepart1 = lt_mepoheaderx.
APPEND wa_extension_in TO poextensionin.
****** Datos del Encabezado del servicio ******
ADD 1 TO l_extrow.
IF w_lt_services_line_no = 1.
poservice-pckg_no = lt_items_pckg_no.
poservice-line_no = lt_services_line_no. «‘0000000001’.
poservice-ext_line = ‘0000000000’.
poservice-outl_ind = ‘X’.
poservice-subpckg_no = lt_items_pckg_no + 1.
poservice-from_line = ‘1’.
poservice-distrib = space.
APPEND poservice. CLEAR poservice.
w_lt_services_line_no = w_lt_services_line_no + 1.
ENDIF.
****** Servicio 1 asociado al encabezado ******
lv_total = l_cantidad_rep * l_precio_rep * p_ukurs.
poservice-pckg_no = lt_items_pckg_no + 1.
poservice-line_no = lt_services_line_no.
poservice-ext_line = l_extrow.
poservice-subpckg_no = ‘0000000000’.
poservice-quantity = ‘1’ .
poservice-short_text = ‘REPARACIÓN CONTENEDOR’.
poservice-service = l_srvpos. » Nro de Servicio (ESLL-SRVPOS)
poservice-gr_price = lv_total.
poservice-distrib = space.
APPEND poservice. CLEAR poservice .
****** Datos de asignaciones de cuentas – Imputación (en este caso es imputación simple)******
* Si fuera imputación múltiple hay que agregar más registros, uno por cada distribución
posrvaccessvalues-pckg_no = lt_items_pckg_no + 1.
posrvaccessvalues-line_no = lt_services_line_no.
posrvaccessvalues-serial_no = lt_serial_no.
posrvaccessvalues-serno_line = ’01’.
posrvaccessvalues-percentage = ‘0’.
posrvaccessvalues-quantity = ‘1’.
APPEND posrvaccessvalues. CLEAR posrvaccessvalues.
ENDIF.
CHECK w_error IS INITIAL.
CLEAR f1_return[].
* Creamos el Pedido de Servicio
CALL FUNCTION ‘BAPI_PO_CREATE1’
EXPORTING
poheader = poheader
poheaderx = poheaderx
no_price_from_po = ‘X’
IMPORTING
exppurchaseorder = f1_purchaseorder
TABLES
return = f1_return
poitem = po_item
poitemx = po_itemx
poaccount = poaccount
poaccountx = poaccountx
poservices = poservice
posrvaccessvalues = posrvaccessvalues
extensionin = poextensionin.
IF f1_purchaseorder IS NOT INITIAL.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’.
* INI NOTA: si se requiere realizar algo con el pedido recién creado, he visto que dejan esta sección de código
* para esperar a que se grabe el documento y luego por ejemplo, liberarlo. Dejo esta sección de código por si les sirve
DO 20 TIMES.
SELECT SINGLE mandt
FROM ekko
INTO ekko-mandt
WHERE ebeln = f1_purchaseorder.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 3 SECONDS.
ENDIF.
ENDDO.
* FIN NOTA
* Informo el pedido generado
CONCATENATE ‘Generado pedido:’ f1_purchaseorder ‘ ‘ INTO lc_mensaje.
MESSAGE : lc_mensaje TYPE ‘I’.
ELSE.
*revierte acciones bapi
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.
*notifica error
CLEAR lc_resp.
CALL FUNCTION ‘POPUP_TO_CONFIRM_STEP’
EXPORTING
defaultoption = ‘Y’
textline1 = ‘Error al generar documento.’
textline2 = ‘¿Visualiza el LOG de ejecución?’
titel = ‘Confirmación’
start_column = 20
start_row = 12
cancel_display = space
IMPORTING
answer = lc_resp.
IF lc_resp = ‘J’. «respuesta ‘SI’
PERFORM visualiza_log_ejecucion.
ENDIF.
ENDIF.
ENDFORM. «CREAR_ORDEN_SERVICIO
*&———————————————————————*
*& Form VISUALIZA_LOG_EJECUCION
*&———————————————————————*
* Permite mostrar con un POPUP el log de ejecución de la BAPI
*———————————————————————-*
FORM visualiza_log_ejecucion.
DATA: lt_log TYPE TABLE OF string WITH HEADER LINE.
*PREPARA LOG
CLEAR lt_log[].
LOOP AT f1_return.
CLEAR lt_log.
CONCATENATE f1_return-type(1)
‘-‘
f1_return-id(20)
‘-‘
f1_return-number(3)
‘-‘
f1_return-message(100)
‘-‘
f1_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