판매오더(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.
댓글