BAPI_MATERIAL_SAVEDATA 使用实例

REPORT ZUPDATE_MATNR.
"$. Region BAPI Data"
DATA gs_bapimathead TYPE bapimathead. " 物料号 物料类型 物料视图表 "
DATA gs_bapi_mara   TYPE bapi_mara.   " MARA数据-基本视图数据 "
DATA gs_bapi_marax  TYPE bapi_marax.  " 变更数据标识 "
DATA gs_bapi_mvke   TYPE bapi_mvke.   " 销售视图 "
DATA gs_bapi_mvkex  TYPE bapi_mvkex.
DATA gs_bapi_marc   TYPE bapi_marc.   " 工厂级别数据 "
DATA gs_bapi_marcx  TYPE bapi_marcx.
DATA gs_bapi_mpgd   TYPE bapi_mpgd.   " 计划数据 "
DATA gs_bapi_mpgdx  TYPE bapi_mpgdx.
DATA gs_bapi_mbew   TYPE bapi_mbew.   " 会计成本视图 "
DATA gs_bapi_mbewx  TYPE bapi_mbewx.
DATA gs_bapi_mard   TYPE bapi_mard.   " 存储位置 "
DATA gs_bapi_mardx  TYPE bapi_mardx. 
DATA gs_bapi_mlgn   TYPE bapi_mlgn.   " 仓库数据 "
DATA gs_bapi_mlgnx  TYPE bapi_mlgnx.
DATA gs_bapi_mlgt   TYPE bapi_mlgt.   " 存储类型数据 "
DATA gs_bapi_mlgtx  TYPE bapi_mlgtx.
DATA gs_return      TYPE bapiret2.    " 返回参数 "

DATA gt_bapi_makt   LIKE TABLE OF bapi_makt WITH HEADER LINE.   " 物料描述 "
DATA gt_bapi_marm   LIKE TABLE OF bapi_marm WITH HEADER LINE.   " 物料的单位换算 "
DATA gt_bapi_marmx  LIKE TABLE OF bapi_marmx WITH HEADER LINE.
DATA gt_bapi_mlan   LIKE TABLE OF bapi_mlan WITH HEADER LINE .  " 税分类 "
DATA gt_bapi_mltx   LIKE TABLE OF bapi_mltx WITH HEADER LINE .  " 文本数据 "
DATA gt_return1 LIKE TABLE OF  bapi_matreturn2 WITH HEADER LINE." 返回信息 "

DATA:gs_bapi_te_mara  LIKE bapi_te_mara,     " 自定i增强字段:客户级别的物料数据 "
     gs_bapi_te_marax LIKE bapi_te_marax.
DATA:gs_bapi_te_e1mvke  LIKE bapi_te_e1mvke, " 自定义增强字段:销售视图 "
     gs_bapi_te_e1mvkex LIKE bapi_te_e1mvkex.
DATA:gt_extensionin  LIKE TABLE OF  bapiparex WITH HEADER LINE, " 附加结构 "
     gt_extensioninx LIKE TABLE OF  bapiparexx WITH HEADER LINE.
DATA:l_valuepart(960),l_valuepartx(960).

DATA: pr_unit TYPE meins,  " 基本单位 "
      pr_unit2 TYPE meins. " 重量单位 "
"$. Endregion BAPI Data"

"$. Region Structure"
DATA:BEGIN OF itab OCCURS 0,
  head_material TYPE matnr,      " 物料号 "
  head_ind_sector TYPE mbrsh,    " 行业领域 "
  head_matl_type TYPE mtart,     " 物料类型 "
  t_makt_matl_desc TYPE maktx,   " 物料描述 "
  mara_base_uom TYPE meins,      " 基本计量单位 "
  mara_matl_group TYPE matkl,    " 物料组 "
  t_old_mat_no TYPE bismt,       " 型号 "
  mara_division TYPE spart,      " 产品组 "
  t_dsn_office TYPE labor,       " 实验室 / 办公室 "
  mara_item_cat TYPE mtpos_mara, " 普通项目组类别 "
  t_marm_gross_wt TYPE brgew,    " 毛重 "
  mara_unit_of_wt TYPE gewei,    " 重量单位 "
  mara_net_weight TYPE ntgew,    " 净重 "
  mara_size_dim TYPE groes,      " 大小 / 量纲 "
  zz_model TYPE char30,          " 屏幕增强字段 "
  zz_drawing TYPE char27,        " 屏幕增强字段 "
  zz_color TYPE char20,          " 屏幕增强字段 "
