DN过账后,自动做501/502
方案:
一、建3个自建表ZMMT029、ZMMT029A、ZMMT029B
二、存储需要做501/502的数据到自建表,在SE37->MB_CREATE_GOODS_MOVEMENT的最后插入代码。
zit0004是用来控制是否启用该增强的一个配置表,可以取消掉。

DATA: LS_ZMMT029A TYPE ZMMT029A, LT_ZMMT029A TYPE TABLE OF ZMMT029A, LS_ZMMT029B TYPE ZMMT029B, LT_ZMMT029B TYPE TABLE OF ZMMT029B. SELECT COUNT(*) FROM zit0004 WHERE zstop EQ 'X' * AND werks EQ ls_tab_werks-werks AND name IN ('ALL','ZAUTO_501'). IF sy-subrc NE 0. * IF sy-tcode eq 'VL02N' OR sy-tcode eq 'VL03N'. CASE xmseg-bwart. WHEN '631' OR '632'. LOOP AT XMSEG INTO DATA(LS_XMSEG) WHERE XAUTO EQ ''. LS_ZMMT029A-VBELN = LS_XMSEG-VBELN_IM. LS_ZMMT029A-MBLNR = LS_XMSEG-MBLNR. LS_ZMMT029A-MJAHR = LS_XMSEG-MJAHR. LS_ZMMT029A-BWART = LS_XMSEG-BWART. APPEND LS_ZMMT029A TO LT_ZMMT029A[]. ls_zmmt029b-mblnr = ls_xmseg-mblnr."物料凭证编号 ls_zmmt029b-mjahr = ls_xmseg-mjahr."物料凭证年度 ls_zmmt029b-zeile = ls_xmseg-zeile."行号 ls_zmmt029b-matnr = ls_xmseg-matnr."物料 ls_zmmt029b-kunnr = ls_xmseg-kunnr."客户 ls_zmmt029b-werks = ls_xmseg-werks."工厂 ls_zmmt029b-lgort = ls_xmseg-lgort."库存地点 ls_zmmt029b-menge = ls_xmseg-menge."数量 ls_zmmt029b-meins = ls_xmseg-meins."单位 ls_zmmt029b-vbeln = ls_xmseg-vbeln_im."交货单 IF LS_XMSEG-BWART EQ '631'. ls_zmmt029b-bwart = '501'. ELSEIF ls_xmseg-bwart eq '632'. ls_zmmt029b-bwart = '502'. ENDIF. append ls_zmmt029b TO lt_zmmt029b[]. ENDLOOP. IF lt_zmmt029a[] IS NOT INITIAL. MODIFY zmmt029a FROM TABLE lt_zmmt029a. ENDIF. IF lt_zmmt029b[] IS NOT INITIAL. MODIFY zmmt029b FROM TABLE lt_zmmt029b. ENDIF. * WHEN . WHEN OTHERS. ENDCASE. ENDIF.
三、在SE19->DELIVERY_PUBLISH实施增强
写个接口和程序来实现后台JOB执行501或502。
CALL FUNCTION 'Z_RFC_PLM_038'."发起后台JOB,自动执行501和502
其中:SE37->Z_RFC_PLM_038的代码为

"---------------------------------------------------------------------- DATA: lv_jobname TYPE tbtcjob-jobname, ls_print_parameters TYPE pri_params, lv_zjobcount TYPE btcjobcnt, lv_jobcount TYPE tbtcjob-jobcount. * lv_zjobcount type BTCJOBCNT. DATA:lt_rspar TYPE TABLE OF rsparams, lw_line LIKE LINE OF lt_rspar. DATA: ls_ztjob_count TYPE ztjob_count, lt_ztjob_count TYPE TABLE OF ztjob_count. "如果是要传给PARAMETER 根据需求设置屏幕参数 * lw_line-selname = 'P_VERID'. * lw_line-kind = 'P'. * lw_line-sign = 'I'. * lw_line-option = 'EQ'. * lw_line-low = p_verid. * APPEND lw_line TO lt_rspar. * * lw_line-selname = 'P_PLNNR'. * lw_line-kind = 'P'. * lw_line-sign = 'I'. * lw_line-option = 'EQ'. * lw_line-low = p_plnnr. * APPEND lw_line TO lt_rspar. * * lw_line-selname = 'P_WERKS'. * lw_line-kind = 'P'. * lw_line-sign = 'I'. * lw_line-option = 'EQ'. * lw_line-low = p_werks. * APPEND lw_line TO lt_rspar. * * lw_line-selname = 'P_MATNR'. * lw_line-kind = 'P'. * lw_line-sign = 'I'. * lw_line-option = 'EQ'. * lw_line-low = p_matnr. * APPEND lw_line TO lt_rspar. *&--------新建作业名 SELECT COUNT( * ) INTO @DATA(lv_zjobcountr) FROM ztjob_count WHERE programm = 'ZMMR102A' AND zerdat EQ @sy-datum. lv_zjobcount = lv_zjobcountr. lv_zjobcount = lv_zjobcount + 1. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_zjobcount IMPORTING output = lv_zjobcount. CONCATENATE 'ZMMR102A' lv_zjobcount INTO lv_jobname SEPARATED BY '_'. "打开JOB 通过JOB name 获得JOB号 CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = lv_jobname IMPORTING jobcount = lv_zjobcount EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 4. IF syst-subrc = 0. "调用需要跑JOB的程序 * SUBMIT zppr065 * WITH SELECTION-TABLE lt_rspar * USER syst-uname " mandatory * VIA JOB lv_jobname NUMBER lv_zjobcount AND RETURN. SUBMIT zmmr102a * WITH s_vbeln in s_vbeln * WITH p_plnnr = p_plnnr * WITH p_werks = p_werks * WITH p_matnr = p_matnr VIA JOB lv_jobname NUMBER lv_zjobcount AND RETURN. IF sy-subrc EQ 0. *&--------设置作业周期信息 * CLEAR lv_jobcount. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_zjobcount jobname = lv_jobname * sdlstrtdt = sy-datum * sdlstrttm = sy-uzeit " * PRDMINS = 10 "每10分钟执行一次 strtimmed = 'X' "立刻开始 EXCEPTIONS cant_start_immediate = 1 invalid_startdate = 2 jobname_missing = 3 job_close_failed = 4 job_nosteps = 5 job_notex = 6 lock_failed = 7 invalid_target = 8 OTHERS = 9. IF sy-subrc <> 0. ENDIF. ENDIF. *&--------记录到表 ls_ztjob_count-programm = 'ZMMR102A'. ls_ztjob_count-jobcount = lv_zjobcount. ls_ztjob_count-zerdat = sy-datum. MODIFY ztjob_count FROM ls_ztjob_count. * IF sy-subrc EQ 0. * COMMIT WORK AND WAIT. * ELSE. * ROLLBACK WORK. * ENDIF. ENDIF.
SE38->ZMMR102A的代码为:

