본문 바로가기
ABAP/BAPI

[BAPI/SD] 판매오더(Sales Order) 생성 - BAPI_SALESORDER_CREATEFROMDAT2

by name_text 2023. 10. 12.

판매오더(Sales Order) 생성

BAPI_SALESORDER_CREATEFROMDAT2

 

 

# 사용예시

  TABLES: VBAK, VBKD, ADRC.
  DATA LT_VBAP TYPE STANDARD TABLE OF VBAP.

*-----------------------------------------------------------------------
* 판매오더 생성
  DATA: LS_ORDER_HEADER_IN      TYPE  BAPISDHD1,
        LS_ORDER_HEADER_INX     TYPE  BAPISDHD1X,

        LT_ORDER_PARTNERS       TYPE STANDARD TABLE OF  BAPIPARNR,
        LS_ORDER_PARTNERS       LIKE LINE OF LT_ORDER_PARTNERS,

        LT_ORDER_ITEMS_IN       TYPE STANDARD TABLE OF  BAPISDITM,
        LS_ORDER_ITEMS_IN       LIKE LINE OF LT_ORDER_ITEMS_IN,
        LT_ORDER_ITEMS_INX      TYPE STANDARD TABLE OF  BAPISDITMX,
        LS_ORDER_ITEMS_INX      LIKE LINE OF LT_ORDER_ITEMS_INX,

        LT_ORDER_SCHEDULES_IN   TYPE STANDARD TABLE OF  BAPISCHDL,
        LS_ORDER_SCHEDULES_IN   LIKE LINE OF LT_ORDER_SCHEDULES_IN,
        LT_ORDER_SCHEDULES_INX  TYPE STANDARD TABLE OF  BAPISCHDLX,
        LS_ORDER_SCHEDULES_INX  LIKE LINE OF LT_ORDER_SCHEDULES_INX,

        LT_ORDER_CONDITIONS_IN  TYPE STANDARD TABLE OF  BAPICOND,
        LS_ORDER_CONDITIONS_IN  LIKE LINE OF LT_ORDER_CONDITIONS_IN,
        LT_ORDER_CONDITIONS_INX TYPE STANDARD TABLE OF  BAPICONDX,
        LS_ORDER_CONDITIONS_INX LIKE LINE OF LT_ORDER_CONDITIONS_INX.

  DATA: LV_VBELN                TYPE BAPIVBELN-VBELN,
        LT_RETURN                TYPE STANDARD TABLE OF BAPIRET2.

  CLEAR: LS_ORDER_HEADER_IN, LS_ORDER_HEADER_INX,
         LT_ORDER_PARTNERS[], LS_ORDER_PARTNERS,
         LT_ORDER_ITEMS_IN[], LS_ORDER_ITEMS_IN,
         LT_ORDER_ITEMS_INX[], LS_ORDER_ITEMS_INX,
         LT_ORDER_SCHEDULES_IN[], LS_ORDER_SCHEDULES_IN,
         LT_ORDER_SCHEDULES_INX[], LS_ORDER_SCHEDULES_INX,
         LT_ORDER_CONDITIONS_IN[], LS_ORDER_CONDITIONS_IN,
         LT_ORDER_CONDITIONS_INX[], LS_ORDER_CONDITIONS_INX.
  CLEAR: LV_VBELN, LT_RETURN[].

* Header Data
  LS_ORDER_HEADER_IN = VALUE #(
    REFOBJKEY  = 'VBBK'
    DOC_TYPE   = VBAK-AUART  " 오더유형
    SALES_ORG  = VBAK-VKORG  " 판매조직
    DISTR_CHAN = VBAK-VTWEG  " 유통경로
    SALES_GRP  = VBAK-VKGRP  " 영업그룹
    SALES_OFF  = VBAK-VKBUR  " 사업장
    DOC_DATE   = VBAK-AUDAT  " 증빙일

    PMNTTRMS   = VBKD-ZTERM  " 지급조건
    INCOTERMS1 = VBKD-INCO1  " 인도도건
    ORD_REASON = VBAK-AUGRU  " 오더사유
    NAME       = VBAK-BNAME  " 주문자명
    PRICE_DATE = VBAK-VDATU  " 가격결정일
    REQ_DATE_H = VBAK-VDATU  " 납품요청일
    BILL_DATE  = VBAK-VDATU  " 대금청구일

    PURCH_NO_C = VBKD-BSTKD  " 고객 구매오더 번호
    PURCH_DATE = VBKD-BSTDK  " 구매오더일
    PURCH_NO_S = VBKD-BSTKD  " 납품처의 구매오더 번호
    PO_DAT_S   = VBKD-BSTDK  " 납품처의 구매오더일
    REF_1_S    = VBAK-IHREZ  " 납품처 문자

    ASS_NUMBER = VBAK-ZUONR  " 지정
    REF_DOC_L  = VBAK-XBLNR  " 참조
    ALTTAX_CLS = VBAK-TAXK1  " 대체세금분류
    ).
  "IN 데이터에 맞추어 INX 설정
  PERFORM SET_IN_TO_INX USING LS_ORDER_HEADER_IN CHANGING LS_ORDER_HEADER_INX.

