当前位置: 首页 > news >正文

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":"过账成功!"
}
]
}
]
}

http://www.dtcms.com/a/471256.html

相关文章:

  • 【ThinkPHP6系列学习-5】获取变量
  • AI技术路线之争
  • Android编译插桩ASM技术探究(一)
  • 西安网站建设软件模板下载失败
  • 学校的网站开发过程钓鱼软件生成器
  • 宁波企业建站网站建设科技
  • 网站开发学习什么网站建设实施规范
  • 安徽建设厅网站进不去郑州网站优化公司平台
  • 如何在网站投放广告wordpress标题后乱码
  • 【C++学习】继承和多态
  • 开发一个网站需要多少人杭州品牌vi设计公司
  • 韩雪冬做网站多少钱网址搜索ip地址
  • Google 智能体设计模式:探索与发现
  • 湛江购房网官方网站沈阳点金网站建设
  • 靖江网站设计做网站服务好
  • 制作网站的素材wordpress怎么改表缀
  • 合肥网站制作公司有哪些公司网站维护中 源码
  • C++的string类
  • 【软件设计师中级】计算机组成与结构(五):指令系统与计算机体系结构 - CPU的“思维语言“与架构蓝图
  • 柳州网站建设数公式大全wordpress 输出the id
  • 17网站一起做网店杭州wordpress 当前页面
  • 百度推广客户端兰州网站seo收费
  • 建站系统主要包括什么自适应网站导航怎么做
  • 服务器运维(五)服务器漏洞扫描赛博修仙版本——东方仙化神期
  • 深圳建专业网站上海网站关键词优化服务
  • c语言-运算符
  • 从AAAI2025中挑选出对目标检测有帮助的文献——第一期
  • Flowise与cpolar:AI工作流的无界运行解决方案
  • 做网站的三个软件兼职做视频的网站
  • 营销型网站的好处企业网站 生成html