*&---------------------------------------------------------------------* *& Report ZMMR102A *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zmmr102a. TABLES:likp,mkpf. DATA: lt_zmmt029 TYPE TABLE OF zmmt029, lt_zmmt029a TYPE TABLE OF zmmt029a, lt_zmmt029b TYPE TABLE OF zmmt029b. DATA: lv_start TYPE char1, lv_end TYPE char1, lv_stabix TYPE sy-tabix, lv_stabix2 TYPE sy-tabix. DATA: ls_head TYPE ztms002_head, lv_msg TYPE bapi_msg, lv_type TYPE bapi_mtype, lv_mblnr TYPE mblnr, lv_mjahr TYPE mjahr, lt_item TYPE TABLE OF ztms002_item, ls_item TYPE ztms002_item. SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: s_vbeln FOR likp-vbeln, s_mblnr FOR mkpf-mblnr, s_datum FOR sy-datum. SELECTION-SCREEN: END OF BLOCK b01. WHILE lv_stabix2 < 10. CLEAR: lt_zmmt029[],lt_zmmt029a[],lt_zmmt029b[]. SELECT * INTO TABLE @lt_zmmt029 FROM zmmt029. SELECT * INTO TABLE @lt_zmmt029a FROM zmmt029a WHERE vbeln IN @s_vbeln AND mblnr IN @s_mblnr AND zflag EQ ''. SORT lt_zmmt029a[] BY mblnr mjahr. IF lt_zmmt029a[] IS NOT INITIAL. SELECT * INTO TABLE @lt_zmmt029b FROM zmmt029b FOR ALL ENTRIES IN @lt_zmmt029a WHERE mblnr EQ @lt_zmmt029a-mblnr AND mjahr EQ @lt_zmmt029a-mjahr. SORT lt_zmmt029b[] BY mblnr mjahr zeile. ENDIF. IF lt_zmmt029b[] IS NOT INITIAL. SELECT matnr, zkgwl "客供物料 INTO TABLE @DATA(lt_zmmt002) FROM zmmt002 FOR ALL ENTRIES IN @lt_zmmt029b WHERE matnr EQ @lt_zmmt029b-matnr. SORT lt_zmmt002[] BY matnr. ADD 20 TO lv_stabix2. ELSE. WAIT UP TO 3 SECONDS. ADD 4 TO lv_stabix2. ENDIF. ENDWHILE. READ TABLE lt_zmmt029 INTO DATA(ls_zmmt029) INDEX 1. IF sy-subrc EQ 0. ls_head-bldat = sy-datum. ls_head-budat = sy-datum. * ls_head-bktxt = ls_zm LOOP AT lt_zmmt029b[] INTO DATA(ls_zmmt029b). CLEAR: lv_start,lv_end. AT NEW mjahr. lv_start = 'X'. ENDAT. AT END OF mjahr. lv_end = 'X'. ENDAT. IF lv_start EQ 'X'. CLEAR: lt_item[]. ls_head-bwart = ls_zmmt029b-bwart."移动类型 ls_head-mtsnr = ls_zmmt029b-vbeln."外部物料单号(这里填DN号) ENDIF. CLEAR ls_item. * ls_item-matnr = ls_zmmt029b-matnr."物料 READ TABLE lt_zmmt002 INTO DATA(ls_zmmt002) WITH KEY matnr = ls_zmmt029b-matnr BINARY SEARCH. IF sy-subrc EQ 0. ls_item-matnr = ls_zmmt002-zkgwl. ENDIF. ls_item-kunnr = ls_zmmt029b-kunnr."客户 ls_item-werks = ls_zmmt029-werks."工厂 ls_item-lgort = ls_zmmt029-lgort."库存地点 ls_item-erfmg = ls_zmmt029b-menge."数量 ls_item-erfme = ls_zmmt029b-meins."单位 ls_item-sgtxt = ls_zmmt029-sgtxt." ls_item-bwart = ls_zmmt029b-bwart. ls_item-migo_insmk = ''. ls_item-migo_insmkx = 'X'. APPEND ls_item TO lt_item[]. IF lv_end EQ 'X'. READ TABLE lt_zmmt029a INTO DATA(ls_zmmt029a) WITH KEY mblnr = ls_zmmt029b-mblnr mjahr = ls_zmmt029b-mjahr BINARY SEARCH. IF sy-subrc EQ 0. lv_stabix = sy-tabix. CALL FUNCTION 'ZTM_RFC002' EXPORTING is_head = ls_head IMPORTING ev_message = lv_msg ev_type = lv_type ev_mblnr = lv_mblnr ev_mjahr = lv_mjahr TABLES it_item = lt_item. IF lv_type EQ 'S'. ls_zmmt029a-zflag = 'X'. ELSE. ls_zmmt029a-zflag = ''. ENDIF. ls_zmmt029a-mblnrn = lv_mblnr. ls_zmmt029a-mjahrn = lv_mjahr. ls_zmmt029a-zmsg = lv_msg. MODIFY lt_zmmt029a FROM ls_zmmt029a INDEX lv_stabix. CLEAR: lv_msg,lv_type,lv_mblnr,lv_mjahr,lt_item[],ls_zmmt029a. ENDIF. ENDIF. ENDLOOP. * IF sy-subrc NE 0. IF lt_zmmt029a[] IS NOT INITIAL. MODIFY zmmt029a FROM TABLE lt_zmmt029a. IF sy-subrc EQ 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF. ENDIF. * ENDIF. ENDIF.
接口ZTM_RFC002是做MIGO移动的,因为有写好的接口,这里直接调用了,
可以使用BAPI_GOODSMVT_CREATE来实现,不建议复制下面这个接口。
SE37-ZTM_RFC002