END OF itab.
DATA itab1 TYPE itab OCCURS 0 WITH HEADER LINE.
* 原材料
DATA: BEGIN OF str_material,
  marc_plant TYPE werks_d,   "工厂"
  mard_stge_loc TYPE lgort_d,"库存地点
  mvke_sales_org TYPE vkorg, "销售组织
  mvke_distr_chan TYPE vtweg,"分销渠道
  head_material TYPE matnr,  "物料号
  head_ind_sector TYPE mbrsh,"行业领域
  head_matl_type TYPE mtart, "物料类型
  t_makt_matl_desc TYPE maktx,"物料描述
  mara_base_uom TYPE meins,  "基本计量单位
  mara_matl_group TYPE matkl,"物料组
  mara_extmatlgrp TYPE extwg,"外部物料组
  mara_item_cat TYPE mtpos_mara,"普通项目组类别
  t_marm_gross_wt TYPE brgew,"毛重
  t_marm_unit_of_wt TYPE gewei,"重量单位
  mara_net_weight TYPE ntgew,"净重
  t_marm_volume TYPE volum,  "标准箱
   t_marm_volumeunit TYPE voleh,"体积单位
  mvke_sales_unit TYPE vrkme,"销售单位 

  t_mlan_taxclass1 TYPE taxkm,  "税分类1
  t_mlan_taxclass2 TYPE taxkm,  "税分类2
  mvke_matl_stats TYPE stgma,   "物料统计组
  mvke_acct_assgt TYPE ktgrm,   "科目设置组
  mvke_item_cat TYPE mtpos,     "来自物料主文件的项目主类别
  marc_availcheck TYPE mtvfp,   "可用性检查
  mara_trans_grp TYPE tragr,    "运输组
  marc_loadinggrp TYPE ladgr,   "装载组
  marc_pur_group TYPE ekgrp,    "采购组
  marc_batch_mgmt TYPE xchpf,   "批次管理标示
  marc_auto_p_ord TYPE kautb,   "自动采购订单
  marc_ind_post_to_insp_stock TYPE insmk_mat,"过账到检验库存
  marc_quotausage TYPE usequ,   "配额安排
  marc_sourcelist TYPE kordb,   "源清单
  marc_mrp_group TYPE disgr,    "MRP组
  marc_mrp_type TYPE dismm,     "MRP类型
  marc_mrp_ctrler TYPE dispo,   "MRP控制者
  marc_lotsizekey TYPE disls,   "批量
  marc_minlotsize TYPE bstmi,   "最小批量
  marc_maxlotsize TYPE bstma,   "最大批量
  marc_round_val TYPE bstrf,    "舍入值
  marc_proc_type TYPE beskz,    "采购类型
  marc_backflush TYPE rgekm,    "反冲
  marc_plnd_delry TYPE plifz,   "计划交货时间
  marc_gr_pr_time TYPE webaz,   "收货处理时间
  marc_safety_stk TYPE eisbe,   "安全库存
  marc_sm_key TYPE fhori,       "计划边际码
  marc_plan_strgp TYPE strgp,   "策略组
  marc_alt_bom_id TYPE altsl,   "选择方法
  stge_loc TYPE lgort_d,        "库存地点,占位,不用取出赋值,同上边库存地点
  mbew_val_class TYPE bklas,    "评估类
  mbew_price_ctrl TYPE vprsv,   "价格控制
  mbew_price_unit TYPE peinh,   "价格单位
  mbew_moving_pr TYPE verpr_bapi,"移动平均价
  mbew_std_price TYPE stprs_bapi,"标准价格
  mbew_qty_struct TYPE ck_ekalrel,"用QS的成本估算
  mbew_orig_mat TYPE hkmat,      "物料来源
  END OF str_material.
DATA: it_material LIKE TABLE OF str_material.
"$. Endregion Structure"
START-OF-SELECTION.
  PERFORM prepare_data.
  PERFORM excute_bapi.
