Inicio > ABAP/4, BAPIs > ABAP – Crear pedido de servicios con BAPI_PO_CREATE1

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

Categorías:ABAP/4, BAPIs Etiquetas: ,
  1. ramiro
    19/01/2016 a las 16:04

    Excelente aporte amigo, me sirvió tu ejemplo aunque mi necesidad es generar un pedido de traslado de material, a lo que lleva mi siguiente pregunta: necesito generar le entrega de salida con referencia a este pedido de traslado (Tx VL10B), conoces si existe alguna bapi que simule el funcionamiento de la VL10B? Desde ya muchas gracias.

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: