ABAP:MM01创建/更新物料主数据BAPI

发布时间 2023-09-11 09:47:41作者: 阿胖的阿多

BAPI:BAPI_MATERIAL_SAVEDATA

*&---------------------------------------------------------------------*
*& Report  ZMMU001
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Remark:期初物料主数据批量导入
*&---------------------------------------------------------------------*
*& Change Record:
*& Date         Developer           ReqNo       Descriptions
*& ==========  ==================  ==========  ========================*
*& 2020.10.09   JT-WUW             S4DK900125   初始开发
*&---------------------------------------------------------------------*
REPORT zmmu001.

TABLES: sscrfields, marc, mara.

TYPES: BEGIN OF ty_alv,
*&---------------------------------------------------------------------*
*& 创建界面
*&---------------------------------------------------------------------*
*         MBRSH     TYPE MARA-MBRSH,   "行业领域
*         ztywl      TYPE  char10,       "同一物料
         mtart        TYPE  mara-mtart,   "物料类型

*&---------------------------------------------------------------------*
*& 工厂
*&---------------------------------------------------------------------*
         werks        TYPE  marc-werks,   "工厂

*&---------------------------------------------------------------------*
*& 基本视图1
*&---------------------------------------------------------------------*
         matnr        TYPE  mara-matnr,   "物料号
         maktx        TYPE  makt-maktx,   "物料描述
*         zltxt      TYPE  char200,      "长物料
         zeinr        TYPE  mara-zeinr,   "图号
         meins        TYPE  mara-meins,   "基本计量单位
         matkl        TYPE  mara-matkl,   "物料组
*         mstae      TYPE  mara-mstae,   "跨工厂物料状态
         bismt        TYPE  mara-bismt,   "旧物料号
         groes        TYPE  mara-groes,   "大小量纲
         brgew        TYPE  char17,       "毛重
         ntgew        TYPE  char17,       "净重
         gewei        TYPE  mara-gewei,   "重量单位




*&---------------------------------------------------------------------*
*& 基本视图2
*&---------------------------------------------------------------------*
         normt        TYPE  mara-normt,   "内部订单
         ferth        TYPE  mara-ferth,   "模穴
         msbookpartno TYPE  mara-msbookpartno,  "产品系列
         zspras       TYPE  langu_iso,   "语言代码
         zltxt        TYPE  char300,      "长描述

*&---------------------------------------------------------------------*
*& 分类视图
*&---------------------------------------------------------------------*
         klart        TYPE klah-klart,       "分类类型
         class        TYPE klah-class,       "分类编号

*&---------------------------------------------------------------------*
*& 销售1
*&---------------------------------------------------------------------*
         vkorg        TYPE mvke-vkorg,       "销售组织
         vtweg        TYPE mvke-vtweg,       "分销渠道
         spart        TYPE mara-spart,       "产品组
*         vrkme      TYPE mvke-vrkme,       "销售单位
*         umren      TYPE char05,           "订单单位分母
*         umrez      TYPE char05,           "订单单位分子
         dwerk        TYPE mvke-dwerk,       "交货工厂
         taxm1        TYPE mlan-taxm1,       "税分类
*         tatyp  TYPE tstl-lfdnr,       "各国家可能的征税顺序

*&---------------------------------------------------------------------*
*& 销售2
*&---------------------------------------------------------------------*
         ktgrm        TYPE mvke-ktgrm,       "科目设置组
         mtpos_mara   TYPE mara-mtpos_mara,  "普通项目类别组
         mtpos        TYPE mvke-mtpos,       "项目类别组

*&---------------------------------------------------------------------*
*& 销售:一般工厂
*&---------------------------------------------------------------------*
         tragr        TYPE mara-tragr,       "运输组
         ladgr        TYPE marc-ladgr,       "装载组
         aland        TYPE mg03steuer-aland, "国家
         vmsta        TYPE mvke-vmsta,       "分销链特定的物料状态
         vmstd        TYPE mvke-vmstd,       "分销链状态的有效起始日期

*&---------------------------------------------------------------------*
*& 采购
*&---------------------------------------------------------------------*
         bstme        TYPE mara-bstme,       "采购单位
         pmren        TYPE char05,           "分母
         pmrez        TYPE char05,           "分子
         vabme        TYPE mara-vabme,       "可变单位
         ekgrp        TYPE marc-ekgrp,       "采购组
*         MMSTA     TYPE MARC-MMSTA,       "特定工厂的物料状态
*         KAUTB     TYPE MARC-KAUTB,       "自动采购订单
*         insmk      TYPE marc-insmk,       "过账到检验库存
         kordb        TYPE marc-kordb,       "标识: 源清单要求

*&---------------------------------------------------------------------*
*& MRP1
*&---------------------------------------------------------------------*
         disgr        TYPE marc-disgr,       "MRP组
*         maabc      TYPE marc-maabc,       "ABC标识
         dismm        TYPE marc-dismm,       "MRP类型
*         minbe      TYPE char17,           "再订货点
         dispo        TYPE marc-dispo,       "MRP控制者
         disls        TYPE marc-disls,       "批量程序
*         bstma      TYPE char17,           "最大批量大小
         bstmi        TYPE char17,           "最小批量大小
*         bstfe      TYPE char17,           "固定批量大小
*         mabst      TYPE char17,           "最大库存水平
         bstrf        TYPE char17,           "舍入值
         berid        TYPE mdma-berid,       "MRP范围
         ausss        TYPE char07,           "装配报废

*&---------------------------------------------------------------------*
*& MRP2
*&---------------------------------------------------------------------*
         beskz        TYPE marc-beskz,       "采购类型
         sobsl        TYPE marc-sobsl,       "特殊采购类型
         rgekz        TYPE marc-rgekz,       "反冲
         lgpro        TYPE marc-lgpro,       "生产仓储地点
         lgfsb        TYPE marc-lgfsb,       "外部采购仓储地点
         plifz        TYPE char03,           "计划交货时间
         dzeit        TYPE char03,           "自制生产时间
         webaz        TYPE char03,           "收货处理时间
*         mrppp      TYPE marc-mrppp,       "计划日历
         fhori        TYPE marc-fhori,       "计划边际码
         eisbe        TYPE char17,           "安全库存
*         SCHGT     TYPE MARC-SCHGT,       "散装物料

*&---------------------------------------------------------------------*
*& MRP3
*&---------------------------------------------------------------------*
*         strgr      TYPE marc-strgr,       "策略组
*         vrmod      TYPE marc-vrmod,       "消耗模式
*         vint1      TYPE char03,           "逆向消耗期间
*         vint2      TYPE char03,           "向前消耗期间
*         miskz      TYPE marc-miskz,       "综合MRP标识
         mtvfp        TYPE marc-mtvfp,       "可用性检查

*&---------------------------------------------------------------------*
*& MRP4
*&---------------------------------------------------------------------*
         sbdkz        TYPE marc-sbdkz,       "独立/集中
         kausf        TYPE marc-kausf,       "部件废品百分数
*         KZAUS     TYPE MARC-KZAUS,       "非连续标识
*         AUSDT     TYPE MARC-AUSDT,       "生效期
*         NFMAT     TYPE MARC-NFMAT,       "后继的物料

*&---------------------------------------------------------------------*
*& 工作计划视图
*&---------------------------------------------------------------------*
*         frtme      TYPE marc-frtme,       "生产单位
*         plren      TYPE char05,           "生产单位分母
*         plrez      TYPE char05,           "生产单位分子
         fevor        TYPE marc-fevor,       "生产管理员
         sfcpf        TYPE marc-sfcpf,       "生成计划参数文件
*         matgr      TYPE marc-matgr,       "物料分组
*         uneto      TYPE char04,           "不足交货容差限制
         ueeto        TYPE char04,           "超量交货容差限制
*         ueetk      TYPE marc-ueetk,       "标识:允许未限制的过量交货
*         bearz      TYPE char07,           "处理时间
*         basmg      TYPE char17,           "基本数量

*&---------------------------------------------------------------------*
*& 工厂数据/存储1
*&---------------------------------------------------------------------*
         loggr        TYPE marc-loggr,       "是否启用条码
         lgort        TYPE mard-lgort,       "库存地点
         ausme        TYPE marc-ausme,       "发货单位
         isren        TYPE char05,           "发货单位分母
         isrez        TYPE char05,           "发货单位分子
*         tempb      TYPE mara-tempb,       "WMS管理
*         raube      TYPE mara-raube,       "ROHS
*         behvo      TYPE mara-behvo,       "HF标识
         xchpf        TYPE marc-xchpf,       "批次管理
*         maxlz      TYPE char05,           "最大存储期间
*         lzeih      TYPE marc-lzeih,       "最大库存期间单位
         mhdrz        TYPE char04,           "最小剩余货架寿命
         mhdhb        TYPE char04,           "总货架寿命
         iprkz        TYPE mara-iprkz,       "期间标识
*         RAUBE     TYPE MARA-RAUBE,       "存储条件
*         LGPBE     TYPE MARD-LGPBE,       "库存仓位

*&---------------------------------------------------------------------*
*& 会计1
*&---------------------------------------------------------------------*
*         bwtty      TYPE mbew-bwtty,       "评估类别
*         bwtar      TYPE mbew-bwtar,       "评估类型
         bklas        TYPE mbew-bklas,       "评估分类
         mlmaa        TYPE mbew-mlmaa,       "ML作业
         mlast        TYPE mbew-mlast,       "价格确定
         stprs        TYPE char17,           "标准价格
         peinh        TYPE char05,           "价格单位
         vprsv        TYPE mbew-vprsv,       "价格控制

*&---------------------------------------------------------------------*
*& 成本1
*&---------------------------------------------------------------------*
         ekalr        TYPE mbew-ekalr,       "用QS的成本估算
         hkmat        TYPE mbew-hkmat,       "物料来源
         hrkft        TYPE mbew-hrkft,       "原始组
         kosgr        TYPE mbew-kosgr,       "间接费分组
*         awsls      TYPE marc-awsls,       "差异码
         prctr        TYPE marc-prctr,       "利润中心
         losgr        TYPE char17,           "成本核算批量
         mmstd        TYPE marc-mmstd,       "有效起始日期
         mmsta        TYPE marc-mmsta,       "工厂特定物料状态
         ncost        TYPE marc-ncost,       "不计算成本
         sobsk        TYPE marc-sobsk,       "特殊采购成本核算
*         kzkup      TYPE marc-kzkup,       "联产品
*         fxpru      TYPE marc-fxpru,       "固定价格


*&---------------------------------------------------------------------*
*& 成本2
*&---------------------------------------------------------------------*
         zplp1        TYPE char17,           "计划价格1
         zpld1        TYPE mbew-zpld1,       "计划价格日期1

*&---------------------------------------------------------------------*
*& 质检视图
*&---------------------------------------------------------------------*
         art          TYPE char20,           "检验类型
         apa          TYPE qmat-apa,         "首选检验
         aktiv        TYPE qmat-aktiv,       "活动
         qmpur        TYPE mara-qmpur,       "QM采购激活
         ssqss        TYPE marc-ssqss,       "QM控制码
         prfrq        TYPE char07,           "检验间隔

*&---------------------------------------------------------------------*
*& 仓库视图
*&---------------------------------------------------------------------*
         lgnum        TYPE mlgt-lgnum,       "仓库号
         lgtyp        TYPE mlgt-lgtyp,       "存储类型
         lgpla        TYPE mlgt-lgpla,       "仓位
         ltkza        TYPE mlgn-ltkza,       "库存出库
         ltkze        TYPE mlgn-ltkze,       "上架
         lgbkz        TYPE mlgn-lgbkz,       "仓储区标识
         plkpt        TYPE mlgn-plkpt,       "领货存储类型
*&---------------------------------------------------------------------*
*& 模板不传 默认
*&---------------------------------------------------------------------*
         spras        TYPE makt-spras,
*&---------------------------------------------------------------------*
*& ALV默认结构
*&---------------------------------------------------------------------*
         zbox         TYPE char01,           "选择框
         zcheck       TYPE char01,           "侧边栏
         zmask        TYPE char01,           "遮罩层
         style        TYPE lvc_t_styl,       "STYLE参数
         light        TYPE icon_d,           "指示灯
         msg          TYPE char200,          "消息
       END OF ty_alv.

DATA: ls_alv TYPE ty_alv,
      lt_alv TYPE TABLE OF ty_alv.

FIELD-SYMBOLS: <fs_alv> TYPE ty_alv,
               <field1> TYPE data,
               <field2> TYPE data.

*&----------调用BAPI参数定义--------(S)
DATA: ls_headdata       TYPE bapimathead,
      ls_mara           TYPE bapi_mara,
      ls_marax          TYPE bapi_marax,
      ls_marc           TYPE bapi_marc,
      ls_marcx          TYPE bapi_marcx,
      ls_mpop           TYPE bapi_mpop,
      ls_mpopx          TYPE bapi_mpopx,
      ls_mpgd           TYPE bapi_mpgd,
      ls_mpgdx          TYPE bapi_mpgdx,
      ls_mard           TYPE bapi_mard,
      ls_mardx          TYPE bapi_mardx,
      ls_mlgn           TYPE bapi_mlgn,
      ls_mlgnx          TYPE bapi_mlgnx,
      ls_mvke           TYPE bapi_mvke,
      ls_mvkex          TYPE bapi_mvkex,
      ls_mlgt           TYPE bapi_mlgt,
      ls_mlgtx          TYPE bapi_mlgtx,
      ls_mbew           TYPE bapi_mbew,
      ls_mbewx          TYPE bapi_mbewx,
      lt_return         TYPE STANDARD TABLE OF bapiret2,
      ls_return         LIKE LINE  OF lt_return,
      lt_makt           TYPE TABLE OF bapi_makt   WITH HEADER LINE,
      lt_mlan           TYPE TABLE OF bapi_mlan   WITH HEADER LINE,
      lt_mltx           TYPE TABLE OF bapi_mltx   WITH HEADER LINE,
      lt_returnmessages TYPE TABLE OF bapi_matreturn2,
      lt_marm           TYPE TABLE OF bapi_marm   WITH HEADER LINE,
      lt_marmx          TYPE TABLE OF bapi_marmx  WITH HEADER LINE,
      lt_mean           TYPE TABLE OF bapi_mean   WITH HEADER LINE,
      lt_extensionin    TYPE TABLE OF bapiparex   WITH HEADER LINE,
      lt_extensioninx   TYPE TABLE OF bapiparexx  WITH HEADER LINE.

DATA: it_fieldcat TYPE lvc_t_fcat,
      wa_layout   TYPE lvc_s_layo.
DATA: wa_fieldcat TYPE lvc_s_fcat,
      gv_field1   TYPE char50,
      gv_field2   TYPE char50,
      gv_line     TYPE i.

DATA: functxt       TYPE smp_dyntxt,
      c_icon_red    TYPE icon_d VALUE '@0A@',
      c_icon_green  TYPE icon_d VALUE '@08@',
      c_icon_yellow TYPE icon_d VALUE '@09@'.
*&---------------------------------------------------------------------*
*&      定义宏
*&---------------------------------------------------------------------*
DEFINE  macro_fill_fcat.
  CLEAR wa_fieldcat.
  &1 = &1 + 1.
  wa_fieldcat-col_pos       = &1.
  wa_fieldcat-fieldname     = &2.
  wa_fieldcat-ref_table     = &3.
  wa_fieldcat-ref_field     = &4.   " 内表中数量参照字段
  wa_fieldcat-coltext       = &5.
  APPEND wa_fieldcat TO it_fieldcat.
END-OF-DEFINITION.

DEFINE macro_fill_bapi.
  gv_field2 = gv_field1 && '-' && &2.
  CONDENSE gv_field2 NO-GAPS.
  ASSIGN (gv_field2) TO <field1>.

  gv_field2 = gv_field1 && 'X' && '-' && &2.
  CONDENSE gv_field2 NO-GAPS.
  ASSIGN (gv_field2) TO <field2>.

  IF &1 IS NOT INITIAL.
    IF &1 <> '#'.
      <field1> = &1.
    ENDIF.
    <field2> = abap_true.
  ENDIF.
  UNASSIGN: <field1>, <field2>.
END-OF-DEFINITION.

DEFINE macro_fill_zfield.
  IF &1 IS INITIAL.
    &1 = &2.
  ELSEIF &1 = '#'.
    CLEAR: &1.
  ENDIF.
END-OF-DEFINITION.

SELECTION-SCREEN: FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_file  LIKE rlgrap-filename MODIF ID mi1.
SELECTION-SCREEN END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE TEXT-002.
  PARAMETERS: p_a AS CHECKBOX DEFAULT 'X',
              p_b AS CHECKBOX DEFAULT 'X',
              p_c AS CHECKBOX DEFAULT 'X',
              p_d AS CHECKBOX DEFAULT 'X',
              p_e AS CHECKBOX DEFAULT 'X',
              p_f AS CHECKBOX DEFAULT 'X',
              p_g AS CHECKBOX DEFAULT 'X',
              p_h AS CHECKBOX DEFAULT 'X',
              p_i AS CHECKBOX DEFAULT 'X',
              p_j AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK blk2.

*&---------------------------------------------------------------------*
*&      INITIALIZATION.
*&---------------------------------------------------------------------*
INITIALIZATION.
  functxt-icon_id = icon_export.
  functxt-quickinfo = '模板下载'.
  functxt-icon_text = '模板下载'.
  sscrfields-functxt_01 = functxt.
*&---------------------------------------------------------------------*
*&      AT SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_init_screen.

*&---------------------------------------------------------------------*
*& 选择屏幕控制
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_select_file.

*&---------------------------------------------------------------------*
*&      AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  IF sy-ucomm = 'FC01'.
    PERFORM frm_download_template.
  ENDIF.
*&---------------------------------------------------------------------*
*&      START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*  PERFORM frm_check_screen.

  PERFORM frm_get_upload.

  PERFORM frm_init_layout.
  PERFORM frm_init_fieldcat.
  PERFORM frm_display_alv.

*&---------------------------------------------------------------------*
*&      END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_screen .

