Multi line PO 생성하기 (LOOP~GROUP BY)

니언·2022년 10월 3일
0

아래와 같이 데이터가 존재할때

참조 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.
profile
쭈니어 개발자

0개의 댓글