Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
shan_20
Explorer

About the post:


Hi everyone,

This post provides a detailed explanation of Service PO creation. Also, can able to understand the below bulletin points:

  • The tables that refer to the service line logic.

  • Passing the fields (needed for service-PO creation) to the BAPI_PO_CREATE1.


Tables:


Check the entries in ESLL, and ESKL (see attached images with the boxes indicated). Observe how the values are stored.

  • ESLL - Lines of Service Package table


In the above table, we can see that:

  1. There are two service lines. A service line belongs to two rows in the ESLL table.

  2. For each service line, there are two rows created. The first row is a dummy but we need to pass values to few fields such as packno, introw, package and sub_packno.

  3. The second row is the real service line which we are able to see it PO screen. In other words, we need to map the fields according to our requirement in the second row of each line item.



  • ESKL - Account Assignment Service Line table


In the above table, we can see that:

  1. There are two service lines. Each row belongs to a service line in the ESKL table.

  2. The service lines (refer to field Introw- 2, 4) are stored in this table.


Coding that I implemented for Service-PO creation:


Variables
-----------------------------------------------------------
DATA: lv_dummy TYPE packno,
      lv_pkgno TYPE packno,
      lv_item_pno TYPE packno,
lv_pckg_no TYPE char10,
lv_pckg_no1 TYPE char10,
lv_subpckg_no TYPE char10,
lv_line_no TYPE char2,
lv_line_no1 TYPE char2.

Internal Tables
-----------------------------------------------------------
DATA: lt_poitem TYPE TABLE OF bapimepoitem,
lt_poitemx TYPE TABLE OF bapimepoitemx,
lt_poaccount TYPE TABLE OF bapimepoaccount,
lt_poaccountx TYPE TABLE OF bapimepoaccountx,
lt_poservices  TYPE TABLE OF bapiesllc,
lt_poservices  TYPE TABLE OF bapiesllc,
lt_posrvaccessvalues TYPE TABLE OF bapiesklc,
gt_po TYPE TABLE OF {structure we maintain}.

Work Area
-----------------------------------------------------------
DATA: ls_poitem TYPE bapimepoitem,
ls_poitemx TYPE bapimepoitemx,
ls_poaccount TYPE bapimepoaccount,
ls_poaccountx TYPE bapimepoaccountx,
ls_poservices  TYPE bapiesllc,
ls_poservices  TYPE bapiesllc,
ls_posrvaccessvalues TYPE bapiesklc.

Logic
-----------------------------------------------------------
CLEAR: lv_pkgno.
lv_dummy = lc_1. " maintaining Line number at service level

*_ Item level details starts
LOOP AT gt_po INTO DATA(ls_po)
WHERE ebeln = <ls_po_temp>-ebeln. "#EC CI_NESTED

*_ POITEM & POITEMX
---------------------
ls_poitem-item_cat = ls_po-pstyp. " Item category in purchasing document

IF ls_po-pstyp IS NOT INITIAL.
lv_pkgno = lv_dummy.
ls_poitem-pckg_no = lv_pkgno.

" for mapping in poservice table, moving 'pckg no'(@item level) to lv_item_pno
lv_item_pno = ls_poitem-pckg_no.
lv_dummy = lv_item_pno + 2.

" additional fields to be passed
ls_poitem-period_ind_expiration_date = lc_d. " Period Ind Exp Date
ls_poitemx-item_cat = lc_x. " Item category in purchasing document
ls_poitemx-pckg_no = lc_x.
ENDIF.

IF ls_po-knttp = 'K'
AND ls_po-pstyp EQ 'D'.
LOOP AT lt_poitem TRANSPORTING NO FIELDS
WHERE po_item = ls_po-ebelp
AND pckg_no = lv_item_pno.
*_ POSERVICES
---------------
ls_poservices-pckg_no = ls_poservices-line_no = lv_item_pno.
lv_pckg_no = ls_poservices-pckg_no.
lv_line_no = lv_item_pno+8(2).
ls_poservices-outl_ind = lc_x.
ls_poservices-subpckg_no = lv_item_pno + 1.
lv_subpckg_no = ls_poservices-subpckg_no.
APPEND ls_poservices TO lt_poservices.
ls_poservices-pckg_no = ls_poservices-pckg_no + 1.
lv_pckg_no1 = ls_poservices-pckg_no.
ls_poservices-line_no = lv_pckg_no1.
lv_line_no1 = ls_poservices-line_no+8(2).
ls_poservices-ext_line = lc_1000(2).
ls_poservices-outl_ind = space.
ls_poservices-subpckg_no = space. " ls_poservices-pckg_no.
ls_poservices-service = ls_po-matnr.
ls_poservices-short_text = ls_po-txz01.
ls_poservices-quantity = ls_po-menge.
ls_poservices-base_uom = ls_po-lmein.
ls_poservices-gr_price = ls_po-netpr.
ls_poservices-net_value = ls_po-netpr.
ls_poservices-matl_group = ls_po-wgbez.
APPEND ls_poservices TO lt_poservices.
CLEAR: ls_poservices.