ENDFORM.                    " FRM_CHECK_SCREEN

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
*       设置ALV输出格式
*----------------------------------------------------------------------*
FORM frm_init_layout .
  CLEAR wa_layout.
  wa_layout-box_fname         = 'ZCHECK'. "侧边栏
  wa_layout-zebra             = 'X'.      "斑马线
  wa_layout-cwidth_opt        = 'X'.      "自动调整宽度
  wa_layout-stylefname        = 'STYLE'.  "样式参数
ENDFORM.                    "FRM_INIT_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_FIELDCAT
*&---------------------------------------------------------------------*
*       设置输出屏幕的ALV输出字段
*----------------------------------------------------------------------*
FORM frm_init_fieldcat.

  DATA: l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.

  FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat.

  CLEAR it_fieldcat.

  macro_fill_fcat:
    l_colpos 'LIGHT'     ''     ''           '指示灯',
    l_colpos 'MSG'       ''     ''           '消息',
    l_colpos 'MTART'     'MARA' 'MTART'      '物料类型',
    l_colpos 'WERKS'     'MARC' 'WERKS'      '工厂',
    l_colpos 'MATNR'     'MARA' 'MATNR'      '物料号',
    l_colpos 'MAKTX'     'MAKT' 'MAKTX'      '物料描述',
    l_colpos 'ZEINR'     'MARA' 'ZEINR'      '图号',
    l_colpos 'MEINS'     'MARA' 'MEINS'      '基本计量单位',
    l_colpos 'MATKL'     'MARA' 'MATKL'      '物料组',
*    l_colpos 'MSTAE'     'MARA' 'MSTAE'      '跨工厂物料状态',
    l_colpos 'BISMT'     'MARA' 'MATNR'      '旧物料号',
    l_colpos 'GROES'     'MARA' 'GROES'      '大小量纲',
    l_colpos 'BRGEW'     ''     ''           '毛重',
    l_colpos 'NTGEW'     ''     ''           '净重',
    l_colpos 'GEWEI'     'MARA' 'GEWEI'      '重量单位',
    l_colpos 'NORMT'     'MARA' 'NORMT'      '内部订单',
    l_colpos 'FERTH'     'MARA' 'FERTH'      '模穴',
    l_colpos 'MSBOOKPARTNO' 'MARA' 'MSBOOKPARTNO' '产品系列',
    l_colpos 'SPRAS'     'MAKT' 'SPRAS'      '语言代码',
    l_colpos 'ZLTXT'     ''     ''           '物料长描述',

    l_colpos 'KLART'     'KLAH' 'KLART'      '分类类型',
    l_colpos 'CLASS'     'KLAH' 'CLASS'      '分类编号',

    l_colpos 'VKORG'     'MVKE' 'VKORG'      '销售组织',
    l_colpos 'VTWEG'     'MVKE' 'VTWEG'      '分销渠道',
    l_colpos 'SPART'     'MARA' 'SPART'      '产品组',
*    l_colpos 'VRKME'     'MVKE' 'VRKME'      '销售单位',
*    l_colpos 'PMREN'     ''     ''           '销售单位分母',
*    l_colpos 'PMREZ'     ''     ''           '销售单位分子',
    l_colpos 'DWERK'     'MVKE' 'DWERK'      '交货工厂',
    l_colpos 'TAXM1'     'MLAN' 'TAXM1'      '税分类',
    l_colpos 'KTGRM'     'MVKE' 'KTGRM'      '科目设置组',
    l_colpos 'MTPOS_MARA' 'MARA' 'MTPOS_MARA' '普通项目类别组',
    l_colpos 'MTPOS'     'MVKE' 'MTPOS'      '项目类别组',
    l_colpos 'TRAGR'     'MARA' 'TRAGR'      '运输组',
    l_colpos 'LADGR'     'MARC' 'LADGR'      '装载组',
    l_colpos 'ALAND'     'MG03STEUER' 'ALAND' '国家代码',

    l_colpos 'BSTME'     'MARA' 'BSTME'      '采购单位',
    l_colpos 'PMREN'     ''     ''           '分母',
    l_colpos 'PMREZ'     ''     ''           '分子',
    l_colpos 'VABME'     'MARA' 'VABME'      '可变单位',
    l_colpos 'EKGRP'     'MARC' 'EKGRP'      '采购组',
*    l_colpos 'INSMK'     'MARC' 'INSMK'      '过账到检验库存',
    l_colpos 'KORDB'     'MARC' 'KORDB'      '标识: 源清单要求',

    l_colpos 'DISGR'     'MARC' 'DISGR'      'MRP组',
*    l_colpos 'MAABC'     'MARC' 'MAABC'      'ABC标识',
    l_colpos 'DISMM'     'MARC' 'DISMM'      'MRP类型',
*    l_colpos 'MINBE'     'MARC' 'MINBE'      '再订货点',
    l_colpos 'DISPO'     'MARC' 'DISPO'      'MRP控制者',
    l_colpos 'DISLS'     'MARC' 'DISLS'      '批量程序',
*    l_colpos 'BSTMA'     'MARC' 'BSTMA'      '最大批量大小',
    l_colpos 'BSTMI'     'MARC' 'BSTMI'      '最小批量大小',
*    l_colpos 'BSTFE'     'MARC' 'BSTFE'      '固定批量大小',
*    l_colpos 'MABST'     'MARC' 'MABST'      '最大库存水平',
    l_colpos 'BSTRF'     'MARC' 'BSTRF'      '舍入值',
    l_colpos 'BERID'     'MDMA' 'BERID'      'MRP范围',
    l_colpos 'AUSSS'     'MARC' 'AUSSS'      '装配报废',

    l_colpos 'BESKZ'     'MARC' 'BESKZ'      '采购类型',
    l_colpos 'SOBSL'     'MARC' 'SOBSL'      '特殊采购类型',
    l_colpos 'RGEKZ'     'MARC' 'RGEKZ'      '反冲',
    l_colpos 'LGPRO'     'MARC' 'LGPRO'      '生产仓储地点',
    l_colpos 'LGFSB'     'MARC' 'LGFSB'      '外部采购仓储地点',
    l_colpos 'PLIFZ'     'MARC' 'PLIFZ'      '计划交货时间',
    l_colpos 'DZEIT'     'MARC' 'DZEIT'      '自制生产时间',
    l_colpos 'WEBAZ'     'MARC' 'WEBAZ'      '收货处理时间',
*    l_colpos 'MRPPP'     'MARC' 'MRPPP'      '计划日历',
    l_colpos 'FHORI'     'MARC' 'FHORI'      '计划边际码',
    l_colpos 'EISBE'     'MARC' 'EISBE'      '安全库存',
*    l_colpos 'STRGR'     'MARC' 'STRGR'      '策略组',
*    l_colpos 'VRMOD'     'MARC' 'VRMOD'      '消耗模式',
*    l_colpos 'VINT1'     'MARC' 'VINT1'      '逆向消耗期间',
*    l_colpos 'VINT2'     'MARC' 'VINT2'      '向前消耗期间',

*    l_colpos 'MISKZ'     'MARC' 'MISKZ'      '综合MRP标识',
    l_colpos 'MTVFP'     'MARC' 'MTVFP'      '可用性检查',
    l_colpos 'SBDKZ'     'MARC' 'SBDKZ'      '独立/集中',
    l_colpos 'KAUSF'     'MARC' 'KAUSF'      '部件废品百分数',

*    l_colpos 'FRTME'     'MARC' 'FRTME'      '生产单位',
*    l_colpos 'PLREN'     ''     ''           '生产单位分母',
*    l_colpos 'PLREZ'     ''     ''           '生产单位分子',
    l_colpos 'FEVOR'     'MARC' 'FEVOR'      '生产管理员',
    l_colpos 'SFCPF'     'MARC' 'SFCPF'      '生产计划参数文件',
*    l_colpos 'MATGR'     'MARC' 'MATGR'      '物料分组',
*    l_colpos 'UNETO'     'MARC' 'UNETO'      '不足交货容差限制',
    l_colpos 'UEETO'     'MARC' 'UEETO'      '超量交货容差限制',
*    l_colpos 'UEETK'     'MARC' 'UEETK'      '标识:允许未限制的过量交货',
*    l_colpos 'BEARZ'     'MARC' 'BEARZ'      '处理时间',
*    l_colpos 'BASMG'     'MARC' 'BASMG'      '基本数量',

    l_colpos 'LOGGR'     'MARC' 'LOGGR'      '是否启用条码',
    l_colpos 'LGORT'     'MARD' 'LGORT'      '库存地点',
    l_colpos 'AUSME'     'MARC' 'AUSME'      '发货单位',
    l_colpos 'ISREN'     ''     ''           '发货单位分母',
    l_colpos 'ISREZ'     ''     ''           '发货单位分子',
*    l_colpos 'TEMPB'     'MARA' 'TEMPB'      'WMS管理',
*    l_colpos 'RAUBE'     'MARA' 'RAUBE'      'ROHS',
*    l_colpos 'BEHVO'     'MARA' 'BEHVO'      'HF标识',
    l_colpos 'XCHPF'     'MARC' 'XCHPF'      '批次管理',
