mm 批量 修改 计量单位 BAPI_MATERIAL_SAVEDATA

本博客介绍了一个自动化批量修改物料主档资料的过程,包括上传Excel文件、权限检查、数据验证、BAPI调用等步骤,实现物料主档资料的高效变更。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& Report ZAPP01R1101 批量修改物料主檔資料
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  yamm01r1004 message-id zapp01..

type-pools : slis.    "引用ALV 要加入這語法

tables:mara,marc,makt,mast,stpo.

*------------------------------------------------------------
data: it_fieldcat type  slis_t_fieldcat_alv. "field catalog
data: it_fieldcat1 type  slis_t_fieldcat_alv. "field catalog

data: is_variant  like disvariant.         "ALV 儲存配置
data: is_layout   type slis_layout_alv.    "ALV 格式設定 *
data: it_events   type slis_t_event.       "ALV事件
data: wa_events   like line of it_events.
data: it_list_commentary type slis_t_listheader,"ALV TOP/END OF PAGE資訊
      wa_list_commentary like line of it_list_commentary.
data: g_save(1)       type c.
data: g_exit(1)      type c.

data: g_repid like sy-repid.
*DATA: gt_events       TYPE slis_t_event.
data: gt_excluding  type slis_t_extab.
data: gt_event_exit type slis_t_event_exit.

data: col    type lvc_s_scol,
      coltab type lvc_t_scol,
      color  type lvc_s_colo.
*-----------------------------------------------------------
data:i_exl like standard table of zalsmex_tabline1 with header line .
data:it_return like bapiret2  occurs 0  with header line.

data:wa_return     like bapiret2.
data:wa_headdata   like bapimathead.

data:wa_plantdata  like bapi_marc.
data:wa_plantdatax like bapi_marcx.

data:wa_bapi_mara   like bapi_mara.
data:wa_bapi_marax  like bapi_marax.

data:wa_bapi_marm   like table of bapi_marm with header line.
data:wa_bapi_marmx  like table of bapi_marmx with header line.

data:wa_tmcnv like tmcnv.

data : begin of i_tab occurs 0,
      matnr like marc-matnr,  "料號
      umren    like marm-umren,  "基本計量單位轉換的分母
      meinh    like marm-meinh,  "庫存記錄單位的替代計量單位
      umrez    like marm-umrez,  "轉換為基礎計量單位的分子
end of i_tab.

data:g_count(7) type n.
data: g_alvcnt(7) type n.
data: g_totcnt(8) type n.

*輸入條件

selection-screen begin of block blk1 with frame title text-001.

parameters: p_path like rlgrap-filename obligatory. "上傳BAPI的文件名稱
selection-screen end of block blk1.


* 說明部分
selection-screen begin of block comm3 with frame title text-009.
selection-screen comment /01(78) text-c10.
selection-screen comment /01(78) text-c11.
selection-screen comment /01(78) text-c12.
selection-screen comment /01(78) text-c13.
selection-screen comment /01(78) text-c14.

selection-screen skip 1.
selection-screen comment /01(78) text-c20.
selection-screen comment /01(78) text-c21.
selection-screen skip 1.

selection-screen end of  block comm3.

initialization.


at selection-screen output.

  loop at screen.
*    if screen-name = 'P_LESS'.
**      screen-input = 0.   " disable *
*      screen-active = 0.
*      modify screen.
*    endif.

  endloop.


at selection-screen on value-request for p_path.
  perform get_filename.                  "Choose upload filename


at selection-screen.
*  PERFORM check_screen.


start-of-selection.
  perform get_init_variant .    "取得ALV 配置呈現變量 *
  perform define_fieldcat.      "定義ALV欄位設定 *

  perform get_img_material.      "取得 IMG  料號前導零設定

  perform upload_data.          "EXCEL 資料上傳
  perform check_authority.      "檢查權限

  if it_return[] is not initial. "檢查權限有異常資料
    perform alv_display using 'CHK'.
  else.
    perform call_bapi_change.   "變更料號裝配廢品率
    if it_return[] is not initial.  "料號變更有異常資料
      perform alv_display using 'UPD'.
    else.

      message i000(zapp01) with text-s01.
    endif.
  endif.

