SAP MM 通用物料移动过账接口分享
一、接口逻辑
1)移动类型范围
1.1 采购入库/退料:101-正常入库/161-退货入库/122-原单退
1.2 工单领料/退料/超领/超退:261/262/Z61/Z62
1.3 大仓库存调拨/委外库存调拨/委外库存调拨退回:311/541/542
1.4 成本中心领料/退料/线边仓超损/线边仓超损退料:201/202/Z03/Z04
1.5 客供料入库/退库:501/502
1.6 库存报废/库存报废退回/部门报废/部门报废退回:551/552/Z01/Z02
1.7 盘盈/盘亏/部门盘盈/部门盘亏:701/702/Z05/Z06
1.8 研发部门+内部订单领料/退料:201/202
1.9 工单入库:101
1.10 特殊库存转通用库存/通用库存转特殊库存/特殊库存转特殊库存:411/412/413
1.11 成本中心领/退有销售订单库存成品:231/232
1.12 免费入库/免费出库:511/512
1.13 支持委外101入库自动扣除543/544组件,自动计算扣除差异
2)接口FS
3)MTO模式判断
业务类型 | 视图逻辑 |
1、生产工单领料MTO逻辑 | 从表RESB,当AUFNR = 生产订单,取MATNR(组件物料)、SOBKZ(特殊库存)、KDAUF(销售订单)、KDPOS(销售订单行)值。如果SOBKZ = E 说明要发 关联的销售订单 + 销售订单行的库存;如果SOBKZ为空,则为通用库存(领料按物料明细去找SOBKZ = E) |
2、交货单发货MTO逻辑 | 从表LIPS,当VBELN = 交货单,取MATNR(发货物料)、SOBKZ(特殊库存)、SONUM(特殊库存编号)。如果SOBKZ = E 说明要发 关联的特殊库存编号前10位(销售订单) + 特殊库存编号后6位(销售订单行)的库存;如果SOBKZ为空,则为通用库存。(交际单按明细去找SOBKZ = E) |
3、工单入库MTO逻辑 | 从表AFPO,当AUFNR = 生产订单,取SOBKZ(特殊库存)、KDAUF(销售订单)、KDPOS(销售订单行)值。如果SOBKZ = E 说明要发 关联的销售订单 + 销售订单行的库存;如果SOBKZ为空,则为通用库存。(按明细) |
4、采购订单入库MTO逻辑 | 从表EKPO中,当EBELN = 采购订单 、EBELP = 采购订单项目,取MATNR(物料编码)、SOBKZ (特殊库存)。如果SOBKZ = E,再从表EKKN中,当EBELN = 采购订单 、EBELP = 采购订单项目取VBELN(销售订单)、 VBELP(销售订单行)。如果SOBKZ = E则为通用库存(按明细) |
5、客供入库 | 保持现有模式 |
6、采购退料 | 1、按原单退,找到对应凭证(WMS发起回写SAP),如SAP返回已经结算,提示用户在SAP建采购退货单 2、SAP同步到WMS,WMS扫描完后,回写SAP确认出库 |
4)委外组件扣减逻辑
一、判断委外采购业务 |
当传入的移动类型为101或122时,从表EKPO中,当EBELN = 当前采购订单,EBELP = 当前采购订单项目,PSTYP = 3时触发此逻辑 |
二、判断采购订单是否最后一次收货 |
1.汇总收货数量:从表EKBE中,当EBELN = 当前采购订单,EBELP = 当前采购订单项目,按EBELN、EBELP,且BWART = 101或102或122或123(102或123时,将MENGE设为负值),汇总MENGE数量 |
2.剩余收货数量:从表EKPO中,当EBELN = 当前采购订单,EBELP = 当前采购订单项目取MENGE采购订单数量 减去 汇总收货数量 |
3.如果当前收货数量 大于等于 剩余收货数量,则说明为最后一次收货 |
三、循环添加组件 |
1.从RESB表中,当XLOEK = 空,且DUMPS = 空,且BDART不为空,且POSTP = L时,循环组件 |
2.不是最后一次收货时,组件数量 = ( 当前收货数量 / 采购订单数量 ) * BDMNG。再从表T006中,当MSEHI = RESB-MEINS且ANDEC = 空有记录,则组件数量向上取整。 |
3.最后一次收货时,组件数量 = BDMNG(需求数量) - ENMNG提货数量。如果小于0,则等于0 |
4.当为101收货时,组件移动类型为543,否则为544。特殊库存为O |
5.采购订单、项目:取当前采购订单、当前采购订单项目 |
6.物料、单位:取RESB表对应字段 |
二、接口代码分享
FUNCTION z_fmmm_0013.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_DATA_GD) TYPE ZSBC_IF_GD OPTIONAL
*" VALUE(I_INPUT) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(E_OUTPUT) TYPE STRING
*"----------------------------------------------------------------------
TABLES: matdoc,ekpo.
TYPES: BEGIN OF ty_temp,
matnr TYPE matnr,
werks TYPE werks_d,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
lfbja TYPE lfbja,
mblnr TYPE lfbnr,
zeile TYPE lfpos,
aufnr TYPE aufnr,
END OF ty_temp.
DATA:gs_temp TYPE ty_temp,
gt_temp TYPE TABLE OF ty_temp.
DATA: gs_data TYPE zsmm_input_013.
DATA: gs_input TYPE zsmm_goodsmvt_input,
gt_input TYPE zttmm_input_013,
gs_item TYPE zsmm_goodsmvt_item_input,
gs_item_temp TYPE zsmm_goodsmvt_item_input,
gs_output TYPE zsmm_goodsmvt_output,
gt_output TYPE zttmm_output_013,
lwa_output TYPE zsmm_output_013.
DATA: wa_bapi_header TYPE bapi2017_gm_head_01.
DATA: wa_goodsmvt_code TYPE bapi2017_gm_code.
DATA: it_bapi_item LIKE STANDARD TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
is_bapi_item TYPE bapi2017_gm_item_create,
it_return LIKE STANDARD TABLE OF bapiret2 WITH HEADER LINE.
DATA: l_mblnr LIKE mseg-mblnr,
l_mjahr LIKE mseg-mjahr.
DATA: lt_ztmm0034 LIKE STANDARD TABLE OF ztmm0034 WITH HEADER LINE,
l_num035(10) TYPE c,
l_zwwbd TYPE zde_wwbd.
DATA: lt_resb LIKE STANDARD TABLE OF resb WITH HEADER LINE.
DATA: l_mod TYPE c VALUE 'S',
l_msg TYPE bapi_msg.
DATA: l_line TYPE mb_line_id.
DATA: l_zsbc_msg TYPE zsbc_msg.
DATA: l_lineqty TYPE i,
l_lineqty2 TYPE i.
DATA: lt_ztmm009 LIKE STANDARD TABLE OF ztmm009 WITH HEADER LINE.
DATA: lt_matdoc LIKE STANDARD TABLE OF matdoc WITH HEADER LINE.
DATA: BEGIN OF lt_guid_item OCCURS 0,
guid_item TYPE zguid_item,
END OF lt_guid_item.
DATA: l_meins TYPE meins.
DATA: lt_split TYPE TABLE OF string,
ls_split TYPE string.
DATA: lt_zqtrks TYPE matdoc-menge. "最大免费出库数量字段
*-------------------------------------MES传输创建工单逻辑
DATA: lt_013_in TYPE zttmm_013_in,
ls_013_in TYPE zsmm_013_in,
lt_013_out TYPE zttmm_013_out.
*-------------------------------------MES传输创建工单逻辑
TYPES: BEGIN OF ty_po,
ebeln TYPE ekpo-ebeln,
ebelp TYPE ekpo-ebelp,
END OF ty_po .
DATA lt_po TYPE TABLE OF ty_po .
CLEAR: lt_po, lt_po[].
"CALL FUNCTION 'ZFM_BREAK_POINT'.
CLEAR:gv_key1,gv_key2.
SPLIT i_input AT ':' INTO TABLE lt_split.
* LOOP AT lt_split INTO ls_split.
* IF sy-tabix = 1 .
* CONTINUE.
* ENDIF.
* CONDENSE ls_split.
* IF ls_split IS INITIAL.
* EXIT.
* ENDIF.
* IF ls_split+0(1) NE '"' AND ls_split+0(1) NE '['.
* e_output = 'JSON格式不正确'.
* EXIT.
* ENDIF.
* ENDLOOP.
IF e_output IS NOT INITIAL.
l_mod = 'E'.
l_msg = 'JSON结构不规范请检查!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg .
APPEND gs_output TO gt_output.
lwa_output-data_list = gt_output.
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = lwa_output
IMPORTING
e_json = e_output.
PERFORM write_log_ty USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
EXIT.
ENDIF.
CALL FUNCTION 'Z_FMBC_JSONTOABAP2'
EXPORTING
i_json = i_input
IMPORTING
e_data = gs_data.
gt_input = gs_data-data_list.
****************checkdata
IF gt_input IS INITIAL.
l_mod = 'E'.
l_msg = '请检查JSON结构与SAP ABAP结构 是否一致!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg .
APPEND gs_output TO gt_output.
lwa_output-data_list = gt_output[].
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = lwa_output
IMPORTING
e_json = e_output.
PERFORM write_log_mvt USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
EXIT.
ENDIF.
DATA p_count TYPE i.
CLEAR: lt_guid_item[].
FIELD-SYMBOLS <fs_input> TYPE zsmm_goodsmvt_input.
FIELD-SYMBOLS <fs_item> TYPE zsmm_goodsmvt_item_input.
LOOP AT gt_input ASSIGNING <fs_input>.
gs_input = <fs_input>.
TRANSLATE <fs_input>-bktxt TO UPPER CASE.
"影响效率,先去掉这个控制
* READ TABLE gs_input-mvt_item INTO gs_item INDEX 1.
* SELECT COUNT( * ) INTO p_count FROM ztfi013 WHERE werks = gs_item-werks AND gjahr = gs_input-budat+0(4) AND monat = gs_input-budat+4(2) AND zflag = 'X'.
* IF sy-subrc EQ 0 AND gs_item-bwart <> '103'.
* l_mod = 'E'.
* l_msg = 'WMS不允许过账,请找财务维护 ZFIR069A !'.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg .
* APPEND gs_output TO gt_output.
* lwa_output-data_list = gt_output[].
* CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
* EXPORTING
* i_data = lwa_output
* IMPORTING
* e_json = e_output.
* PERFORM write_log_mvt USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
* EXIT.
* ENDIF.
CLEAR gs_item.
LOOP AT <fs_input>-mvt_item ASSIGNING <fs_item>.
gs_item = <fs_item>.
CALL FUNCTION 'Z_FMBC_CONVERT_MATNR_IN'
EXPORTING
i_matnr = <fs_item>-matnr
IMPORTING
e_matnr = <fs_item>-matnr
* E_STATUS =
.
<fs_item>-lifnr = |{ <fs_item>-lifnr ALPHA = IN }|.
<fs_item>-kunnr = |{ <fs_item>-kunnr ALPHA = IN }|.
<fs_item>-vbeln_im = |{ <fs_item>-vbeln_im ALPHA = IN }|.
<fs_item>-aufnr = |{ <fs_item>-aufnr ALPHA = IN }|.
<fs_item>-kostl = |{ <fs_item>-kostl ALPHA = IN }|.
<fs_item>-mat_kdauf = |{ <fs_item>-mat_kdauf ALPHA = IN }|.
<fs_item>-kdauf = |{ <fs_item>-kdauf ALPHA = IN }|.
IF <fs_item>-erfme IS NOT INITIAL.
CLEAR: l_meins.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = <fs_item>-erfme
language = sy-langu
IMPORTING
output = l_meins
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF l_meins IS NOT INITIAL.
<fs_item>-erfme = l_meins.
ENDIF.
ENDIF.
lt_guid_item-guid_item = gs_item-guid_item.
COLLECT lt_guid_item.
gv_key1 = gs_item-werks .
gv_key2 = gs_item-bwart .
"填充中间表
CLEAR gs_temp.
gs_temp-matnr = <fs_item>-matnr.
gs_temp-werks = <fs_item>-werks.
gs_temp-ebeln = <fs_item>-ebeln.
gs_temp-ebelp = <fs_item>-ebelp.
gs_temp-lfbja = <fs_item>-lfbja.
gs_temp-mblnr = <fs_item>-lfbnr.
gs_temp-zeile = <fs_item>-lfpos.
gs_temp-aufnr = <fs_item>-aufnr.
APPEND gs_temp TO gt_temp.
ENDLOOP.
DESCRIBE TABLE gs_input-mvt_item[] LINES l_lineqty.
ENDLOOP.
DESCRIBE TABLE lt_guid_item[] LINES l_lineqty2.
IF l_lineqty > l_lineqty2.
l_mod = 'E'.
l_msg = '物料凭证WMS明细行标记不可重复!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg .
APPEND gs_output TO gt_output.
lwa_output-data_list = gt_output[].
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = lwa_output
IMPORTING
e_json = e_output.
PERFORM write_log_mvt USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
EXIT.
ENDIF.
****************************** 此段作废和下面的合并,优化效率****************************************
* LOOP AT gt_input INTO gs_input.
*
* "根据物料凭证取出采购凭证
* IF gs_input-mvt_item IS NOT INITIAL.
** SELECT mblnr,mjahr,zeile,ebeln,ebelp,werks
** FROM mseg
** INTO TABLE @DATA(lt_mseg)
** FOR ALL ENTRIES IN @gs_input-mvt_item
** WHERE mblnr = @gs_input-mvt_item-lfbnr
** AND zeile = @gs_input-mvt_item-lfpos.
**
** SELECT aufnr,posnr,dwerk
** FROM afpo
** INTO TABLE @DATA(lt_afpo)
** FOR ALL ENTRIES IN @gs_input-mvt_item
** WHERE posnr = @gs_input-mvt_item-lfpos. "AND aufnr = @gs_input-mvt_item-lfbnr
* ENDIF.
* LOOP AT gs_input-mvt_item INTO gs_item .
*
** READ TABLE lt_mseg INTO DATA(ls_mseg) WITH KEY mblnr = gs_item-lfbnr zeile = gs_item-lfpos.
** IF sy-subrc = 0.
** gs_item-ebeln = ls_mseg-ebeln.
** gs_item-ebelp = ls_mseg-ebelp.
** gs_item-lfbja = ls_mseg-mjahr.
** gs_item-werks = ls_mseg-werks.
** ENDIF.
*
** READ TABLE lt_afpo INTO DATA(ls_afpo) WITH KEY aufnr = gs_item-lfbnr posnr = gs_item-lfpos.
** IF sy-subrc = 0.
** gs_item-aufnr = ls_afpo-aufnr.
*** gs_item-lfpos = ls_afpo-lfpos.
** gs_item-werks = ls_afpo-dwerk.
** ENDIF.
*
* CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
* EXPORTING
* input = gs_item-matnr
* IMPORTING
* output = gs_item-matnr.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-lifnr
* IMPORTING
* output = gs_item-lifnr.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-kunnr
* IMPORTING
* output = gs_item-kunnr.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-vbeln_im
* IMPORTING
* output = gs_item-vbeln_im.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-aufnr
* IMPORTING
* output = gs_item-aufnr.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-kostl
* IMPORTING
* output = gs_item-kostl.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-mat_kdauf
* IMPORTING
* output = gs_item-mat_kdauf.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gs_item-kdauf
* IMPORTING
* output = gs_item-kdauf.
*
* IF gs_item-erfme IS NOT INITIAL.
* CLEAR: l_meins.
* CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
* EXPORTING
* input = gs_item-erfme
* language = sy-langu
* IMPORTING
* output = l_meins
* EXCEPTIONS
* unit_not_found = 1
* OTHERS = 2.
* IF l_meins IS NOT INITIAL.
* gs_item-erfme = l_meins.
* ENDIF.
* ENDIF.
*
* TRANSLATE gs_item-guid_item TO UPPER CASE.
* MODIFY gs_input-mvt_item FROM gs_item.
* ENDLOOP.
*
* TRANSLATE gs_input-bktxt TO UPPER CASE.
*
* MODIFY gt_input FROM gs_input.
* ENDLOOP.
****************************** 此段作废和下面的合并,优化效率****************************************
IF gt_temp[] IS NOT INITIAL.
SELECT matnr,mtart
FROM mara
INTO TABLE @DATA(lt_mara)
FOR ALL ENTRIES IN @gt_temp
WHERE matnr = @gt_temp-matnr.
SELECT matnr,werks,bwart,menge
FROM matdoc
FOR ALL ENTRIES IN @gt_temp
WHERE matnr = @gt_temp-matnr AND werks = @gt_temp-werks AND bwart IN ('511','512')
INTO TABLE @DATA(lw_matdoc2) .
SELECT ebeln,ebelp,loekz,elikz,zwwbd,pstyp,menge
FROM ekpo
INTO TABLE @DATA(lt_ekpo)
FOR ALL ENTRIES IN @gt_temp
WHERE ebeln = @gt_temp-ebeln
AND ebelp = @gt_temp-ebelp.
SELECT mjahr,mblnr,zeile,bwart
FROM matdoc
INTO TABLE @DATA(gt_matdoc)
FOR ALL ENTRIES IN @gt_temp
WHERE mjahr = @gt_temp-lfbja
AND mblnr = @gt_temp-mblnr
AND zeile = @gt_temp-zeile.
SELECT aufnr,werks
FROM aufk
INTO TABLE @DATA(lt_aufk)
FOR ALL ENTRIES IN @gt_temp
WHERE aufnr = @gt_temp-aufnr
AND werks = @gt_temp-werks.
ENDIF.
MOVE-CORRESPONDING i_data_gd TO gs_output.
LOOP AT gt_input INTO gs_input.
MOVE-CORRESPONDING gs_input TO gs_output.
CLEAR: l_lineqty.
DESCRIBE TABLE gs_input-mvt_item LINES l_lineqty.
* IF l_lineqty > 9999.
IF l_lineqty > 300.
l_mod = 'E'.
l_msg = '同一个凭证明细不能大于300行'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
IF gs_input-bktxt IS INITIAL.
l_mod = 'E'.
l_msg = '抬头文本BKTXT不能为空'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
LOOP AT gs_input-mvt_item INTO gs_item .
IF gs_item-guid_item IS INITIAL.
EXIT.
ENDIF.
gs_output-guid_item = gs_item-guid_item.
"先注释
* SELECT SINGLE * FROM matdoc
* WHERE bktxt = gs_input-bktxt
* AND ablad = gs_item-guid_item.
* IF sy-subrc = 0.
* l_mod = 'E'.
* l_msg = 'WMS单据重复'.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* APPEND gs_output TO gt_output.
* EXIT.
* ENDIF.
* IF gs_item-bwart = '512' AND gs_item-matnr IS NOT INITIAL.
* SELECT SINGLE * FROM mara
* WHERE matnr = gs_item-matnr.
* IF sy-subrc = 0 AND mara-mtart NE 'Z051'.
* SELECT
* CAST( @space AS CHAR( 10 ) ) AS ext_fd01,
* CAST( @space AS CHAR( 10 ) ) AS ext_fd01
* FROM matdoc
* WHERE matnr = gs_item-matnr AND werks = gs_item-werks AND bwart in ('511','512')
* INTO @DATA(lw_matdoc) .
*
* l_mod = 'E'.
* l_msg = '512移动类型只允许客供料做免费出库!'.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* APPEND gs_output TO gt_output.
* EXIT.
* ENDIF.
* ENDIF.
*-----------------------------------"非客供料增加512移动类型判断24.3.15
IF gs_item-bwart = '512' AND gs_item-matnr IS NOT INITIAL.
"迁移到外部提升效率
* SELECT SINGLE *
* FROM mara
* INTO @DATA(ls_mara)
* WHERE matnr = @gs_item-matnr.
READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = gs_item-matnr.
IF sy-subrc = 0 AND ls_mara-mtart NE 'Z051'.
* SELECT matnr,werks,bwart,menge
* FROM matdoc
* WHERE matnr = @gs_item-matnr AND werks = @gs_item-werks AND bwart IN ('511','512')
* INTO TABLE @DATA(lw_matdoc2) .
*
* SELECT SINGLE *
* FROM @lw_matdoc2 AS a
* WHERE bwart = '511'
* INTO @DATA(lw_matdoc1).
READ TABLE lw_matdoc2 INTO DATA(lw_matdoc1) WITH KEY bwart = '511' matnr = gs_item-matnr werks = gs_item-werks.
IF sy-subrc = 0 AND lw_matdoc1 IS INITIAL.
l_mod = 'E'.
l_msg = '512移动类型不允许未做过其它入库的物料做其它出库'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
CLEAR lt_zqtrks.
LOOP AT lw_matdoc2 ASSIGNING FIELD-SYMBOL(<fs_tab>) WHERE matnr = gs_item-matnr AND werks = gs_item-werks.
IF <fs_tab>-bwart = '511'.
lt_zqtrks = lt_zqtrks + <fs_tab>-menge.
ELSE.
lt_zqtrks = lt_zqtrks - <fs_tab>-menge.
ENDIF.
ENDLOOP.
IF lt_zqtrks - gs_item-erfmg < 0 .
l_mod = 'E'.
l_msg = |512移动类型其它出库数量不能大于其它入库数量,最大出库数量:{ lt_zqtrks }|.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
ENDIF.
*-----------------------------------
IF ( gs_item-bwart = '101' OR gs_item-bwart = '103' OR gs_item-bwart = '105' ) AND gs_item-ebeln IS NOT INITIAL.
* SELECT SINGLE * FROM ekpo
* WHERE ebeln = gs_item-ebeln
* AND ebelp = gs_item-ebelp.
READ TABLE lt_ekpo INTO DATA(ls_ekpo) WITH KEY ebeln = gs_item-ebeln ebelp = gs_item-ebelp.
IF sy-subrc NE 0 .
l_mod = 'E'.
l_msg = '采购订单行已删除或已关闭'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ELSEIF ls_ekpo-loekz = 'L' OR ls_ekpo-elikz = 'X'.
l_mod = 'E'.
l_msg = '采购订单行已删除或已关闭'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
"记录PO号和行项目,后面调用Z_FMMM_002
lt_po = VALUE #( BASE lt_po ( ebeln = gs_item-ebeln ebelp = gs_item-ebelp ) ) .
ELSEIF gs_item-bwart = '122' AND gs_item-ebeln IS NOT INITIAL.
* CLEAR:matdoc.
* SELECT SINGLE * FROM matdoc
* WHERE mjahr = gs_item-lfbja
* AND mblnr = gs_item-lfbnr
* AND zeile = gs_item-lfpos.
READ TABLE gt_matdoc INTO DATA(gs_matdoc) WITH KEY mjahr = gs_item-lfbja
mblnr = gs_item-lfbnr
zeile = gs_item-lfpos.
IF sy-subrc = 0 AND ( gs_matdoc-bwart = '101' OR gs_matdoc-bwart = '105' ).
ELSE.
l_mod = 'E'.
l_msg = '请检查原入库凭证'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
"记录PO号和行项目,后面调用Z_FMMM_002
lt_po = VALUE #( BASE lt_po ( ebeln = gs_item-ebeln ebelp = gs_item-ebelp ) ) .
ENDIF.
*-----------------------------------"添加移动类型判断逻辑 -Z62-ZHANGYJ-2022.6.16
IF gs_item-bwart = '262' OR gs_item-bwart = '261'."OR gs_item-bwart = 'Z62'.
* IF gs_item-aufnr IS INITIAL OR gs_item-rsnum IS INITIAL OR gs_item-rspos IS INITIAL.
* l_mod = 'E'.
* l_msg = '移动类型为261/262字段:工单号、预留号、预留项必须传入!'.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* APPEND gs_output TO gt_output.
* EXIT.
* ENDIF.
ENDIF.
IF gs_item-bwart = 'Z62' AND ( gs_item-aufnr IS INITIAL OR gs_item-lgort IS INITIAL ).
l_mod = 'E'.
l_msg = '移动类型为Z62字段:工单号、库位必须传入!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
IF gs_item-bwart = '303' OR gs_item-bwart = '306' .
IF gs_item-matnr IS INITIAL OR gs_item-werks IS INITIAL OR gs_item-lgort IS INITIAL
OR gs_item-umwrk IS INITIAL OR gs_item-erfmg IS INITIAL.
l_mod = 'E'.
l_msg = '移动类型为 303/306字段:MATNR、WERKS、LGORT、UMWRK、ERFMG、BWART=303/306必须传入!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
IF gs_item-bwart = '304' OR gs_item-bwart = '305' .
IF gs_item-matnr IS INITIAL OR gs_item-werks IS INITIAL OR gs_item-lgort IS INITIAL
OR gs_item-umwrk IS INITIAL OR gs_item-erfmg IS INITIAL.
l_mod = 'E'.
l_msg = '移动类型为 304/305字段:MATNR、WERKS、LGORT、UMWRK、ERFMG、BWART=304/305必须传入!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
IF gs_item-bwart = '313' OR gs_item-bwart = '314' OR gs_item-bwart = '315' OR gs_item-bwart = '316' .
IF gs_item-matnr IS INITIAL OR gs_item-werks IS INITIAL OR gs_item-lgort IS INITIAL
OR gs_item-umwrk IS INITIAL OR gs_item-erfmg IS INITIAL OR gs_item-umlgo IS INITIAL.
l_mod = 'E'.
l_msg = '移动类型为313/314/315/316 字段:MATNR、WERKS、UMWRK、LGORT、UMLGO、ERFMG、BWART=313/314/315/316必须传入!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
"判断103/124
"临时关闭124移动类型IQC二次过账管控 没启动先注释
* IF gs_item-bwart = '103' .
* SELECT SINGLE usnam ,cpudt,cputm
* FROM ztmm0034
* WHERE ablad = @gs_item-guid_item AND werks = @gs_item-werks AND bwart = @gs_item-bwart
* INTO @DATA(lw_034) .
* IF sy-subrc EQ 0.
* l_mod = 'E'.
* l_msg = |数据重复提交! 系统已有数据,用户:{ lw_034-usnam },创建于[日期]:{ lw_034-cpudt },[时间]:{ lw_034-cputm }| .
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* APPEND gs_output TO gt_output.
* EXIT.
* ENDIF.
* ENDIF.
*"添加移动类型判断逻辑
IF gs_item-aufnr IS NOT INITIAL AND gs_item-werks IS NOT INITIAL.
IF gs_item-aufnr >= '510100000000' AND gs_item-aufnr <= '530199999999'.
* SELECT SINGLE werks FROM aufk WHERE aufnr = @gs_item-aufnr AND werks = @gs_item-werks INTO @DATA(lv_wek) .
READ TABLE lt_aufk TRANSPORTING NO FIELDS WITH KEY aufnr = gs_item-aufnr werks = gs_item-werks.
IF sy-subrc NE 0.
l_mod = 'E'.
l_msg = '工单工厂与输入工厂不匹配!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
ENDIF.
*"261移动类型增加数量校验 By xwh
IF gs_item-bwart = '261'.
DATA:lv_sum_mng TYPE bdmng.
SELECT SINGLE rsnum,rspos,enmng,bdmng
FROM resb INTO @DATA(ls_resb)
WHERE rsnum = @gs_item-rsnum AND rspos = @gs_item-rspos.
IF sy-subrc = 0.
lv_sum_mng = ls_resb-enmng.
LOOP AT gs_input-mvt_item INTO DATA(ls_item_temp) WHERE rsnum = gs_item-rsnum AND rspos = gs_item-rspos.
lv_sum_mng = lv_sum_mng + ls_item_temp-erfmg.
ENDLOOP.
SELECT SINGLE ztmm029~matkl,menge
FROM ztmm029
INNER JOIN mara ON mara~matkl = ztmm029~matkl
INTO @DATA(ls_ztmm029)
WHERE matnr = @gs_item-matnr.
IF sy-subrc <> 0.
CLEAR:ls_ztmm029.
ENDIF.
IF lv_sum_mng > ls_resb-bdmng + ls_ztmm029-menge.
l_mod = 'E'.
l_msg = '累积数量不允许超过预留单总数'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
IF gs_item-guid_item IS INITIAL.
l_mod = 'E'.
l_msg = 'WMS单据号、GUID_ITEM必须有值'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
EXIT.
ENDIF.
ENDLOOP.
IF gt_output IS NOT INITIAL.
lwa_output-data_list = gt_output[].
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = lwa_output
IMPORTING
e_json = e_output.
PERFORM write_log_mvt USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
EXIT.
ENDIF.
*************委外补单手动构造组件行
LOOP AT gt_input INTO gs_input.
LOOP AT gs_input-mvt_item INTO gs_item WHERE ebeln IS NOT INITIAL AND ( bwart = '101' OR bwart = '122' ).
* CLEAR: l_zwwbd.
* SELECT SINGLE zwwbd INTO l_zwwbd
* FROM ekpo
* WHERE ebeln = gs_item-ebeln
* AND ebelp = gs_item-ebelp.
CLEAR:ls_ekpo.
READ TABLE lt_ekpo INTO ls_ekpo WITH KEY ebeln = gs_item-ebeln ebelp = gs_item-ebelp.
* l_zwwbd = ls_ekpo-zwwbd.
IF ls_ekpo-pstyp = '3'.
l_zwwbd = 'X'.
ENDIF.
IF l_zwwbd = 'X' AND gs_item-bwart NE '122'. "22.04.26 和陈龙验证,委外采购退货,不需要添加组件 500凭证号:5000001177
CLEAR: lt_resb,lt_resb[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_resb
FROM resb
WHERE ebeln = gs_item-ebeln
AND ebelp = gs_item-ebelp
AND xloek = ''
AND dumps = '' "排除虚拟件
AND bdart NE ''
AND postp = 'L'.
DATA:lv_sum_bdmng TYPE resb-bdmng.
LOOP AT lt_resb INTO DATA(lg_resb) GROUP BY ( matnr = lg_resb-matnr ).
"按物料号汇总出数量
lv_sum_bdmng = 0.
LOOP AT GROUP lg_resb INTO DATA(member).
lv_sum_bdmng = lv_sum_bdmng + member-bdmng.
ENDLOOP.
CLEAR: gs_item_temp.
MOVE-CORRESPONDING gs_item TO gs_item_temp.
IF gs_item-bwart = '101'.
IF lg_resb-shkzg = 'S'.
gs_item_temp-bwart = '531'.
CONTINUE.
ELSE.
gs_item_temp-bwart = '543'.
ENDIF.
ELSE.
IF lg_resb-shkzg = 'S'.
gs_item_temp-bwart = '532'.
ELSE.
gs_item_temp-bwart = '544'.
ENDIF.
ENDIF.
gs_item_temp-sobkz = 'O'.
gs_item_temp-matnr = lg_resb-matnr.
gs_item_temp-werks = lg_resb-werks.
CLEAR: gs_item_temp-lgort.
* gs_item_temp-erfmg = 0.
"组件数量 = ( 当前收货数量 / 采购订单数量 ) * BDMNG。再从表T006中,当MSEHI = RESB-MEINS且ANDEC = 空有记录,则组件数量向上取整。
gs_item_temp-erfmg = gs_item-erfmg / ls_ekpo-menge * lv_sum_bdmng.
SELECT SINGLE msehi FROM t006 INTO @DATA(ls_t006)
WHERE msehi = @lg_resb-meins AND andec = ''.
IF sy-subrc = 0.
"对所得数量向上取整
gs_item_temp-erfmg = ceil( gs_item_temp-erfmg ).
ENDIF.
SELECT mblnr,mjahr,zeile,erfmg,bwart
FROM mseg
INTO TABLE @DATA(lt_mseg)
WHERE matnr = @lg_resb-matnr
AND sobkz = 'O'
AND werks = @lg_resb-werks
AND ebeln = @gs_item-ebeln
AND ebelp = @gs_item-ebelp
AND ( bwart = '543' OR bwart = '544' ).
DATA:lv_sum_mseg TYPE mseg-erfmg.
lv_sum_mseg = 0.
LOOP AT lt_mseg INTO DATA(ls_mseg).
IF ls_mseg-bwart = '543'.
lv_sum_mseg = lv_sum_mseg + ls_mseg-erfmg.
ELSEIF ls_mseg-bwart = '544'.
lv_sum_mseg = lv_sum_mseg - ls_mseg-erfmg.
ENDIF.
ENDLOOP.
"如果本次数量累加前面的数量大于等于总的需求数量,那修正本次的数量
IF gs_item_temp-erfmg + lv_sum_mseg >= lv_sum_bdmng.
gs_item_temp-erfmg = lv_sum_bdmng - lv_sum_mseg.
ENDIF.
"如果需求已经全部发完,那组件也把剩余全部发送
SELECT mblnr,mjahr,zeile,erfmg,bwart
FROM mseg
INTO TABLE @DATA(lt_mseg_2)
WHERE matnr = @gs_item-matnr
* AND sobkz = ''
AND werks = @gs_item-werks
AND ebeln = @gs_item-ebeln
AND ebelp = @gs_item-ebelp
AND ( bwart = '101' OR bwart = '102' OR bwart = '122' OR bwart = '161'). "多加122和161冲销101移动类型的退货场景-- add by hps20250811
DATA:lv_sum_fhsl TYPE mseg-erfmg. "总发货数量
lv_sum_fhsl = 0.
LOOP AT lt_mseg_2 INTO DATA(ls_mseg_2).
IF ls_mseg_2-bwart = '101'.
lv_sum_fhsl = lv_sum_fhsl + ls_mseg_2-erfmg.
ELSEIF ls_mseg_2-bwart = '102' or ls_mseg_2-bwart = '122' or ls_mseg_2-bwart = '161'.
lv_sum_fhsl = lv_sum_fhsl - ls_mseg_2-erfmg.
ENDIF.
ENDLOOP.
IF lv_sum_fhsl + gs_item-erfmg >= ls_ekpo-menge.
gs_item_temp-erfmg = lv_sum_bdmng - lv_sum_mseg.
ENDIF.
SELECT mblnr,mjahr,zeile,erfmg,bwart
FROM mseg
INTO TABLE @DATA(lt_mseg_541)
WHERE matnr = @lg_resb-matnr
AND sobkz = 'O'
AND werks = @lg_resb-werks
AND ebeln = @gs_item-ebeln
AND ebelp = @gs_item-ebelp
AND ( bwart = '541' OR bwart = '542' ).
DATA:lv_sum_541 TYPE mseg-erfmg. "当时发送组件的总数
lv_sum_541 = 0.
LOOP AT lt_mseg_541 INTO DATA(ls_mseg_541).
IF ls_mseg_541-bwart = '541'.
lv_sum_541 = lv_sum_541 + ls_mseg_541-erfmg.
ELSEIF ls_mseg_541-bwart = '542'.
lv_sum_541 = lv_sum_541 - ls_mseg_541-erfmg.
ENDIF.
ENDLOOP.
"如果当时发件的总数 < 收件的历史数 + 本次收货数,则报错
DATA(lv_ccsl) = lv_sum_mseg + gs_item_temp-erfmg - lv_sum_541. "收货超出数量
IF lv_ccsl > 0.
l_mod = 'E'.
l_msg = |PO单{ gs_item-ebeln } 行号{ gs_item-ebelp ALPHA = OUT }对应组件{ lg_resb-matnr ALPHA = OUT }缺少{ lv_ccsl }|.
CONDENSE l_msg NO-GAPS.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
ENDIF.
gs_item_temp-erfme = lg_resb-erfme.
APPEND gs_item_temp TO gs_input-mvt_item.
ENDLOOP.
ENDIF.
ENDLOOP.
IF gs_output-messagelist[] IS NOT INITIAL.
MOVE-CORRESPONDING gs_input TO gs_output.
APPEND gs_output TO gt_output.
ENDIF.
MODIFY gt_input FROM gs_input.
ENDLOOP.
****************inputdata
IF l_mod <> 'E'.
LOOP AT gt_input INTO gs_input.
CLEAR: l_mblnr,l_mjahr,it_return[].
CLEAR: wa_bapi_header,it_bapi_item,it_bapi_item[],wa_goodsmvt_code.
wa_bapi_header-pstng_date = gs_input-budat. "过账日期
wa_bapi_header-doc_date = gs_input-bldat. "凭证日期
wa_bapi_header-header_txt = gs_input-bktxt. "凭证抬头文本
wa_bapi_header-ref_doc_no = gs_input-xblnr. "参照
wa_bapi_header-bill_of_lading = gs_input-frbnr. "提单号
CLEAR: lt_ztmm0034,lt_ztmm0034[].
LOOP AT gs_input-mvt_item INTO gs_item .
it_bapi_item-line_id = sy-tabix.
it_bapi_item-move_type = gs_item-bwart. "移动类型
it_bapi_item-spec_stock = gs_item-sobkz. "特殊库存标识
it_bapi_item-plant = gs_item-werks. "工厂
it_bapi_item-stge_loc = gs_item-lgort. "库存地点
* it_bapi_item-material = gs_item-matnr. "物料号
it_bapi_item-material_long = gs_item-matnr. "物料号
it_bapi_item-entry_qnt = gs_item-erfmg. "单位条目的数量
it_bapi_item-entry_uom = gs_item-erfme. "数量的单位
it_bapi_item-move_plant = gs_item-umwrk. "收货工厂/发货工厂
it_bapi_item-move_stloc = gs_item-umlgo. "收货/发货库存地点
it_bapi_item-po_number = gs_item-ebeln. "采购订单号
it_bapi_item-po_item = gs_item-ebelp. "采购订单行项目
it_bapi_item-reserv_no = gs_item-rsnum. "预留号
it_bapi_item-res_item = gs_item-rspos. "预留行项目
it_bapi_item-orderid = gs_item-aufnr. "生产订单号
it_bapi_item-ref_doc_yr = gs_item-lfbja. "参考凭证会计年度
it_bapi_item-ref_doc = gs_item-lfbnr. "参考凭证的凭证号
it_bapi_item-ref_doc_it = gs_item-lfpos. "参考凭证项目
it_bapi_item-costcenter = gs_item-kostl. "成本中心
it_bapi_item-item_text = gs_item-sgtxt. "行项目文本
it_bapi_item-vendor = gs_item-lifnr. "如果供应商账号为空,则不向内表填充
it_bapi_item-customer = gs_item-kunnr. "客户
it_bapi_item-stck_type = gs_item-insmk. "库存类型
it_bapi_item-no_more_gr = gs_item-elikz. "交货已完成标识
it_bapi_item-gr_rcpt = gs_item-wempf. "收货方
it_bapi_item-move_reas = gs_item-grund. "移动原因
it_bapi_item-val_sales_ord = gs_item-kdauf. "源销售订单号
it_bapi_item-val_s_ord_item = gs_item-kdpos. "源销售订单行项目
it_bapi_item-sales_ord = gs_item-mat_kdauf. "销售订单号
it_bapi_item-s_ord_item = gs_item-mat_kdpos. "销售订单行项目
it_bapi_item-deliv_numb_to_search = gs_item-vbeln_im. "交货单
it_bapi_item-deliv_item_to_search = gs_item-vbelp_im. "交货单行项目
it_bapi_item-unload_pt = gs_item-guid_item. "MES单据的行唯一标识
it_bapi_item-gl_account = gs_item-account.
"非计划借用字段
IF cl_abap_matcher=>matches( pattern = '201|202|Z05|Z06|Z13|Z14|Z15|Z16|Z97|Z98' text = gs_item-bwart ).
it_bapi_item-fund = gs_item-wempf.
CLEAR it_bapi_item-gr_rcpt .
ENDIF.
IF ( gs_item-bwart = '101' OR gs_item-bwart = '122'
OR gs_item-bwart = '543' OR gs_item-bwart = '544' OR gs_item-bwart = '105' )
AND gs_item-ebeln IS NOT INITIAL.
it_bapi_item-mvt_ind = 'B'.
IF gs_item-bwart = '122' AND gs_item-aufnr IS NOT INITIAL.
it_bapi_item-mvt_ind = 'F'.
ENDIF.
wa_goodsmvt_code-gm_code = '01'.
IF gs_item-bwart = '101' OR gs_item-bwart = '122' OR gs_item-bwart = '105'.
l_line = it_bapi_item-line_id.
ENDIF.
IF gs_item-bwart = '543' OR gs_item-bwart = '544'.
CLEAR: it_bapi_item-line_id,it_bapi_item-mvt_ind.
it_bapi_item-parent_id = l_line.
* IT_BAPI_ITEM-line_depth = 1.
ENDIF.
ELSEIF ( gs_item-bwart = '101' OR gs_item-bwart = '102' OR gs_item-bwart = '122' ) AND gs_item-aufnr IS NOT INITIAL.
it_bapi_item-mvt_ind = 'F'.
wa_goodsmvt_code-gm_code = '02'.
IF gs_item-bwart = '122'.
wa_goodsmvt_code-gm_code = '01'.
ENDIF.
ELSEIF gs_item-bwart = '201' OR gs_item-bwart = 'Z01' OR gs_item-bwart = 'Z03'
OR gs_item-bwart = 'Z05' OR gs_item-bwart = 'Z11'
OR gs_item-bwart = '202' OR gs_item-bwart = 'Z02' OR gs_item-bwart = 'Z04'
OR gs_item-bwart = 'Z06' OR gs_item-bwart = 'Z12'
OR gs_item-bwart = 'Z09' OR gs_item-bwart = 'Z10'
OR gs_item-bwart = 'Z07' OR gs_item-bwart = 'Z08'
OR gs_item-bwart = 'Z13' OR gs_item-bwart = 'Z15'
OR gs_item-bwart = 'Z14' OR gs_item-bwart = 'Z16'
OR gs_item-bwart = '531' OR gs_item-bwart = '532'
OR gs_item-bwart = '261' OR gs_item-bwart = '262'
OR gs_item-bwart = 'Z61' OR gs_item-bwart = 'Z62'
OR gs_item-bwart = '231' or gs_item-bwart = 'Z31'."添加移动类型-
IF gs_item-erfmg NE 0.
wa_goodsmvt_code-gm_code = '03'.
ENDIF.
IF gs_item-bwart = '262' OR gs_item-bwart = '532'."添加移动类型-Z62
it_bapi_item-xstob = 'X'.
ENDIF.
ELSEIF gs_item-bwart = '541' OR gs_item-bwart = '542' OR gs_item-bwart = '301' OR gs_item-bwart = '302'
OR gs_item-bwart = '311' OR gs_item-bwart = '312'.
wa_goodsmvt_code-gm_code = '04'.
ELSEIF gs_item-bwart = '511' OR gs_item-bwart = '512'
OR gs_item-bwart = '561' OR gs_item-bwart = '562'.
wa_goodsmvt_code-gm_code = '05'.
ELSEIF gs_item-bwart = '303' OR gs_item-bwart = '304'
OR gs_item-bwart = '305' OR gs_item-bwart = '306'
OR gs_item-bwart = '313' OR gs_item-bwart = '314'
OR gs_item-bwart = '315' OR gs_item-bwart = '316'.
wa_goodsmvt_code-gm_code = '04'.
ELSEIF gs_item-bwart = '343' OR gs_item-bwart = '344'.
wa_goodsmvt_code-gm_code = '04'.
ELSEIF gs_item-bwart = '161'. "添加161移动类型
it_bapi_item-mvt_ind = 'B'.
wa_goodsmvt_code-gm_code = '01'.
ELSEIF gs_item-bwart = '501' OR gs_item-bwart = '502'. "添加移动类型
wa_goodsmvt_code-gm_code = '01'.
ELSEIF gs_item-bwart = '551' OR gs_item-bwart = '552'.
wa_goodsmvt_code-gm_code = '03'.
ELSEIF gs_item-bwart = '701' OR gs_item-bwart = '702'.
wa_goodsmvt_code-gm_code = '05'.
ELSEIF gs_item-bwart = '411' OR gs_item-bwart = '412' OR gs_item-bwart = '413'.
wa_goodsmvt_code-gm_code = '04'.
ENDIF.
**************************移动类型=103、124的不调用BAPI
IF gs_item-bwart = '103' OR gs_item-bwart = '124'.
CLEAR:lt_ztmm0034.
MOVE-CORRESPONDING gs_item TO lt_ztmm0034.
* move-corresponding I_DATA_GD to lt_ZTMM0034.
IF gs_item-bwart = '124'.
lt_ztmm0034-erfmg = - lt_ztmm0034-erfmg.
ENDIF.
lt_ztmm0034-mjahr = gs_input-bldat+0(4).
lt_ztmm0034-zeile = sy-tabix.
lt_ztmm0034-sjahr = gs_item-lfbja.
lt_ztmm0034-smbln = gs_item-lfbnr.
lt_ztmm0034-smblp = gs_item-lfpos.
lt_ztmm0034-ablad = gs_item-guid_item.
lt_ztmm0034-bktxt = gs_input-bktxt.
lt_ztmm0034-usnam = i_data_gd-uname.
lt_ztmm0034-cpudt = i_data_gd-rdate.
lt_ztmm0034-cputm = i_data_gd-rtime.
APPEND lt_ztmm0034.
CONTINUE.
ENDIF.
APPEND it_bapi_item.
ENDLOOP.
LOOP AT it_bapi_item.
IF it_bapi_item-move_type = '543' OR it_bapi_item-move_type = '544'.
READ TABLE it_bapi_item INTO is_bapi_item WITH KEY po_number = it_bapi_item-po_number po_item = it_bapi_item-po_item move_type+0(2) = '10'.
IF sy-subrc = 0.
it_bapi_item-parent_id = is_bapi_item-line_id.
MODIFY it_bapi_item.
ENDIF.
ENDIF.
IF it_bapi_item-move_type = 'Z61' OR it_bapi_item-move_type = 'Z62'. "2022.11.24 guoxj add.
it_bapi_item-reserv_no = ''. "预留号
it_bapi_item-res_item = ''. "预留行项目
MODIFY it_bapi_item.
ENDIF.
ENDLOOP.
* IF lt_ztmm0034[] IS NOT INITIAL.
* CLEAR: l_num035.
* CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
* EXPORTING
* object = 'ZMM035'.
* CALL FUNCTION 'NUMBER_GET_NEXT'
* EXPORTING
* nr_range_nr = '1'
* object = 'ZMM035'
** quantity = '1'
* IMPORTING
* number = l_num035.
* CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
* EXPORTING
* object = 'ZMM035'.
* IF l_num035 IS NOT INITIAL.
* LOOP AT lt_ztmm0034.
* lt_ztmm0034-mblnr = l_num035.
* MODIFY lt_ztmm0034.
* ENDLOOP.
* IF lt_ztmm0034[] IS NOT INITIAL.
* MODIFY ztmm0034 FROM TABLE lt_ztmm0034[].
* COMMIT WORK AND WAIT.
* l_mod = 'S'.
* l_msg = '成功生成采购到货记录!'.
* CLEAR: lt_ztmm009,lt_ztmm009[].
* LOOP AT lt_ztmm0034.
* MOVE-CORRESPONDING lt_ztmm0034 TO lt_ztmm009.
* lt_ztmm009-userid = i_data_gd-userid.
* lt_ztmm009-sdate = i_data_gd-rdate.
* lt_ztmm009-stim = i_data_gd-rtime.
* lt_ztmm009-bktxt = gs_input-bktxt.
* lt_ztmm009-guid_item = lt_ztmm0034-ablad.
** IF lt_ztmm009-BWART = '103'.
** lt_ztmm009-
** ENDIF.
* APPEND lt_ztmm009.
* ENDLOOP.
* MODIFY ztmm009 FROM TABLE lt_ztmm009[].
* COMMIT WORK AND WAIT.
* ENDIF.
* ELSE.
* l_mod = 'E'.
* l_msg = '获取流水单号失败!'.
* ENDIF.
* LOOP AT lt_ztmm0034.
* gs_output-mblnr = lt_ztmm0034-mblnr.
* gs_output-mjahr = lt_ztmm0034-mjahr.
* gs_output-zeile = lt_ztmm0034-zeile.
* gs_output-bktxt = gs_input-bktxt.
* gs_output-guid_item = lt_ztmm0034-ablad.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* APPEND gs_output TO gt_output.
* ENDLOOP.
* CONTINUE.
* ENDIF.
"调用前加上
IF gs_item-bwart NE '122'. "排除122,当为K时,会报错“移动类型122 (note 306919)的合并和功能选择不可能”
CALL FUNCTION 'MB_SET_BAPI_FLAG'
EXPORTING
action = '3'.
ENDIF.
IF gs_input-testrun IS NOT INITIAL.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = wa_bapi_header
goodsmvt_code = wa_goodsmvt_code
testrun = 'X'
IMPORTING
materialdocument = l_mblnr
matdocumentyear = l_mjahr
TABLES
goodsmvt_item = it_bapi_item[]
return = it_return.
ELSE.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = wa_bapi_header
goodsmvt_code = wa_goodsmvt_code
IMPORTING
materialdocument = l_mblnr
matdocumentyear = l_mjahr
TABLES
goodsmvt_item = it_bapi_item[]
return = it_return.
ENDIF.
IF gs_input-testrun IS NOT INITIAL AND it_return[] IS INITIAL.
gs_output-bktxt = gs_input-bktxt.
l_mod = 'S'.
l_msg = '测试过账成功!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
APPEND gs_output TO gt_output.
ELSEIF l_mblnr IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT it_return WHERE type = 'A' OR type = 'E'.
CLEAR:l_msg .
l_mod = it_return-type.
l_msg = it_return-message.
IF it_return-type = 'E' AND it_return-id = 'M7' AND it_return-number = '021'.
READ TABLE it_bapi_item INTO DATA(lw_bapi_item) INDEX it_return-row .
IF sy-subrc EQ 0.
l_msg = |物料{ lw_bapi_item-material_external };{ lw_bapi_item-po_number }/{ lw_bapi_item-po_item };{ l_msg }| .
ENDIF.
ENDIF.
IF it_return-type = 'E' AND it_return-id = 'M7' AND it_return-number = '112'.
* SELECT SINGLE name_text INTO @DATA(lv_name)
* FROM adrp
* WHERE persnumber = @it_return-message_v1.
DATA:lv_name TYPE ad_namtext.
DATA:lv_user TYPE xubname.
lv_user = it_return-message_v1.
CALL FUNCTION 'FDM_CUST_USER_NAME_READ_SINGLE'
EXPORTING
i_user_id = lv_user
IMPORTING
* E_FIRSTNAME =
* E_LASTNAME =
e_fullname = lv_name.
IF sy-subrc = 0.
CONDENSE lv_name NO-GAPS. "去掉空格字符
it_return-message_v1 = it_return-message_v1 && lv_name.
ENDIF.
MESSAGE ID it_return-id TYPE it_return-type NUMBER it_return-number
INTO l_msg
WITH it_return-message_v1 it_return-message_v2 it_return-message_v3 it_return-message_v4.
ENDIF.
IF it_return-type = 'E' AND it_return-id = 'CO' AND it_return-number = '469'.
lv_user = it_return-message_v2.
CLEAR:lv_name.
CALL FUNCTION 'FDM_CUST_USER_NAME_READ_SINGLE'
EXPORTING
i_user_id = lv_user
IMPORTING
* E_FIRSTNAME =
* E_LASTNAME =
e_fullname = lv_name.
IF sy-subrc = 0.
CONDENSE lv_name NO-GAPS. "去掉空格字符
it_return-message_v2 = it_return-message_v2 && lv_name.
ENDIF.
MESSAGE ID it_return-id TYPE it_return-type NUMBER it_return-number
INTO l_msg
WITH it_return-message_v1 it_return-message_v2 it_return-message_v3 it_return-message_v4.
ENDIF.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
ENDLOOP.
gs_output-bktxt = gs_input-bktxt.
* loop at gs_input-MVT_ITEM into gs_item.
* gs_output-ZEILE = sy-tabix.
* gs_output-GUID_ITEM = gs_item-GUID_ITEM.
APPEND gs_output TO gt_output.
* endloop.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
* WAIT UP TO 1 SECONDS.
l_mod = 'S'.
l_msg = '过账成功!'.
PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
gs_output-mblnr = l_mblnr.
gs_output-mjahr = l_mjahr.
gs_output-bktxt = gs_input-bktxt.
IF gs_input-testrun IS INITIAL.
CLEAR: lt_ztmm009,lt_ztmm009[].
CLEAR: lt_matdoc[],lt_matdoc.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_matdoc
FROM matdoc
WHERE mblnr = l_mblnr
AND mjahr = l_mjahr
AND xauto = ''.
DATA: lv_row TYPE i.
CLEAR lv_row .
LOOP AT lt_matdoc.
ADD 1 TO lv_row .
* lt_ztmm009-mblnr = lt_matdoc-mblnr.
* lt_ztmm009-mjahr = lt_matdoc-mjahr.
* lt_ztmm009-zeile = lt_matdoc-zeile.
* lt_ztmm009-bwart = lt_matdoc-bwart.
* lt_ztmm009-smbln = lt_matdoc-smbln.
* lt_ztmm009-sjahr = lt_matdoc-sjahr.
* lt_ztmm009-smblp = lt_matdoc-smblp.
* lt_ztmm009-bktxt = lt_matdoc-bktxt.
* READ TABLE it_bapi_item WITH KEY unload_pt = lt_matdoc-ablad.
* IF sy-subrc = 0.
* lt_ztmm009-guid_item = lt_matdoc-ablad.
* ELSE.
* READ TABLE it_bapi_item INDEX lv_row ."sy-tabix.
* IF sy-subrc = 0 .
* lt_ztmm009-guid_item = it_bapi_item-unload_pt.
* ENDIF.
* ENDIF.
****** lt_ztmm009-guid_item = lt_matdoc-ablad.
* lt_ztmm009-userid = i_data_gd-userid.
* lt_ztmm009-sdate = i_data_gd-rdate.
* lt_ztmm009-stim = i_data_gd-rtime.
* APPEND lt_ztmm009.
gs_output-zeile = lt_matdoc-zeile.
gs_output-guid_item = lt_matdoc-ablad ."lt_matdoc-ablad.
* IF lt_matdoc-bwart NE '543' AND lt_matdoc-bwart NE '544' AND lt_matdoc-bwart NE '545' AND lt_matdoc-bwart NE '546'.
*-------------------------------------MES传输创建工单逻辑-ZHANGZG-2022.08.12-复制新接口Z_FMMM_ORDERCRT,此接口中逻辑注释
* CLEAR: lt_013_in, ls_013_in, lt_013_out.
* READ TABLE gs_input-mvt_item INTO DATA(ls_mvt) WITH KEY guid_item = gs_output-guid_item.
* IF sy-subrc EQ 0.
* "检查创建工单控制表
* SELECT SINGLE ztpp019~autocrt
* INTO @DATA(lv_autocrt)
* FROM ztpp019
* INNER JOIN mara ON ztpp019~matkl EQ mara~matkl
* WHERE ztpp019~werks EQ @ls_mvt-werks
* AND mara~matnr EQ @ls_mvt-matnr
* AND autocrt EQ 'X'.
* IF sy-subrc EQ 0.
* MOVE-CORRESPONDING ls_mvt TO ls_013_in.
* ls_013_in-mblnr = l_mblnr.
* ls_013_in-mjahr = l_mjahr.
* ls_013_in-zeile = lt_matdoc-zeile.
* APPEND ls_013_in TO lt_013_in.
*
* CALL FUNCTION 'Z_FMPP_020'
* EXPORTING
* i_input = lt_013_in
* IMPORTING
* e_out = lt_013_out.
*
* READ TABLE lt_013_out INTO DATA(ls_020_out) INDEX 1.
* IF sy-subrc EQ 0.
* gs_output-aufnr_new = ls_020_out-aufnr_new.
* l_mod = ls_020_out-status.
* l_msg = ls_020_out-message.
* PERFORM frm_set_msg TABLES gs_output-messagelist USING l_mod '00' '001' l_msg.
* ENDIF.
* ENDIF.
* ENDIF.
*-------------------------------------MES传输创建工单逻辑-ZHANGZG-2022.08.12
* gs_output-guid_item = ''.
APPEND gs_output TO gt_output.
* ENDIF.
ENDLOOP.
* MODIFY ztmm009 FROM TABLE lt_ztmm009[].
* COMMIT WORK AND WAIT.
* CALL FUNCTION 'Z_FMMM_002'
* TABLES
* it_po = lt_po.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
***********返回消息物料号去掉前导零
* DATA: l_c TYPE c,
* l_i TYPE i,
* l_str(9) TYPE c.
* LOOP AT gt_output INTO gs_output.
* LOOP AT gs_output-messagelist INTO l_zsbc_msg.
* SEARCH l_zsbc_msg-message FOR '00000000'.
* IF sy-subrc = 0.
* IF sy-fdpos > 1.
* l_i = sy-fdpos - 1.
* l_c = l_zsbc_msg-message+l_i(1).
* IF l_c = '0' OR l_c = '1' OR l_c = '2' OR l_c = '3' OR l_c = '4' OR l_c = '5' OR l_c = '6'
* OR l_c = '7' OR l_c = '8' OR l_c = '9'.
* ELSE.
* l_c = ' '.
* REPLACE '00000000' WITH '' INTO l_zsbc_msg-message.
* ENDIF.
* ENDIF.
* ENDIF.
* l_zsbc_msg-message = 'SAP:' && l_zsbc_msg-message.
*
* MODIFY gs_output-messagelist FROM l_zsbc_msg.
* ENDLOOP.
* MODIFY gt_output FROM gs_output.
* ENDLOOP.
lwa_output-data_list = gt_output[].
CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
EXPORTING
i_data = lwa_output
IMPORTING
e_json = e_output.
IF gs_input-testrun IS INITIAL.
PERFORM write_log_mvt USING i_data_gd i_input e_output 'MM0013' 'INBOUND' l_mod l_msg.
ENDIF.
*-------------------------------------MES传输创建工单逻辑-ZHANGZG-2022.08.04-异步调用注释掉
* DATA: lt_order TYPE zttpp_020_in,
* ls_order TYPE zspp_020_in,
* lv_task TYPE string.
*
* CLEAR: gs_input, lt_order.
* LOOP AT gt_input INTO gs_input.
* CLEAR: gs_item.
* LOOP AT gs_input-mvt_item INTO gs_item
* WHERE ( bwart EQ '101' OR bwart EQ '102' OR bwart EQ '122' )
* AND aufnr IS NOT INITIAL.
* CLEAR gs_output.
* READ TABLE gt_output INTO gs_output WITH KEY guid_item = gs_item-guid_item.
* IF gs_output-mblnr IS INITIAL. "有凭证号才断续处理
* CONTINUE.
* ENDIF.
*
* "检查创建工单控制表
* SELECT SINGLE ztpp019~autocrt
* INTO @DATA(lv_autocrt)
* FROM ztpp019
* INNER JOIN mara ON ztpp019~matkl EQ mara~matkl
* WHERE ztpp019~werks EQ @gs_item-werks
* AND mara~matnr EQ @gs_item-matnr
* AND autocrt EQ 'X'.
* IF sy-subrc EQ 0.
* CLEAR ls_order.
* MOVE-CORRESPONDING gs_item TO ls_order.
* APPEND ls_order TO lt_order.
* ENDIF.
*
* CLEAR gs_item.
* ENDLOOP.
*
* CLEAR gs_input.
* ENDLOOP.
*
* IF lt_order IS NOT INITIAL.
* "异步调用-MES传输创建工单
* CLEAR lv_task.
* CONCATENATE 'auto_create_' sy-datum '_' sy-uzeit INTO lv_task.
* CALL FUNCTION 'Z_FMPP_020'
* STARTING NEW TASK lv_task
* EXPORTING
* i_input = lt_order.
* ENDIF.
*-------------------------------------MES传输创建工单逻辑
ENDFUNCTION.
三、JSON示例分享
1)不带数据
{
"DATA_LIST":
[
{
"TESTRUN":"",
"BLDAT":"",
"BUDAT":"",
"BKTXT":"",
"XBLNR":"",
"FRBNR":"",
"MVT_ITEM":
[
{
"GUID_ITEM":"",
"BWART":"",
"SOBKZ":"",
"MATNR":"",
"WERKS":"",
"LGORT":"",
"LIFNR":"",
"KUNNR":"",
"INSMK":"",
"ERFMG":0,
"ERFME":"",
"EBELN":"",
"EBELP":0,
"ELIKZ":"",
"VBELN_IM":"",
"VBELP_IM":0,
"LFBJA":0,
"LFBNR":"",
"LFPOS":0,
"RSNUM":0,
"RSPOS":0,
"AUFNR":"",
"KOSTL":"",
"MAT_KDAUF":"",
"MAT_KDPOS":0,
"KDAUF":"",
"KDPOS":0,
"UMWRK":"",
"UMLGO":"",
"SGTXT":"",
"WEMPF":"",
"GRUND":0,
"ACCOUNT":"",
"ANLN1":"",
"ANLN2":""
}
]
}
]
}
2)带数据,以生产订单领料261为例
A.外围系统入参
{
"DATA_LIST":[
{
"MVT_ITEM":[
{
"ERFMG":6.0,
"ERFME":"PCS",
"SOBKZ":"",
"BWART":261,
"GUID_ITEM":"5E16F330B4D14D9B8ECC9FDEE6F37313",
"WERKS":1001,
"LGORT":"S002",
"RSPOS":"0005",
"AUFNR":"100100009617",
"MATNR":"20113922011",
"RSNUM":"0000172530"
}
],
"XBLNR":"",
"BKTXT":"100100009617",
"BLDAT":"20241011",
"FRBNR":"",
"TESTRUN":"",
"BUDAT":"20241011"
}
]
}
B.SAP返回参数
{
"DATA_LIST":[
{
"MBLNR":"4901131779",
"MJAHR":"2025",
"ZEILE":"0001",
"BKTXT":"100100009617",
"GUID_ITEM":"5E16F330B4D14D9B8E",
"AUFNR_NEW":"",
"MESSAGELIST":[
{
"TYPE":"S",
"ID":"00",
"NUMBER":"001",
"MESSAGE":"过账成功!"
}
]
}
]
}