* Partners
  LS_ORDER_PARTNERS-PARTN_ROLE = 'AG'.  "판매처
  LS_ORDER_PARTNERS-PARTN_NUMB = VBAK-KUNNR.    "판매처
  "일회성 고객 점검
  SELECT SINGLE XCPDK INTO @DATA(LV_XCPDK) FROM KNA1
    WHERE KUNNR EQ @LS_ORDER_PARTNERS-PARTN_NUMB.
  IF LV_XCPDK EQ 'X'.   "일회성고객 주소입력
    LS_ORDER_PARTNERS-NAME        = ADRC-NAME1.      "이름
    LS_ORDER_PARTNERS-POSTL_CODE   = ADRC-POST_CODE1.    "우편번호
    LS_ORDER_PARTNERS-CITY         = ADRC-CITY1.     "도시명
    LS_ORDER_PARTNERS-STREET       = ADRC-STREET.    "상세주소
    LS_ORDER_PARTNERS-FAX_NUMBER   = ADRC-FAX_NUMBER.  "팩스
    IF ADRC-TEL_NUMBER IS INITIAL.  "전화번호
      LS_ORDER_PARTNERS-TELEPHONE  = 'NONE'.
    ELSE.
      LS_ORDER_PARTNERS-TELEPHONE  = ADRC-TEL_NUMBER.
    ENDIF.
    IF ADRC-COUNTRY IS INITIAL.   "국가
      SELECT SINGLE B~LAND1 B~SPRAS
        INTO (LS_ORDER_PARTNERS-COUNTRY, LS_ORDER_PARTNERS-LANGU)
      FROM KNB1 AS A
        INNER JOIN T001 AS B ON A~BUKRS EQ B~BUKRS
      WHERE A~KUNNR EQ LS_ORDER_PARTNERS-PARTN_NUMB.
    ELSE.
      LS_ORDER_PARTNERS-COUNTRY = ADRC-COUNTRY.
    ENDIF.
    IF ADRC-REGION IS INITIAL.  "지역
      SELECT SINGLE BLAND
        INTO LS_ORDER_PARTNERS-REGION
      FROM T005S
      WHERE LAND1 EQ ADRC-COUNTRY.
    ELSE.
      LS_ORDER_PARTNERS-REGION = ADRC-REGION.
    ENDIF.
  ENDIF.
  APPEND LS_ORDER_PARTNERS TO LT_ORDER_PARTNERS.

* Items
  LOOP AT LT_VBAP INTO DATA(LS_VBAP).
    "Sales order Items
    LS_ORDER_ITEMS_IN = CORRESPONDING #( LS_VBAP
                                         MAPPING ITM_NUMBER = POSNR
                                                 MATERIAL   = MATNR
                                                 PLANT      = WERKS
                                                 STORE_LOC  = LGORT
                                                 "이하 생략..... 상황에 맞추어 필드 설정
                                                 ).
    PERFORM SET_IN_TO_INX USING LS_ORDER_ITEMS_IN CHANGING LS_ORDER_HEADER_INX.
    APPEND: LS_ORDER_ITEMS_IN   TO LT_ORDER_ITEMS_IN,
            LS_ORDER_ITEMS_INX  TO LT_ORDER_ITEMS_INX.

    " Schecule data
    LS_ORDER_SCHEDULES_IN = VALUE #(
      ITM_NUMBER  = LS_VBAP-POSNR       " Item number
      REQ_QTY     = LS_VBAP-KWMENG      " Qty
      REQ_DATE    = VBAK-VDATU          " Requirement date
      ).
    PERFORM SET_IN_TO_INX USING LS_ORDER_SCHEDULES_IN CHANGING LS_ORDER_SCHEDULES_INX.
    APPEND: LS_ORDER_SCHEDULES_IN   TO LT_ORDER_SCHEDULES_IN,
            LS_ORDER_SCHEDULES_INX  TO LT_ORDER_SCHEDULES_INX.

    "Conditions
    "품목 조건을 추가/변경이 필요한 경우 설정하여 사용

  ENDLOOP.