end-of-selection.


  define append_selections.
    &4-sign = 'I'.
    &4-option = &1.
    &4-low = &2.
    &4-high = &3.
    append &4.
  end-of-definition.


*&---------------------------------------------------------------------*
*&      Form  get_layout_variant
*&---------------------------------------------------------------------*
*  取得 使用者 在show ALV 配置設定 *
*----------------------------------------------------------------------*
form get_init_variant .
  clear is_variant.

  is_variant-report = sy-repid.
  call function 'REUSE_ALV_VARIANT_DEFAULT_GET'
    exporting
      i_save     = 'A'
    changing
      cs_variant = is_variant
    exceptions
      not_found  = 2.
endform.                    "initialize_variant


*&---------------------------------------------------------------------*
*&      Form  get_t141 .
*&---------------------------------------------------------------------*
*       *"取得 IMG  料號前導零設定
*----------------------------------------------------------------------*
form get_img_material.

  "取得料號編碼 IMG 設定是否有前導零
  "TMCNV-LEXFLAG = ' '  --> 若料號號碼為數值存檔時前面會補零

  clear:wa_tmcnv.
  select single * into wa_tmcnv from tmcnv
    where convid = 'MATCONV'.

endform.                                                    "get_t141

*&---------------------------------------------------------------------*
*&      Form  check_authority.
*&---------------------------------------------------------------------*
*       檢查權限
*----------------------------------------------------------------------*
form check_authority.
  data: l_tabix like sy-tabix.
  data: l_count type p.

  refresh:it_return.

  describe table i_tab lines sy-tfill. " 取得 總筆數 *
  g_totcnt = sy-tfill.

  loop at i_tab.
    l_tabix = sy-tabix.

    "檢查有無維護料號工廠權限
    authority-check object 'M_MATE_STA'  "M_MATE_ZST
             id 'ACTVT' field '02'
             id 'STATM' field 'K'.

    if sy-subrc <> 0.
      it_return-type = 'E'.
      concatenate  text-e06  i_tab-matnr text-e04
      into it_return-message.
      append it_return.  clear:it_return.
    endif.

    "--------------------------------------------------------
    " 產生進度比率小時鐘 ------------------------------------
    l_count = l_tabix / g_totcnt * 100.
    perform progress_indicator using '2-1' l_count text-t03.
    " -------------------------------------------------------

  endloop.

  sort it_return by type message.
  delete adjacent duplicates from it_return comparing type message.
  describe table it_return lines sy-tfill. " 取得 總筆數 *
  g_alvcnt = sy-tfill.

endform.                    "get_mat_status

*&---------------------------------------------------------------------*
*&      Form  call_bapi_change
*&---------------------------------------------------------------------*
*       變更料號主檔資料
*----------------------------------------------------------------------*
form call_bapi_change.
  data: l_count type p,
        g_meins like mara-meins,
        g_gewei like t006i-isocode.
  data: l_tabix like sy-tabix.

  refresh:it_return.


  loop at i_tab.
    clear:wa_headdata,wa_bapi_mara,wa_bapi_marax,
          wa_bapi_marm,wa_bapi_marmx.
    l_tabix = sy-tabix.

    wa_headdata-material     = i_tab-matnr.
    wa_headdata-basic_view     = 'X'.

    wa_bapi_marm-denominatr     = i_tab-umren.
    wa_bapi_marm-alt_unit     = i_tab-meinh.
    wa_bapi_marm-numerator     = i_tab-umrez.


    wa_bapi_marmx-alt_unit       = i_tab-meinh.
    wa_bapi_marmx-denominatr     = 'X'.
    wa_bapi_marmx-denominatr     = 'X'.
    wa_bapi_marmx-gross_wt = 'X'.
    wa_bapi_marmx-unit_of_wt = 'X'.

    append wa_bapi_marm.
    append wa_bapi_marmx.


    "呼叫 BAPI 進行修改料號主檔資料 -----------
    call function 'BAPI_MATERIAL_SAVEDATA'
      exporting
       headdata                   = wa_headdata
       clientdata                 = wa_bapi_mara
       clientdatax                = wa_bapi_marax
       plantdata                  = wa_plantdata
       plantdatax                 = wa_plantdatax
