ABAP 物料主数据视图更新(BDC / BAPI)

ABAP物料主数据视图更新方法

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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值