前台使用事物代码MR21对SKU级物料进行标准价修改,现在要通过自开发平台对SKU级物料进行批量修改标准价。
网上查到的可用bapi有两个,但是经过测试,两个bapi都是无法使用的,而且在前台通过断点发现,mr21修改物料标准价是直接调用两个内部函数,以下是两个bapi无法使用的原因。
BAPI_M_REVAL_CREATEPRICECHANGE
此bapi看传入参数,可以初步看出他可以批量修改,公司、工厂下的物料标准价,但是执行后没有任何反应,双击进入函数后,发现以下代码:
很明显,这个bapi是无法使用的,默认情况下禁用。
BAPI_M_REVAL_CREATEPRICECHANGE
此bapi通过单条物料进行修改,但是在bapi中他会去判断ckml_price_send
表中是否有数据,如果没有,则返回报错消息。
但是在系统中,这个表是空表,没有任何数据,会直接返回‘估算范围 &1 中无用户化数据被发现’。
BDC录屏
LOOP AT lt_alv INTO ls_alv.
* 抬头
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
* PERFORM bdc_field USING 'MR21HEAD-BUDAT'
* sy-datum.
PERFORM bdc_field USING 'MR21HEAD-BUKRS'
ls_alv-bukrs.
PERFORM bdc_field USING 'MR21HEAD-WERKS'
ls_alv-werks.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
* 明细
LOOP AT gt_alv INTO gs_alv WHERE bukrs = ls_alv-bukrs
AND werks = ls_alv-werks.
* 确定行
lv_line = lv_line + 1.
IF lv_line > 9.
lv_mat = 'CKI_MR21_0250-MATNR(' && lv_line && ')'.
lv_pri = 'CKI_MR21_0250-NEWVALPR(' && lv_line && ')'.
ELSE.
lv_mat = 'CKI_MR21_0250-MATNR(0' && lv_line && ')'.
lv_pri = 'CKI_MR21_0250-NEWVALPR(0' && lv_line && ')'.
ENDIF.
PERFORM bdc_field USING lv_mat
gs_alv-matnr.
PERFORM bdc_field USING lv_pri
lv_price.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
CLEAR gs_alv.
ENDLOOP.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
* 保存
PERFORM bdc_field USING 'BDC_OKCODE'
'=SAVE'.
*mode 模式分为3种
* A 前台运行模式
* E 显示错误模式
* N 后台运行模式
CALL TRANSACTION 'MR21' USING gt_bdcdata
MODE 'N'
MESSAGES INTO lt_messtab.
CLEAR: ls_alv,gt_bdcdata,lt_messtab,lv_line.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> P_
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR gs_bdcdata.
gs_bdcdata-program = program.
gs_bdcdata-dynpro = dynpro.
gs_bdcdata-dynbegin = 'X'.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*& --> P_
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR gs_bdcdata.
gs_bdcdata-fnam = fnam.
gs_bdcdata-fval = fval.
SHIFT gs_bdcdata-fval LEFT DELETING LEADING space.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.