MR21修改价格¶
BDC实现¶
示例代码
*&---------------------------------------------------------------------*
*& Form frm_bdc_mr21
*&---------------------------------------------------------------------*
*& MR21录屏
*&---------------------------------------------------------------------*
FORM frm_bdc_mr21.
" 测试数据类型
DATA:
BEGIN OF ls_data,
budat TYPE budat,
matnr TYPE matnr,
werks TYPE werks,
bukrs TYPE bukrs,
zamount TYPE p LENGTH 16 DECIMALS 2,
mtype TYPE bapi_mtype,
msg TYPE bapi_msg,
END OF ls_data.
" BDC数据
DATA:
lt_bdcdata TYPE STANDARD TABLE OF bdcdata WITH EMPTY KEY,
ls_bdcdata TYPE bdcdata,
lt_bdcmsg TYPE STANDARD TABLE OF bdcmsgcoll WITH EMPTY KEY,
ls_bdcmsg TYPE bdcmsgcoll,
ls_option TYPE ctu_params.
DEFINE _bdc_dynpro.
CLEAR ls_bdcdata.
ls_bdcdata-program = &1.
ls_bdcdata-dynpro = &2.
ls_bdcdata-dynbegin = 'X'.
INSERT ls_bdcdata INTO TABLE lt_bdcdata.
END-OF-DEFINITION.
DEFINE _bdc_field.
CLEAR ls_bdcdata.
ls_bdcdata-fnam = &1.
ls_bdcdata-fval = &2.
CONDENSE ls_bdcdata-fval.
INSERT ls_bdcdata INTO TABLE lt_bdcdata.
END-OF-DEFINITION.
CLEAR lt_bdcdata.
CLEAR lt_bdcmsg.
CLEAR ls_option.
DATA l_budat TYPE char10.
l_budat = |{ ls_data-budat DATE = USER }|.
" MR21初始屏幕
_bdc_dynpro 'SAPRCKM_MR21' '0201'.
_bdc_field:
'BDC_OKCODE' '=ENTR',
'MR21HEAD-BUDAT' l_budat,
'MR21HEAD-BUKRS' ls_data-bukrs,
'MR21HEAD-WERKS' ls_data-werks.
" 录入一行物料价格
_bdc_dynpro 'SAPRCKM_MR21' '0201'.
_bdc_field:
'BDC_OKCODE' '=ENTR',
'CKI_MR21_0250-MATNR(01)' ls_data-matnr, " 物料
'CKI_MR21_0250-NEWVALPR(01)' ls_data-zamount. " 价格
" 保存
_bdc_dynpro 'SAPRCKM_MR21' '0201'.
_bdc_field:
'BDC_OKCODE' '=SAVE'.
ls_option-dismode = 'N'. " 后台
ls_option-updmode = 'L'. " 本地
ls_option-nobinpt = 'X'. " 有弹窗,需要启用这个标识
CALL TRANSACTION 'MR21' USING lt_bdcdata
OPTIONS FROM ls_option
MESSAGES INTO lt_bdcmsg.
" 读取错误数据
LOOP AT lt_bdcmsg INTO ls_bdcmsg WHERE msgtyp CA 'AXE'.
MESSAGE ID ls_bdcmsg-msgid TYPE ls_bdcmsg-msgtyp NUMBER ls_bdcmsg-msgnr
WITH ls_bdcmsg-msgv1 ls_bdcmsg-msgv2 ls_bdcmsg-msgv3 ls_bdcmsg-msgv4
INTO DATA(l_msg).
ls_data-mtype = 'E'.
ls_data-msg = |{ ls_data-msg }{ l_msg };|.
ENDLOOP.
IF sy-subrc <> 0.
" 没有错误,将正确数据报出
DELETE lt_bdcmsg WHERE msgtyp CA 'AXE'.
LOOP AT lt_bdcmsg INTO ls_bdcmsg.
MESSAGE ID ls_bdcmsg-msgid TYPE ls_bdcmsg-msgtyp NUMBER ls_bdcmsg-msgnr
WITH ls_bdcmsg-msgv1 ls_bdcmsg-msgv2 ls_bdcmsg-msgv3 ls_bdcmsg-msgv4
INTO l_msg.
ls_data-mtype = 'S'.
ls_data-msg = |{ ls_data-msg }{ l_msg };|.
ENDLOOP.
ENDIF.
IF ls_data-msg IS INITIAL.
ls_data-mtype = 'S'.
ls_data-msg = '已处理'.
ENDIF.
" 不管如何,BDC都回滚不了,直接提交了事
COMMIT WORK AND WAIT.
ENDFORM.
BAPI实现¶
BAPI_M_REVAL_CREATEPRICECHANGE,价格修改用BAPI,由于将该函数代码初始有默认限制,需要通过增强放开。
增强BAPI不知道会留下什么坑……所以我没用BAPI实现价格修改,也没有示例