*&---------------------------------------------------------------------*
*&      Form  PREPARE_DATA
*&---------------------------------------------------------------------*
FORM prepare_data .
  DATA : lv_matnr TYPE char18.
  itab-head_material = '1500-620'.
  itab-head_ind_sector = 'M'.
  itab-head_matl_type = 'HIBE'.        " 物料类型 "
  itab-mara_base_uom = 'CSE'.           " 基本计量单位 "
  itab-mara_matl_group = '010'.      " 物料组 "
  itab-t_old_mat_no = 'test007'.       " 型号 "
  itab-mara_division = '00'.           " 产品组 "
  itab-t_dsn_office = '001'.           " 实验室 / 办公室 "
  itab-mara_item_cat = 'NORM'.         " 普通项目组类别 "
  itab-mara_net_weight = 2.            " 净重 "
*  itab-mara_normt = ''.               " 行业标准描述 "
  itab-mara_size_dim = '2*3'.          " 大小 / 量纲 "
  itab-t_marm_gross_wt = 22 / 10.      " 毛重 "
  itab-mara_unit_of_wt = 'KG'.         " 重量单位 "
  itab-t_makt_matl_desc = '10W40 MOTOR OIL CASE test'.  " 物料描述 "
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = itab-head_material
    IMPORTING
      output = itab-head_material.
  lv_matnr = itab-head_material.
  TRANSLATE lv_matnr TO UPPER CASE.
  itab-head_material = lv_matnr.
  APPEND itab.
ENDFORM.                    " PREPARE_DATA "
*&---------------------------------------------------------------------*
*&      Form  EXCUTE_BAPI
*&---------------------------------------------------------------------*
FORM excute_bapi .
  LOOP AT itab.
    CLEAR: gs_bapimathead,gs_bapi_mara,gs_bapi_marax,gs_bapi_marc,
    gs_bapi_marcx,gs_bapi_mbew,gs_bapi_mbewx,gs_return.
    CLEAR: gt_bapi_makt,gt_bapi_marm,gt_bapi_marmx,gt_bapi_mlan,gt_return1.
    REFRESH:gt_bapi_makt,gt_bapi_marm,gt_bapi_marmx,gt_bapi_mlan,gt_return1.
    " 表头控制数据 "
    gs_bapimathead-material   = itab-head_material.  " 物料编码 "
    gs_bapimathead-matl_type  = itab-head_matl_type. " 物料类型 "
    gs_bapimathead-ind_sector = itab-head_ind_sector." 行业领域 "
    gs_bapimathead-basic_view = 'X'.      " 基本数据视图 "
    gs_bapimathead-purchase_view = 'X'.   " 采购视图 "
    gs_bapimathead-mrp_view = 'X'.        " MRP数据视图 "
