物料主数据视图 BAPI_MATERIAL_SAVEDATA(工厂,销售,分类,会计1,成本1,采购,质量视图)

物料主数据后台表

MARA 基本视图
MAKT 物料描述
MARM 计量单位
MARC 工厂数据
MARD 仓储数据
MBEW 物料评估
MVKE 销售数据
QMAT 质检相关的表

物料主数据各视图是否有维护都记录在表 MARA 的字段 VPSTA 和 PSTAT 中。通过分析这两个字段,就可以知道该物料主数据各视图的维护状态。和工厂相关的视图在MARC的PSTAT中

PSTAT:只包含手动创建的视图清单 。
VPSTA:这个字段包含为物料所创建的视图,请注意这个字段也包含了为相关视图自动创建的值(例如:Plant stock (X) 和 Storage stock (Z) 是自动创建的) 。
这段引用
在这里插入图片描述

说一说BAPI_MATERIAL_SAVEDATA的使用过程

根据配置表扩展创建物料工厂销售分类视图

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA: lw_zmmt023 TYPE  zmmt023,
        lv_mmsta   TYPE mmsta,
        lv_vmsta   TYPE vmsta,
        ls_marc    TYPE marc,
        returnmes  LIKE  bapi_matreturn2 OCCURS 0 WITH HEADER LINE.
  DATA: gs_taxclass  TYPE bapi_mlan.
  DATA: gt_taxclass   TYPE STANDARD TABLE OF bapi_mlan,
        lt_alloc_list TYPE TABLE OF bapi1003_alloc_list,
        lt_class      TYPE TABLE OF bapiret2,
        ls_class      TYPE bapiret2.
  DATA lv_objectkeynew      TYPE bapi1003_key-object.
  DATA lt_return2            TYPE STANDARD TABLE OF bapiret2.

  CLEAR: lt_mara,ls_head,gs_sale,gs_salex,ls_plant,ls_plantx,gs_taxclass,gt_taxclass .

  SELECT * FROM mara
    WHERE ersda IN @s_date
      AND created_at_time IN @s_time
      AND matnr IN @s_matnr
      INTO CORRESPONDING FIELDS OF TABLE @lt_mara.

  SORT lt_mara.
  DELETE ADJACENT DUPLICATES FROM  lt_mara COMPARING ALL FIELDS.
  SELECT  * FROM zmmt023 INTO TABLE @DATA(lt_zmmt023).
  LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
    CLEAR ls_head.
    ls_head-ind_sector = <fs_mara>-mbrsh.   "行业
    ls_head-material = <fs_mara>-matnr.
    ls_head-material_long = <fs_mara>-matnr.
    ls_head-matl_type = <fs_mara>-mtart.
    ls_head-basic_view = 'X'.
    ls_head-sales_view        = 'X'.

    LOOP AT lt_zmmt023 INTO lw_zmmt023 .                                                             "工厂视图 
      CLEAR: ls_output,ls_plant,ls_plantx, ls_return,lv_mmsta ,lv_vmsta.
      ls_head-storage_view = 'X'.
      ls_plant-plant            = lw_zmmt023-werks.
      ls_plantx-plant           = lw_zmmt023-werks.
      ls_output-matnr = ls_head-material.
      ls_output-werks =  lw_zmmt023-werks.
      CLEAR:lv_mmsta,ls_marc,returnmes[].
      SELECT SINGLE * FROM marc WHERE matnr = @<fs_mara>-matnr AND werks = @lw_zmmt023-werks INTO @ls_marc.
      IF sy-subrc = 0.
        lv_mmsta = ls_marc-mmsta.
      ENDIF.

      SELECT SINGLE vmsta FROM mvke WHERE matnr = @<fs_mara>-matnr AND vkorg = @lw_zmmt023-werks INTO @lv_vmsta.
      IF lv_mmsta IS INITIAL OR lv_vmsta IS INITIAL.
        IF ls_head-matl_type EQ 'Z008' OR ls_head-matl_type EQ 'Z005' .
          IF lv_mmsta IS INITIAL .
            ls_plant-pur_status = '20'.
            ls_plantx-pur_status = abap_true.
          ENDIF.
          IF lv_vmsta IS INITIAL .                            "销售视图
            gs_sale-sal_status = '20'.
            gs_salex-sal_status = 'X'.
          ENDIF.
        ELSE.
          IF lv_mmsta IS INITIAL .
            ls_plant-pur_status = '10'.
            ls_plantx-pur_status = abap_true.
          ENDIF.
          IF lv_vmsta IS INITIAL .
            gs_sale-sal_status = '10'.
            gs_salex-sal_status = 'X'.
          ENDIF.
        ENDIF.

        IF lv_mmsta IS INITIAL.
          ls_plant-availcheck  = 'Z2'.
          ls_plantx-availcheck   = 'X'.
        ENDIF.

        IF lv_vmsta IS INITIAL.
          gs_sale-sales_org  = lw_zmmt023-werks.            "
          gs_sale-distr_chan = '00'.
          gs_sale-delyg_plnt = lw_zmmt023-werks.           "交货工厂
          gs_sale-valid_from = sy-datum.
          gs_salex-valid_from = 'X'.

          IF ls_head-matl_type EQ 'Z009'.
            gs_sale-item_cat     = 'ZNR1'.
            gs_sale-acct_assgt = 'Z1'.
          ELSE.
            gs_sale-item_cat     = 'ZNR3'.
            gs_sale-acct_assgt = 'Z2'.
          ENDIF.

          gs_salex-sales_org  = lw_zmmt023-werks.
          gs_salex-distr_chan =  '00'.
          gs_salex-delyg_plnt = 'X'.
          gs_salex-item_cat     =  'X'.
          gs_salex-acct_assgt = 'X'.

          "SET_TAXCLASS_DATA
          IF lw_zmmt023-werks = '3000'.
            gs_taxclass-depcountry      = 'MX'.
            gs_taxclass-depcountry_iso  = 'MX'.
          ELSE.
            gs_taxclass-depcountry      = 'CN'.
            gs_taxclass-depcountry_iso  = 'CN'.
          ENDIF.
          gs_taxclass-tax_type_1      = 'MWST'.
          gs_taxclass-taxclass_1      = '1'.
          APPEND gs_taxclass TO gt_taxclass.
        ENDIF.

        CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
          EXPORTING
            headdata           = ls_head
            plantdata          = ls_plant
            plantdatax         = ls_plantx
            salesdata          = gs_sale
            salesdatax         = gs_salex
          IMPORTING
            return             = ls_return
          TABLES
            returnmessages     = returnmes[]
            taxclassifications = gt_taxclass. 


        IF ls_return-type  = 'S'.
          " 提交事务
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          ls_output-type = 'S'.
          ls_output-message = | { <fs_mara>-matnr }: { ls_return-message }|.

        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ls_output-type = 'E'.
          ls_output-message = | { <fs_mara>-matnr }: { ls_return-message }|.
        ENDIF.

        READ TABLE returnmes INTO DATA(ls_nmes) WITH KEY type = ' E'.
        ls_output-type1 = ls_nmes-type.
        ls_output-message1 = ls_nmes-message .

        APPEND ls_output TO lt_output.
        CLEAR:lw_zmmt023.
      ENDIF.
    ENDLOOP.


    CLEAR:lt_return2,lv_objectkeynew.
    "创建分类视图
    lv_objectkeynew = <fs_mara>-matnr .

    CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
      EXPORTING
        objectkey_imp   = lv_objectkeynew
        objecttable_imp = 'MARA'
        classtype_imp   = '023'