*  Call bapi
  CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    EXPORTING
*     SALESDOCUMENTIN               =
      ORDER_HEADER_IN               = LS_ORDER_HEADER_IN
      ORDER_HEADER_INX              = LS_ORDER_HEADER_INX
*     SENDER                        =
*     BINARY_RELATIONSHIPTYPE       =
*     INT_NUMBER_ASSIGNMENT         =
*     BEHAVE_WHEN_ERROR             =
*     LOGIC_SWITCH                  =
*     TESTRUN                       =
*     CONVERT                       = ' '
    IMPORTING
      SALESDOCUMENT                 = LV_VBELN
    TABLES
      RETURN                        = LT_RETURN
      ORDER_ITEMS_IN                = LT_ORDER_ITEMS_IN
      ORDER_ITEMS_INX               = LT_ORDER_ITEMS_INX
      ORDER_PARTNERS                = LT_ORDER_PARTNERS
      ORDER_SCHEDULES_IN            = LT_ORDER_SCHEDULES_IN
      ORDER_SCHEDULES_INX           = LT_ORDER_SCHEDULES_INX
      ORDER_CONDITIONS_IN           = LT_ORDER_CONDITIONS_IN
      ORDER_CONDITIONS_INX          = LT_ORDER_CONDITIONS_INX
*     ORDER_CFGS_REF                =
*     ORDER_CFGS_INST               =
*     ORDER_CFGS_PART_OF            =
*     ORDER_CFGS_VALUE              =
*     ORDER_CFGS_BLOB               =
*     ORDER_CFGS_VK                 =
*     ORDER_CFGS_REFINST            =
*     ORDER_CCARD                   =
*     ORDER_TEXT                    =
*     ORDER_KEYS                    =
*     EXTENSIONIN                   =
*     PARTNERADDRESSES              =
*     EXTENSIONEX                   =
            .
  IF LV_VBELN IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT          = 'X'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.
* 판매오더 생성
*-----------------------------------------------------------------------


*&---------------------------------------------------------------------*
*&      Form  SET_IN_TO_INX
*&---------------------------------------------------------------------*
*       BAPI에 사용할 XXX_IN 인터널테이블의 값 유무에 따라 XXX_INX 설정
*----------------------------------------------------------------------*
FORM SET_IN_TO_INX  USING    PS_IN
                    CHANGING PS_INX.

  DATA: LV_FIELDNAME(255) TYPE C.

  FIELD-SYMBOLS: <LFV_IN>   TYPE ANY,
                 <LFV_INX>  TYPE ANY.

  DATA(LT_DDFIELDS) = CL_SALV_DDIC=>GET_BY_DATA( PS_IN ).

  CLEAR PS_INX.

  LOOP AT LT_DDFIELDS INTO DATA(LS_DDFIELDS).
    LV_FIELDNAME = |PS_IN-{ LS_DDFIELDS-FIELDNAME }|.
    ASSIGN (LV_FIELDNAME) TO <LFV_IN>.
    LV_FIELDNAME = |PS_INX-{ LS_DDFIELDS-FIELDNAME }|.
    ASSIGN (LV_FIELDNAME) TO <LFV_INX>.

    IF <LFV_IN> IS ASSIGNED AND <LFV_INX> IS ASSIGNED.
      IF LS_DDFIELDS-DOMNAME EQ 'BAPIUPDATE'.
        IF <LFV_IN> IS NOT INITIAL.
          <LFV_INX> = 'X'.
        ENDIF.
      ELSE.
        MOVE <LFV_IN> TO <LFV_INX>.
      ENDIF.
    ENDIF.

    UNASSIGN <LFV_IN>.
    UNASSIGN <LFV_INX>.
  ENDLOOP.
ENDFORM.

 

댓글