*    l_colpos 'MAXLZ'     'MARC' 'MAXLZ'      '最大存储期间',
*    l_colpos 'LZEIH'     'MARC' 'LZEIH'      '最大库存期间单位',
    l_colpos 'MHDRZ'     'MARA' 'MHDRZ'      '最小剩余货架寿命',
    l_colpos 'MHDHB'     'MARA' 'MHDHB'      '总货架寿命',
    l_colpos 'IPRKZ'     'MARA' 'IPRKZ'      '期间标识',

*    l_colpos 'BWTTY'     'MBEW' 'BWTTY'      '评估类别',
*    l_colpos 'BWTAR'     'MBEW' 'BWTAR'      '评估类型',
    l_colpos 'BKLAS'     'MBEW' 'BKLAS'      '评估分类',
    l_colpos 'MLMAA'     'MBEW' 'MLMAA'      'ML作业',
    l_colpos 'MLAST'     'MBEW' 'MLAST'      '价格确定',
    l_colpos 'STPRS'     'MBEW' 'STPRS'      '标准价格',
    l_colpos 'PEINH'     'MBEW' 'PEINH'      '价格单位',
    l_colpos 'VPRSV'     'MBEW' 'VPRSV'      '价格控制',

    l_colpos 'EKALR'     'MBEW' 'EKALR'      '用QS的成本估算',
    l_colpos 'HKMAT'     'MBEW' 'HKMAT'      '物料来源',
    l_colpos 'HRKFT'     'MBEW' 'HRKFT'      '原始组',
    l_colpos 'KOSGR'     'MBEW' 'KOSGR'      '间接费分组',
*    l_colpos 'AWSLS'     'MARC' 'AWSLS'      '差异码',
    l_colpos 'PRCTR'     'MARC' 'PRCTR'      '利润中心',
    l_colpos 'LOSGR'     'MARC' 'LOSGR'      '成本核算批量',
    l_colpos 'MMSTD'     'MARC' 'MMSTD'      '起始日期',
    l_colpos 'MMSTA'     'MARC' 'MMSTA'      '工厂特定物料状态',
    l_colpos 'VMSTA'     'MVKE' 'VMSTA'      '分销链特定的物料状态',
    l_colpos 'VMSTD'     'MVKE' 'VMSTD'      '分销链状态的有效起始日期',
    l_colpos 'NCOST'     'MARC' 'NCOST'      '不计算成本',
    l_colpos 'SOBSK'     'MARC' 'SOBSK'      '特殊采购成本核算',
*    l_colpos 'KZKUP'     'MARC' 'KZKUP'      '联产品',
*    l_colpos 'FXPRU'     'MARC' 'FXPRU'      '固定价格',

    l_colpos 'ZPLP1'     'MBEW' 'ZPLP1'      '计划价格1',
    l_colpos 'ZPLD1'     'MBEW' 'ZPLD1'      '计划价格日期1',

    l_colpos 'ART'       ''     ''           '检验类型',
    l_colpos 'APA'       'QMAT' 'APA'        '首选检验',
    l_colpos 'AKTIV'     'QMAT' 'AKTIV'      '活动',
    l_colpos 'QMPUR'     'MARA' 'QMPUR'      'QM采购激活',
    l_colpos 'SSQSS'     'MARC' 'SSQSS'      'QM控制码',
    l_colpos 'PRFRQ'     'MARC' 'PRFRQ'      '检验间隔',

    l_colpos 'LGNUM'     'MLGT' 'LGNUM'      '仓库号',
    l_colpos 'LGTYP'     'MLGT' 'LGTYP'      '存储类型',
    l_colpos 'LGPLA'     'MLGT' 'LGPLA'      '仓位',
    l_colpos 'LTKZA'     'MLGN' 'LTKZA'      '库存出库',
    l_colpos 'LTZKE'     'MLGN' 'LTZKE'      '上架',
    l_colpos 'LGBKZ'     'MLGN' 'LGBKZ'      '仓储区标识',
    l_colpos 'PLKPT'     'MLGN' 'PLKPT'      '领货存储类型'.

ENDFORM.                    "FRM_INIT_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  frm_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_display_alv.
  DATA: gs_grid_settings TYPE lvc_s_glay.
*  SORT it_alv BY vbeln posnr.

  gs_grid_settings-edt_cll_cb = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF_STATUS'
      i_grid_settings          = gs_grid_settings
      i_callback_user_command  = 'USER_COMMAND'
      is_layout_lvc            = wa_layout
*     IS_VARIANT               = GS_VARIANT
      it_fieldcat_lvc          = it_fieldcat
      i_save                   = 'A'
    TABLES
      t_outtab                 = lt_alv
    EXCEPTIONS
      program_error            = 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_ALV_OUTPUT

*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       设置标准工具栏按钮,并添加一个打印按钮
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  DATA: rs_extab LIKE LINE OF rt_extab.

  gv_line = lines( lt_alv ).

  SET PF-STATUS 'STATUS' EXCLUDING rt_extab.

  SET TITLEBAR 'TITLE' WITH gv_line.
ENDFORM. "SET_PF_STATUS

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       用户指令
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&ZPOST'.
      PERFORM frm_post_data.
    WHEN OTHERS.
  ENDCASE.

  PERFORM frm_refresh_display.
ENDFORM. "FM_USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_download_template .
  DATA: lo_objdata     LIKE wwwdatatab,
        lo_mime        LIKE w3mime,
        lc_filename    TYPE string,
        lc_fullpath    TYPE string VALUE'c:\',
        lc_path        TYPE string VALUE'c:\',
        ls_destination LIKE rlgrap-filename,
        ls_objnam      TYPE string,
        l_rc           LIKE sy-subrc,
        ls_errtxt      TYPE string,
        lv_title       TYPE string.

  DATA:l_objid TYPE wwwdatatab-objid,
       l_dest  LIKE sapb-sappfad.

  " 对象名称
  l_objid     = 'ZMMU001'.
  lc_filename = '物料主数据批导模板'.

  lv_title = '物料主数据批导模板'.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = lv_title
      default_extension    = 'xlsx'
      default_file_name    = lc_filename
*     WITH_ENCODING        =
*     FILE_FILTER          =
*     INITIAL_DIRECTORY    =
*     PROMPT_ON_OVERWRITE  = 'X'
    CHANGING
      filename             = lc_filename
      path                 = lc_path
      fullpath             = lc_fullpath
*     USER_ACTION          =
*     FILE_ENCODING        =
    EXCEPTIONS
      cntl_error           = 0
      error_no_gui         = 0
      not_supported_by_gui = 0
      OTHERS               = 0.

  IF sy-subrc = 0.
    l_dest = lc_fullpath.

    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF lo_objdata
     WHERE srtf2 = 0
      AND relid = 'MI'
      AND objid = l_objid.

    IF sy-subrc <> 0 OR lo_objdata-objid IS INITIAL.
*      请输入有效值: &1
      MESSAGE e004(zca) WITH l_objid.
    ENDIF.

    ls_destination = l_dest.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lo_objdata
        destination = ls_destination
      IMPORTING
        rc          = l_rc.
    IF l_rc <> 0.
*      下载模板失败!
      MESSAGE e005(zca).
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_DOWNLOAD_TEMPLATE

*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_select_file .

*  定义局部变量
  DATA: l_filetab TYPE filetable,
        l_waftab  LIKE LINE OF l_filetab,
        l_rc      TYPE i,
        lv_title  TYPE string.

  lv_title = TEXT-003.

*  调用类方法,打开文件
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = lv_title
*     DEFAULT_EXTENSION       =
*     DEFAULT_FILENAME        =
*     FILE_FILTER             =
*     WITH_ENCODING           =
      initial_directory       = 'C:/'
*     MULTISELECTION          =
    CHANGING
      file_table              = l_filetab
      rc                      = l_rc
*     USER_ACTION             =
*     FILE_ENCODING           =
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

* 打开文件成功
  READ TABLE l_filetab INTO l_waftab INDEX 1.
  p_file = l_waftab-filename.
  CLEAR: l_filetab, l_waftab.

ENDFORM.                    "frm_select_file

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_upload .

  DATA: lt_intern TYPE TABLE OF zalsmex_tabline,
        ls_intern TYPE zalsmex_tabline.

  FIELD-SYMBOLS <fs> TYPE any .
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 6
      i_end_col               = 200
      i_end_row               = 65000
    TABLES
      intern                  = lt_intern
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  IF sy-subrc = 0.
    LOOP AT lt_intern INTO ls_intern.
      ASSIGN COMPONENT ls_intern-col OF STRUCTURE ls_alv TO <fs>.
      IF <fs> IS ASSIGNED.
        <fs> = ls_intern-value.
      ENDIF.
      AT END OF row.
        APPEND ls_alv TO lt_alv.
        CLEAR ls_alv.
      ENDAT.
    ENDLOOP.
  ENDIF.

  IF lt_alv IS INITIAL.
*    未解析到数据,请关闭EXCEL后重试!
    MESSAGE s006(zca) DISPLAY LIKE 'E'.
    STOP.
  ELSE.
