前台使用事物代码MR21对SKU级物料进行标准价修改,现在要通过自开发平台对SKU级物料进行批量修改标准价。

网上查到的可用bapi有两个,但是经过测试,两个bapi都是无法使用的,而且在前台通过断点发现,mr21修改物料标准价是直接调用两个内部函数,以下是两个bapi无法使用的原因。

BAPI_M_REVAL_CREATEPRICECHANGE

此bapi看传入参数,可以初步看出他可以批量修改,公司、工厂下的物料标准价,但是执行后没有任何反应,双击进入函数后,发现以下代码:

MR21修改物料标准价

很明显,这个bapi是无法使用的,默认情况下禁用。

BAPI_M_REVAL_CREATEPRICECHANGE

 

此bapi通过单条物料进行修改,但是在bapi中他会去判断ckml_price_send

表中是否有数据,如果没有,则返回报错消息。

       但是在系统中,这个表是空表,没有任何数据,会直接返回‘估算范围 &1 中无用户化数据被发现’。

MR21修改物料标准价

 

BDC录屏

MR21修改物料标准价

MR21修改物料标准价

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.

相关文章: