需求: MIGO 做采购订单收货时,化学品物料启用批次管理和产品生命周期的管理,采购收货或其他入库时,需要输入生产日期,根据批次生成规则,自动(或手工输入优先)生成批次号,针对移动类型:101、511、501、309、561、
批次生成规则:生产日期(年2位,月2位,日2位)+ 流水码(4位),按照每天的收货入库进行Check,例如:生产日期为:2020年12月31日,则2021年04月06日,第一次收货入库时的批次为:2012310001,第二次收货入库时,批次为:2012310002,依次类推。
MIGO收货入库增强函数参考:EXIT_SAPLV01Z_002 ; SMOD: SAPLV01Z;
"替换为国瓷条件 -- CHECK sy-mandt = '302' OR sy-mandt = '602' OR sy-mandt = '802' OR sy-mandt = '301' OR sy-mandt = '601' OR sy-mandt = '801'. DATA : lv_prog LIKE d020s-prog, lv_dnum LIKE d020s-dnum, lv_datum TYPE datum, lv_dates TYPE datum, lv_bklas TYPE bklas, lv_atwrt TYPE atwrt, lv_atinn TYPE atinn, ls_mch1 TYPE ztpp_mch1, ls_mch2 TYPE ztpp_mch2, it_dyn TYPE STANDARD TABLE OF dynpread. DATA: lv_exit TYPE c. IF x_bncom-werks IS INITIAL. MESSAGE e027(zpp01) WITH '请输入工厂'. RAISE cancelled. ENDIF. PERFORM frm_change_charg IN PROGRAM zmme0003 USING x_bncom CHANGING new_charg lv_exit IF FOUND. IF lv_exit = abap_true. RETURN. ENDIF. SELECT SINGLE bklas INTO lv_bklas FROM mbew WHERE matnr = x_bncom-matnr AND bwkey = x_bncom-werks. *CASE lv_bklas. * WHEN '3010'. CASE lv_bklas+(2). WHEN '30'. CASE sy-tcode. WHEN 'MIGO' . lv_prog = 'SAPLMIGO'. lv_dnum = '0110'. APPEND VALUE #( fieldname = 'GOHEAD-BUDAT' ) TO it_dyn. *获取屏幕记账日期 CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = lv_prog dynumb = lv_dnum TABLES dynpfields = it_dyn EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 stepl_not_found = 10 OTHERS = 11. IF sy-subrc = 0. READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn>). IF sy-subrc = 0. IF <fs_dyn>-fieldvalue IS NOT INITIAL. CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' EXPORTING date_external = <fs_dyn>-fieldvalue IMPORTING date_internal = lv_datum. ELSE. lv_datum = sy-datum. ENDIF. ENDIF. ENDIF. WHEN 'MSC1N' . lv_datum = sy-datum. WHEN 'ZPDAxx'. DATA(lv_field) = '(SAPLZMM_FG0006)GV_BUDAT'. ASSIGN (lv_field) TO FIELD-SYMBOL(<lfs_budat>). IF <lfs_budat> IS ASSIGNED. lv_datum = <lfs_budat>. ELSE. lv_datum = sy-datum. ENDIF. ENDCASE. IF NOT lv_datum IS INITIAL. SELECT SINGLE * INTO ls_mch1 FROM ztpp_mch1 WHERE datum = lv_datum+2(6). IF sy-subrc = 0. ls_mch1-msnro = ls_mch1-msnro + 1. ELSE. ls_mch1-datum = lv_datum+2(6). ls_mch1-msnro = '0001'. ENDIF. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = lv_datum days = 0 months = 2 signum = '-' years = 0 IMPORTING calc_date = lv_dates. DATA(i_dat_del) = lv_dates+2(6). DELETE FROM ztpp_mch1 WHERE datum <= i_dat_del ##WARN_OK. MODIFY ztpp_mch1 FROM ls_mch1 ##WARN_OK. CONCATENATE ls_mch1-datum ls_mch1-msnro INTO new_charg. ELSE. CLEAR new_charg. ENDIF. * WHEN '7010' OR '7020'. "成品 , 半成品, WHEN '70'. "成品 , 半成品 CHECK ( x_bncom-werks = '7500' OR x_bncom-werks = '7599' ) AND ( lv_bklas = '7010' OR lv_bklas = '7020' ). CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT' EXPORTING input = 'LSGC_PRODUCTCODE' IMPORTING output = lv_atinn. SELECT SINGLE atwrt INTO lv_atwrt FROM ausp WHERE objek IN ( SELECT cuobj FROM inob WHERE klart = '023' AND objek = x_bncom-matnr AND obtab = 'MARA' ) "CUOBJ AND atinn = lv_atinn AND mafid = 'O' AND klart = '023'. IF sy-subrc = 0. CONDENSE lv_atwrt NO-GAPS. SELECT SINGLE * INTO ls_mch2 FROM ztpp_mch2 WHERE matnr = x_bncom-matnr AND gjahr = sy-datum+2(2). IF sy-subrc = 0. ls_mch2-msnro = ls_mch2-msnro + 1. ELSE. *成品半成品流水码保留一年 DATA(nian_tmp) = sy-datum+2(2) - 1. SELECT COUNT(*) FROM ztpp_mch2 WHERE matnr = x_bncom-matnr AND gjahr = nian_tmp . IF sy-subrc = 0. DELETE ztpp_mch2 FROM ls_mch2. ENDIF. CLEAR ls_mch2. ls_mch2-matnr = x_bncom-matnr. ls_mch2-pdcode = lv_atwrt(2). ls_mch2-gjahr = sy-datum+2(2). ls_mch2-msnro = '00001'. ENDIF. MODIFY ztpp_mch2 FROM ls_mch2. CONCATENATE lv_atwrt(2) sy-datum+2(2) ls_mch2-msnro INTO new_charg. ELSE. CLEAR new_charg. ENDIF. WHEN OTHERS. ENDCASE.
DATA: lr_werks TYPE RANGE OF aufk-werks, lr_xchpf TYPE RANGE OF marc-xchpf, lr_bwart TYPE RANGE OF mseg-bwart. DATA: lv_prog LIKE d020s-prog, lv_dnum LIKE d020s-dnum, it_dyn TYPE STANDARD TABLE OF dynpread, lv_bwart LIKE mseg-bwart, lv_hsdat LIKE mcha-hsdat. * 条件:工厂(GOITEM-WERKS = P101/P121/P900/P000)+ 化学品物料启用批次管理(MARC-XCHPF = ‘X’), SELECT SINGLE * INTO @DATA(ls_ztmm_enhance) FROM ztmm_enhance WHERE prog = 'ZMME0003_001' AND item = '000001' AND active = 'X'. IF sy-subrc NE 0. RETURN. ELSE. "s1.检查工厂 PERFORM frm_value_split TABLES lr_werks USING ls_ztmm_enhance-value1 . IF x_bncom-werks NOT IN lr_werks. RETURN. ELSE. lv_exit = abap_true. ENDIF. "s2.检查是否启用批次号 SELECT SINGLE xchpf INTO @DATA(lv_xchpf) FROM marc WHERE matnr = @x_bncom-matnr AND werks = @x_bncom-werks. PERFORM frm_xchpf_split TABLES lr_xchpf USING ls_ztmm_enhance-value2 . IF lv_xchpf NOT IN lr_xchpf. RETURN. ENDIF. "s3.检查移动类型 CASE sy-tcode. WHEN 'MIGO' . lv_prog = 'SAPLMIGO'. lv_dnum = '0011'. APPEND VALUE #( fieldname = 'GODEFAULT_TV-BWART' ) TO it_dyn. *获取屏幕抬头移动类型 CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = lv_prog dynumb = lv_dnum TABLES dynpfields = it_dyn EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 stepl_not_found = 10 OTHERS = 11. IF sy-subrc = 0. READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn>). IF sy-subrc = 0. IF <fs_dyn>-fieldvalue IS NOT INITIAL. lv_bwart = <fs_dyn>-fieldvalue. ENDIF. ENDIF. ENDIF. WHEN 'MSC1N' . WHEN 'ZPDAxx'. WHEN OTHERS."BAPI 做MIGO ENDCASE. PERFORM frm_bwart_split TABLES lr_bwart USING ls_ztmm_enhance-value3 . IF lv_bwart NOT IN lr_bwart. RETURN. ENDIF. ENDIF. * IF x_bncom-hsdat IS INITIAL. * MESSAGE e027(zpp01) WITH '请输入工厂'. RAISE cancelled. * ENDIF. **获取屏幕项目生产日期 CASE sy-tcode. WHEN 'MIGO' . lv_prog = 'SAPLMIGO'. lv_dnum = '0335'. CLEAR: it_dyn,it_dyn[]. APPEND VALUE #( fieldname = 'GOITEM-HSDAT' ) TO it_dyn. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = lv_prog dynumb = lv_dnum TABLES dynpfields = it_dyn EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 stepl_not_found = 10 OTHERS = 11. IF sy-subrc = 0. READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn_date>). IF sy-subrc = 0. IF <fs_dyn_date>-fieldvalue IS NOT INITIAL. CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' EXPORTING date_external = <fs_dyn_date>-fieldvalue IMPORTING date_internal = lv_hsdat. ENDIF. ENDIF. ENDIF. WHEN 'MSC1N' . WHEN 'ZPDAxx'. WHEN OTHERS."BAPI 做MIGO ENDCASE. BREAK sapwb0011. DATA: lv_lsm TYPE numc4. IF lv_hsdat IS NOT INITIAL. "MCHB SELECT MAX( charg ) FROM mchb WHERE matnr = @x_bncom-matnr AND werks = @x_bncom-werks AND substring( charg,1,6 ) = @lv_hsdat+2(6) INTO @DATA(lv_charg). IF sy-subrc EQ 0. lv_lsm = lv_charg+6(4). lv_lsm = lv_lsm + 1. ELSE. lv_lsm = '0001'."改为4位流水码 ENDIF. CONCATENATE lv_hsdat+2(6) lv_lsm INTO new_charg. ENDIF.