*       READ_VALUATIONS =
*       KEYDATE         = SY-DATUM
*       LANGUAGE        = SY-LANGU
      TABLES
        alloclist       = lt_alloc_list
*       ALLOCVALUESCHAR =
*       ALLOCVALUESCURR =
*       ALLOCVALUESNUM  =
        return          = lt_class.
    READ TABLE lt_class INTO ls_class WITH KEY type = 'S'.

    IF sy-subrc <> 0.

      CALL FUNCTION 'BAPI_OBJCL_CREATE'
        EXPORTING
          objectkeynew   = lv_objectkeynew
          objecttablenew = 'MARA'
          classnumnew    = 'Z_BATCH_PURCHASED'
          classtypenew   = '023'
          standardclass  = 'X'
        TABLES
          return         = lt_return2.

      READ TABLE lt_return2 INTO DATA(ls_return2) WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ls_output-type = 'E'.
        ls_output-message = | { <fs_mara>-matnr }: { ls_return2-message }|.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.

修改创建物料工厂销售分类视图

*&---------------------------------------------------------------------*
*& Form frm_init_screen
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_screen .
  CLEAR: s_date.
  s_date-low = sy-datum.
  s_date-high = sy-datum.
  APPEND s_date.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA: ls_head        TYPE bapimathead,
        ls_plant       TYPE bapi_marc,
        ls_plantx      TYPE bapi_marcx,
        lt_return      TYPE TABLE OF bapiret2,
        lt_mara        TYPE TABLE OF mara,
        ls_return      TYPE bapiret2,
        ls_clientdata  TYPE bapi_mara,
        ls_clientdatax TYPE bapi_marax,
        returnmes      LIKE  bapi_matreturn2 OCCURS 0 WITH HEADER LINE..
  DATA: gs_taxclass  TYPE bapi_mlan.
  DATA: gt_taxclass   TYPE STANDARD TABLE OF bapi_mlan,
        lt_alloc_list TYPE TABLE OF bapi1003_alloc_list,
        lt_class      TYPE TABLE OF bapiret2,
        ls_class      TYPE bapiret2.
  DATA lv_objectkeynew      TYPE bapi1003_key-object.
  DATA lt_return2            TYPE STANDARD TABLE OF bapiret2.
  DATA lv_flag TYPE c LENGTH 1.

  CLEAR: lt_mbew, lt_marc,lt_mvke,lv_flag .

  SELECT * FROM mbew
    WHERE matnr IN @s_matnr
      AND bwkey IN @s_werks
      AND laepr IN @s_date
    INTO TABLE @lt_mbew.

  SELECT * FROM marc
    WHERE matnr IN @s_matnr
      AND werks IN @s_werks
    INTO TABLE @lt_marc.

  SELECT * FROM mvke
    WHERE matnr IN @s_matnr
    AND vkorg IN @s_werks
    INTO TABLE @lt_mvke.

  SELECT * FROM mara
    WHERE matnr IN @s_matnr
    INTO TABLE @lt_mara.

  LOOP AT  lt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew>).
    IF <fs_mbew>-stprs > '0'.
      CLEAR: ls_head,lv_flag.
      READ TABLE lt_marc INTO DATA(ls_marc) WITH  KEY matnr = <fs_mbew>-matnr werks = <fs_mbew>-bwkey.
      IF sy-subrc = 0 AND  ls_marc-mmsta <> '20'.
        ls_head-basic_view = 'X'.
        ls_plant-plant            = <fs_mbew>-bwkey.
        ls_plantx-plant           = <fs_mbew>-bwkey.
        ls_plant-pur_status = '20'.
        ls_plantx-pur_status = abap_true.
        lv_flag  = 'X'.
      ENDIF.

      READ TABLE lt_mvke INTO DATA(ls_mvke) WITH  KEY matnr = <fs_mbew>-matnr vkorg = <fs_mbew>-bwkey.
      IF sy-subrc = 0 AND ls_mvke-vmsta <> '20'.
        ls_head-sales_view  = 'X'.
        gs_sale-sal_status = '20'.
        gs_salex-sal_status = 'X'.
        gs_sale-sales_org  = <fs_mbew>-bwkey.            "
        gs_sale-distr_chan = ls_mvke-vtweg.
        gs_sale-valid_from = sy-datum.
        gs_salex-valid_from = 'X'.
        gs_salex-sales_org  = <fs_mbew>-bwkey.
        gs_salex-distr_chan =  ls_mvke-vtweg.
        lv_flag  = 'X'.
      ENDIF.

      IF lv_flag  = 'X'.
        ls_head-material = <fs_mbew>-matnr.
        READ TABLE lt_mara INTO DATA(ls_mara) WITH  KEY matnr = <fs_mbew>-matnr .
        IF sy-subrc = 0.
          ls_head-matl_type = ls_mara-mtart.
          ls_head-ind_sector = ls_mara-mbrsh.
