1.MRP视图更新需注意参数:
splantdata-mrp_view = ‘X’.
不设置MRP不会更新
2.会计视图的价格单位,通过BDC的方式更新
因为物料视图扩充的不同 导致mm02回车的视图选择不同
方法1(隐式增强)
所以这里不能使用录屏生成的index,需要通过增强的方式判断下**


方法2(非增强,通过视图函数获取)

通过如下函数读取所有视图,并对指定的SELECTION视图打上X(字段fval)
eg:mrp3视图的配置变量
因为mrp视图1234是连着的,所以读取第一个X的位置 + 2 即可

"视图选择
DATA lt_btci TYPE TABLE OF bdcdata.
CALL FUNCTION 'MATERIAL_BTCI_SELECTION_NEW'
EXPORTING
material = p_matnr
selection = 'D'
tcode = 'MM02'
TABLES
btci_d0070 = lt_btci
EXCEPTIONS
material_not_found = 1
material_number_missing = 2
material_type_missing = 3
material_type_not_found = 4
no_active_dynpro_selected = 5
no_authority = 6
OTHERS = 7.
READ TABLE lt_btci INTO DATA(ls_btci) WITH KEY fval = 'X'.
IF sy-subrc = 0.
DATA(lv_cnt) = ls_btci-fnam+17(2).
lv_cnt = lv_cnt + 2.
fnam = |MSICHTAUSW-KZSEL({ lv_cnt })|.
ELSE.
" add_msg 'E' '请扩充MRP视图' ls_req-matnr '' ''.
ENDIF.
CLEAR:lt_btci.
3.BDC注意点
如果字段类型是数量或金额 需要定义char类型的字段替代传值–如下案例
4.BAPI_MATERIAL_SAVEREPLICA可批量执行
参考:扩充存储地点
这里是 MRP / 成本 / 会计视图的修改案例
*&---------------------------------------------------------------------*
*& Report ZMMR01B
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmr01c.
INCLUDE zcommon.
TABLES: marc.
DATA: return TYPE TABLE OF bapiret2.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: ls_opt TYPE ctu_params.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_matnr FOR marc-matnr,"采购订单
s_werks FOR marc-werks,"凭证日期
s_loggr FOR marc-loggr."凭证类型
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
IF s_loggr[] IS INITIAL.
MESSAGE s000(zgl01) WITH '后勤处理组为必填!' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
SELECT
marc~matnr,
makt~maktx,
marc~werks,
marc~loggr,
marc~beskz,
marc~sobsl,
marc~rgekz,
marc~schgt,
marc~lgpro,
marc~losgr,
mbew~peinh,
mbew~verpr,
mbew~stprs,
mbew~zplp1,
mbew~zpld1,
mbew~lbkum,"当前库存
marc~dplpu AS sel,"当X置为空
marc~qssys AS light,""置为空 状态灯
mara~productoid AS msg""置为空 消息提示
INTO TABLE @DATA(gt_itab)
FROM marc
INNER JOIN makt ON makt~matnr = marc~matnr AND spras = @sy-langu
INNER JOIN mara ON mara~matnr = marc~matnr
INNER JOIN mbew ON mbew~matnr = marc~matnr AND mbew~bwkey = marc~werks
WHERE marc~matnr IN @s_matnr
AND marc~werks IN @s_werks
AND marc~loggr IN @s_loggr.
* IF gt_itab[] IS INITIAL.
* MESSAGE s000(zgl01) WITH '该选择无数据!' DISPLAY LIKE 'E'.
* EXIT.
* ENDIF.
LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<fs_itab>).
CLEAR: <fs_itab>-sel, <fs_itab>-light, <fs_itab>-msg.
ENDLOOP.
DATA: gs_itab LIKE LINE OF gt_itab.
PERFORM frm_display.
FORM frm_display .
"add_fieldcat 'SEL' '选择' 'X' 'X' '' '' '' '' ''.
add_fieldcat 'LIGHT' '更新状态' '' '' '' '' '' '' ''.
add_fieldcat 'MSG' '消息提示' '' '' '' '' '' '' ''.
"
add_fieldcat 'MATNR' '物料编码' '' '' '' '' '' '' ''.
add_fieldcat 'MAKTX' '物料名称' '' '' '' '' '' '' ''.
add_fieldcat 'WERKS' '工厂' '' '' '' '' '' '' ''.
add_fieldcat 'LOGGR' '当前后勤处理组' '' '' '' '' '' '' ''.
add_fieldcat 'BESKZ' '采购类型' '' '' '' '' '' '' ''.
add_fieldcat 'SOBSL' '特殊采购' '' '' '' '' '' '' ''.
add_fieldcat 'RGEKZ' '反冲' '' '' '' '' '' '' ''.
add_fieldcat 'SCHGT' '散装物料' '' '' '' '' '' '' ''.
add_fieldcat 'LGPRO' '生产存储地点' '' '' '' '' '' '' ''.
add_fieldcat 'LBKUM' '当前库存' '' '' '' '' '' '' ''.
add_fieldcat 'PEINH' '当期价格单位' '' '' '' '' '' '' ''.
add_fieldcat 'VERPR' '当期移动平均价' '' '' '' '' '' '' ''.
add_fieldcat 'STPRS' '当期标准价' '' '' '' '' '' '' ''.
add_fieldcat 'LOSGR' '成本核算批量' '' '' '' '' '' '' ''.
add_fieldcat 'ZPLP1' '计划价格1' '' '' '' '' '' '' ''.
add_fieldcat 'ZPLD1' '计划价格日期1' '' '' '' '' '' '' ''.
wa_layout-box_fname = 'SEL'."选择框的字段名
"wa_layout-no_rowmark = 'X'."禁用行选择 如果自定义了选择框字段 可以隐藏掉自带的
wa_layout-zebra = 'X'."颜色交替
wa_layout-cwidth_opt = 'X' . " 自动优化列宽
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
is_layout_lvc = wa_layout "属性
it_fieldcat_lvc = gt_fieldcat "字段
i_callback_program = sy-repid "当前程序
i_callback_pf_status_set = 'ALV_PF_STATUS_SET'
i_callback_user_command = 'ALV_USER_COMMAND'
TABLES
t_outtab = gt_itab
EXCEPTIONS
program_error = 1.
ENDFORM.
FORM alv_pf_status_set USING rt_extab TYPE slis_t_extab.
DATA: l_extab TYPE LINE OF slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab."显示/隐藏对应的GUI按钮
ENDFORM.
FORM alv_user_command USING r_ucomm TYPE sy-ucomm
ls_selfield TYPE slis_selfield.
"alv的刷新 获取更新后的值
IF lr_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
ENDIF.
IF lr_grid IS NOT INITIAL.
CALL METHOD lr_grid->check_changed_data.
ENDIF.
IF r_ucomm = '&DEL' OR r_ucomm = '&JH'.
LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<fs_itab>) WHERE sel = 'X'.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE w000(zgl01) WITH '未选择数据!'.
ENDIF.
ENDIF.
"弹出可以填写字段的函数方法
DATA : lt_sval TYPE TABLE OF sval,
ls_sval LIKE LINE OF lt_sval.
DATA:l_returncode TYPE string .
DATA: lt_returnmessages TYPE TABLE OF bapiret2,
ls_returnmessages LIKE bapiret2,
ls_return TYPE bapiret2.
DATA:lt_headdata TYPE TABLE OF bapie1matheader,
ls_headdata TYPE bapie1matheader,
tvaluationdata TYPE TABLE OF bapie1mbew,
tvaluationdatax TYPE TABLE OF bapie1mbewx,
svaluationdata TYPE bapie1mbew,
svaluationdatax TYPE bapie1mbewx.
DATA: tplantdata TYPE TABLE OF bapie1marc.
DATA: splantdata TYPE bapie1marc.
DATA: tplantdatax TYPE TABLE OF bapie1marcx.
DATA: splantdatax TYPE bapie1marcx.
DATA: lv_msg(100).
DATA: lv_str(20).
"定义消息类型
TYPES: BEGIN OF esp1_message_wa_type,
msgid LIKE sy-msgid,
msgty LIKE sy-msgty,
msgno LIKE sy-msgno,
msgv1 LIKE sy-msgv1,
msgv2 LIKE sy-msgv2,
msgv3 LIKE sy-msgv3,
msgv4 LIKE sy-msgv4,
lineno LIKE mesg-zeile,
END OF esp1_message_wa_type.
TYPES: esp1_message_tab_type TYPE esp1_message_wa_type OCCURS 20.
DATA: it_error_message TYPE esp1_message_tab_type WITH HEADER LINE.
DATA: v_lineno TYPE mesg-zeile.
DATA: l_msgid TYPE sy-msgid,
l_msgty TYPE sy-msgty,
l_msgno TYPE sy-msgno,
l_msg TYPE char100.
l_msgid = 'ZGL01'.
l_msgty = 'W'.
l_msgno = '000'.
DEFINE mac_msg.
v_lineno = v_lineno + 1.
it_error_message-lineno = v_lineno.
it_error_message-msgid = l_msgid.
it_error_message-msgty = l_msgty.
it_error_message-msgno = l_msgno.
it_error_message-msgv1 = &1.
it_error_message-msgv2 = &2.
APPEND it_error_message.
CLEAR it_error_message.
END-OF-DEFINITION.
DATA lv_answer.
CASE r_ucomm.
WHEN '&BG'.
"提示
CLEAR: it_error_message, it_error_message[].
LOOP AT gt_itab ASSIGNING <fs_itab> WHERE sel = 'X'.
CLEAR: lv_msg.
IF <fs_itab>-lbkum = 0.
lv_msg = '物料' && <fs_itab>-matnr && '库存均为0'.
ELSE.
lv_msg = '物料' && <fs_itab>-matnr && '库存为' && <fs_itab>-lbkum.
ENDIF.
mac_msg: lv_msg ''.
ENDLOOP.
CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
TABLES
i_message_tab = it_error_message.
ASSERT sy-subrc = 0.
"填写物料属性
CLEAR: ls_sval, lt_sval.
ls_sval-tabname = 'MARC' . "表名
ls_sval-fieldname = 'LOGGR' . "字段名
ls_sval-field_obl = 'X' . "是否为必填
APPEND ls_sval TO lt_sval.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
* NO_VALUE_CHECK = ' '
popup_title = '请填写属性'
* START_COLUMN = '5'
* START_ROW = '5'
IMPORTING
returncode = l_returncode
TABLES
fields = lt_sval
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
CLEAR ls_sval.
READ TABLE lt_sval INTO ls_sval INDEX 1.
IF ls_sval-value IS INITIAL.
MESSAGE s000(zgl01) WITH '物料属性必填!' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
* CLEAR lv_answer.
* CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
* EXPORTING
** DEFAULTOPTION = 'Y'
* textline1 = '请确认未交货的ASN已删除。标记删除后,对应订单行无法发货,无法收货!'
** TEXTLINE2 = ' '
* titel = '提示:'
** START_COLUMN = 25
** START_ROW = 6
* cancel_display = 'X' "X:显示取消按钮
* IMPORTING
* answer = lv_answer. "确定= J 否=N 取消 = A
* CHECK lv_answer = 'J'.
LOOP AT gt_itab ASSIGNING <fs_itab> WHERE sel = 'X'.
CLEAR: splantdata, splantdatax, tplantdata, tplantdatax, ls_headdata, lt_headdata,
ls_return, lt_returnmessages, ls_returnmessages, tvaluationdata, tvaluationdatax,
svaluationdata, svaluationdata.
SELECT SINGLE mbrsh, mtart INTO (@ls_headdata-ind_sector, @ls_headdata-matl_type)
FROM mara WHERE matnr = @<fs_itab>-matnr.
ls_headdata-mrp_view = 'X'.
ls_headdata-cost_view = 'X'.
ls_headdata-account_view = 'X'.
ls_headdata-material_long = <fs_itab>-matnr.
APPEND ls_headdata TO lt_headdata.
svaluationdata-price_unit = 1.
svaluationdata-pr_unit_pp = 1.
svaluationdata-pr_unit_py = 1.
svaluationdata-plndprdate1 = ''.
svaluationdata-plndprice1 = ''.
CASE ls_sval-value.
WHEN '2'.
splantdata-plant = <fs_itab>-werks.
splantdata-material_long = <fs_itab>-matnr.
splantdata-handlg_grp = ls_sval-value."属性
splantdata-bulk_mat = 'X'."散装
splantdata-iss_st_loc = ''.
splantdata-lot_size = 1.
splantdata-backflush = ''."反冲标识
WHEN '4'.
splantdata-plant = <fs_itab>-werks.
splantdata-material_long = <fs_itab>-matnr.
splantdata-handlg_grp = ls_sval-value."属性
splantdata-bulk_mat = ''."散装
splantdata-iss_st_loc = 'A009'.
splantdata-lot_size = 10000.
splantdata-backflush = '1'."反冲标识
svaluationdata-price_unit = 10000.
svaluationdata-pr_unit_pp = 10000.
svaluationdata-pr_unit_py = 10000.
svaluationdata-plndprdate1 = sy-datum+0(6) && '01'.
svaluationdata-plndprice1 = '0.01'.
WHEN '3'.
splantdata-plant = <fs_itab>-werks.
splantdata-material_long = <fs_itab>-matnr.
splantdata-handlg_grp = ls_sval-value."属性
splantdata-bulk_mat = ''."散装
splantdata-iss_st_loc = 'A009'.
splantdata-lot_size = 1.
splantdata-backflush = '1'."反冲标识
ENDCASE.
splantdata-mrp_view = 'X'.
splantdatax-plant = <fs_itab>-werks.
splantdatax-material_long = <fs_itab>-matnr.
splantdatax-handlg_grp = 'X'."属性
splantdatax-bulk_mat = 'X'."散装
splantdatax-iss_st_loc = 'X'.
splantdatax-lot_size = 'X'.
splantdatax-backflush = 'X'."反冲标识
APPEND splantdata TO tplantdata.
APPEND splantdatax TO tplantdatax.
svaluationdata-material_long = <fs_itab>-matnr.
svaluationdata-val_area = <fs_itab>-werks.
svaluationdata-account_view = 'X'.
svaluationdata-cost_view = 'X'.
APPEND svaluationdata TO tvaluationdata.
svaluationdatax-material_long = <fs_itab>-matnr.
svaluationdatax-val_area = <fs_itab>-werks.
svaluationdatax-price_unit = 'X'.
svaluationdatax-pr_unit_pp = 'X'.
svaluationdatax-pr_unit_py = 'X'.
svaluationdatax-plndprice1 = 'X'.
svaluationdatax-plndprdate1 = 'X'.
APPEND svaluationdatax TO tvaluationdatax.
CALL FUNCTION 'BAPI_MATERIAL_SAVEREPLICA'
EXPORTING
noappllog = ''
nochangedoc = ''
testrun = ''
inpfldcheck = ''
IMPORTING
return = ls_return
TABLES
headdata = lt_headdata
plantdata = tplantdata
plantdatax = tplantdatax
valuationdata = tvaluationdata
valuationdatax = tvaluationdatax
returnmessages = lt_returnmessages.
LOOP AT lt_returnmessages INTO ls_returnmessages WHERE type = 'A' OR type = 'E'.
<fs_itab>-msg = <fs_itab>-msg && ls_returnmessages-message.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<fs_itab>-light = '@0A@'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
<fs_itab>-light = '@08@'.
<fs_itab>-loggr = splantdata-handlg_grp."属性
<fs_itab>-schgt = splantdata-bulk_mat."散装
<fs_itab>-lgpro = splantdata-iss_st_loc.
<fs_itab>-losgr = splantdata-lot_size.
<fs_itab>-peinh = svaluationdata-price_unit.
<fs_itab>-rgekz = splantdata-backflush."反冲标识
"继续
lv_str = <fs_itab>-peinh.
CONDENSE lv_str NO-GAPS.
CLEAR: messtab, messtab[], bdcdata, bdcdata[].
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'RMMG1-MATNR'
<fs_itab>-matnr."!!!!!!!!
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(15)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
* PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(15)'
* 'X'.
PERFORM bdc_dynpro USING 'SAPLMGMM' '0080'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RMMG1-WERKS'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'RMMG1-WERKS'
<fs_itab>-werks."!!!!!!
PERFORM bdc_dynpro USING 'SAPLMGMM' '4000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'BU'.
PERFORM bdc_field USING 'BDC_CURSOR'
'CKMMAT_DISPLAY-PEINH_3'.
PERFORM bdc_field USING 'CKMMAT_DISPLAY-PEINH_1'
lv_str.
PERFORM bdc_field USING 'CKMMAT_DISPLAY-PEINH_2'
lv_str.
PERFORM bdc_field USING 'CKMMAT_DISPLAY-PEINH_3'
lv_str.
PERFORM bdc_dynpro USING 'SAPLMGMM' '4000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
ls_opt-dismode = 'N'."
ls_opt-updmode = 'S'."
"ls_opt-cattmode = 'A'.
ls_opt-nobinpt = 'X'.
ls_opt-racommit = 'X'.
"LMGMMO0I->MOUDLE: LMGMMO0I
"通过内存值判断 该程序调用 则默认会计视图
DATA(lv_id) = 'ZMMR01C'.
EXPORT lv_id TO MEMORY ID 'ZMMR01C'.
CALL TRANSACTION 'MM02' USING bdcdata OPTIONS FROM ls_opt MESSAGES INTO messtab.
READ TABLE messtab WITH KEY msgtyp = 'E'.
IF sy-subrc = 0.
<fs_itab>-light = '@0A@'.
<fs_itab>-msg = '属性更新成功!价格单位更新失败!'.
ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
<fs_itab>-msg = ''.
ENDIF.
ENDIF.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE e000(zgl01) WITH '未选择!'.
ENDIF.
WHEN 'ALL'.
gs_itab-sel = 'X'.
MODIFY gt_itab FROM gs_itab TRANSPORTING sel WHERE sel = ''.
WHEN 'SAL'.
gs_itab-sel = ''.
MODIFY gt_itab FROM gs_itab TRANSPORTING sel WHERE sel = 'X'.
ENDCASE.
CALL METHOD lr_grid->get_frontend_layout
IMPORTING
es_layout = wa_layout.
wa_layout-cwidth_opt = 'X' . " 自动优化列
CALL METHOD lr_grid->set_frontend_layout
EXPORTING
is_layout = wa_layout.
DATA: ls_stbl TYPE lvc_s_stbl.
ls_stbl-row = 'X'.
ls_stbl-col = 'X'.
CALL METHOD lr_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
ENDFORM.
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM.
ABAP物料主数据视图更新方法
168

被折叠的 条评论
为什么被折叠?