*_ POSRVACCESSVALUES
-----------------------
ls_posrvaccessvalues-pckg_no = lv_pckg_no1.
ls_posrvaccessvalues-line_no = lv_pckg_no1.
ls_posrvaccessvalues-serno_line = lv_item_pno+8(2).
ls_posrvaccessvalues-percentage = '100'.
ls_posrvaccessvalues-serial_no = lv_item_pno+8(2).
ls_posrvaccessvalues-quantity = ls_po-menge.
ls_posrvaccessvalues-net_value = ls_po-netpr.
APPEND ls_posrvaccessvalues TO lt_posrvaccessvalues.
CLEAR: ls_posrvaccessvalues.

" Mapping the account assignment fields at service level.
LOOP AT lt_poservices TRANSPORTING NO FIELDS
WHERE pckg_no = lv_pckg_no1
AND line_no = lv_line_no1.
" Account Assignment at service level
ls_poaccount-po_item = ls_po-ebelp. " Item number
ls_poaccountx-po_item = ls_po-ebelp. " Item number
ls_poaccountx-po_itemx = lc_x. " Item number
ls_poaccount-serial_no = lv_line_no.
ls_poaccountx-serial_no = lv_line_no.
ls_poaccountx-serial_nox = lc_x.
PERFORM f_conv_poaccount USING ls_po
CHANGING ls_poaccount.
IF ls_poaccount-gl_account IS NOT INITIAL. " G/L Account Number
ls_poaccountx-gl_account = lc_x.
ENDIF.
IF ls_poaccount-costcenter IS NOT INITIAL. " Cost Center
ls_poaccountx-costcenter = lc_x.
ENDIF.
IF ls_poaccount-orderid IS NOT INITIAL. " Order Number
ls_poaccountx-orderid = lc_x.
ENDIF.
IF ls_poaccount-profit_ctr IS NOT INITIAL. " Profit Center
ls_poaccountx-profit_ctr = lc_x.
ENDIF.
IF ls_poaccount-wbs_element IS NOT INITIAL. " wbs element
ls_poaccountx-wbs_element = lc_x.
ENDIF.
ls_poaccount-co_area = lc_1000. " Control Area
ls_poaccountx-co_area = lc_x.
IF ls_poaccount-net_value IS NOT INITIAL. " Net Price
ls_poaccount-net_value = ls_po-netpr.
ls_poaccountx-net_value = lc_x.
ENDIF.
IF ls_poaccount-quantity IS NOT INITIAL. " Qty
ls_poaccount-quantity = ls_po-menge.
ls_poaccountx-quantity = lc_x.
ENDIF.
*_ Distribution percentage has to be passed value like below
ls_poaccount-distr_perc = '1.0'.
ls_poaccountx-distr_perc = lc_x.
APPEND ls_poaccount TO lt_poaccount.
APPEND ls_poaccountx TO lt_poaccountx.
CLEAR: ls_poaccount, ls_poaccountx.
ENDLOOP.
ENDLOOP.
ENDIF.
ENDLOOP.
*_ Item level details ends

CLEAR: lv_ponum.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
testrun = lv_testrun
IMPORTING
exppurchaseorder = lv_ponum
TABLES
poitem = lt_poitem
poitemx = lt_poitemx
poaccount = lt_poaccount
poaccountx = lt_poaccountx
poservices = lt_poservices
posrvaccessvalues = lt_posrvaccessvalues.




Note:

I appreciate your comments for the betterment of this post. Please notify me if any of the lines need to be updated or requires additional explanatory.

Thank you, everyone in advance, for your support and co-operation.
4 Comments