*          ls_clientdata-matl_group = ls_mara-matkl.
*          ls_clientdatax-matl_group = 'X'.
        ENDIF.
        ls_output-matnr = <fs_mbew>-matnr.
        ls_output-werks =  <fs_mbew>-bwkey.

        CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
          EXPORTING
            headdata       = ls_head
*           clientdata     = ls_clientdata
*           clientdatax    = ls_clientdatax
            plantdata      = ls_plant
            plantdatax     = ls_plantx
            salesdata      = gs_sale
            salesdatax     = gs_salex
          IMPORTING
            return         = ls_return
          TABLES
            returnmessages = returnmes[].
*            taxclassifications = gt_taxclass.

        IF ls_return-type  = 'S'.
          " 提交事务
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          ls_output-type = 'S'.
          ls_output-message = | { <fs_mbew>-matnr }: { ls_return-message }|.

        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ls_output-type = 'E'.
          ls_output-message = | { <fs_mbew>-matnr }: { ls_return-message }|.
        ENDIF.

        READ TABLE returnmes INTO DATA(ls_nmes) WITH KEY type = ' E'.
        ls_output-type1 = ls_nmes-type.
        ls_output-message1 = ls_nmes-message .
        APPEND ls_output TO lt_output.
      ENDIF.

    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_output_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output_alv .

  TRY .
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = go_alv
        CHANGING
          t_table      = lt_output ).
    CATCH cx_salv_msg.
  ENDTRY.

  DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr.
  DATA: ls_field_in TYPE dfies,
        lt_dfies    TYPE ddfields.

  DATA:lv_fname  TYPE lvc_fname,
       lv_short  TYPE scrtext_s,
       lv_medium TYPE scrtext_m,
       lv_long   TYPE scrtext_l.

  lo_tabdescr ?= cl_abap_structdescr=>describe_by_data( ls_output ).
  CALL METHOD cl_salv_data_descr=>read_structdescr
    EXPORTING
      r_structdescr = lo_tabdescr
    RECEIVING
      t_dfies       = lt_dfies.

  PERFORM frm_get_tabname TABLES lt_dfies USING 'ls_output'. "auto get tablename


  "===自动赋值fieldcat===
  LOOP AT lt_dfies INTO ls_field_in.

    CLEAR: gs_fieldcat.
    CLEAR: lv_short ,lv_medium ,lv_long ,lv_fname .

    MOVE-CORRESPONDING ls_field_in TO gs_fieldcat.
    gs_fieldcat-ref_table = ls_field_in-reftable.   "参照类型的表,搜索帮助,域控制
    gs_fieldcat-ref_field = ls_field_in-reffield. "参照类型字段

    IF ls_field_in-tabname IS NOT INITIAL.         "当COLTEXT不存在显示FILEDTEXT,如字段没域,只有手工描述的情况.
      lv_medium = ls_field_in-scrtext_m .
      go_alv->get_columns( )->get_column( lv_fname )->set_medium_text( lv_medium ).
    ENDIF.
  ENDLOOP.


  "自动列宽
  go_alv->get_columns( )->set_optimize( 'X' ).
  "斑马线
  go_alv->get_display_settings( )->set_striped_pattern( 'X' ).
  "set selection mode 可以行列进行选择
  go_alv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