*    前导零补充与内外转换
    LOOP AT lt_alv ASSIGNING <fs_alv>.

      CONDENSE <fs_alv>-matnr NO-GAPS.

      PERFORM frm_matn1_input(zpub_f01) IF FOUND CHANGING <fs_alv>-matnr.
      PERFORM frm_matn1_input(zpub_f01) IF FOUND CHANGING <fs_alv>-msbookpartno.
      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-meins.
      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-gewei.
*      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-vrkme.
      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-bstme.
*      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-frtme.
      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-ausme.
      PERFORM frm_alpha_input(zpub_f01) IF FOUND CHANGING <fs_alv>-prctr.
*      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-lzeih.
      PERFORM frm_perkz_input(zpub_f01) IF FOUND CHANGING <fs_alv>-iprkz.
*      PERFORM frm_cunit_input(zpub_f01) IF FOUND CHANGING <fs_alv>-zdldw.

      CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
        EXPORTING
          input            = <fs_alv>-zspras
        IMPORTING
          output           = <fs_alv>-spras
        EXCEPTIONS
          unknown_language = 1
          OTHERS           = 2.

    ENDLOOP.
  ENDIF.

  PERFORM frm_check_input.

ENDFORM.                    " FRM_GET_UPLOAD

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_input.

  SELECT
    matnr,
    mtart
  INTO TABLE @DATA(lt_mara)
  FROM mara
  FOR ALL ENTRIES IN @lt_alv
  WHERE matnr = @lt_alv-matnr.
  SORT lt_mara BY matnr.

  SELECT DISTINCT
    werks,
    matnr
  INTO TABLE @DATA(lt_mseg)
  FROM mseg
  FOR ALL ENTRIES IN @lt_alv
  WHERE matnr = @lt_alv-matnr.
  SORT lt_mseg BY werks matnr.

  LOOP AT lt_alv ASSIGNING <fs_alv>.

    CONDENSE: <fs_alv>-brgew,
              <fs_alv>-ntgew,
*              <fs_alv>-umren,
*              <fs_alv>-umrez,
*              <fs_alv>-bstma,
              <fs_alv>-bstmi,
*              <fs_alv>-bstfe,
*              <fs_alv>-mabst,
              <fs_alv>-bstrf,
              <fs_alv>-ausss,
*              <fs_alv>-vint2,
*              <fs_alv>-vint1,
*              <fs_alv>-uneto,
              <fs_alv>-ueeto,
*              <fs_alv>-maxlz,
              <fs_alv>-mhdrz,
              <fs_alv>-mhdhb,
              <fs_alv>-plifz,
              <fs_alv>-dzeit,
              <fs_alv>-webaz,
              <fs_alv>-eisbe,
              <fs_alv>-losgr,
              <fs_alv>-zplp1,
              <fs_alv>-prfrq.
*              <fs_alv>-zdren,
*              <fs_alv>-zdrez.

    READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_alv>-mtart = ls_mara-mtart.
      <fs_alv>-light = c_icon_yellow.
      <fs_alv>-msg   = '物料已经存在,如果确认确实需要导入,再点击“过账”'.
    ENDIF.

    READ TABLE lt_mseg INTO DATA(ls_mseg) WITH KEY  werks = <fs_alv>-werks
                                                    matnr = <fs_alv>-matnr
                                                    BINARY SEARCH.
    IF sy-subrc = 0 AND <fs_alv>-xchpf IS NOT INITIAL.
      <fs_alv>-light = c_icon_red.
      <fs_alv>-msg   = '已进行货物移动,不允许更改批次管理'.
      CONTINUE.
    ENDIF.

    IF <fs_alv>-mtart = 'Z004' AND p_j IS NOT INITIAL.
      <fs_alv>-light = c_icon_red.
      <fs_alv>-msg   = '物料类型Z004,不允许导入检验数据'.
      CONTINUE.
    ENDIF.

    IF <fs_alv>-prctr IS INITIAL AND p_g IS NOT INITIAL.
      <fs_alv>-light = c_icon_red.
      <fs_alv>-msg   = '扩充财务视图,利润中心必填'.
      CONTINUE.
    ENDIF.

  ENDLOOP.
ENDFORM.                    " FRM_CHECK_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_refresh_display .
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: stbl TYPE lvc_s_stbl.  "稳定刷新
  stbl-row = 'X'." 基于行的稳定刷新
  stbl-col = 'X'." 基于列稳定刷新

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.

*  RS_SELFIELD-REFRESH = 'X'.  "自动刷新,当使用稳定刷新后就不能使用自动刷新了
*  使用排序、过滤器等,定位在当前行、列
  CALL METHOD lr_grid->refresh_table_display
    EXPORTING
      is_stable      = stbl
      i_soft_refresh = 'X'
    EXCEPTIONS
      finished       = 1
      OTHERS         = 2.
ENDFORM.                    " FRM_REFRESH_DISPLAY

*&---------------------------------------------------------------------*
*&      Form  FRM_POST_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_post_data.
  TYPES: BEGIN OF ty_matnr,
           ztywl TYPE char10,
           matnr TYPE mara-matnr,
         END OF ty_matnr.

  DATA: ls_matnr TYPE ty_matnr,
        lt_matnr TYPE TABLE OF ty_matnr.

  DATA: lt_number LIKE TABLE OF bapimatinr,
        ls_number LIKE LINE OF lt_number,
        lv_msg    TYPE string,
        lv_index  TYPE i.

  DATA: ls_te_mara  TYPE bapi_te_mara,
        ls_te_marax TYPE bapi_te_marax.

  READ TABLE lt_alv TRANSPORTING NO FIELDS WITH KEY light = c_icon_red.
  IF sy-subrc = 0.
*    请先处理报错数据!
    MESSAGE i007(zca).
    RETURN.
  ENDIF.

*  BREAK jt-wuw.

  LOOP AT lt_alv ASSIGNING <fs_alv> WHERE zmask = abap_false.

    ADD 1 TO lv_index.

    lv_msg = '导入中...' && lv_index && '/' && gv_line.
    PERFORM frm_show_process(zpub_f01) IF FOUND USING 0 lv_msg.

*  视图选择
    IF p_a = 'X'.
      ls_headdata-basic_view      = 'X'."基本数据视图
    ENDIF.

    IF p_b = 'X'.
      ls_headdata-sales_view      = 'X'."销售视图
    ENDIF.

    IF p_c = 'X' .
      ls_headdata-purchase_view   = 'X'."采购视图
    ENDIF.

    IF p_d = 'X'.
      ls_headdata-mrp_view        = 'X'."MRP视图
    ENDIF.

    IF p_e = 'X' .
      ls_headdata-work_sched_view = 'X'."工作计划视图
    ENDIF.

    IF p_f = 'X'.
      ls_headdata-warehouse_view  = 'X'."仓库管理视图
    ENDIF.

    IF p_g = 'X'.
      ls_headdata-account_view    = 'X'."会计
      ls_headdata-cost_view       = 'X'."成本
    ENDIF.

    IF p_h = 'X'.
      ls_headdata-storage_view = 'X'. "工厂、存储视图
    ENDIF.

    IF p_j = 'X'.
      ls_headdata-quality_view = 'X'. "质量管理视图
    ENDIF.

    ls_headdata-ind_sector      = 'M'.                          "行业领域
    ls_headdata-matl_type       = <fs_alv>-mtart.               "物料类型

*    IF <fs_alv>-matnr IS INITIAL.
*
*      READ TABLE lt_matnr INTO ls_matnr WITH KEY ztywl = <fs_alv>-ztywl.
*      IF sy-subrc = 0.
*        <fs_alv>-matnr = ls_matnr-matnr.
*      ELSE.
*        CLEAR: lt_number[].
*        CALL FUNCTION 'BAPI_MATERIAL_GETINTNUMBER'
*          EXPORTING
*            material_type    = <fs_alv>-mtart
*            required_numbers = 1
*          TABLES
*            material_number  = lt_number.
*
*        READ TABLE lt_number INTO ls_number INDEX 1.
*        IF sy-subrc = 0.
*          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
*
*          <fs_alv>-matnr = ls_number-material.
*          ls_matnr-ztywl = <fs_alv>-ztywl.
*          ls_matnr-matnr = <fs_alv>-matnr.
*          APPEND ls_matnr TO lt_matnr.
*        ENDIF.
*      ENDIF.
*    ENDIF.
    ls_headdata-material        = <fs_alv>-matnr.
    ls_headdata-material_long   = <fs_alv>-matnr.

*    基础视图
    IF p_a IS NOT INITIAL.
      IF <fs_alv>-maktx IS NOT INITIAL .
        lt_makt-langu       = <fs_alv>-spras.
        lt_makt-matl_desc = <fs_alv>-maktx.
        APPEND lt_makt.
      ENDIF.

      gv_field1 = 'LS_MARA'.
      macro_fill_bapi:
        <fs_alv>-meins 'BASE_UOM' ,                   "单位
        <fs_alv>-matkl 'MATL_GROUP',                  "物料组
        <fs_alv>-bismt 'OLD_MAT_NO_LONG',             "旧物料号