*   FORECASTPARAMETERS         =
*   FORECASTPARAMETERSX        =
*   PLANNINGDATA               =
*   PLANNINGDATAX              =
*   STORAGELOCATIONDATA        =
*   STORAGELOCATIONDATAX       =
*   VALUATIONDATA              =
*   VALUATIONDATAX             =
*   WAREHOUSENUMBERDATA        =
*   WAREHOUSENUMBERDATAX       =
*   SALESDATA                  =
*   SALESDATAX                 =
*   STORAGETYPEDATA            =
*   STORAGETYPEDATAX           =
*   FLAG_ONLINE                = ' '
*   FLAG_CAD_CALL              = ' '
*   NO_DEQUEUE                 = ' '
*   NO_ROLLBACK_WORK           = ' '
      importing
       return                     = wa_return
 tables
*   MATERIALDESCRIPTION        =
   unitsofmeasure              = wa_bapi_marm
   unitsofmeasurex             = wa_bapi_marmx
*   INTERNATIONALARTNOS        =
*   MATERIALLONGTEXT           =
*   TAXCLASSIFICATIONS         =
*   RETURNMESSAGES             =
*   PRTDATA                    =
*   PRTDATAX                   =
*   EXTENSIONIN                =
*   EXTENSIONINX               =
              .

    if sy-subrc = 0.
      call function 'BAPI_TRANSACTION_COMMIT'
*               EXPORTING
*                 WAIT          =
*               IMPORTING
*                 RETURN        = RETURN
              .
    else.
      call function 'BAPI_TRANSACTION_ROLLBACK'.
    endif.
    refresh: wa_bapi_marm,wa_bapi_marm[],wa_bapi_marmx,wa_bapi_marmx[].
    "--------------------------------------------------------
    if wa_return-type = 'E'.    "更新失敗
      move-corresponding wa_return to it_return.
      concatenate i_tab-matnr it_return-message into it_return-message.
      append it_return.
      g_alvcnt = g_alvcnt + 1. "計算總筆數, show 在 ALV Title
    endif.

    " 產生進度比率小時鐘 ------------------------------------
    l_count = l_tabix / g_totcnt * 100.
    perform progress_indicator using '2-2' l_count text-t04.
    " -------------------------------------------------------

  endloop.


endform.                    "get_request_data

*&---------------------------------------------------------------------*
*&      Form  define_fieldcat
*&---------------------------------------------------------------------*
*       Field Catalog
*----------------------------------------------------------------------*
form define_fieldcat.
  data:wa_fieldcat type slis_t_fieldcat_alv with header line.
  clear:it_fieldcat,it_fieldcat[],wa_fieldcat,wa_fieldcat[].

  "從SAP DDIC 抓出 ALV 欄位標準設定  ---------------------------------------
  call function 'REUSE_ALV_FIELDCATALOG_MERGE'
    exporting
      i_program_name         = sy-repid
      i_internal_tabname     = 'IT_RETURN'   " IT_LIST 一定要大寫
      i_inclname             = sy-repid
    changing
      ct_fieldcat            = it_fieldcat
    exceptions "
      inconsistent_interface = 1
      program_error          = 2
      others                 = 3.

endform.                    "define_fieldcat


*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  set_layout
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
form set_layout.
  is_layout-info_fieldname   = 'ROW_COLOR'.   "設定ALV 一整列顏色
  is_layout-coltab_fieldname = 'CELL_COLOR'.  "設定ALV  欄(cell) 顏色

endform.                    "set_layout