FUNCTION ztm_rfc002. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(IS_HEAD) TYPE ZTMS002_HEAD OPTIONAL *" VALUE(P_SYSTEM) TYPE CHAR10 DEFAULT 'TM' *" EXPORTING *" VALUE(EV_MESSAGE) TYPE BAPI_MSG *" VALUE(EV_TYPE) TYPE BAPI_MTYPE *" VALUE(EV_MBLNR) TYPE MBLNR *" VALUE(EV_MJAHR) TYPE MJAHR *" TABLES *" IT_ITEM STRUCTURE ZTMS002_ITEM OPTIONAL *"---------------------------------------------------------------------- "入库过账参数 DATA:goodsmvt_header TYPE bapi2017_gm_head_01, goodsmvt_code TYPE bapi2017_gm_code, goodsmvt_headret TYPE bapi2017_gm_head_ret, materialdocument TYPE bapi2017_gm_head_ret-mat_doc, goodsmvt_item TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE, return TYPE TABLE OF bapiret2 WITH HEADER LINE, g_move_type LIKE goodsmvt_item-move_type, lv_meins TYPE meins, lt_extension TYPE STANDARD TABLE OF bapiparex WITH HEADER LINE, wa_extension LIKE zqmkpf_badi. DATA: ls_zqmt005 TYPE zqmt005, lt_zqmt005 TYPE TABLE OF zqmt005. DATA: lv_wait TYPE sy-tabix, lv_wait2 TYPE sy-tabix. DATA: json_ser TYPE REF TO cl_trex_json_serializer, json_ser2 TYPE REF TO cl_trex_json_serializer, json_des TYPE REF TO cl_trex_json_deserializer. DATA: jsonstr TYPE string, jsonstr2 TYPE string. DATA: lv_zeile TYPE mseg-zeile. DATA: lt_zrfc_logs TYPE TABLE OF zrfc_logs, ls_zrfc_logs TYPE zrfc_logs. DATA:nextnum TYPE i, lv_numadd TYPE numc4. DATA: lv_xcharg TYPE mcha-charg. DATA: lv_z004 TYPE char1, lv_menge TYPE ekpo-menge, lv_menge2 TYPE ekpo-menge, lv_menge3 TYPE ekpo-menge. DATA:l_line_id TYPE mseg-line_id VALUE '000000', l_parent_id TYPE mseg-parent_id VALUE '000000', l_line_depth TYPE mseg-line_depth VALUE '00'. *01 MB01 采购订单的过帐收货 *02 MB31 按生产订单收货 *03 MB1A 货物提取 *04 MB1B 转移过帐 *05 MB1C 其他收货 *06 MB11 货物移动 *07 MB04 "物料供应"消耗的事后调整 SELECT COUNT(*) FROM zit0004 WHERE zstop EQ 'X' AND name IN ('ALL','ZTM_RFC002'). IF sy-subrc EQ 0. MESSAGE '该功能已暂停使用,请等IT通知,谢谢!' TYPE 'E'. EXIT. ENDIF. CREATE OBJECT json_ser EXPORTING data = it_item[]. CALL METHOD json_ser->serialize. CALL METHOD json_ser->get_data RECEIVING rval = jsonstr. CREATE OBJECT json_ser2 EXPORTING data = is_head. CALL METHOD json_ser2->serialize. CALL METHOD json_ser2->get_data RECEIVING rval = jsonstr2. ls_zrfc_logs-funcname = 'ZTM_RFC002'. ls_zrfc_logs-zsystem = 'TM'. ls_zrfc_logs-uname = p_uname. ls_zrfc_logs-zname1 = p_name1. ls_zrfc_logs-erdat = sy-datum. ls_zrfc_logs-uzeit = sy-uzeit. * ls_zrfc_logs-ep_type = ep_type. * ls_zrfc_logs-ep_message = ep_message. ls_zrfc_logs-jsonstr1 = jsonstr. ls_zrfc_logs-jsonstr2 = jsonstr2. IF p_system NE 'SAP'. MODIFY zrfc_logs FROM ls_zrfc_logs. IF sy-subrc EQ 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF. ENDIF. funcname = 'ZTM_RFC002' . zsystem = 'TM'. IF it_item[] IS INITIAL. ev_message = '请求的参数不能为空!'. EXIT. ENDIF. LOOP AT it_item ASSIGNING FIELD-SYMBOL(<ls_item>). * <ls_item>-zeile = <ls_item>-zeile + 1. <ls_item>-zeile = |{ <ls_item>-zeile ALPHA = IN }|."物料凭证编号 <ls_item>-aufnr = |{ <ls_item>-aufnr ALPHA = IN }|."工单 <ls_item>-ebeln = |{ <ls_item>-ebeln ALPHA = IN }|."采购凭证 <ls_item>-ebelp = |{ <ls_item>-ebelp ALPHA = IN }|."采购行项目 <ls_item>-lifnr = |{ <ls_item>-lifnr ALPHA = IN }|."供应商行项目 <ls_item>-rsnum = |{ <ls_item>-rsnum ALPHA = IN }|."预留号 <ls_item>-rspos = |{ <ls_item>-rspos ALPHA = IN }|."预留行项目 <ls_item>-kunnr = |{ <ls_item>-kunnr ALPHA = IN }|."客户 ENDLOOP. IF it_item[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_zmmt004_tl) FROM zmmt004_tl FOR ALL ENTRIES IN @it_item WHERE zlldj EQ @it_item-zlldj AND zxuha EQ @it_item-zxuha AND ztype EQ @it_item-ztype. SORT lt_zmmt004_tl[] BY zlldj zxuha ztype. ENDIF. DATA(lt_item) = it_item[]. IF is_head-bwart EQ '101'. SORT lt_item[] BY ebeln ebelp. DELETE lt_item[] WHERE ebeln EQ ''. IF lt_item[] IS NOT INITIAL. SELECT ekpo~ebeln, ekpo~ebelp, ekpo~werks, ekpo~menge, ekpo~meins, ekko~lifnr, ekko~bsart "采购凭证类型 INTO TABLE @DATA(lt_ekpo) FROM ekpo JOIN ekko ON ekpo~ebeln EQ ekko~ebeln FOR ALL ENTRIES IN @lt_item WHERE ekpo~ebeln EQ @lt_item-ebeln AND ekpo~ebelp EQ @lt_item-ebelp. SORT lt_ekpo[] BY ebeln ebelp. SELECT rsnum, rspos, bdmng, enmng, werks, meins, matnr, baugr, lifnr, ebeln, ebelp INTO TABLE @DATA(lt_resb_101) FROM resb FOR ALL ENTRIES IN @lt_item WHERE ebeln EQ @lt_item-ebeln AND ebelp EQ @lt_item-ebelp. SORT lt_resb_101[] BY ebeln ebelp. IF lt_resb_101[] IS NOT INITIAL. SELECT matnr, werks, charg, sobkz, lifnr, lblab INTO TABLE @DATA(lt_mslb) FROM mslb FOR ALL ENTRIES IN @lt_resb_101 WHERE matnr EQ @lt_resb_101-matnr AND werks EQ @lt_resb_101-werks AND sobkz EQ 'O' AND lifnr EQ @lt_resb_101-lifnr AND lblab NE 0. SORT lt_mslb[] BY matnr werks lifnr charg. ENDIF. ENDIF. ENDIF. lt_item[] = it_item[]. DELETE lt_item[] WHERE rsnum EQ ''. IF lt_item[] IS NOT INITIAL. SELECT rsnum, rspos, bdmng, enmng, meins INTO TABLE @DATA(lt_resb) FROM resb FOR ALL ENTRIES IN @lt_item WHERE rsnum EQ @lt_item-rsnum AND rspos EQ @lt_item-rspos. SORT lt_resb[] BY rsnum rspos. ENDIF. SELECT SINGLE chneu INTO @DATA(lv_chneu) FROM t156 WHERE bwart EQ @is_head-bwart. CASE lv_chneu. WHEN 'A' OR 'B' OR 'C' OR 'D' OR 'E' OR 'F'. LOOP AT it_item ASSIGNING FIELD-SYMBOL(<fs_item_charg>). IF <fs_item_charg>-charg EQ ''. SELECT SINGLE xchpf INTO @DATA(lv_xchpf) FROM mara WHERE matnr EQ @<fs_item_charg>-matnr. IF sy-subrc EQ 0. IF lv_xchpf EQ 'X'. SELECT charg INTO @lv_xcharg UP TO 1 ROWS FROM mch1 WHERE ersda EQ @sy-datum AND matnr EQ @<fs_item_charg>-matnr ORDER BY charg DESCENDING. ENDSELECT. IF lv_xcharg NE ''. lv_numadd = lv_xcharg+6(4) + 1. ELSE. lv_numadd = 1. ENDIF. <fs_item_charg>-charg = |{ sy-datum+2(6) }{ lv_numadd ALPHA = IN }|. ENDIF. ENDIF. LOOP AT it_item INTO DATA(w_item) WHERE matnr = <fs_item_charg>-matnr AND charg NE ''. IF <fs_item_charg>-charg LT w_item-charg. <fs_item_charg>-charg = w_item-charg + 1. ENDIF. CLEAR w_item. ENDLOOP. ENDIF. ENDLOOP. WHEN OTHERS. ENDCASE. *----数据检查、填充 LOOP AT it_item ASSIGNING FIELD-SYMBOL(<fs_item>). ADD 1 TO lv_zeile. <fs_item>-zeile = lv_zeile. * <fs_item>-zeile = |{ <fs_item>-zeile ALPHA = IN }|."物料凭证编号 * <fs_item>-aufnr = |{ <fs_item>-aufnr ALPHA = IN }|."工单 * <fs_item>-ebeln = |{ <fs_item>-ebeln ALPHA = IN }|."采购凭证 * <fs_item>-ebelp = |{ <fs_item>-ebelp ALPHA = IN }|."采购行项目 * <fs_item>-lifnr = |{ <fs_item>-lifnr ALPHA = IN }|."供应商行项目 * <fs_item>-rsnum = |{ <fs_item>-rsnum ALPHA = IN }|."预留号 * <fs_item>-rspos = |{ <fs_item>-rspos ALPHA = IN }|."预留行项目 * <fs_item>-kunnr = |{ <fs_item>-kunnr ALPHA = IN }|."客户 * 101采购订单的供应商和工厂 CLEAR: lv_menge,lv_z004. READ TABLE lt_ekpo INTO DATA(ls_ekpo) WITH KEY ebeln = <fs_item>-ebeln ebelp = <fs_item>-ebelp BINARY SEARCH. IF sy-subrc EQ 0. IF <fs_item>-werks EQ ''. <fs_item>-werks = ls_ekpo-werks. ENDIF. IF <fs_item>-lifnr IS INITIAL. <fs_item>-lifnr = ls_ekpo-lifnr. ENDIF. IF ls_ekpo-bsart EQ 'Z004' AND is_head-bwart = '101'. lv_z004 = 'X'. "委外采购订单收货 lv_menge = ls_ekpo-menge."采购订单数量 " 凭证行的唯一标识 l_line_id = l_line_id + 1. l_parent_id = l_line_id. goodsmvt_item-line_id = l_line_id. ENDIF. ENDIF. "单位转换 CLEAR lv_meins. CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING input = <fs_item>-erfme language = '1' IMPORTING output = lv_meins EXCEPTIONS unit_not_found = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. IF lv_meins CO '*'. ELSEIF lv_meins NE ''. <fs_item>-erfme = lv_meins. ENDIF. READ TABLE lt_zmmt004_tl INTO DATA(ls_zmmt004_tl) WITH KEY zlldj = <fs_item>-zlldj zxuha = <fs_item>-zxuha ztype = <fs_item>-ztype BINARY SEARCH. IF sy-subrc EQ 0."退料单 IF is_head-bwart = '262'. IF ls_zmmt004_tl-mblnr IS NOT INITIAL. <fs_item>-msg = '退料单只能退一次,已退过料!'. ENDIF. ENDIF. ENDIF. CASE is_head-bwart. WHEN '101' OR '161'. IF <fs_item>-aufnr IS NOT INITIAL."生产入库 goodsmvt_item-mvt_ind = 'F'."移动标识 goodsmvt_code = '02'. goodsmvt_item-orderid = <fs_item>-aufnr."订单号 goodsmvt_item-item_text = <fs_item>-sgtxt. "项目文本 goodsmvt_item-unload_pt = <fs_item>-ablad."卸货点(人名) * goodsmvt_item-ref_doc = <fs_item>-lfbnr."参考凭证 * goodsmvt_item-ref_doc_it = <fs_item>-lfpos."参考凭证的项目 ELSE."采购入库 IF <fs_item>-ebeln IS INITIAL OR <fs_item>-ebelp IS INITIAL. <fs_item>-msg = '采购入库时,采购订单和行项目必输!'. ENDIF. IF <fs_item>-lifnr IS INITIAL. <fs_item>-msg = '采购入库时,供应商必输!' && <fs_item>-msg. ENDIF. goodsmvt_item-mvt_ind = 'B'."移动标识 goodsmvt_code = '01'. goodsmvt_item-po_number = <fs_item>-ebeln."采购凭证 goodsmvt_item-po_item = <fs_item>-ebelp."凭证行项目 goodsmvt_item-vendor = <fs_item>-lifnr."供应商 ENDIF. goodsmvt_header-ref_doc_no = is_head-xblnr. IF <fs_item>-migo_insmkx EQ 'X'. goodsmvt_item-stck_type = <fs_item>-migo_insmk."库存类型 ELSE. goodsmvt_item-stck_type = '2'."库存类型 ENDIF. * goodsmvt_item-stck_type = '2'."库存类型 WHEN '122'. IF <fs_item>-ebeln IS INITIAL OR <fs_item>-ebelp IS INITIAL . <fs_item>-msg = '采购入库时,采购订单和行项目必输!'. ENDIF. IF <fs_item>-lifnr IS INITIAL. <fs_item>-msg = '采购入库时,供应商必输!' && <fs_item>-msg. ENDIF. IF <fs_item>-lfbnr IS INITIAL OR <fs_item>-lfpos IS INITIAL. <fs_item>-msg = '参考凭证及其行项目必输!' && <fs_item>-msg. ENDIF. goodsmvt_header-ref_doc_no = is_head-xblnr."交货单 goodsmvt_item-mvt_ind = 'B'."移动标识 goodsmvt_code = '01'. goodsmvt_item-po_number = <fs_item>-ebeln."采购凭证 goodsmvt_item-po_item = <fs_item>-ebelp."凭证行项目 goodsmvt_item-vendor = <fs_item>-lifnr."供应商 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 goodsmvt_item-ref_doc = <fs_item>-lfbnr."参考凭证 goodsmvt_item-ref_doc_it = <fs_item>-lfpos."参考凭证的项目 goodsmvt_item-stck_type = ''."库存类型 IF <fs_item>-migo_insmkx EQ 'X'. goodsmvt_item-stck_type = <fs_item>-migo_insmk."库存类型 ELSE. goodsmvt_item-stck_type = ''."库存类型 ENDIF. WHEN '201' OR '202' OR '551' OR '552'. IF is_head-bwart = '551' OR is_head-bwart = '552'. IF <fs_item>-grund IS INITIAL. <fs_item>-msg = '移动原因必输!' . ENDIF. goodsmvt_item-move_reas = <fs_item>-grund."移动原因 ENDIF. IF is_head-bwart EQ '201' OR is_head-bwart EQ '202'. IF <fs_item>-kostl IS INITIAL. <fs_item>-msg = '成本中心必输!' && <fs_item>-msg. ENDIF. ENDIF. goodsmvt_code = '03'. goodsmvt_item-mvt_ind = ''."移动标识 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 goodsmvt_item-costcenter = <fs_item>-kostl."成本中心 WHEN '261' OR '262' OR 'Z61' OR 'Z62' OR '531' OR '532'. goodsmvt_code = '03'. goodsmvt_item-mvt_ind = ''."移动标识 IF <fs_item>-rsnum IS INITIAL OR <fs_item>-rspos IS INITIAL. <fs_item>-msg = '261时,预留单和预留行项目必输!' && <fs_item>-msg. ENDIF. goodsmvt_item-reserv_no = <fs_item>-rsnum."预留单号 goodsmvt_item-res_item = <fs_item>-rspos."项目编号 goodsmvt_item-orderid = <fs_item>-aufnr."订单号 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 goodsmvt_item-gr_rcpt = <fs_item>-zxuha ."收货方 IF <fs_item>-zlldj NE ''. IF <fs_item>-ztype <> 'T3'. "t3 反冲退料 T1计划内退料 T2 计划外退料 Z2 计划外领料 goodsmvt_code = '03'. IF <fs_item>-ztype EQ 'T1'. goodsmvt_item-xstob = 'X'. "使用冲销移动类型标识符 goodsmvt_item-res_type = <fs_item>-rsart."记录类型 ENDIF. ELSE. goodsmvt_code = '04'. ENDIF. goodsmvt_item-gr_rcpt = <fs_item>-zxuha."序号 goodsmvt_item-val_type = <fs_item>-zpglx. "评估类 goodsmvt_item-vendor = <fs_item>-lifnr ." 供应商 goodsmvt_item-suppl_vend = <fs_item>-lifnr ." 供应商 ENDIF. WHEN '309'. goodsmvt_code = '04'. goodsmvt_item-mvt_ind = ''."移动标识 goodsmvt_item-move_mat = <fs_item>-ummat."接收/发出物料编码 goodsmvt_item-move_plant = <fs_item>-umwrk."收货工厂/发货工厂 goodsmvt_item-move_stloc = <fs_item>-umlgo."收货/发货库存地点 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 WHEN '311'."公司间转储 goodsmvt_code = '04'. goodsmvt_item-mvt_ind = ''."移动标识 goodsmvt_item-move_stloc = <fs_item>-umlgo."收货/发货库存地点 goodsmvt_item-reserv_no = <fs_item>-rsnum."预留单号 goodsmvt_item-res_item = <fs_item>-rspos."项目编号 WHEN '301'."工厂间转储 goodsmvt_code = '04'. * MOVE_MAT goodsmvt_item-move_plant = <fs_item>-umwrk."收货工厂/发货工厂 goodsmvt_item-mvt_ind = ''."移动标识 goodsmvt_item-move_stloc = <fs_item>-umlgo."收货/发货库存地点 goodsmvt_item-move_batch = <fs_item>-umcha."收货/发货批量 * goodsmvt_item-MATERIAL = <fs_item>-MATNR." goodsmvt_item-batch = <fs_item>-charg."批次 WHEN '312'. IF <fs_item>-zlldj NE ''. IF <fs_item>-ztype <> 'T3'. "t3 反冲退料 T1计划内退料 T2 计划外退料 Z2 计划外领料 goodsmvt_code = '03'. ELSE. goodsmvt_code = '04'. ENDIF. goodsmvt_item-gr_rcpt = <fs_item>-zxuha."序号 goodsmvt_item-val_type = <fs_item>-zpglx. "评估类 goodsmvt_item-vendor = <fs_item>-lifnr ." 供应商 goodsmvt_item-suppl_vend = <fs_item>-lifnr ." 供应商 ENDIF. goodsmvt_item-move_stloc = <fs_item>-zxbcw. "线边仓 goodsmvt_item-mvt_ind = ''."移动标识 goodsmvt_item-reserv_no = <fs_item>-rsnum."预留单号 goodsmvt_item-res_item = <fs_item>-rspos."项目编号 goodsmvt_item-orderid = <fs_item>-aufnr."订单号 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 goodsmvt_item-gr_rcpt = <fs_item>-zxuha ."收货方 * goodsmvt_item- WHEN '501' OR '502'. goodsmvt_code = '05'. goodsmvt_item-mvt_ind = ''. "移动标识 IF <fs_item>-migo_insmkx EQ 'X'. goodsmvt_item-stck_type = <fs_item>-migo_insmk."库存类型 ELSE. goodsmvt_item-stck_type = '2'."库存类型 ENDIF. * goodsmvt_item-stck_type = '2'."库存类型 goodsmvt_item-vendor = <fs_item>-lifnr."供应商 goodsmvt_item-customer = <fs_item>-kunnr."客户 goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 goodsmvt_item-reserv_no = <fs_item>-rsnum."预留单号 goodsmvt_item-res_item = <fs_item>-rspos."项目编号 IF <fs_item>-rsnum IS INITIAL OR <fs_item>-rspos IS INITIAL. <fs_item>-msg = '501时,预留单和预留行项目必输!' && <fs_item>-msg. ENDIF. READ TABLE lt_resb INTO DATA(ls_resb) WITH KEY rsnum = <fs_item>-rsnum rspos = <fs_item>-rspos BINARY SEARCH. IF sy-subrc EQ 0. IF is_head-bwart EQ '501'. ls_resb-enmng = <fs_item>-erfmg + ls_resb-enmng. IF ls_resb-enmng > ls_resb-bdmng."提货数不能大于需求数 <fs_item>-msg = |预留单{ <fs_item>-rsnum }行{ <fs_item>-rspos }做501时,提货数不能大于需求数!{ <fs_item>-msg }|. ENDIF. ENDIF. IF is_head-bwart EQ '502'. IF ls_resb-enmng < <fs_item>-erfmg."录入数量不能大于提货数 <fs_item>-msg = |预留单{ <fs_item>-rsnum }行{ <fs_item>-rspos }做501时,录入数量不能大于提货数!{ <fs_item>-msg }|. ENDIF. ENDIF. ENDIF. WHEN 'Z11' OR 'Z12'. goodsmvt_code = '05'. goodsmvt_item-mvt_ind = ''. "移动标识 goodsmvt_item-stck_type = '2'."库存类型 goodsmvt_item-vendor = <fs_item>-lifnr."供应商 *----增强字段 lt_extension-structure = 'ZQMKPF_BADI'. wa_extension-ztldh = <fs_item>-ztldh. wa_extension-zhlbs = <fs_item>-zhlbs. * wa_extension-mblnr = <fs_item>-mblnr. * wa_extension-mjahr = is_head-budat+0(4). wa_extension-mandt = sy-mandt. wa_extension-bwart = is_head-bwart. lt_extension-valuepart1 = wa_extension. APPEND lt_extension. *---- WHEN '541' OR '542'. goodsmvt_code = '01'. goodsmvt_item-po_number = <fs_item>-ebeln."采购凭证 goodsmvt_item-po_item = <fs_item>-ebelp."凭证行项目 WHEN '511' OR '512'. goodsmvt_code = '05'. goodsmvt_item-item_text = <fs_item>-sgtxt."项目文本 WHEN OTHERS. ENDCASE. *----通用参数 * goodsmvt_item-MVT_IND = <fs_item>-kzbew. "移动标识 goodsmvt_item-plant = <fs_item>-werks."工厂 goodsmvt_item-material = <fs_item>-matnr."物料 goodsmvt_item-entry_qnt = <fs_item>-erfmg."录入数量 goodsmvt_item-entry_uom = <fs_item>-erfme."单位 goodsmvt_item-stge_loc = <fs_item>-lgort."库存地点 goodsmvt_item-move_type = <fs_item>-bwart."移动类型 goodsmvt_item-batch = <fs_item>-charg."批次 IF <fs_item>-msg IS NOT INITIAL. <fs_item>-type = 'E'. ENDIF. APPEND goodsmvt_item. CLEAR:goodsmvt_item."goodsmvt_code IF lv_z004 EQ 'X'."委外采购订单收货 * IF <fs_item>-migo_insmkx EQ 'X'. * goodsmvt_item-stck_type = <fs_item>-migo_insmk."库存类型 * ELSE. * goodsmvt_item-stck_type = '2'."库存类型 * ENDIF. "先从resb里面找到组件,再从mslb里面取出供应商的O库存和批次 READ TABLE lt_resb_101 WITH KEY ebeln = <fs_item>-ebeln ebelp = <fs_item>-ebelp TRANSPORTING NO FIELDS BINARY SEARCH. IF sy-subrc EQ 0. LOOP AT lt_resb_101 INTO DATA(ls_resb_101) FROM sy-tabix. IF ls_resb_101-ebeln NE <fs_item>-ebeln OR ls_resb_101-ebelp NE <fs_item>-ebelp. EXIT. ENDIF. "采购入库 * goodsmvt_item-mvt_ind = 'B'."移动标识 * goodsmvt_code = '01'. goodsmvt_item-move_type = '543'." goodsmvt_item-material = ls_resb_101-matnr."组件 goodsmvt_item-plant = <fs_item>-werks."工厂 goodsmvt_item-spec_stock = 'O'."供应商特殊库存 goodsmvt_item-vendor = ls_resb_101-lifnr."供应商 goodsmvt_item-po_number = <fs_item>-ebeln."采购凭证 goodsmvt_item-po_item = <fs_item>-ebelp."凭证行项目 " 上一行的识别码 goodsmvt_item-parent_id = l_parent_id. " 凭证行的唯一标识 l_line_id = l_line_id + 1. goodsmvt_item-line_id = l_line_id. " 凭证中行层次结构级别 ADD 1 TO l_line_depth. goodsmvt_item-line_depth = l_line_depth. IF lv_menge NE 0. lv_menge2 = ceil( <fs_item>-erfmg * ( ls_resb_101-bdmng / lv_menge ) )."组件录入数量 ENDIF. goodsmvt_item-entry_uom = ls_resb_101-meins."单位 CLEAR lv_menge3. READ TABLE lt_mslb WITH KEY matnr = ls_resb_101-matnr werks = ls_resb_101-werks lifnr = ls_resb_101-lifnr TRANSPORTING NO FIELDS BINARY SEARCH. IF sy-subrc EQ 0. LOOP AT lt_mslb INTO DATA(ls_mslb) FROM sy-tabix. IF ls_mslb-matnr NE ls_resb_101-matnr OR ls_mslb-werks NE ls_resb_101-werks OR ls_mslb-lifnr NE ls_resb_101-lifnr. EXIT. ENDIF. ADD ls_mslb-lblab TO lv_menge3. goodsmvt_item-batch = ls_mslb-charg."批次 IF lv_menge2 LE lv_menge3. goodsmvt_item-entry_qnt = lv_menge2."组件录入数量 APPEND goodsmvt_item. EXIT. ELSE. goodsmvt_item-entry_qnt = ls_mslb-lblab."组件录入数量 APPEND goodsmvt_item. ENDIF. ENDLOOP. ENDIF. ENDLOOP. ENDIF. ENDIF. * <ls_item>-aufnr = |{ <ls_item>-aufnr ALPHA = OUT }|."工单 CLEAR goodsmvt_item. ENDLOOP. *----抬头数据检查、填充 IF is_head-bldat IS INITIAL. goodsmvt_header-doc_date = sy-datum."凭证日期 ELSE. goodsmvt_header-doc_date = is_head-bldat."凭证日期 ENDIF. IF is_head-bldat IS INITIAL. goodsmvt_header-pstng_date = sy-datum."过账日期 ELSE. goodsmvt_header-pstng_date = is_head-budat."过账日期 IF is_head-budat > sy-datum. ev_message = '过账日期不允许在未来'. ev_type = 'E'. EXIT. ENDIF. ENDIF. goodsmvt_header-header_txt = is_head-bktxt."凭证抬头文本 goodsmvt_header-ref_doc_no = is_head-xblnr."参考凭证编号 READ TABLE it_item WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. ev_message = '请求参数错误,请检查!'. ev_type = 'E'. EXIT. ENDIF. CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING goodsmvt_header = goodsmvt_header goodsmvt_code = goodsmvt_code IMPORTING goodsmvt_headret = goodsmvt_headret materialdocument = materialdocument TABLES goodsmvt_item = goodsmvt_item[] return = return[]. * IF sy-uname EQ 'IT0003'. * BREAK-POINT. * CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. * EXIT. * ENDIF. LOOP AT return WHERE type CA 'AEX'. * CONCATENATE ev_message return-message INTO ev_message. ENDLOOP. IF sy-subrc = 0. LOOP AT return ."WHERE type CA 'AEX' CONCATENATE ev_message return-message INTO ev_message. ENDLOOP. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ev_type = 'E'. ELSE. is_head-mblnr = materialdocument. is_head-mjahr = is_head-budat+0(4). ev_mblnr = materialdocument. ev_mjahr = goodsmvt_headret-doc_year. ev_message = '过账成功'. ev_type = 'S'. LOOP AT lt_zmmt004_tl ASSIGNING FIELD-SYMBOL(<fs_004>) WHERE mblnr IS INITIAL. IF <fs_004>-ztcsl > 0. <fs_004>-mblnr = materialdocument. <fs_004>-mjahr = goodsmvt_headret-doc_year. ELSE. <fs_004>-loekz = 'X'. ENDIF. <fs_004>-zudat = sy-datum. <fs_004>-zunam = sy-uname. ENDLOOP. IF lt_zmmt004_tl[] IS NOT INITIAL. MODIFY zmmt004_tl FROM TABLE lt_zmmt004_tl. ENDIF. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. "查找SAP产生的批次号和检验批 IF is_head-bwart EQ '101'. WHILE lv_wait EQ 0. SELECT mblnr, mjahr, zeile, charg INTO TABLE @DATA(lt_mseg) FROM mseg WHERE mblnr EQ @ev_mblnr AND mjahr EQ @ev_mjahr. SORT lt_mseg[] BY zeile. IF lt_mseg[] IS NOT INITIAL. ADD 1 TO lv_wait. ELSE. WAIT UP TO 1 SECONDS. ADD 1 TO lv_wait2. IF lv_wait2 EQ 4. ADD 1 TO lv_wait. ENDIF. ENDIF. ENDWHILE. SELECT prueflos, mjahr, mblnr, zeile INTO TABLE @DATA(lt_qals) FROM qals WHERE mblnr EQ @ev_mblnr AND mjahr EQ @ev_mjahr. LOOP AT it_item ASSIGNING FIELD-SYMBOL(<fs_itemb>). READ TABLE lt_mseg INTO DATA(ls_mseg) WITH KEY zeile = <fs_itemb>-zeile BINARY SEARCH. IF sy-subrc EQ 0. <fs_itemb>-charg = ls_mseg-charg."SAP产生的批次号 ENDIF. READ TABLE lt_qals INTO DATA(ls_qals) WITH KEY zeile = <fs_itemb>-zeile BINARY SEARCH. IF sy-subrc EQ 0. <fs_itemb>-prueflos = ls_qals-prueflos."检验批 ENDIF. IF <fs_itemb>-zsjdh NE ''. MOVE-CORRESPONDING <fs_itemb> TO ls_zqmt005. ls_zqmt005-mblnr = ev_mblnr. ls_zqmt005-mjahr = ev_mjahr. APPEND ls_zqmt005 TO lt_zqmt005[]. ENDIF. ENDLOOP. IF lt_zqmt005[] IS NOT INITIAL. MODIFY zqmt005 FROM TABLE lt_zqmt005. IF sy-subrc EQ 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF. ENDIF. LOOP AT it_item ASSIGNING <ls_item>. <ls_item>-aufnr = |{ <ls_item>-aufnr ALPHA = OUT }|."工单 ENDLOOP. ENDIF. ENDIF. ENDFUNCTION.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」