*        <fs_alv>-extwg 'EXTMATLGRP',                  "外部物料组
*        <fs_alv>-prdha 'PROD_HIER',                   "销售产品线
*        <fs_alv>-mstae 'PUR_STATUS',                  "跨工厂物料状态
        <fs_alv>-zeinr 'DOCUMENT',                    "图号
        <fs_alv>-groes 'SIZE_DIM',                    "大小量纲
        <fs_alv>-ferth 'PROD_MEMO',                   "模穴
        <fs_alv>-normt 'STD_DESCR',                   "内部订单
*        <fs_alv>-formt 'PAGEFORMAT',                  "最小倍数MOQ
        <fs_alv>-zeinr 'DOCUMENT',                    "图号
        <fs_alv>-ntgew 'NET_WEIGHT',                  "净重
        <fs_alv>-gewei 'UNIT_OF_WT'.                  "重量单位
*        <fs_alv>-brgew ''
    ENDIF.

    ls_marc-plant   = <fs_alv>-werks.
    ls_marcx-plant  = <fs_alv>-werks.

*   销售视图
    IF p_b IS NOT INITIAL.
      ls_mvke-sales_org  = <fs_alv>-vkorg.
      ls_mvke-distr_chan = <fs_alv>-vtweg.

      ls_mvkex-sales_org  = <fs_alv>-vkorg.
      ls_mvkex-distr_chan = <fs_alv>-vtweg.
      gv_field1 = 'LS_MVKE'.
      macro_fill_bapi:
*        <fs_alv>-vrkme 'SALES_UNIT',                  "销售单位
        <fs_alv>-dwerk 'DELYG_PLNT',                  "交货工厂
        <fs_alv>-ktgrm 'ACCT_ASSGT',                  "科目设置组
        <fs_alv>-mtpos 'ITEM_CAT',                    "项目类别
        <fs_alv>-vmsta 'SAL_STATUS',                  "分销链特定的物料状态
        <fs_alv>-vmstd 'VALID_FROM'.                  "分销链状态的有效起始日期

      gv_field1 = 'LS_MARA'.
      macro_fill_bapi:
        <fs_alv>-spart 'DIVISION',                    "产品组
        <fs_alv>-mtpos_mara 'ITEM_CAT',               "普通项目类别组
        <fs_alv>-tragr 'TRANS_GRP'.                   "运输组

      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
        <fs_alv>-ladgr 'LOADINGGRP',                  "装载组
        <fs_alv>-mtvfp 'AVAILCHECK'.                  "可用性检查

*      IF <fs_alv>-vrkme IS NOT INITIAL.
*        READ TABLE lt_marm WITH KEY alt_unit = <fs_alv>-vrkme.
*        IF sy-subrc <> 0.
*          lt_marm-alt_unit    = <fs_alv>-vrkme.
*          lt_marm-numerator   = <fs_alv>-umrez.
*          lt_marm-denominatr  = <fs_alv>-umren.
*          APPEND lt_marm.
*
*          lt_marmx-alt_unit   = <fs_alv>-vrkme.
*          lt_marmx-numerator  = abap_true.
*          lt_marmx-denominatr = abap_true.
*          APPEND lt_marmx.
*        ENDIF.
*      ENDIF.

      lt_mlan-depcountry = <fs_alv>-aland.            "国家
      lt_mlan-tax_type_1 = 'MWST'.                    "税
      lt_mlan-taxclass_1 = <fs_alv>-taxm1.            "税分类
      APPEND lt_mlan.
    ENDIF.

*    采购视图
    IF p_c IS NOT INITIAL.
      gv_field1 = 'LS_MARA'.
      macro_fill_bapi:
        <fs_alv>-bstme 'PO_UNIT',                     "采购单位
        <fs_alv>-vabme 'VAR_ORD_UN'.                  "可变单位

      IF <fs_alv>-bstme IS NOT INITIAL.
        READ TABLE lt_marm WITH KEY alt_unit = <fs_alv>-bstme.
        IF sy-subrc <> 0.
          lt_marm-alt_unit    = <fs_alv>-bstme.
          lt_marm-numerator   = <fs_alv>-pmrez.
          lt_marm-denominatr  = <fs_alv>-pmren.
          APPEND lt_marm.

          lt_marmx-alt_unit   = <fs_alv>-bstme.
          lt_marmx-numerator  = abap_true.
          lt_marmx-denominatr = abap_true.
          APPEND lt_marmx.
        ENDIF.
      ENDIF.

      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
        <fs_alv>-ekgrp 'PUR_GROUP',                   "采购组
*        <fs_alv>-insmk 'IND_POST_TO_INSP_STOCK',      "过账到检验库存
        <fs_alv>-kordb 'SOURCELIST'.                  "启用货源清单

    ENDIF.

*    MRP视图
    IF p_d IS NOT INITIAL.
      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
        <fs_alv>-disgr 'MRP_GROUP',                   "MRP组
*        <fs_alv>-maabc 'ABC_ID',                      "ABC标识
        <fs_alv>-dismm 'MRP_TYPE',                    "MRP类型
*        <fs_alv>-minbe 'REORDER_PT',                  "再订货点
        <fs_alv>-dispo 'MRP_CTRLER',                  "MRP控制者
        <fs_alv>-disls 'LOTSIZEKEY',                  "批量程序
*        <fs_alv>-bstma 'MAXLOTSIZE',                  "最大批量
        <fs_alv>-bstmi 'MINLOTSIZE',                  "最小批量
*        <fs_alv>-bstfe 'FIXED_LOT',                   "固定批量
*        <fs_alv>-mabst 'MAX_STOCK',                   "最大库存
        <fs_alv>-bstrf 'ROUND_VAL',                   "舍入值
        <fs_alv>-ausss 'ASSY_SCRAP',                  "装配报废

        <fs_alv>-beskz 'PROC_TYPE',                   "采购类型
        <fs_alv>-sobsl 'SPPROCTYPE',                  "特殊采购类
        <fs_alv>-rgekz 'BACKFLUSH',                   "反冲
        <fs_alv>-lgpro 'ISS_ST_LOC',                  "生产仓储地点
        <fs_alv>-lgfsb 'SLOC_EXPRC',                  "外部采购仓储地点
        <fs_alv>-plifz 'PLND_DELRY',                  "计划交货时间
        <fs_alv>-dzeit 'INHSEPRODT',                  "自制生产时间
        <fs_alv>-webaz 'GR_PR_TIME',                  "收货处理时间
*        <fs_alv>-mrppp 'PPC_PL_CAL',                  "计划日历
        <fs_alv>-fhori 'SM_KEY',                      "计划边际码
        <fs_alv>-eisbe 'SAFETY_STK',                  "安全库存
*        <fs_alv>-strgr 'PLAN_STRGP',                  "策略组
*        <fs_alv>-vrmod 'CONSUMMODE',                  "消耗模式
*        <fs_alv>-vint2 'FWD_CONS',                    "向前消耗区间
*        <fs_alv>-vint1 'BWD_CONS',                    "逆向消耗区间
*        <fs_alv>-miskz 'MIXED_MRP',                   "综合MRP
        <fs_alv>-mtvfp 'AVAILCHECK',                  "可用性检查
        <fs_alv>-sbdkz 'DEP_REQ_ID',                  "独立/集中
        <fs_alv>-kausf 'COMP_SCRAP'.                  "部件废品百分率
    ENDIF.

*    工作计划视图
    IF p_e IS NOT INITIAL.
      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
*        <fs_alv>-frtme 'PROD_UNIT',                   "生产单位
        <fs_alv>-fevor 'PRODUCTION_SCHEDULER',        "生产管理员
        <fs_alv>-sfcpf 'PRODPROF',                    "生产计划参数文件
*        <fs_alv>-matgr 'MAT_GRP_TRANS',               "物料分组
*        <fs_alv>-uneto 'UNDER_TOL',                   "不足交货允差
        <fs_alv>-ueeto 'OVER_TOL'.                    "过量交货允差
*        <fs_alv>-ueetk 'UNLIMITED',                   "允许过量交货
*        <fs_alv>-bearz 'PROC_TIME',                   "处理时间
*        <fs_alv>-basmg 'BASE_QTY'.                    "基本数量

*      IF <fs_alv>-frtme IS NOT INITIAL.
*        READ TABLE lt_marm WITH KEY alt_unit = <fs_alv>-frtme.
*        IF sy-subrc <> 0.
*          lt_marm-alt_unit    = <fs_alv>-frtme.
*          lt_marm-numerator   = <fs_alv>-plren.
*          lt_marm-denominatr  = <fs_alv>-plrez.
*          APPEND lt_marm.
*
*          lt_marmx-alt_unit   = <fs_alv>-frtme.
*          lt_marmx-numerator  = abap_true.
*          lt_marmx-denominatr = abap_true.
*          APPEND lt_marmx.
*        ENDIF.
*      ENDIF.

    ENDIF.

*    工厂数据/存储视图
    IF p_h IS NOT INITIAL.

      IF <fs_alv>-lgort IS NOT INITIAL.
        ls_mard-plant     = <fs_alv>-werks.           "工厂
        ls_mard-stge_loc  = <fs_alv>-lgort.           "库存地点

        ls_mardx-plant    = <fs_alv>-werks.
        ls_mardx-stge_loc = <fs_alv>-lgort.
      ENDIF.

      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
        <fs_alv>-ausme 'ISSUE_UNIT',                  "生产单位
        <fs_alv>-xchpf 'BATCH_MGMT',                  "批次管理
