아래와 같이 데이터가 존재할때
참조 PO 번호 기준으로 두개의 PO를 생성해야한다. LOOP ~ GROUP BY를 사용해본다.
DATA : ls_poheader LIKE bapimepoheader,
ls_poheaderx LIKE bapimepoheaderx,
lt_poitem LIKE TABLE OF bapimepoitem,
lt_poitemx LIKE TABLE OF bapimepoitemx,
lt_poaccount LIKE TABLE OF bapimepoaccount,
lt_poaccountx LIKE TABLE OF bapimepoaccountx,
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
lv_purchaseorder LIKE bapimepoheader-po_number,
ls_expheader LIKE bapimepoheader.
DATA : lt_copy LIKE TABLE OF gs_data WITH HEADER LINE.
DATA : lv_ebelp TYPE ebelp,
lv_error(1).
CONSTANTS : lc_type TYPE esart VALUE 'NB',
lc_kostl TYPE kostl VALUE '13010'.
PERFORM check_required_field USING lv_error.
CHECK lv_error IS INITIAL.
" lifnr & ekgrp & telf1 기준으로 group으로 생성
LOOP AT gt_data INTO DATA(ls_data)
GROUP BY ( lifnr =
ekgrp =
telf1 =
size = GROUP SIZE
index = GROUP INDEX )
ASCENDING
REFERENCE INTO DATA(ls_group).
CLEAR : lv_ebelp.
LOOP AT GROUP ls_group ASSIGNING FIELD-SYMBOL(<ls_data>).
**********************************************************************
* HEADER
**********************************************************************
" LOOP 를 돌면서 Header 와 Item 을 담아주고있음
" Header를 한 번만 담으면되므로 Data가 들어가 있는 경우 Item만 담도록 처리
IF ls_poheader IS INITIAL.
DATA(lv_lifnr) = |{ <ls_data>-lifnr ALPHA = IN }|.
ls_poheader = VALUE #( doc_type =
vendor =
purch_org =
pur_group =
comp_code =
doc_date =
created_by =
creat_date =
ref_1 =
sales_pers =
telephone =
our_ref =
).
ls_poheaderx = VALUE #( doc_type = abap_true
vendor = abap_true
purch_org = abap_true
pur_group = abap_true
comp_code = abap_true
doc_date = abap_true
created_by = abap_true
creat_date = abap_true
ref_1 = abap_true
sales_pers = abap_true
telephone = abap_true
our_ref = abap_true
).
ENDIF.
***********************************************************************
** POITEM
***********************************************************************
" Item Sequence를 담아주기 위해
ADD 10 TO lv_ebelp.
lt_poitem = VALUE #( BASE lt_poitem
( po_item = " 아이템번호
material = " 자재코드
short_text = " 자재명
quantity = " 수량
net_price = " 원가
plant =
stge_loc =
tax_code = " 세금코드
acctasscat =
item_cat =
) ).
lt_poitemx = VALUE #( BASE lt_poitemx
( po_item = lv_ebelp
material = abap_true
short_text = abap_true
quantity = abap_true
net_price = abap_true
plant = abap_true
stge_loc = abap_true
tax_code = abap_true
acctasscat = abap_true
item_cat = abap_true
) ).
***********************************************************************
** POACCOUNT
***********************************************************************
DATA(lv_kostl) = |{ <ls_data>-kostl ALPHA = IN }|.
DATA(lv_sakto) = |{ <ls_data>-sakto ALPHA = IN }|.
lt_poaccount = VALUE #( BASE lt_poaccount
( po_item = lv_ebelp
costcenter =
gl_account =
) ).
lt_poaccountx = VALUE #( BASE lt_poaccountx
( po_item = lv_ebelp
costcenter = abap_true
gl_account = abap_true
) ).
ENDIF.
" Group으로 담을 경우 1/2/3 Group 나뉘어서 담기므로
" Data 수정시 조건과 인덱스를 못찾아서 copy해서 Data 처리
MOVE-CORRESPONDING <ls_data> TO lt_copy.
" Structure 를 Itab에 Append
APPEND lt_copy.
ENDLOOP.
CLEAR : lv_purchaseorder, ls_expheader.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_poheader " Header Data
poheaderx = ls_poheaderx " Header Data (Change Parameter)
IMPORTING
exppurchaseorder = lv_purchaseorder " Purchasing Document Number
expheader = ls_expheader " Purchasing Document Number
TABLES
return = lt_return " Return Parameter
poitem = lt_poitem " Item Data
poitemx = lt_poitemx " Item Data (Change Parameter)
poaccount = lt_poaccount " Account Assignment Fields
poaccountx = lt_poaccountx. " Account Assignment Fields (Change Parameter)
SORT lt_return BY type.
" 위에서 Copy한 Data를 msg 의 유무에 따라 처리
LOOP AT lt_copy WHERE msg IS INITIAL.
" Purchasing Document Number 가 생성되었을 때 Commit 처리
IF lv_purchaseorder IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
READ TABLE lt_return WITH KEY type = gc_e
BINARY SEARCH.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
MODIFY lt_copy TRANSPORTING id msg ebeln WHERE lifnr EQ <ls_data>-lifnr
AND ekgrp EQ <ls_data>-ekgrp
AND telf1 EQ <ls_data>-telf1.
ENDLOOP.
CLEAR : ls_poheader, ls_poheaderx,
lt_poitem, lt_poitemx, lt_poaccount, lt_poaccountx.
ENDLOOP.
IF lt_copy[] IS NOT INITIAL.
MOVE-CORRESPONDING lt_copy[] TO gt_data[].
PERFORM refresh_alv_grid USING go_grid.
ELSE.
MESSAGE s*** DISPLAY LIKE gc_w.
ENDIF.