*******标准按钮和自定义状态使用一个就好
  "标准按钮
  go_alv->get_functions( )->set_all( abap_true ).  "将激活所以的ALV内置通用按钮

  "显示
  go_alv->display( ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GET_TABNAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_DFIES
*&      --> P_
*&---------------------------------------------------------------------*
FORM frm_get_tabname  TABLES t_dfies TYPE ddfields USING tabname TYPE tfdir-funcname.
  " source container
  DATA: BEGIN OF ls_abap_source,
          line TYPE char300,
        END OF ls_abap_source,
        lt_abap_source LIKE TABLE OF ls_abap_source.
  DATA: lt_fieldinfo_old LIKE fieldinfo OCCURS 10 WITH HEADER LINE.
  CLASS cx_sy_read_src_line_too_long DEFINITION LOAD.
  DATA: ex_too_long TYPE REF TO  cx_sy_read_src_line_too_long.
  TRY.
      READ REPORT sy-repid INTO lt_abap_source.
    CATCH cx_sy_read_src_line_too_long INTO ex_too_long.
      MESSAGE '一行代码超过300个字符' TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

  CALL FUNCTION 'ABAP_SCAN_DATA_DESCRIPTION'
    EXPORTING
      structure_name      = tabname
      main_program_name   = sy-cprog
      i_context           = 'X'
    TABLES
      abap_source         = lt_abap_source
      ddic_fieldinfo      = lt_fieldinfo_old
      ddic_fieldinfo2     = gt_fieldinfo
    EXCEPTIONS
      source_not_accepted = 0
      OTHERS              = 0.

  LOOP AT t_dfies ASSIGNING FIELD-SYMBOL(<lfs_dfies>).
    IF <lfs_dfies>-reftable IS INITIAL. "auto set tablename
      READ TABLE gt_fieldinfo INTO gs_fieldinfo WITH KEY fieldname = <lfs_dfies>-fieldname.
      IF sy-subrc = 0.
        SPLIT gs_fieldinfo-name AT '-' INTO <lfs_dfies>-reftable <lfs_dfies>-reffield.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

SAP 扩充质量视图BAIP BAPI_MATERIAL_SAVEDATA

MM50也可以查到没有维护的物料视图并复制参照物料工厂视图到另外一个工厂

会计1,成本1,采购,质量视图复制其他工厂到1200

*&---------------------------------------------------------------------*
*& Include          ZMME053_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_init_screen
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_screen .
  CLEAR: s_date.
  s_date-low = sy-datum.
  s_date-high = sy-datum.
  APPEND s_date.
  CLEAR: s_time.
  s_time-high = '235959'.
  APPEND s_time.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data.
  DATA lt_mara TYPE TABLE OF mara.
  DATA lt_marc TYPE TABLE OF marc.
  DATA: lt_mbew      TYPE TABLE OF mbew,
        lt_steuertab TYPE TABLE OF mg03steuer,
        gs_taxclass  TYPE bapi_mlan,
        gt_taxclass  TYPE STANDARD TABLE OF bapi_mlan,
        ls_mbew      TYPE mbew,
        ls_return    TYPE bapiret2,
        ls_plant     TYPE bapi_marc,
        ls_plantx    TYPE bapi_marcx,
        returnmes    LIKE bapi_matreturn2 OCCURS 0 WITH HEADER LINE,
        ls_qmat      TYPE qmat,
        lt_qmat      TYPE TABLE OF qmat.
  DATA valuationdata     TYPE bapi_mbew. " 评估数据
  DATA valuationdatax    TYPE bapi_mbewx.
  DATA lt_inspectionctrl TYPE TABLE OF bapi1001004_qmat.
  DATA ls_inspectionctrl TYPE bapi1001004_qmat.
  DATA lt_return         TYPE TABLE OF bapiret2.
  " TODO: variable is assigned but never used (ABAP cleaner)
  DATA ls_tq34           TYPE tq34.

  CLEAR: lt_mara, lt_marc, lt_mbew, lt_steuertab, gs_taxclass,gt_taxclass,ls_mbew,ls_return,ls_plant,ls_plantx,returnmes[],
          valuationdata, valuationdatax, lt_inspectionctrl, ls_inspectionctrl, lt_return,  ls_tq34,ls_qmat.

  SELECT * FROM mara
    WHERE ersda           IN @s_date
      AND created_at_time IN @s_time
      AND matnr           IN @s_matnr
    INTO CORRESPONDING FIELDS OF TABLE @lt_mara.
  SORT lt_mara BY matnr.
  DELETE ADJACENT DUPLICATES FROM lt_mara COMPARING matnr.

  IF lt_mara IS INITIAL.
    RETURN.
  ENDIF.

  SELECT a~*
    FROM marc AS a
           INNER JOIN
             @lt_mara AS b ON a~matnr = b~matnr
    WHERE a~werks IN ( '1000', '1100' )
    INTO CORRESPONDING FIELDS OF TABLE @lt_marc.

  SORT lt_marc BY matnr
                  werks.
  DELETE ADJACENT DUPLICATES FROM lt_marc COMPARING matnr werks.

  SELECT * FROM mbew
    WHERE matnr IN @s_matnr
      AND bwkey IN ( '1000', '1100' )
    INTO TABLE @lt_mbew.

  SORT lt_marc BY matnr
                  werks.
  DELETE ADJACENT DUPLICATES FROM lt_marc COMPARING matnr werks.

  LOOP AT lt_marc ASSIGNING FIELD-SYMBOL(<fs_marc>).

    READ TABLE lt_mara INTO DATA(ls_mara) WITH  KEY matnr = <fs_marc>-matnr BINARY SEARCH.
    IF sy-subrc = 0.
      ls_head-material   = <fs_marc>-matnr.
      ls_head-matl_type  = ls_mara-mtart.
      ls_head-ind_sector = ls_mara-mbrsh.
      ls_plant-plant  = '1200'.
      ls_plantx-plant = '1200'.
    ENDIF.
    ls_output-matnr = <fs_marc>-matnr.
    ls_output-werks = '1200'.

    SELECT SINGLE * FROM marc WHERE matnr = @<fs_marc>-matnr AND werks = '1200' INTO @DATA(ls_marc).
    IF sy-subrc = 0.
      IF ls_marc-pstat NA 'Q'.  "质量视图
        ls_head-quality_view = 'X'.
      ELSEIF ls_marc-pstat NA 'B'. " 会计视图
        ls_head-account_view = 'X'.
      ELSEIF ls_marc-pstat NA 'G'. " 成本视图
        ls_head-cost_view = 'X'. "
      ELSEIF ls_marc-pstat NA 'E'.  " 采购视图
        ls_head-purchase_view = 'X'.
        SELECT SINGLE * FROM mvke WHERE vkorg = @<fs_marc>-werks AND matnr = @<fs_marc>-matnr INTO @DATA(ls_mvke).
        CLEAR : lt_steuertab,
                gs_taxclass.
        CALL FUNCTION 'STEUERTAB_IDENTIFY'
          EXPORTING vkorg       = <fs_marc>-werks
                    bukrs_vkorg = <fs_marc>-werks
                    vtweg       = ls_mvke-vtweg
          TABLES    steuertab   = lt_steuertab.

        LOOP AT lt_steuertab INTO DATA(ls_steuertab).
          gs_taxclass-depcountry = ls_steuertab-aland.
          gs_taxclass-tax_type_1 = ls_steuertab-tatyp.
          gs_taxclass-taxclass_1 = '1'.
          APPEND gs_taxclass TO gt_taxclass.
        ENDLOOP.
      ENDIF.
    ENDIF.

    IF ls_head-account_view = 'X' OR ls_head-cost_view = 'X'.
      CLEAR ls_mbew.
      READ TABLE lt_mbew INTO ls_mbew INDEX 1.

      " 会计1
      CLEAR valuationdata.
      valuationdata-val_area   = '1200'.
      valuationdata-val_class  = ls_mbew-bklas. "评估分类
      valuationdata-price_ctrl = ls_mbew-vprsv. "价格控制指示符
      valuationdata-price_unit = ls_mbew-peinh.  "价格单位
      valuationdata-moving_pr  = ls_mbew-verpr. "周期单位价格
      valuationdata-std_price  = ls_mbew-stprs.  "标准价格
      "成本1   
      valuationdata-qty_struct = ls_mbew-ekalr.   "用QS的成本核算
      valuationdata-orig_mat   = ls_mbew-hkmat.   "物料来源
      ls_PLANT-LOT_SIZE       = <fs_marc>-LOSGR.     "成本核算批量
      ls_PLANTX-LOT_SIZE        = 'X'.               "成本核算批量
      ls_PLANT-NO_COSTING        = <fs_marc>-NCOST.     "不计算成本
      ls_PLANTX-NO_COSTING         = 'X'.               "不计算成本
      
      CLEAR valuationdatax.
      valuationdatax-val_area   = '1200'.
      valuationdatax-val_class  = 'X'.
      valuationdatax-price_ctrl = 'X'.
      valuationdatax-price_unit = 'X'.
      valuationdatax-moving_pr  = 'X'.
      valuationdatax-std_price  = 'X'.
      valuationdatax-qty_struct = 'X'.
      valuationdatax-orig_mat   = 'X'.
    ENDIF.

    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING headdata           = ls_head
*                CLIENTDATA         =
*                CLIENTDATAX        =
                plantdata          = ls_plant
                plantdatax         = ls_plantx
*                FORECASTPARAMETERS =
*                FORECASTPARAMETERSX =
*                PLANNINGDATA       =
*                PLANNINGDATAX      =
*                STORAGELOCATIONDATA =
*                STORAGELOCATIONDATAX =
                valuationdata      = valuationdata
                valuationdatax     = valuationdatax
      "         WAREHOUSENUMBERDATA         =
      "         WAREHOUSENUMBERDATAX        =
      "         SALESDATA                   =
      "         SALESDATAX                  =
      "         STORAGETYPEDATA             =
      "         STORAGETYPEDATAX            =
      "         FLAG_ONLINE                 = ' '
      "         FLAG_CAD_CALL               = ' '
      "         NO_DEQUEUE                  = ' '
      "         NO_ROLLBACK_WORK            = ' '
      "         CLIENTDATACWM               =
      "         CLIENTDATACWMX              =
      "         VALUATIONDATACWM            =
      "         VALUATIONDATACWMX           =
      "         MATPLSTADATA                =
      "         MATPLSTADATAX               =
      "         MARC_APS_EXTDATA            =
      "         MARC_APS_EXTDATAX           =
      IMPORTING return             = ls_return
      TABLES
      "         MATERIALDESCRIPTION         =
      "         UNITSOFMEASURE              =
      "         UNITSOFMEASUREX             =
      "         INTERNATIONALARTNOS         =
      "         MATERIALLONGTEXT            =
                taxclassifications = gt_taxclass
                returnmessages     = returnmes[].
    "         PRTDATA  =
    "         PRTDATAX =
    "         EXTENSIONIN                 =
    "         EXTENSIONINX                =
    "         UNITSOFMEASURECWM           =
    "         UNITSOFMEASURECWMX          =
    "         SEGMRPGENERALDATA           =
    "         SEGMRPGENERALDATAX          =
    "         SEGMRPQUANTITYDATA          =
    "         SEGMRPQUANTITYDATAX         =
    "         SEGVALUATIONTYPE            =
    "         SEGVALUATIONTYPEX           =
    "         SEGSALESSTATUS              =
    "         SEGSALESSTATUSX             =
    "         SEGWEIGHTVOLUME             =
    "         SEGWEIGHTVOLUMEX            =
    "         DEMAND_PENALTYDATA          =
    "         DEMAND_PENALTYDATAX         =
    "         NFMCHARGEWEIGHTS            =
    "         NFMCHARGEWEIGHTSX           =
    "         NFMSTRUCTURALWEIGHTS        =
    "         NFMSTRUCTURALWEIGHTSX       =

    IF ls_return-type = 'S'.
      " 提交事务
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING wait = 'X'.
      ls_output-type    = 'S'.
      ls_output-message = | { <fs_marc>-matnr }: { ls_return-message }|.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ls_output-type    = 'E'.
      ls_output-message = | { <fs_marc>-matnr }: { ls_return-message }|.
    ENDIF.

    READ TABLE returnmes INTO DATA(ls_nmes) WITH KEY type = ' E'.
    ls_output-type1    = ls_nmes-type.
    ls_output-message1 = ls_nmes-message.

    APPEND ls_output TO lt_output.

    IF ls_marc-pstat NA 'Q'.
      SELECT * FROM qmat
        WHERE matnr = @<fs_marc>-matnr
          AND werks = @<fs_marc>-werks
        INTO TABLE @lt_qmat.
    if lt_qmat is NOT INITIAL.
      LOOP AT lt_qmat INTO ls_qmat.
        IF ls_marc-pstat NA 'Q' AND <fs_marc>-pstat CA 'Q'.
        SELECT * FROM qmat
          WHERE matnr = @<fs_marc>-matnr
            AND werks = @<fs_marc>-werks
          INTO TABLE @lt_qmat.
        IF lt_qmat IS NOT INITIAL.
          LOOP AT lt_qmat INTO ls_qmat.
            ls_inspectionctrl-plant = '1200'.
            ls_inspectionctrl-material = <fs_marc>-matnr.
            ls_inspectionctrl-insptype = ls_qmat-art.
            ls_inspectionctrl-ind_insp_with_tsk_list = ls_qmat-ppl.
            ls_inspectionctrl-ind_spec_matspec = ls_qmat-spezueber.
            ls_inspectionctrl-ind_spec_config = ls_qmat-conf.
            ls_inspectionctrl-ind_spec_batch = ls_qmat-tls.
            ls_inspectionctrl-ind_auto_assign = ls_qmat-app.
            ls_inspectionctrl-ind_insp_by_charac = ls_qmat-mer.
            ls_inspectionctrl-ind_post_to_insp_stock = ls_qmat-insmk.
            ls_inspectionctrl-ind_automatic_ud = ls_qmat-ave.
            ls_inspectionctrl-sampling_procedure = ls_qmat-stichprver.
            ls_inspectionctrl-dyn_modif_rule = ls_qmat-dynregel.
            ls_inspectionctrl-insp_percentage = ls_qmat-sproz.
            ls_inspectionctrl-ind_100_percent_inspection = ls_qmat-hpz.
            ls_inspectionctrl-ind_skips_allowed = ls_qmat-dyn.
            ls_inspectionctrl-ind_manual_sample = ls_qmat-mpb.
            ls_inspectionctrl-ind_manual_sample_calc = ls_qmat-mst.
            ls_inspectionctrl-ind_single_units_possible = ls_qmat-ein.
            ls_inspectionctrl-ave_insp_duration = ls_qmat-mpdau.
            ls_inspectionctrl-contr_insp_lot_create = ls_qmat-chg.
            ls_inspectionctrl-qual_score_procedure = ls_qmat-qkzverf.
            ls_inspectionctrl-allowed_scrap_share = ls_qmat-qpmat.
            ls_inspectionctrl-ind_insptype_mat_active = 'X'.
            ls_inspectionctrl-preferred_insptype = 'X'."首选的检验类型
            APPEND ls_inspectionctrl TO lt_inspectionctrl.
            CLEAR ls_qmat.
          ENDLOOP.
      ls_output-matnr = <fs_marc>-matnr.
      ls_output-werks = '1200'.
      CLEAR lt_return.
      CALL FUNCTION 'BAPI_MATINSPCTRL_SAVEREPLICA'       " 质量视图里的字段内容
       TABLES
       return         = lt_return
       inspectionctrl = lt_inspectionctrl.
      READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'S'.
      IF lt_return IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ENDIF.
      APPEND ls_output TO lt_output.
     endif.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_output_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output_alv .

  DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr.
  DATA: ls_field_in TYPE dfies,
        lt_dfies    TYPE ddfields.

  DATA:lv_fname  TYPE lvc_fname,
       lv_short  TYPE scrtext_s,
       lv_medium TYPE scrtext_m,
       lv_long   TYPE scrtext_l.

  TRY .
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = go_alv
        CHANGING
          t_table      = lt_output ).
    CATCH cx_salv_msg.
  ENDTRY.

  lo_tabdescr ?= cl_abap_structdescr=>describe_by_data( ls_output ).
  CALL METHOD cl_salv_data_descr=>read_structdescr
    EXPORTING
      r_structdescr = lo_tabdescr
    RECEIVING
      t_dfies       = lt_dfies.

  PERFORM frm_get_tabname TABLES lt_dfies USING 'ls_output'. "auto get tablename

  "===自动赋值fieldcat===
  LOOP AT lt_dfies INTO ls_field_in.

    CLEAR: gs_fieldcat.
    CLEAR: lv_short ,lv_medium ,lv_long ,lv_fname .

    MOVE-CORRESPONDING ls_field_in TO gs_fieldcat.
    gs_fieldcat-ref_table = ls_field_in-reftable.   "参照类型的表,搜索帮助,域控制
    gs_fieldcat-ref_field = ls_field_in-reffield. "参照类型字段

    IF ls_field_in-tabname IS NOT INITIAL.         "当COLTEXT不存在显示FILEDTEXT,如字段没域,只有手工描述的情况.
      lv_medium = ls_field_in-scrtext_m .
      go_alv->get_columns( )->get_column( lv_fname )->set_medium_text( lv_medium ).
    ENDIF.
  ENDLOOP.


  "自动列宽
  go_alv->get_columns( )->set_optimize( 'X' ).
  "斑马线
  go_alv->get_display_settings( )->set_striped_pattern( 'X' ).
  "set selection mode 可以行列进行选择
  go_alv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

