SAP SD销售订单创建接口分享
一、接口逻辑
1)输入参数和输出参数
2)业务逻辑
二、接口代码
FUNCTION z_fmsd_0018.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_DATA_GD) TYPE ZSBC_IF_GD OPTIONAL
*" VALUE(I_INPUT) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(E_OUTPUT) TYPE STRING
*"----------------------------------------------------------------------
DATA:ls_data TYPE zssd_input_018, "传入的多条数据
ls_input TYPE zssd_order_all, "单条数据
ls_output TYPE zssd_output_018.
DATA:lv_status TYPE c.
DATA:lv_posnr TYPE num4,
lv_sched_type TYPE pstyv,
lv_znew_so TYPE vbap-znew_so,
lv_msg TYPE bapi_msg.
DATA:gv_status_025 TYPE char1. "是否成功
DATA:lv_testrun TYPE bapiflag-bapiflag, "是否模拟进行
l_salesdocumentin LIKE bapivbeln-vbeln. "销售订单
DATA:l_order_header_in LIKE bapisdhd1, "销售订单抬头
l_order_header_inx LIKE bapisdhd1x, "销售订单抬头更新
gt_return LIKE TABLE OF bapiret2 WITH HEADER LINE, "返回参数
gt_order_items_in LIKE TABLE OF bapisditm WITH HEADER LINE, "销售订单项目
gt_order_items_inx LIKE TABLE OF bapisditmx WITH HEADER LINE, "销售订单项目更新
gt_order_partners LIKE TABLE OF bapiparnr WITH HEADER LINE, "销售订单合作伙伴
l_sender LIKE bapi_sender, "发送人逻辑系统
l_logic_switch LIKE bapisdls, "逻辑切换的 SD 复选框
l_order_conditions_in LIKE TABLE OF bapicond WITH HEADER LINE, "条件类型
l_order_conditions_inx LIKE TABLE OF bapicondx WITH HEADER LINE, "条件类型更新
l_salesdocument LIKE bapivbeln-vbeln, "BAPI 销售订单
gt_order_schedules_in LIKE TABLE OF bapischdl WITH HEADER LINE, "计划行
gt_order_schedules_inx LIKE TABLE OF bapischdlx WITH HEADER LINE, "计划行更新。
gt_order_text LIKE TABLE OF bapisdtext WITH HEADER LINE, "文本
gt_extensionin LIKE TABLE OF bapiparex WITH HEADER LINE,
gt_extensionex LIKE TABLE OF bapiparex WITH HEADER LINE.
CLEAR:ls_input,ls_output,lv_status.
IF i_input IS NOT INITIAL.
CALL FUNCTION 'Z_FMBC_JSONTOABAP2'
EXPORTING
i_json = i_input
IMPORTING
e_data = ls_data.
ENDIF.
IF ls_data IS INITIAL.
MOVE-CORRESPONDING ls_data TO ls_output.
PERFORM frm_set_msg TABLES ls_output-messagelist
USING 'E' '00' '001' '请检查JSON结构与SAP ABAP结构 是否一致!'.
PERFORM frm_write_log_new USING 'SD0018' ls_output i_data_gd i_input e_output 'E'.
EXIT.
ENDIF.
READ TABLE ls_data-data_list
TRANSPORTING NO FIELDS
WITH KEY vkgrp = '108'.
IF sy-subrc = 0.
MOVE-CORRESPONDING ls_data TO ls_output.
lv_msg = '销售组为108通用,请更正销售组为对应部门!'.
PERFORM frm_set_msg TABLES ls_output-messagelist
USING 'E' '00' '001' lv_msg.
PERFORM frm_write_log_new USING 'SD0018' ls_output i_data_gd i_input e_output 'E'.
EXIT.
ENDIF.
LOOP AT ls_data-data_list INTO DATA(lwa_header) WHERE auart = 'ZOR1' OR
auart = 'ZOR3' OR
auart = 'ZOR7' OR
auart = 'ZRE1' OR
auart = 'ZRE3' OR
* auart = 'ZRE5' OR
auart = 'ZRE7'.
SELECT SINGLE *
FROM vbak
WHERE zrequest_id = @lwa_header-zrequest_id
INTO @DATA(lwa_vbak).
IF sy-subrc = 0.
DATA(lv_error) = 'X'.
MOVE-CORRESPONDING ls_data TO ls_output.
lv_msg = 'REQUEST_ID:' && lwa_header-zrequest_id && '已创建销售订单:' && lwa_vbak-vbeln &&'!'.
PERFORM frm_set_msg TABLES ls_output-messagelist
USING 'E' '00' '001' lv_msg.
CLEAR lwa_vbak.
CONTINUE.
ENDIF.
lwa_header-kunnr = |{ lwa_header-kunnr ALPHA = IN }|.
DATA(lv_kunnr) = lwa_header-kunnr.
DATA(lv_vkorg) = lwa_header-vkorg.
DATA(lv_vtweg) = lwa_header-vtweg.
* DATA(lv_prsdt) = lwa_header-prsdt.
DATA:lt_item LIKE lwa_header-item.
LOOP AT lwa_header-item INTO DATA(ls_item).
ls_item-matnr = |{ ls_item-matnr ALPHA = IN }|.
APPEND ls_item TO lt_item.
ENDLOOP.
IF lt_item[] IS NOT INITIAL.
DATA(lwa_item) = lt_item[ 1 ].
DATA(lv_prsdt) = lwa_item-prsdt.
ENDIF.
IF lt_item[] IS NOT INITIAL.
SELECT a901~kunnr,
vkorgau,
vtweg,
pltyp,
matnr,
datab,
datbi,
a901~knumh,
kbetr
FROM a901
LEFT JOIN konp ON konp~knumh = a901~knumh AND konp~loevm_ko = ''
FOR ALL ENTRIES IN @lt_item
WHERE a901~kunnr = @lv_kunnr
AND vkorgau = @lv_vkorg
AND vtweg = @lv_vtweg
AND pltyp = @lt_item-pltyp
AND matnr = @lt_item-matnr
AND datab <= @lt_item-prsdt
AND datbi >= @lt_item-prsdt
INTO TABLE @DATA(lt_a901).
SELECT matnr,
matkl
FROM mara
FOR ALL ENTRIES IN @lt_item
WHERE matnr = @lt_item-matnr
INTO TABLE @DATA(lt_mara).
ENDIF.
LOOP AT lt_item INTO lwa_item WHERE pstyv NE 'ZTA5' AND pstyv NE 'ZRE5'.
"盛思物料特殊处理
READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = lwa_item-matnr.
IF sy-subrc = 0.
DATA(lv_matnr) = |{ lwa_item-matnr ALPHA = OUT }|.
* IF lv_matnr+0(3) = '202' OR ls_mara-matkl = '110901'. "盛思物料特殊处理
IF ls_mara-matkl = '110901'. "盛思物料特殊处理
IF lwa_item-zkbetr1 IS INITIAL .
lv_error = 'X'.
MOVE-CORRESPONDING ls_data TO ls_output.
lv_msg = '盛思物料:' && lwa_item-matnr && '价格必填'.
&nb