1、该文章主要是针对MFBF中作业反冲-----(报工过账),这个不能用BAPI_REPMANCONF_CREATE_MTS进行过账的原因有二,
其一,如下图所示的作业值有可能要进行修改,而BAPI_REPMANCONF_CREATE_MTS函数中没有对作业值进行修改的参数
其二是要在前台选择是产量过账还是废品数量进行过账,BAPI_REPMANCONF_CREATE_MTS函数中没有对这个进行单独的处理
BDC代码示例如下:
**当产量有值时,调用下面这个BDC进行过账
if lv_menge is not initial and lv_zfpsl is initial .
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_CURSOR'
'RM61B-RB_LEIST'.
perform bdc_field using 'BDC_OKCODE'
'=RBTYP'.
perform bdc_field using 'RM61B-BUDAT' lv_budat. "过账日期
perform bdc_field using 'RM61B-BLDAT' lv_bldat. "凭证日期
perform bdc_field using 'RM61B-RB_BAUGR'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=RBREF'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=ZPKT'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'BDC_CURSOR'
'RM61B-REP_POINTS'.
perform bdc_field using 'RM61B-MATNR' lv_matnr. "物料号
perform bdc_field using 'RM61B-WERKS' lv_werks. "工厂
perform bdc_field using 'RM61B-VERID' lv_verid. "生产版本
perform bdc_field using 'RM61B-REP_POINTS'
'X'.
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=GOON'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'BDC_CURSOR'
'RM61B-ZPUNKT'.
perform bdc_field using 'RM61B-MATNR' lv_matnr.
perform bdc_field using 'RM61B-WERKS' lv_werks.
perform bdc_field using 'RM61B-VERID' lv_verid.
perform bdc_field using 'RM61B-REP_POINTS'
'X'.
perform bdc_field using 'RM61B-ZPUNKT' lv_zpunkt. "报告点
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_field using 'RM61B-REFMG' lv_menge.
perform bdc_field using 'RM61B-POSTZ'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=ISTDA'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'RM61B-MATNR' lv_matnr.
perform bdc_field using 'RM61B-WERKS' lv_werks.
perform bdc_field using 'RM61B-VERID' lv_verid.
perform bdc_field using 'RM61B-PLWERK' lv_werks.
perform bdc_field using 'RM61B-REP_POINTS'
'X'.
perform bdc_field using 'RM61B-ZPUNKT' lv_zpunkt.
perform bdc_field using 'BDC_CURSOR'
'RM61B-REFMG'.
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_field using 'RM61B-REFMG' lv_menge.
perform bdc_field using 'RM61B-POSTZ'
'X'.
perform bdc_dynpro using 'SAPLRMAA' '0320'.
perform bdc_field using 'BDC_CURSOR'
'OPR_INFO-PLNFL(01)'.
perform bdc_field using 'BDC_OKCODE'
'=GOON'.
perform bdc_field using 'OPR_INFO-SEL(01)'
'X'.
perform bdc_dynpro using 'SAPLRMAA' '0300'.
perform bdc_field using 'BDC_OKCODE'
'=POST'.
* perform bdc_field using 'BDC_CURSOR'
* 'RM61J-ISM06'.
perform bdc_field using 'RM61J-ISM01' lv_vgw01. "作业值1
perform bdc_field using 'RM61J-ILE01' lv_vge01. "单位1
perform bdc_field using 'RM61J-LAR01' 'ACT001'.
perform bdc_field using 'RM61J-ISM02' lv_vgw02. "作业值2
perform bdc_field using 'RM61J-ILE02' lv_vge02. "单位2
perform bdc_field using 'RM61J-LAR02' 'ACT002'.
perform bdc_field using 'RM61J-ISM03' lv_vgw03. "作业值3
perform bdc_field using 'RM61J-ILE03' lv_vge03. "单位3
perform bdc_field using 'RM61J-LAR03' 'ACT003'.
perform bdc_field using 'RM61J-ISM04' lv_vgw04. "作业值4
perform bdc_field using 'RM61J-ILE04' lv_vge04. "单位4
perform bdc_field using 'RM61J-LAR04' 'ACT004'.
perform bdc_field using 'RM61J-ISM05' lv_vgw05. "作业值5
perform bdc_field using 'RM61J-ILE05' lv_vge05. "单位5
perform bdc_field using 'RM61J-LAR05' 'ACT005'.
perform bdc_field using 'RM61J-ISM06' lv_vgw06. "作业值6
perform bdc_field using 'RM61J-ILE06' lv_vge06. "单位6
perform bdc_field using 'RM61J-LAR06' 'ACT006'.
elseif lv_menge is initial and lv_zfpsl is not initial . "废品数量有值时调如下的BDC过账
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_CURSOR'
'RM61B-RB_LEIST'.
perform bdc_field using 'BDC_OKCODE'
'=RBTYP'.
perform bdc_field using 'RM61B-BUDAT' lv_budat. "过账日期
perform bdc_field using 'RM61B-BLDAT' lv_bldat. "凭证日期
perform bdc_field using 'RM61B-RB_BAUGR'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=RBREF'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'BDC_CURSOR'
'RM61B-ROUT_ON'.
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'/ETOGG'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=ZPKT'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'BDC_CURSOR'
'RM61B-REP_POINTS'.
perform bdc_field using 'RM61B-MATNR' lv_matnr. "物料号
perform bdc_field using 'RM61B-WERKS' lv_werks. "工厂
perform bdc_field using 'RM61B-VERID' lv_verid. "生产版本
perform bdc_field using 'RM61B-REP_POINTS' 'X'.
perform bdc_field using 'RM61B-ROUT_ON' 'X'.
perform bdc_field using 'RM61B-REFMG' lv_zfpsl. "废品数量
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=GOON'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'BDC_CURSOR'
'RM61B-ZPUNKT'.
perform bdc_field using 'RM61B-MATNR' lv_matnr. "物料号
perform bdc_field using 'RM61B-WERKS' lv_werks.
perform bdc_field using 'RM61B-VERID' lv_verid.
perform bdc_field using 'RM61B-REP_POINTS'
'X'.
perform bdc_field using 'RM61B-ZPUNKT' lv_zpunkt. "报告点
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_field using 'RM61B-REFMG' lv_zfpsl.
perform bdc_field using 'RM61B-POSTZ'
'X'.
perform bdc_dynpro using 'SAPLBARM' '0800'.
perform bdc_field using 'BDC_OKCODE'
'=ISTDA'.
perform bdc_field using 'RM61B-BUDAT' lv_budat.
perform bdc_field using 'RM61B-BLDAT' lv_bldat.
perform bdc_field using 'RM61B-MATNR' lv_matnr.
perform bdc_field using 'RM61B-WERKS' lv_werks.
perform bdc_field using 'RM61B-VERID' lv_verid.
perform bdc_field using 'RM61B-PLWERK' lv_werks.
perform bdc_field using 'RM61B-REP_POINTS'
'X'.
perform bdc_field using 'RM61B-ZPUNKT' lv_zpunkt.
perform bdc_field using 'BDC_CURSOR'
'RM61B-REFMG'.
perform bdc_field using 'RM61B-ROUT_ON'
'X'.
perform bdc_field using 'RM61B-REFMG' lv_zfpsl.
perform bdc_field using 'RM61B-POSTZ'
'X'.
perform bdc_dynpro using 'SAPLRMAA' '0320'.
perform bdc_field using 'BDC_CURSOR'
'OPR_INFO-PLNFL(01)'.
perform bdc_field using 'BDC_OKCODE'
'=GOON'.
perform bdc_field using 'OPR_INFO-SEL(01)'
'X'.
perform bdc_dynpro using 'SAPLRMAA' '0300'.
perform bdc_field using 'BDC_OKCODE'
'=POST'.
perform bdc_field using 'BDC_CURSOR'
'RM61J-ISM01'.
perform bdc_field using 'RM61J-ISM01' lv_vgw01. "作业值1
perform bdc_field using 'RM61J-ILE01' lv_vge01. "单位1
perform bdc_field using 'RM61J-LAR01' 'ACT001'.
perform bdc_field using 'RM61J-ISM02' lv_vgw02. "作业值2
perform bdc_field using 'RM61J-ILE02' lv_vge02. "单位2
perform bdc_field using 'RM61J-LAR02' 'ACT002'.
perform bdc_field using 'RM61J-ISM03' lv_vgw03. "作业值3
perform bdc_field using 'RM61J-ILE03' lv_vge03. "单位3
perform bdc_field using 'RM61J-LAR03' 'ACT003'.
perform bdc_field using 'RM61J-ISM04' lv_vgw04. "作业值4
perform bdc_field using 'RM61J-ILE04' lv_vge04. "单位4
perform bdc_field using 'RM61J-LAR04' 'ACT004'.
perform bdc_field using 'RM61J-ISM05' lv_vgw05. "作业值5
perform bdc_field using 'RM61J-ILE05' lv_vge05. "单位5
perform bdc_field using 'RM61J-LAR05' 'ACT005'.
perform bdc_field using 'RM61J-ISM06' lv_vgw06. "作业值6
perform bdc_field using 'RM61J-ILE06' lv_vge06. "单位6
perform bdc_field using 'RM61J-LAR06' 'ACT006'.
endif.
clear: gt_messtab.
call transaction 'MFBF'
using gt_bdcdata
mode 'N' "A:前台执行 N:后台执行
update 'S' "S:同步 A:异步
messages into gt_messtab.
clear: lt_return.
call function 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
tables
imt_bdcmsgcoll = gt_messtab
ext_return = lt_return.
**获取凭证日志号
read table lt_return into ls_return with key type = 'E'. "#EC CI_STDSEQ
if sy-subrc eq 0. "BDC出现错误
<ls_value_icon> = c_red.
<ls_value_message> = ls_return-message.
continue.
else. "BDC更新成功
commit work.
read table lt_return into ls_return with key type = 'S' id = 'RM'. "#EC CI_STDSEQ " number = '190' or '191' or '215'.
if sy-subrc eq 0.
<ls_value_icon> = c_green.
<ls_value_message> = '报工成功!'.
endif.
endif.