*        <fs_alv>-maxlz 'STGEPERIOD',                  "最大存储期间
*        <fs_alv>-lzeih 'STGE_PD_UN',                  "最大存储期间时间单位
        <fs_alv>-loggr 'HANDLG_GRP'.                  "是否启用条码

      gv_field1 = 'LS_MARA'.
      macro_fill_bapi:
        <fs_alv>-xchpf 'BATCH_MGMT',                  "批次管理
*        <fs_alv>-tempb 'TEMP_CONDS',                  "WMS管理
*        <fs_alv>-raube 'STOR_CONDS',                  "ROHS
*        <fs_alv>-behvo 'CONTAINER',                   "HF标识
        <fs_alv>-mhdrz 'MINREMLIFE',                  "最小剩余货架寿命
        <fs_alv>-mhdhb 'SHELF_LIFE',                  "总货架寿命
        <fs_alv>-iprkz 'PERIOD_IND_EXPIRATION_DATE'.  "期间标识

      IF <fs_alv>-ausme IS NOT INITIAL.
        READ TABLE lt_marm WITH KEY alt_unit = <fs_alv>-ausme.
        IF sy-subrc <> 0.
          lt_marm-alt_unit    = <fs_alv>-ausme.
          lt_marm-numerator   = <fs_alv>-isren.
          lt_marm-denominatr  = <fs_alv>-isrez.
          APPEND lt_marm.

          lt_marmx-alt_unit   = <fs_alv>-ausme.
          lt_marmx-numerator  = abap_true.
          lt_marmx-denominatr = abap_true.
          APPEND lt_marmx.
        ENDIF.
      ENDIF.

    ENDIF.

*    会计/成本视图
    IF p_g IS NOT INITIAL.
      ls_mbew-val_area = <fs_alv>-werks.
*      ls_mbew-val_type = <fs_alv>-bwtar.

      ls_mbewx-val_area = <fs_alv>-werks.
*      ls_mbewx-val_type = <fs_alv>-bwtar.
      gv_field1 = 'LS_MBEW'.
      macro_fill_bapi:
*        <fs_alv>-bwtty 'VAL_CAT',                     "评估类别
*        <fs_alv>-bwtar 'VAL_TYPE',                    "评估类型
        <fs_alv>-bklas 'VAL_CLASS',                   "评估类
        <fs_alv>-mlmaa 'ML_ACTIVE',                   "ML作业
        <fs_alv>-mlast 'ML_SETTLE',                   "价格确定
        <fs_alv>-stprs 'STD_PRICE',                   "标准价格
        <fs_alv>-peinh 'PRICE_UNIT',                  "价格单位
        <fs_alv>-vprsv 'PRICE_CTRL',                  "价格控制
        <fs_alv>-ekalr 'QTY_STRUCT',                  "用QS的成本估算
        <fs_alv>-hkmat 'ORIG_MAT',                    "物料来源
        <fs_alv>-hrkft 'ORIG_GROUP',                  "原始组
         <fs_alv>-kosgr 'OVERHEAD_GRP',                "间接费分组
         <fs_alv>-zplp1 'PLNDPRICE1',                  "计划价格1
         <fs_alv>-zpld1 'PLNDPRDATE1'.                 "计划价格生效日期

      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
*        <fs_alv>-awsls 'VARIANCE_KEY',                "差异码
        <fs_alv>-prctr 'PROFIT_CTR',                  "利润中心
        <fs_alv>-losgr 'LOT_SIZE',                    "成本核算批量
        <fs_alv>-mmstd 'PVALIDFROM',                  "起始日期
        <fs_alv>-mmsta 'PUR_STATUS',                  "工厂特定物料状态
        <fs_alv>-ncost 'NO_COSTING',                  "无成本核算
        <fs_alv>-sobsk 'SPECPROCTY'.                  "特殊采购成本核算
*        <fs_alv>-kzkup 'CO_PRODUCT',                  "联产品
*        <fs_alv>-fxpru 'FXD_PRICE'.                   "固定价格
    ENDIF.

*    质检视图
    IF p_j IS NOT INITIAL.
      gv_field1 = 'LS_MARA'.
      macro_fill_bapi:
        <fs_alv>-qmpur 'QM_PROCMNT'.                 "QM采购激活

      gv_field1 = 'LS_MARC'.
      macro_fill_bapi:
        <fs_alv>-ssqss 'CTRL_KEY',                   "QM控制码
        <fs_alv>-prfrq 'INSP_INT'.                   "检验间隔
    ENDIF.

*    仓库视图
    IF p_f IS NOT INITIAL.
      ls_mlgt-whse_no     = <fs_alv>-lgnum.          "仓库号
      ls_mlgt-stge_type   = <fs_alv>-lgtyp.          "仓储类型

      ls_mlgtx-whse_no    = <fs_alv>-lgnum.
      ls_mlgtx-stge_type  = <fs_alv>-lgtyp.

      gv_field1 = 'LS_MLGT'.
      macro_fill_bapi:
        <fs_alv>-lgpla 'STGE_BIN'.                   "仓位

      ls_mlgn-whse_no     = <fs_alv>-lgnum.

      ls_mlgnx-whse_no     = <fs_alv>-lgnum.

      gv_field1 = 'LS_MLGN'.
      macro_fill_bapi:
        <fs_alv>-ltkza 'WITHDRAWAL',                 "库存出库
        <fs_alv>-ltkze 'PLACEMENT',                  "上架
        <fs_alv>-lgbkz 'STGESECTOR',                 "存储区标识
        <fs_alv>-plkpt 'STGE_TYPE'.                  "领货存储类型
    ENDIF.

    IF p_a IS NOT INITIAL.
*    增强字段

      IF <fs_alv>-brgew IS NOT INITIAL.
        ls_te_mara-material       = <fs_alv>-matnr.
        ls_te_mara-brgew          = <fs_alv>-brgew.

        ls_te_marax-material      = <fs_alv>-matnr.
        ls_te_marax-brgew         = abap_true.
      ENDIF.

      IF <fs_alv>-msbookpartno IS NOT INITIAL.
        ls_te_mara-material       = <fs_alv>-matnr.
        ls_te_mara-msbookpartno   = <fs_alv>-msbookpartno.

        ls_te_marax-material      = <fs_alv>-matnr.
        ls_te_marax-msbookpartno  = abap_true.
      ENDIF.

      IF <fs_alv>-brgew IS NOT INITIAL OR <fs_alv>-msbookpartno IS NOT INITIAL.
        lt_extensionin-structure  = 'BAPI_TE_MARA'.
        lt_extensionin-valuepart1 = ls_te_mara.
        APPEND lt_extensionin.
        CLEAR lt_extensionin.

        lt_extensioninx-structure  = 'BAPI_TE_MARAX'.
        lt_extensioninx-valuepart1 = ls_te_marax.
        APPEND lt_extensioninx.
        CLEAR lt_extensioninx.
      ENDIF.

    ENDIF.

*    BREAK JT-WUW.
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        headdata             = ls_headdata
        clientdata           = ls_mara
        clientdatax          = ls_marax
        plantdata            = ls_marc
        plantdatax           = ls_marcx
        storagelocationdata  = ls_mard
        storagelocationdatax = ls_mardx
        valuationdata        = ls_mbew
        valuationdatax       = ls_mbewx
        warehousenumberdata  = ls_mlgn
        warehousenumberdatax = ls_mlgnx
        salesdata            = ls_mvke
        salesdatax           = ls_mvkex
        storagetypedata      = ls_mlgt
        storagetypedatax     = ls_mlgtx
      IMPORTING
        return               = ls_return
      TABLES
        materialdescription  = lt_makt
        unitsofmeasure       = lt_marm
        unitsofmeasurex      = lt_marmx
*       MATERIALLONGTEXT     = LT_MLTX
        taxclassifications   = lt_mlan
        returnmessages       = lt_returnmessages
        extensionin          = lt_extensionin
        extensioninx         = lt_extensioninx.

    IF ls_return-id = 'MM' AND ls_return-number = '356'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.

      <fs_alv>-light = c_icon_green.
      <fs_alv>-msg = ls_return-message.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LOOP AT lt_returnmessages INTO DATA(ls_returnmessages) WHERE type = 'E'.
        <fs_alv>-light = c_icon_red.
        <fs_alv>-msg = ls_return-message.
      ENDLOOP.
      RETURN.
    ENDIF.

    IF <fs_alv>-light = c_icon_green.
      DO 20 TIMES.
        SELECT COUNT(*)
        FROM mara
        WHERE matnr = <fs_alv>-matnr.
        IF sy-subrc = 0.
          IF <fs_alv>-class IS NOT INITIAL AND p_i IS NOT INITIAL. "分类视图
            PERFORM frm_objcl_create.
          ENDIF.

          PERFORM frm_update_mara.

*          质量视图
          IF <fs_alv>-art IS NOT INITIAL AND p_j IS NOT INITIAL.
            PERFORM frm_insptype_create.
          ENDIF.