*   gs_bapimathead-work_sched_view = 'X'. " 工作计划 "
*   gs_bapimathead-quality_view    = 'X'. " 质量管理视图 "
*   gs_bapimathead-storage_view    = 'X'. " 工厂存储 "
*   gs_bapimathead-sales_view      = 'X'. " 销售 "
*   gs_bapimathead-account_view    = 'X'. " 会计 "
*   gs_bapimathead-cost_view       = 'X'. " 成本 "
    CLEAR: pr_unit,pr_unit2.
    PERFORM frm_unit USING itab-mara_base_uom CHANGING pr_unit.    " 基本单位 "
    PERFORM frm_unit USING itab-mara_unit_of_wt CHANGING pr_unit2. " 重量单位 "
    " 基本数据视图数据 "
    gs_bapi_mara-base_uom = pr_unit.                 " 基本计量单位 "
    gs_bapi_mara-matl_group = itab-mara_matl_group.  " 物料组 "
    gs_bapi_mara-old_mat_no = itab-t_old_mat_no.     " 型号 "
    gs_bapi_mara-division = itab-mara_division.      " 产品组 "
    gs_bapi_mara-dsn_office = itab-t_dsn_office.     " 实验室 / 办公室 "
    gs_bapi_mara-item_cat = itab-mara_item_cat.      " 普通项目组类别 "
    gs_bapi_mara-unit_of_wt = pr_unit2.              " 重量单位 "
    gs_bapi_mara-net_weight = itab-mara_net_weight.  " 净重 "
    gs_bapi_mara-size_dim = itab-mara_size_dim.      " 大小 / 量纲 "
    gs_bapi_marax-base_uom = 'X'.
    gs_bapi_marax-matl_group = 'X'.
    gs_bapi_marax-old_mat_no = 'X'.
    gs_bapi_marax-division = 'X'.
    gs_bapi_marax-dsn_office = 'X'.
    gs_bapi_marax-item_cat = 'X'.
    gs_bapi_marax-unit_of_wt = 'X'.
    gs_bapi_marax-net_weight = 'X'.
    gs_bapi_marax-size_dim = 'X'.
    " 计量单位 "
    gt_bapi_marm-alt_unit = pr_unit.    " 替换单位 (必须为基本计量单位,否则会报错:没有转换因子) "
    gt_bapi_marm-numerator = 1.         " 分子 "
    gt_bapi_marm-denominatr = 1.        " 分母 "
    gt_bapi_marm-gross_wt = itab-t_marm_gross_wt. " 毛重 "
    gt_bapi_marm-unit_of_wt = pr_unit2. " 填充毛重时,注意此处需要添加重量单位,否则会提示没有指定单位 "
    APPEND gt_bapi_marm.
    CLEAR gt_bapi_marmx.
    gt_bapi_marmx-alt_unit = pr_unit.   " 注意此处不是填充 'X' "
    gt_bapi_marmx-numerator = 'X'.
    gt_bapi_marmx-denominatr = 'X'.
    gt_bapi_marmx-gross_wt = 'X'.
    gt_bapi_marmx-unit_of_wt = 'X'.     " 此处填充 'X' "
    IF gt_bapi_marmx-alt_unit IS NOT INITIAL AND gt_bapi_marmx-numerator IS NOT INITIAL
    AND gt_bapi_marmx-denominatr IS NOT INITIAL.
      APPEND gt_bapi_marmx.
    ENDIF.
    " 物料描述 "
    gt_bapi_makt-langu_iso = 'EN'.
    gt_bapi_makt-matl_desc = itab-t_makt_matl_desc.
    APPEND gt_bapi_makt.
    " 维护增强字段 "
    gs_bapi_te_mara-material   = itab-head_material.
    gs_bapi_te_mara-zz_model   = itab-zz_model.
    gs_bapi_te_mara-zz_drawing = itab-zz_drawing.
    gs_bapi_te_mara-zz_color   = itab-zz_color.
    l_valuepart = gs_bapi_te_mara.
    gt_extensionin-structure = 'BAPI_TE_MARA'.
    gt_extensionin-valuepart1 = l_valuepart+0(240).
    gt_extensionin-valuepart2 = l_valuepart+240(240).
    gt_extensionin-valuepart3 = l_valuepart+480(240).
    APPEND gt_extensionin.
    gs_bapi_te_marax-material  = itab-matnr.
    gs_bapi_te_marax-zz_model  = 'X'.
    gs_bapi_te_marax-zz_drawing_no = 'X'.
    gs_bapi_te_marax-zz_color = 'X'.
    l_valuepartx = gs_bapi_te_marax.
    gt_extensioninx-structure = 'BAPI_TE_MARAX'.
    gt_extensioninx-valuepart1 = l_valuepartx+0(240).
    gt_extensioninx-valuepart2 = l_valuepartx+240(240).
    gt_extensioninx-valuepart3 = l_valuepartx+480(240).
    APPEND gt_extensioninx.
    " CALL BAPI "
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        headdata            = gs_bapimathead
        clientdata          = gs_bapi_mara
        clientdatax         = gs_bapi_marax
      IMPORTING
        return              = gs_return
      TABLES
        materialdescription = gt_bapi_makt[]
        unitsofmeasure      = gt_bapi_marm[]
        unitsofmeasurex     = gt_bapi_marmx[]
        returnmessages      = gt_return1[].
    IF gs_return-type NE 'E'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.
  ENDLOOP.
  WRITE : gs_return-type,gs_return-message.
ENDFORM.                    " EXCUTE_BAPI "
*&---------------------------------------------------------------------*
*&      Form  frm_unit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->UNIT1      text
*      -->UNIT2      text
*----------------------------------------------------------------------*
FORM frm_unit USING unit1 CHANGING unit2.
  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      input          = unit1
      language       = sy-langu
    IMPORTING
      output         = unit2
    EXCEPTIONS
      unit_not_found = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
*   message id sy-msgid type sy-msgty number sy-msgno
*           with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    "FRM_UNIT"