*&---------------------------------------------------------------------*
*&      Form  alv_display
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form alv_display  using l_mode.
  data:l_headdesc type lvc_title.

  if l_mode = 'CHK'.
    shift g_alvcnt left deleting leading '0' .
    concatenate text-601 g_alvcnt into l_headdesc.
  else.
    shift g_alvcnt left deleting leading '0' .
    concatenate text-602 g_alvcnt into l_headdesc.

  endif.


  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program       = sy-repid
*      i_callback_pf_status_set = 'ALV_STATUS'
*      i_callback_user_command  = 'USER_COMMAND'
      i_grid_title             = l_headdesc
      is_layout                = is_layout  "ALV 格式設定 *
      i_save                   = ' '
      is_variant               = is_variant "傳入 使用者 在show ALV 配置設定
      it_events                = it_events
      it_fieldcat              = it_fieldcat "傳入ALV Field Catalog *
      i_default                = 'X'
    tables
      t_outtab                 = it_return
    exceptions
      program_error            = 1.


endform.                    "alv_display



*&---------------------------------------------------------------------*
*&      Form  alv_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->EXTAB      text
*----------------------------------------------------------------------*
form alv_status using  extab type slis_t_extab.
  refresh extab.
  set pf-status 'ALV_STATUS' excluding extab.
endform.                    "alv_status


*&---------------------------------------------------------------------*
*&      Form  progress_indicator
*&---------------------------------------------------------------------*
*       產生進度比率小時鐘
*----------------------------------------------------------------------*
*      -->
*----------------------------------------------------------------------*
form progress_indicator using   l_step  vn_test vc_desc.
  data: vc_num(4), vc_text(30).

  vc_num = vn_test.
  concatenate ' Process->' l_step vc_num '%  ' vc_desc into vc_text.
  call function 'SAPGUI_PROGRESS_INDICATOR'
    exporting
      percentage = vn_test
      text       = vc_text
    exceptions
      others     = 1.
endform.                  "progress_indicator

*&---------------------------------------------------------------------*
*&      Form  get_filename
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form get_filename .
  call function 'WS_FILENAME_GET'
    exporting
      def_filename     = '*.xls'
      def_path         = 'C:\'
      mask             = ',*.xls.'
      mode             = 'O'
      title            = text-t01    "請選擇上傳的Excel文件
    importing
      filename         = p_path
    exceptions
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      others           = 5.
  if sy-subrc <> 0.
    "上傳的EXCEL路徑及檔名不正確,請重新輸入!
    message s000 with text-e01.
    stop.
  endif.
endform.                    "get_filename

*&---------------------------------------------------------------------*
*&      Form  upload_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form upload_data.
  clear:i_tab,i_tab[],i_exl,i_exl[].
  data:l_count(7) type n.

  clear:l_count.
  refresh:i_tab.

  call function 'ZALSM_EXCEL_TO_INTERNAL_TABL1'
    exporting
      filename                = p_path
      i_begin_col             = 1
      i_begin_row             = 1
      i_end_col               = 4
      i_end_row               = 65535
    tables
      intern                  = i_exl
    exceptions
      inconsistent_parameters = 1
      upload_ole              = 2
      others                  = 3.

  if sy-subrc = 0 or i_exl[] is initial..
    sort i_exl by row col.

    loop at i_exl where row >= 2.
      condense i_exl-value.
      case i_exl-col.
        when 1.
          i_tab-matnr = i_exl-value.
          if wa_tmcnv-lexflag = ''.   "IMG 設定有前導零
            call function 'CONVERSION_EXIT_ALPHA_INPUT'   "補前導零
              exporting
                input  = i_tab-matnr
              importing
                output = i_tab-matnr.
          endif.
        when 2.
          i_tab-umren = i_exl-value.
        when 3.
          i_tab-meinh = i_exl-value.

        when 4.
          i_tab-umrez = i_exl-value.


      endcase.

      at end of row .
        append i_tab.    clear i_tab.
        l_count = l_count + 1.
      endat.
    endloop.

  else.
    "無資料,請仔細檢查上傳的數據和文件名!
    message i000 with text-e02.
    stop.
  endif.

  if g_count > 65535.
    message i026(zapp01) with l_count.
    stop.
  endif.

  free:i_exl.