*       存长文本
          IF <fs_alv>-zltxt IS NOT INITIAL.
            DATA: lv_name  TYPE thead-tdname,
                  lv_langu TYPE makt-spras.
            EXPORT lv_langu TO MEMORY ID 'ZMM_LANGU'.
            lv_name = <fs_alv>-matnr.
            PERFORM frm_save_text(zpub_f01) IF FOUND USING 'GRUN' lv_name 'MATERIAL' space <fs_alv>-zltxt.
          ENDIF.

*          创建MRP范围
          IF <fs_alv>-berid IS NOT INITIAL.
            PERFORM frm_create_mrp.
          ENDIF.

*          MR21创建集团价格
          IF <fs_alv>-peinh > 1.
            PERFORM frm_create_mr21.
          ENDIF.

          EXIT.
        ELSE.
          WAIT UP TO '0.1' SECONDS.
        ENDIF.

      ENDDO.
    ENDIF.

    CLEAR: ls_headdata,       ls_mara,              ls_marax,
           ls_marc,           ls_marcx,             ls_mard,
           ls_mardx,          ls_mbew,              ls_mbewx,
           ls_mvke,           ls_mvkex,             ls_return,
           lt_makt[],         lt_marm[],            lt_marmx[],
           lt_mlan[],         lt_returnmessages,    lt_extensionin[],
           lt_extensioninx[], ls_mlgn,              ls_mlgnx,
           ls_mlgt,           ls_mlgtx,             ls_te_mara,
           ls_te_marax.

    IF <fs_alv>-light = c_icon_red.
      RETURN.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_POST_DATA

*&---------------------------------------------------------------------*
*& Form frm_objcl_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_objcl_create.

  DATA : ls_return       TYPE bapireturn1,
         lt_return       TYPE TABLE OF bapiret2,
         wa_return       TYPE bapiret2,
         lv_objectkey    TYPE objnum,
         lt_class        TYPE TABLE OF bapi1003_alloc_values_char,
         wa_class        TYPE bapi1003_alloc_values_char,
         lv_line         TYPE i,
         allocvaluesnum  TYPE  TABLE OF  bapi1003_alloc_values_num,
         allocvaluescurr TYPE TABLE OF   bapi1003_alloc_values_curr.


  lv_objectkey = <fs_alv>-matnr.

  CALL FUNCTION 'BAPI_OBJCL_EXISTENCECHECK'
    EXPORTING
      objectkey   = lv_objectkey
      objecttable = 'MARA'
      classnum    = <fs_alv>-class
      classtype   = <fs_alv>-klart
    TABLES
      return      = lt_return.

  READ TABLE lt_return INTO wa_return INDEX 1 .

  IF wa_return-type EQ 'S'.
    CALL FUNCTION 'BAPI_OBJCL_CHANGE'
      EXPORTING
        objectkey          = lv_objectkey
        objecttable        = 'MARA'
        classnum           = <fs_alv>-class
        classtype          = <fs_alv>-klart
        standardclass      = 'X'
      TABLES
        allocvaluesnumnew  = allocvaluesnum
        allocvaluescharnew = lt_class
        allocvaluescurrnew = allocvaluescurr
        return             = lt_return.
  ELSE .

    CALL FUNCTION 'BAPI_OBJCL_CREATE'
      EXPORTING
        objectkeynew    = lv_objectkey
        objecttablenew  = 'MARA'
        classnumnew     = <fs_alv>-class
        classtypenew    = <fs_alv>-klart
        standardclass   = 'X'
      TABLES
        allocvaluesnum  = allocvaluesnum
        allocvalueschar = lt_class
        allocvaluescurr = allocvaluescurr
        return          = lt_return.
  ENDIF.

  READ TABLE lt_return INTO wa_return WITH KEY type = 'E'.
  IF sy-subrc EQ 0 .
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  ELSE .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_update_mara
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> PS_HEAD_HEAD
*&---------------------------------------------------------------------*
FORM frm_update_mara.
*  UPDATE 增强字段
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_quality_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_insptype_create .

  DATA: ls_qmat   TYPE bapi1001004_qmat,
        lt_qmat   TYPE TABLE OF bapi1001004_qmat,
        lt_return TYPE TABLE OF bapiret2.

  SPLIT <fs_alv>-art AT '/' INTO TABLE DATA(arts).
  IF arts[] IS NOT INITIAL.
    LOOP AT arts INTO DATA(art).

      SELECT SINGLE
        *
      INTO @DATA(ls_tq34)
      FROM tq34
      WHERE art = @art.

*  ls_qmat-function      = '004'.
      ls_qmat-insptype      = art.                       "检验类型
      ls_qmat-material      = <fs_alv>-matnr.                     "物料编码
      ls_qmat-material_long = <fs_alv>-matnr.
      ls_qmat-plant         = <fs_alv>-werks.                     "工厂

      ls_qmat-ind_insp_with_tsk_list      = ls_tq34-ppl.              "有任务清单的检验
      ls_qmat-ind_spec_matspec            = ls_tq34-spezueber.        "使用物料说明的检验
      ls_qmat-ind_spec_config             = ls_tq34-conf.             "来自配置的检验规范
      ls_qmat-ind_spec_batch              = ls_tq34-tls.              "批次确定的检验规范
      ls_qmat-ind_auto_assign             = ls_tq34-app.              "自动规格分配
      ls_qmat-ind_insp_by_charac          = ls_tq34-mer.              "按特性检验
      ls_qmat-ind_post_to_insp_stock      = ls_tq34-insmk.            "过账到检验库存
      ls_qmat-ind_automatic_ud            = ls_tq34-ave.              "计划的自动用途确定
      ls_qmat-sampling_procedure          = ls_tq34-stichprver.       "采样程序
      ls_qmat-dyn_modif_rule              = ls_tq34-dynregel.         "动态修改规则
      ls_qmat-insp_percentage             = ls_tq34-sproz.            "检验百分比
      ls_qmat-ind_100_percent_inspection  = ls_tq34-hpz.              "100%检验
      ls_qmat-ind_skips_allowed           = ls_tq34-dyn.              "允许略过
      ls_qmat-ind_manual_sample           = ls_tq34-mpb.              "手工输入采样
      ls_qmat-ind_manual_sample_calc      = ls_tq34-mst.              "手动触发采样计算
      ls_qmat-ind_single_units_possible   = ls_tq34-ein.              "可能的序列号管理
      ls_qmat-ave_insp_duration           = ls_tq34-mpdau.            "平均检验期
      ls_qmat-contr_insp_lot_create       = ls_tq34-chg.              "控制检验批创建(批次摘要)
      ls_qmat-qual_score_procedure        = ls_tq34-qkzverf.          "质量计分过程
      ls_qmat-allowed_scrap_share         = ls_tq34-qpmat.            "检验批中允许的废品份额(百分比)
      ls_qmat-ind_hu_inspection           = ls_tq34-apa.              "处理单位的检验
      ls_qmat-ms_flag                     = ls_tq34-ms_flag.          "标识:多个规范
      ls_qmat-preferred_insptype          = <fs_alv>-apa.             "首选的检验类型
      ls_qmat-ind_insptype_mat_active     = <fs_alv>-aktiv.           "活动的

      APPEND ls_qmat TO lt_qmat.
      CLEAR ls_qmat.

      CALL FUNCTION 'BAPI_MATINSPCTRL_SAVEREPLICA'
        TABLES
          return         = lt_return
          inspectionctrl = lt_qmat.

      READ TABLE lt_return INTO DATA(ls_return) WITH KEY type = 'E'.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = abap_true.
      ENDIF.

      CLEAR: lt_qmat, lt_return.
    ENDLOOP.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_create_mrp
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_mrp .
  DATA: ls_selfields TYPE sdibe_massfields,
        ls_mdma      TYPE mdma,
        ls_dpop      TYPE dpop,
        ls_return    TYPE bapireturn1.

  ls_selfields-xdismm = abap_true.
  ls_mdma-dismm = 'ND'.

  CALL FUNCTION 'MD_MRP_LEVEL_CREATE_DATA'
    EXPORTING
      i_matnr           = <fs_alv>-matnr
      i_werk            = <fs_alv>-werks
      i_mrp_area        = <fs_alv>-berid
      i_selfields       = ls_selfields
      i_mdma            = ls_mdma
      i_dpop            = ls_dpop
      i_external_commit = abap_true
    IMPORTING
      e_error_return    = ls_return.

  IF ls_return-type CA 'AEX'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_create_mr21
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_mr21 .
  DATA: iv_mode   TYPE char01 VALUE 'N',
        is_input  TYPE zsmr21,
        lt_return TYPE TABLE OF bapiret2.

  is_input-matnr = <fs_alv>-matnr.
  is_input-werks = <fs_alv>-werks.
  is_input-stprs = <fs_alv>-stprs.
  is_input-peinh = <fs_alv>-peinh.

  CALL FUNCTION 'ZFUNC_CREATE_MR21'
    EXPORTING
      iv_mode  = iv_mode
      is_input = is_input
    TABLES
      return   = lt_return.

  READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY id = 'CKPRCH'
                                                   number = '019'.
  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.
ENDFORM.