*******标准按钮和自定义状态使用一个就好
  "标准按钮
  go_alv->get_functions( )->set_all( abap_true ).  "将激活所以的ALV内置通用按钮

  "显示
  go_alv->display( ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GET_TABNAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_DFIES
*&      --> P_
*&---------------------------------------------------------------------*
FORM frm_get_tabname  TABLES t_dfies TYPE ddfields USING tabname TYPE tfdir-funcname.
  " source container
  DATA: BEGIN OF ls_abap_source,
          line TYPE char300,
        END OF ls_abap_source,
        lt_abap_source LIKE TABLE OF ls_abap_source.
  DATA: lt_fieldinfo_old LIKE fieldinfo OCCURS 10 WITH HEADER LINE.
  CLASS cx_sy_read_src_line_too_long DEFINITION LOAD.
  DATA: ex_too_long TYPE REF TO  cx_sy_read_src_line_too_long.
  TRY.
      READ REPORT sy-repid INTO lt_abap_source.
    CATCH cx_sy_read_src_line_too_long INTO ex_too_long.
      MESSAGE '一行代码超过300个字符' TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

  CALL FUNCTION 'ABAP_SCAN_DATA_DESCRIPTION'
    EXPORTING
      structure_name      = tabname
      main_program_name   = sy-cprog
      i_context           = 'X'
    TABLES
      abap_source         = lt_abap_source
      ddic_fieldinfo      = lt_fieldinfo_old
      ddic_fieldinfo2     = gt_fieldinfo
    EXCEPTIONS
      source_not_accepted = 0
      OTHERS              = 0.

  LOOP AT t_dfies ASSIGNING FIELD-SYMBOL(<lfs_dfies>).
    IF <lfs_dfies>-reftable IS INITIAL. "auto set tablename
      READ TABLE gt_fieldinfo INTO gs_fieldinfo WITH KEY fieldname = <lfs_dfies>-fieldname.
      IF sy-subrc = 0.
        SPLIT gs_fieldinfo-name AT '-' INTO <lfs_dfies>-reftable <lfs_dfies>-reffield.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值