endform.                    "upload_data









excel  file

 

MATNR

UMREN

MEINH

UMREZ

料號

基本計量單位轉換的分母

庫存記錄單位的替代計量單位

基本計量單位轉換的分子


### 回答1: 首先,您可以使用ABAP语言来编写一个程序,用于将物料主数据批量导入系统。具体步骤如下: 1. 创建一个程序,设置输入和输出参数,并确定相应的数据结构。 2. 创建一个SQL语句,从Excel文件中读取物料主数据,并将其转换ABAP内部表。 3. 使用ABAP指令将物料主数据从内部表中读取,并将其存储在系统中。 4. 使用ABAP指令检查物料主数据的正确性。 5. 将物料主数据成功导入系统后,使用ABAP指令将其保存到相应的文件中。 ### 回答2: 使用ABAP语言编写物料主数据批量导入程序可以使用SAP内置的功能模块和数据对象来实现。 首先,我们可以创建一个ABAP报表程序,在其中定义所需的变量和数据对象。例如,我们可以使用内置的数据对象LFA1来表示供应商主数据,以及信息记录对象MAKT来表示物料描述。 接下来,我们可以使用内置的功能模块如BDC_OPEN_GROUP和BDC_INSERT来打开一个BDC(事务数据转换)会话组,并插入事务数据。 在导入过程中,我们可以使用内置的函数模块如LSMW_OBJECT_READ、LSMW_DATA_READ和LSMW_DATA_WRITE来读取、处理和写入数据。 对于物料主数据批量导入,我们可以先使用每个物料的一般信息(如物料号、物料类型、基本计量单位等)创建一个转换对象。然后,通过设置字段映射和转换规则来映射输入数据和SAP系统中物料主数据字段之间的关系。最后,将导入的数据写入SAP系统中。 在整个导入过程中,我们可以使用内置的函数模块如BDC_CLOSE_GROUP来关闭BDC会话组,并提交数据。 另外,我们还可以使用BAPI_MATERIAL_SAVEDATABAPI_MATERIAL_MAINTAINDATA等内置的BAPI(业务应用编程接口)函数模块来实现物料主数据的批量导入。这些函数模块可以通过传递参数和结构体来实现物料主数据的创建、修改和删除等操作。 总之,通过使用ABAP语言编写物料主数据批量导入程序,我们可以利用SAP内置的功能模块和数据对象来实现高效、可靠和准确的物料主数据导入。 ### 回答3: ABAP语言可以用来写一个物料主数据批量导入的程序。 首先,我们可以利用ABAP的数据导入技术,使用OPEN DATASET语句打开一个文本文件。然后,通过读取该文本文件的每一行,我们可以逐行解析物料主数据的信息。在解析过程中,我们可以使用字符串操作函数和正则表达式来提取需要的字段,如物料编码、物料描述、价格等。 接下来,我们可以使用INSERT语句将解析到的物料主数据插入到物料主数据表中。在插入之前,我们可以使用SELECT语句检查物料主数据表中是否已存在相同的物料编码,以避免重复插入。 除了插入物料主数据,我们还可以在导入过程中进行一些额外的逻辑处理。例如,我们可以使用条件语句判断物料主数据是否符合一些特定条件,如价格是否大于一定阈值、描述是否包含特定关键词等。根据判断的结果,我们可以选择不插入或者标记异常的物料主数据。 在导入完成后,我们可以关闭文本文件,并进行一些后续处理。例如,我们可以输出导入结果的日志信息,统计成功和失败的记录数等数据。此外,我们还可以将导入结果保存到一个报表或者发送邮件给相关人员。 综上所述,使用ABAP语言编写一个物料主数据批量导入的程序可通过数据导入、解析、插入和逻辑处理等步骤完成,同时可以进行后续处理和结果输出。这样的程序可以大大提高物料主数据导入的效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值