ABAP-批导物料主数据

*&---------------------------------------------------------------------*
*& Report ZMMR_032
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmr_032.

*&---------------------------------------------------------------------*
* TABLES
*&---------------------------------------------------------------------*
TYPE-POOLS: slis.
TABLES: sscrfields.

*&---------------------------------------------------------------------*
* TYPES
*&---------------------------------------------------------------------*
TYPES:
* 上传文件用
  BEGIN OF ty_upload,
    filed01 TYPE string,   "项目01
    filed02 TYPE string,   "项目02
    filed03 TYPE string,   "项目03
    filed04 TYPE string,   "项目04
    filed05 TYPE string,   "项目05
    filed06 TYPE string,   "项目06
    filed07 TYPE string,   "项目07
    filed08 TYPE string,   "项目08
    filed09 TYPE string,   "项目09
    filed10 TYPE string,   "项目10
    filed11 TYPE string,   "项目11
    filed12 TYPE string,   "项目12
    filed13 TYPE string,   "项目13
    filed14 TYPE string,   "项目14
    filed15 TYPE string,   "项目15
    filed16 TYPE string,   "项目16
    filed17 TYPE string,   "项目17
    filed18 TYPE string,   "项目18
    filed19 TYPE string,   "项目19
    filed20 TYPE string,   "项目20
    filed21 TYPE string,   "项目21
    filed22 TYPE string,   "项目22
    filed23 TYPE string,   "项目23
    filed24 TYPE string,   "项目24
    filed25 TYPE string,   "项目25
    filed26 TYPE string,   "项目26
    filed27 TYPE string,   "项目27
    filed28 TYPE string,   "项目28
    filed29 TYPE string,   "项目29
    filed30 TYPE string,   "项目30
    filed31 TYPE string,   "项目31
    filed32 TYPE string,   "项目32
    filed33 TYPE string,   "项目33
    filed34 TYPE string,   "项目34
    filed35 TYPE string,   "项目35
    filed36 TYPE string,   "项目36
    filed37 TYPE string,   "项目37
    filed38 TYPE string,   "项目38
    filed39 TYPE string,   "项目39
    filed40 TYPE string,   "项目40
    filed41 TYPE string,   "项目41
    filed42 TYPE string,   "项目42
    filed43 TYPE string,   "项目43
    filed44 TYPE string,   "项目44
    filed45 TYPE string,   "项目45
    filed46 TYPE string,   "项目46
    filed47 TYPE string,   "项目47
    filed48 TYPE string,   "项目48
  END OF ty_upload,

* 数据处理用
  BEGIN OF ty_data,
    ckbox      TYPE xfeld,                " 复选框
    icon       TYPE string,               " 状态
    msgtx      TYPE string,               " 消息
    matnr      TYPE mara-matnr,           " 物料编码
    spart      TYPE mara-spart,           " 产品组
    mbrsh      TYPE mara-mbrsh,           " 行业领域
    mtart      TYPE mara-mtart,           " 物料类型
    werks      TYPE marc-werks,           " 工厂
    maktx      TYPE makt-maktx,           " 物料描述
    meins      TYPE mara-meins,           " 基本计量单位
    matkl      TYPE mara-matkl,           " 物料组
    groes      TYPE mara-groes,           " 大小/量纲
    gewei      TYPE mara-gewei,           " 重量单位
    mtpos_mara TYPE mara-mtpos_mara,      " 普通项目类别组
    klart      TYPE klah-klart,           " 类别种类
    class      TYPE klah-class,           " 类别
    vkorg      TYPE mvke-vkorg,           " 销售组织
    vtweg      TYPE mvke-vtweg,           " 分销渠道
    dwerk      TYPE mvke-dwerk,           " 交货工厂
    spart2     TYPE mara-spart,           " 产品组
    taxm1      TYPE mlan-taxm1,           " 物料的税分类
    kondm      TYPE mvke-kondm,           " 物料价格组
    ktgrm      TYPE mvke-ktgrm,           " 科目设置组
    mtpos      TYPE mvke-mtpos,           " 项目类别组
    mtvfp      TYPE marc-mtvfp,           " 可用性检查的检查组
    tragr      TYPE mara-tragr,           " 运输组
    ladgr      TYPE marc-ladgr,           " 装载组
    prctr      TYPE marc-prctr,           " 利润中心
    xchpf      TYPE mara-xchpf,           " 批次管理
    vrkme      TYPE mvke-vrkme,           " 销售单位
    ekgrp      TYPE marc-ekgrp,           " 采购组
    beskz      TYPE marc-beskz,           " 采购类型
    disgr      TYPE marc-disgr,           " MRP组
    dismm      TYPE marc-dismm,           " MRP类型
    dispo      TYPE marc-dispo,           " MRP控制者
    perkz      TYPE marc-perkz,           " 期间标识
    disls      TYPE marc-disls,           " 批量程序
    mtvfp2     TYPE marc-mtvfp,           " 可用性检查的检查组
    eisbe      TYPE marc-eisbe,           " 安全库存
    strgr      TYPE marc-strgr,           " 计划策略组
    sauft      TYPE marc-sauft,           " 重复制造标识
    sfepr      TYPE marc-sfepr,           " 重复生产参数文件
    bklas      TYPE mbew-bklas,           " 评估类
    mlast      TYPE mbew-mlast,           " 价格确定
    vprsv      TYPE mbew-vprsv,           " 价格控制
    peinh      TYPE mbew-peinh,           " 价格单位
    stprs      TYPE mbew-stprs,           " 标准价格
    verpr      TYPE mbew-verpr,           " 移动平均价
    ekalr      TYPE mbew-ekalr,           " 用QS的成本估算
    prctr2     TYPE marc-prctr,           " 利润中心
    hkmat      TYPE mbew-hkmat,           " 物料来源
*    mstae      TYPE mara-mstae,          " 跨工厂物料状态
*    vrkme      TYPE mvke-vrkme,          " 销售单位
*    bstme TYPE mara-bstme,               " 订单单位
*    zflag TYPE zsmm_mara-ztbsrm,         " 同步状态
*    zdate TYPE zsmm_mara-ztbsrmdate,     " 上次同步日期
  END OF ty_data,

* 数据处理用
  BEGIN OF ty_data2,
    matnr TYPE mara-matnr,            " 物料编号
    werks TYPE marc-werks,            " 工厂
    ckbox TYPE xfeld,                 " 复选框
    icon  TYPE string,                " 状态
    msgtx TYPE string,                " 消息
    mbrsh TYPE mara-mbrsh,            " 行业领域
    mtart TYPE mara-mtart,            " 物料类型
    maktx TYPE makt-maktx,            " 物料描述
    matkl TYPE mara-matkl,            " 物料组
    meins TYPE mara-meins,            " 计量单位
    mstae TYPE mara-mstae,            " 跨工厂物料状态
*    zggxh TYPE mara-zggxh,           " 详细规格型号
*    zwldl TYPE mara-zwldl,           " 物料大类
*    zwlzl TYPE mara-zwlzl,           " 物料中类
*    zwlsl TYPE mara-zwlsl,           " 物料小类
*    zwlxl TYPE mara-zwlxl,           " 物料细类
    ekgrp TYPE marc-ekgrp,            " 采购组
*    zflag TYPE zsmm_mara-ztbsrm,     " 同步状态
*    zdate TYPE zsmm_mara-ztbsrmdate, "上次同步日期
  END OF ty_data2.

*&---------------------------------------------------------------------*
* CONSTANTS
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* GLOBAL DATA
*&---------------------------------------------------------------------*
DATA: gv_repid LIKE sy-repid.    "程序名
DATA: gv_title TYPE lvc_title,   "ALV标题
      gv_count LIKE sy-index,    "记录条数
      gv_cnttx TYPE char10,      "记录条数-字符型
      gv_matnr TYPE mara-matnr,  "物料号
      gv_laeda TYPE mara-laeda.  "更新日期

*&---------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES
*&---------------------------------------------------------------------*
DATA: gs_function  TYPE smp_dyntxt.
DATA: gt_fieldcat  TYPE lvc_t_fcat.
DATA: gs_fieldcat  TYPE lvc_s_fcat.
DATA: gt_events    TYPE slis_t_event.
DATA: gs_events    TYPE slis_alv_event.
DATA: gs_layout    TYPE lvc_s_layo.
DATA: gs_settings  TYPE lvc_s_glay.
DATA: gs_variant   LIKE disvariant.

DATA: gt_upload   TYPE STANDARD TABLE OF ty_upload.
DATA: gs_upload   TYPE ty_upload.
DATA: gt_data     TYPE STANDARD TABLE OF ty_data.
DATA: gs_data     TYPE ty_data.
DATA: gt_data2    TYPE STANDARD TABLE OF ty_data2.
DATA: gs_data2    TYPE ty_data2.
DATA: gt_excel    TYPE STANDARD TABLE OF alsmex_tabline.

DATA: gs_gmhead   TYPE bapi2017_gm_head_01.
DATA: gs_gmcode   TYPE bapi2017_gm_code.
DATA: gs_gmitem   TYPE bapi2017_gm_item_create.
DATA: gt_gmitem   TYPE TABLE OF bapi2017_gm_item_create.
DATA: gs_headrt   TYPE bapi2017_gm_head_ret.
DATA: gs_return   TYPE bapiret2.
DATA: gt_return   TYPE TABLE OF bapiret2.

*&---------------------------------------------------------------------*
* GLOBAL RANGES
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* SELECTION-SCREEN
*&---------------------------------------------------------------------*
* 工具栏
SELECTION-SCREEN FUNCTION KEY 1.

* 数据选择
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: cb_1 AS CHECKBOX,            " 基本视图            cb_2 
AS CHECKBOX,            " 销售视图            cb_3 
AS CHECKBOX,            " 采购视图            cb_4 
AS CHECKBOX,            " 会计和成本视图            cb_5 
AS CHECKBOX,            " 分类视图            cb_6 
AS CHECKBOX.            " MRP视图
*SELECT-OPTIONS: s_matnr FOR gv_matnr,    " 物料号
*                s_laeda FOR gv_laeda.    " 更新日期
SELECTION-SCREEN END OF BLOCK b1.

* 数据导入
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_fname TYPE rlgrap-filename.           "选择导入文件
SELECTION-SCREEN END OF BLOCK b2.

* 操作模式
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
PARAMETERS: rb_1 RADIOBUTTON GROUP gu1 DEFAULT 'X' USER-COMMAND flag"测试导入            rb_2 
RADIOBUTTON GROUP gu1.                               "正式导入
SELECTION-SCREEN END OF BLOCK b3.

*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* EVENTS BEFORE MAIN PROGRAM
*&---------------------------------------------------------------------*
INITIALIZATION.

* 初期化处理  
PERFORM sub_initialization.

*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* 屏幕输出前初始化处理  
PERFORM sub_selection_screen_output.

*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.

* 选择屏幕校验  
PERFORM sub_selection_screen_check.

*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.

* 选择导入文件检索帮助  
PERFORM sub_search_help_filename.

*&---------------------------------------------------------------------*
*        MAIN PROGRAM                                                  *
*----------------------------------------------------------------------*
START-OF-SELECTION.

** 同步SRM系统
*  IF rb_3 = 'X'.
**   抽取数据
*    PERFORM sub_get_data.
** 上传数据
*  ELSE.
**   上传文件
*    PERFORM sub_upload_file.
*  ENDIF.  
PERFORM sub_upload_file.
*&---------------------------------------------------------------------*
END-OF-SELECTION.  

IF sy-batch = abap_on.
*   同步SRM处理    
PERFORM sub_data_transfer.  
ELSE.
*   设置ALV显示列属性    
PERFORM sub_fieldcat_init.

*   设置ALV事件    
PERFORM sub_eventtab_build.

***    IF rb_3 = abap_on.
****     输出ALV屏幕
***      PERFORM sub_call_alv USING gt_data2.
***    ELSE.
****     输出ALV屏幕
***      PERFORM sub_call_alv USING gt_data.
***    ENDIF.    
PERFORM sub_call_alv USING gt_data.  
ENDIF.
*&---------------------------------------------------------------------*
*       Subroutine                                                     *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SUB_INITIALIZATION
*&---------------------------------------------------------------------*
*       初期化处理
*----------------------------------------------------------------------*
FORM sub_initialization .

* 保存程序ID  gv_repid 
= sy-repid.

* 工具栏添加下载模板按钮  
CLEAR gs_function.  gs_function
-icon_id   = icon_export.  gs_function
-icon_text TEXT-004.  gs_function
-quickinfo TEXT-004.  sscrfields
-functxt_01 = gs_function.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_SELECTION_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*       屏幕输出前初始化处理
*----------------------------------------------------------------------*
FORM sub_selection_screen_output .

*  IF rb_3 = abap_on.
*    LOOP AT SCREEN.
*      IF screen-group4 = '002' OR screen-group4 = '003'
*      OR screen-group4 = '004' OR screen-group4 = '005'
*      OR screen-name = '%B002009_BLOCK_1000'
*      OR screen-group4 = '010'.
*        screen-active = 0.
*        MODIFY SCREEN.
*      ENDIF.
*    ENDLOOP.
*  ELSE.
*    LOOP AT SCREEN.
*      IF screen-group4 = '006' OR screen-group4 = '007'.
*        screen-active = 0.
*        MODIFY SCREEN.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.
*  LOOP AT SCREEN.
*    IF screen-group4 = '006' OR screen-group4 = '007'.
*      screen-active = 0.
*      MODIFY SCREEN.
*    ENDIF.
*  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_SELECTION_SCREEN_CHECK
*&---------------------------------------------------------------------*
*       选择屏幕校验
*----------------------------------------------------------------------*
FORM sub_selection_screen_check .

* 下载数据导入文件模版  
IF sy-ucomm 'FC01'.
*   下载数据导入模版    
PERFORM sub_download_template_file USING 'ZMMR_032'.
* 批量上传时  
ELSEIF ( rb_1 = abap_on OR rb_2 = abap_on AND          
( sy-ucomm 'ONLI' OR sy-ucomm = space ).
*   文件必输校验    
PERFORM sub_file_obligatory.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_download_template_file
*&---------------------------------------------------------------------*
*       下载数据导入模版
*----------------------------------------------------------------------*
*      -->PV_FILECODE  模板名称
*----------------------------------------------------------------------*
FORM sub_download_template_file  USING pv_filecode.  

DATA: lv_filename TYPE string,        lv_title    
TYPE wwwdata-text,        lv_mask     
TYPE string.  
DATA: lv_sapdir TYPE string.

**检查并获取放在服务器上的文件对象的信息  
DATA: lt_query_table  LIKE w3query OCCURS WITH HEADER LINE,        lt_html_table   
LIKE w3html  OCCURS 1,        lt_doc_table    
LIKE w3mime  OCCURS 0,        lv_return_code  
LIKE w3param-ret_code,        lv_content_type 
LIKE w3param-cont_type,        lv_doc_size     
TYPE i.

* 获取SAP客户端工作目录  
CALL METHOD cl_gui_frontend_services=>get_sapgui_workdir    
CHANGING      sapworkdir            
= lv_sapdir    
EXCEPTIONS      get_sapworkdir_failed 
1      cntl_error            
2      error_no_gui          
3      not_supported_by_gui  
4      
OTHERS                5.  

CLEAR: lv_title.  
SELECT SINGLE text INTO lv_title    
FROM wwwdata   
WHERE relid 'MI'     
AND objid = pv_filecode.  
IF sy-subrc <> 0.    lv_title 
= pv_filecode.  
ENDIF.  

CLEAR: lv_mask.  
SELECT SINGLE extension INTO lv_mask    
FROM wwwparams AS a   INNER 
JOIN mimetypes AS b ON b~type = a~value   
WHERE a~relid 'MI'     
AND a~objid = pv_filecode     
AND a~name  'mimetype'.  
IF sy-subrc 0.    
CONCATENATE ',' lv_mask ',' lv_mask '.' INTO lv_mask.  
ENDIF.  

CALL FUNCTION 'WS_FILENAME_GET'    
EXPORTING      def_path         
= lv_sapdir      def_filename     
= lv_title         "缺省的文件名      
mask             = lv_mask      
mode             'S'              "S = 保存,O = 打开      
title            TEXT-102    
IMPORTING      filename         
= lv_filename    
EXCEPTIONS      inv_winsys       
1      no_batch         
2      selection_cancel 
3      selection_error  
4      
OTHERS           5.  
IF sy-subrc <> 0.    
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno    
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
ENDIF.  lt_query_table

-name '_OBJECT_ID'.  lt_query_table
-value = pv_filecode.  
APPEND lt_query_table.  

CALL FUNCTION 'WWW_GET_MIME_OBJECT'    
TABLES      query_string        
= lt_query_table      html                
= lt_html_table      mime                
= lt_doc_table    
CHANGING      return_code         
= lv_return_code      content_type        
= lv_content_type      content_length      
= lv_doc_size    
EXCEPTIONS      parameter_not_found 
2      
OTHERS              3.  
IF sy-subrc NE 0.    
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno    
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
ENDIF.

**将获取的服务器上的文件内容下载到上面获取的文件名中  
CALL FUNCTION 'GUI_DOWNLOAD'    
EXPORTING      bin_filesize            
= lv_doc_size      filename                
= lv_filename      filetype                
'BIN'    
TABLES      data_tab                
= lt_doc_table    
EXCEPTIONS      file_write_error        
1      no_batch                
2      gui_refuse_filetransfer 
3      invalid_type            
4      no_authority            
5      unknown_error           
6      header_not_allowed      
7      separator_not_allowed   
8      filesize_not_allowed    
9      header_too_long         
10      dp_error_create         
11      dp_error_send           
12      dp_error_write          
13      unknown_dp_error        
14      access_denied           
15      dp_out_of_memory        
16      disk_full               
17      dp_timeout              
18      file_not_found          
19      dataprovider_exception  
20      control_flush_error     
21      
OTHERS                  22.  
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.
*&---------------------------------------------------------------------*
*&      Form  SUB_FILE_OBLIGATORY
*&---------------------------------------------------------------------*
*       文件必输校验
*----------------------------------------------------------------------*
FORM sub_file_obligatory .

* 数据选择校验  
IF cb_1 = space AND cb_2 = space AND cb_3 = space AND cb_4 = space.    
SET CURSOR FIELD 'CB_1'.    
MESSAGE '请选择要导入的视图' TYPE 'E'.  
ENDIF.

* 文件必输校验  
IF p_fname IS INITIAL.    
SET CURSOR FIELD 'P_FNAME'.    
MESSAGE '请选择导入的文件' TYPE 'E'.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_SEARCH_HELP_FILENAME
*&---------------------------------------------------------------------*
*       选择导入文件检索帮助
*----------------------------------------------------------------------*
FORM sub_search_help_filename .  
CALL FUNCTION 'WS_FILENAME_GET'    
EXPORTING      
mask             ',EXCEL FILE,*.XLS;*.XLSX;'      
mode             'O' "S为保存,O为打开    
IMPORTING      filename         
= p_fname    
EXCEPTIONS      inv_winsys       
1      no_batch         
2      selection_cancel 
3      selection_error  
4      
OTHERS           5.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_UPLOAD_FILE
*&---------------------------------------------------------------------*
*       上传文件
*----------------------------------------------------------------------*
FORM sub_upload_file .  
DATA: ls_excel TYPE alsmex_tabline,        lv_name  
TYPE string,        ls_data  
TYPE ty_data,        ls_head  
TYPE ty_upload,        lt_head  
TYPE STANDARD TABLE OF ty_upload.  
FIELD-SYMBOLS: <lfs_filedname> TYPE any,                 <lfs_value>     
TYPE any.

* 上传文件  
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'    
EXPORTING      filename                
= p_fname      i_begin_col             
2      i_begin_row             
1      i_end_col               
49      i_end_row               
65535    
TABLES      intern                  
= gt_excel    
EXCEPTIONS      inconsistent_parameters 
1      upload_ole              
2      
OTHERS                  3.  
IF sy-subrc <> 0.    
MESSAGE e398(00WITH '上传EXCEL文件出错!'.  
ELSE.    
IF gt_excel[] IS INITIAL.      
MESSAGE e398(00WITH 'EXCEL文件中无数据!'.    
ENDIF.  
ENDIF.  

LOOP AT gt_excel INTO ls_excel.
*   模板抬头    
IF ls_excel-row 1.      
ASSIGN COMPONENT ls_excel-col OF STRUCTURE ls_head TO <lfs_filedname>.      
IF ls_excel-value IS NOT INITIAL.        <lfs_filedname> 
= ls_excel-value.        lv_name         
= ls_excel-value.      
ELSE.        <lfs_filedname> 
= lv_name.      
ENDIF.
*   字段属性和名称    
ELSEIF ls_excel-row < 7.      
ASSIGN COMPONENT ls_excel-col OF STRUCTURE ls_head TO <lfs_filedname>.      <lfs_filedname> 
= ls_excel-value.
*   导入数据    
ELSE.
*     获取当前SAP字段ID      
READ TABLE lt_head INTO ls_head INDEX 3.      
ASSIGN COMPONENT ls_excel-col OF STRUCTURE ls_head TO <lfs_filedname>.
*     获取当前结构中的位置      
ASSIGN COMPONENT <lfs_filedname> OF STRUCTURE ls_data TO <lfs_value>.
*     把上传文件的值赋予到构造中      
TRY.          <lfs_value> 
= ls_excel-value.        
CATCH cx_root INTO DATA(cx).          ls_data
-icon  = icon_red_light.          ls_data
-msgtx = cx->get_text).      
ENDTRY.    
ENDIF.    

AT END OF row.      
IF ls_excel-row < 7.        
APPEND ls_head TO lt_head.        
CLEAR ls_head.      
ELSE.
*       数据校验        
PERFORM sub_check_field USING    lt_head                                
CHANGING ls_data.
*添加校验权限        
AUTHORITY-CHECK OBJECT 'M_MSEG_WMB'        
ID 'WERKS' FIELD ls_data-werks        
ID 'ACTVT' FIELD  '03'.        
IF sy-subrc <> 0.          ls_data
-icon  = icon_red_light.          
CONCATENATE '没有' ls_data-werks '工厂的权限' INTO ls_data-msgtx.        
ENDIF.        
APPEND ls_data TO gt_data.        
CLEAR ls_data.      
ENDIF.    
ENDAT.  
ENDLOOP.  

IF gt_data[] IS INITIAL.    
MESSAGE s398(00WITH '该用户没有导入数据工厂权限!' DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form SUB_CHECK_FIELD
*&---------------------------------------------------------------------*
*&      数据校验
*&---------------------------------------------------------------------*
*&      --> IT_HEAD 抬头信息数据
*&      <-- ES_DATA 导入数据
*&---------------------------------------------------------------------*
FORM sub_check_field  USING    it_head TYPE STANDARD TABLE                      
CHANGING es_data TYPE ty_data.  

DATA: ls_fieldname TYPE ty_upload,        ls_viewname  
TYPE ty_upload,        ls_fieldid   
TYPE ty_upload,        ls_check     
TYPE ty_upload,        lv_viewname  
TYPE string,        lv_index     
TYPE i.  

FIELD-SYMBOLS: <lfs_fieldname> TYPE any,                 <lfs_viewname>  
TYPE any,                 <lfs_fieldid>   
TYPE any,                 <lfs_check>     
TYPE any,                 <lfs_data>      
TYPE any.  

READ TABLE it_head INTO ls_viewname  INDEX 1.  
READ TABLE it_head INTO ls_fieldname INDEX 2.  
READ TABLE it_head INTO ls_fieldid   INDEX 3.  
READ TABLE it_head INTO ls_check     INDEX 6.  lv_index 

1.

*   必输入校验  
DO.
*     获取字段名称    
ASSIGN COMPONENT lv_index OF STRUCTURE ls_fieldname TO <lfs_fieldname>.    
IF <lfs_fieldname> IS NOT ASSIGNED OR sy-subrc <> 0.      
EXIT.    
ENDIF.
*     获取视图名    
ASSIGN COMPONENT lv_index OF STRUCTURE ls_viewname TO <lfs_viewname>.    
IF sy-subrc AND <lfs_viewname> IS NOT INITIAL.      lv_viewname 
= <lfs_viewname>.    
ENDIF.
*     获取字段ID    
ASSIGN COMPONENT lv_index OF STRUCTURE ls_fieldid TO <lfs_fieldid>.
*     获取字段是否必输    
ASSIGN COMPONENT lv_index OF STRUCTURE ls_check TO <lfs_check>.
*     获取导入数据    
ASSIGN COMPONENT <lfs_fieldid> OF STRUCTURE es_data TO <lfs_data>.

*     必输入校验    
IF ( cb_1 'X' AND lv_viewname TEXT-p01 )    
OR ( cb_2 'X' AND lv_viewname TEXT-p02 )    
OR ( cb_3 'X' AND lv_viewname TEXT-p03 )    
OR ( cb_4 'X' AND ( lv_viewname TEXT-p04 OR lv_viewname TEXT-p05 )    
OR ( cb_5 'X' AND lv_viewname TEXT-p06 )    
OR ( cb_6 'X' AND lv_viewname TEXT-p07 )    
OR ( lv_viewname <> TEXT-p01 AND lv_viewname <> TEXT-p02 AND         lv_viewname <> 
TEXT-p03 AND lv_viewname <> TEXT-p04 AND         lv_viewname <> 
TEXT-p05 AND lv_viewname <> TEXT-p06 AND         lv_viewname <> 
TEXT-p07 )    
OR <lfs_fieldid> 'MATNR'    
OR <lfs_fieldid> 'MBRSH'    
OR <lfs_fieldid> 'MTART'.      
IF <lfs_check> TEXT-e01 AND <lfs_data> = space.        es_data
-icon  = icon_red_light.
*        MESSAGE e001(zmm_01) WITH <lfs_fieldname> INTO es_data-msgtx.        
MESSAGE e001(00WITH <lfs_fieldname> TEXT-e01 INTO es_data-msgtx.        
EXIT.      
ENDIF.    
ENDIF.    lv_index 

= lv_index + 1.  
ENDDO.

*  虚拟物料不需要分类校验  
CHECK es_data-icon IS INITIAL AND es_data-mtart <> 'A00Z' AND  cb_1 'X'.

*  分类存不存在校验
*  SELECT SINGLE COUNT(*)
*    FROM ztmm_wlfl
*   WHERE zwldl = es_data-zwldl
*     AND zwlzl = es_data-zwlzl
*     AND zwlsl = es_data-zwlsl
*     AND zwlxl = es_data-zwlxl.
*
*  IF sy-subrc <> 0.
*    es_data-icon  = icon_red_light.
*    MESSAGE e000(zmm_01) INTO es_data-msgtx.
*  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  SUB_FIELDCAT_INIT
*&---------------------------------------------------------------------*
* INITIALIZATION FIELDCATALOG   DEFINITION OF HEADING.
*      FIELDNAMES AND REF_FIELDNAMES MUST BE UPPER CASE !!
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM sub_fieldcat_init.  
DEFINE mcr_alv_fieldcat.    
CLEAR: gs_fieldcat.
***    IF rb_3 = abap_off.
***      gs_fieldcat-tabname       = 'GT_DATA'.
***    ELSE.
***      gs_fieldcat-tabname       = 'GT_DATA2'.
***    ENDIF.    gs_fieldcat

-tabname       'GT_DATA'.    gs_fieldcat

-fieldname     = &1.    gs_fieldcat
-key           = &2.    gs_fieldcat
-outputlen     = &3.    gs_fieldcat
-coltext       = &4.    gs_fieldcat
-scrtext_l     = &4.    gs_fieldcat
-scrtext_m     = &4.    gs_fieldcat
-scrtext_s     = &4.    gs_fieldcat
-ref_field     = &5.    gs_fieldcat
-ref_table     = &6.    gs_fieldcat
-no_out        = &7.    gs_fieldcat
-no_zero       = &8.    gs_fieldcat
-emphasize     = &9.    "列颜色    
APPEND gs_fieldcat TO gt_fieldcat.  
END-OF-DEFINITION.  

REFRESH: gt_fieldcat.  mcr_alv_fieldcat  
'CKBOX'       ' ' ' ' TEXT-t01  ' ' ' ' ' ' ' ' ' '.  mcr_alv_fieldcat  
'ICON'        ' ' ' ' TEXT-t02  ' ' ' ' ' ' ' ' ' '.  mcr_alv_fieldcat  
'MSGTX'       ' ' ' ' TEXT-t03  ' ' ' ' ' ' ' ' ' '.  mcr_alv_fieldcat  
'MATNR'       ' ' ' ' TEXT-t04  'MATNR' 'MARA' ' ' ' ' ' '." 物料编码  mcr_alv_fieldcat  
'MAKTX'       ' ' ' ' TEXT-t08  'MAKTX' 'MAKT' ' ' ' ' ' '." 物料描述  mcr_alv_fieldcat  
'SPART'       ' ' ' ' TEXT-t20  ' ' ' ' ' ' ' ' ' '.       " 产品组  mcr_alv_fieldcat  
'MBRSH'       ' ' ' ' TEXT-t05  ' ' ' ' ' ' ' ' ' '.       " 行业领域  mcr_alv_fieldcat  
'MTART'       ' ' ' ' TEXT-t06  ' ' ' ' ' ' ' ' ' '.       " 物料类型  mcr_alv_fieldcat  
'WERKS'       ' ' ' ' TEXT-t07  ' ' ' ' ' ' ' ' ' '.       " 工厂  mcr_alv_fieldcat  
'MEINS'       ' ' ' ' TEXT-t09  ' ' ' ' ' ' ' ' ' '.       " 基本计量单位  mcr_alv_fieldcat  
'MATKL'       ' ' ' ' TEXT-t10  ' ' ' ' ' ' ' ' ' '.       " 物料组  mcr_alv_fieldcat  
'GROES'       ' ' ' ' TEXT-t44  ' ' ' ' ' ' ' ' ' '.       " 大小/量纲  mcr_alv_fieldcat  
'GEWEI'       ' ' ' ' TEXT-t45  ' ' ' ' ' ' ' ' ' '.       " 重量单位  mcr_alv_fieldcat  
'MTPOS_MARA'  ' ' ' ' TEXT-t46  ' ' ' ' ' ' ' ' ' '.       " 普通项目类别组  mcr_alv_fieldcat  
'KLART'       ' ' ' ' TEXT-t47  ' ' ' ' ' ' ' ' ' '.       " 类别种类  mcr_alv_fieldcat  
'CLASS'       ' ' ' ' TEXT-t48  ' ' ' ' ' ' ' ' ' '.       " 类别  mcr_alv_fieldcat  
'VKORG'       ' ' ' ' TEXT-t17  ' ' ' ' ' ' ' ' ' '.       " 销售组织  mcr_alv_fieldcat  
'VTWEG'       ' ' ' ' TEXT-t18  ' ' ' ' ' ' ' ' ' '.       " 分销渠道  mcr_alv_fieldcat  
'DWERK'       ' ' ' ' TEXT-t19  ' ' ' ' ' ' ' ' ' '.       " 交货工厂  mcr_alv_fieldcat  
'SPART2'      ' ' ' ' TEXT-t20  ' ' ' ' ' ' ' ' ' '.       " 产品组  mcr_alv_fieldcat  
'TAXM1'       ' ' ' ' TEXT-t22  ' ' ' ' ' ' ' ' ' '.       " 物料的税分类  mcr_alv_fieldcat  
'KONDM'       ' ' ' ' TEXT-t63  ' ' ' ' ' ' ' ' ' '.       " 物料价格组  mcr_alv_fieldcat  
'KTGRM'       ' ' ' ' TEXT-t23  ' ' ' ' ' ' ' ' ' '.       " 科目设置组  mcr_alv_fieldcat  
'MTPOS'       ' ' ' ' TEXT-t24  ' ' ' ' ' ' ' ' ' '.       " 项目类别组  mcr_alv_fieldcat  
'MTVFP'       ' ' ' ' TEXT-t49  ' ' ' ' ' ' ' ' ' '.       " 可用性检查组  mcr_alv_fieldcat  
'TRAGR'       ' ' ' ' TEXT-t25  ' ' ' ' ' ' ' ' ' '.       " 运输组  mcr_alv_fieldcat  
'LADGR'       ' ' ' ' TEXT-t26  ' ' ' ' ' ' ' ' ' '.       " 装载组  mcr_alv_fieldcat  
'PRCTR'       ' ' ' ' TEXT-t40  ' ' ' ' ' ' ' ' ' '.       " 利润中心  mcr_alv_fieldcat  
'XCHPF'       ' ' ' ' TEXT-t50  ' ' ' ' ' ' ' ' ' '.       " 批次管理  mcr_alv_fieldcat  
'VRKME'       ' ' ' ' TEXT-t62  ' ' ' ' ' ' ' ' ' '.       " 销售单位  mcr_alv_fieldcat  
'EKGRP'       ' ' ' ' TEXT-t29  ' ' ' ' ' ' ' ' ' '.       " 采购组  mcr_alv_fieldcat  
'BESKZ'       ' ' ' ' TEXT-t51  ' ' ' ' ' ' ' ' ' '.       " 采购类型  mcr_alv_fieldcat  
'DISGR'       ' ' ' ' TEXT-t52  ' ' ' ' ' ' ' ' ' '.       " MRP组  mcr_alv_fieldcat  
'DISMM'       ' ' ' ' TEXT-t53  ' ' ' ' ' ' ' ' ' '.       " MRP类型  mcr_alv_fieldcat  
'DISPO'       ' ' ' ' TEXT-t54  ' ' ' ' ' ' ' ' ' '.       " MRP控制者  mcr_alv_fieldcat  
'PERKZ'       ' ' ' ' TEXT-t55  ' ' ' ' ' ' ' ' ' '.       " 期间标识  mcr_alv_fieldcat  
'DISLS'       ' ' ' ' TEXT-t56  ' ' ' ' ' ' ' ' ' '.       " 批量程序  mcr_alv_fieldcat  
'MTVFP2'      ' ' ' ' TEXT-t57  ' ' ' ' ' ' ' ' ' '.       " 可用性检查  mcr_alv_fieldcat  
'EISBE'       ' ' ' ' TEXT-t58  ' ' ' ' ' ' ' ' ' '.       " 安全库存  mcr_alv_fieldcat  
'STRGR'       ' ' ' ' TEXT-t59  ' ' ' ' ' ' ' ' ' '.       " 计划策略组  mcr_alv_fieldcat  
'SAUFT'       ' ' ' ' TEXT-t60  ' ' ' ' ' ' ' ' ' '.       " 重复制造标识  mcr_alv_fieldcat  
'SFEPR'       ' ' ' ' TEXT-t61  ' ' ' ' ' ' ' ' ' '.       " 重复生产参数文件  mcr_alv_fieldcat  
'BKLAS'       ' ' ' ' TEXT-t32  ' ' ' ' ' ' ' ' ' '.       " 评估类  mcr_alv_fieldcat  
'MLAST'       ' ' ' ' TEXT-t33  ' ' ' ' ' ' ' ' ' '.       " 价格确定  mcr_alv_fieldcat  
'VPRSV'       ' ' ' ' TEXT-t34  ' ' ' ' ' ' ' ' ' '.       " 价格控制  mcr_alv_fieldcat  
'PEINH'       ' ' ' ' TEXT-t35  ' ' ' ' ' ' ' ' ' '.       " 价格单位  mcr_alv_fieldcat  
'STPRS'       ' ' ' ' TEXT-t36  ' ' ' ' ' ' ' ' ' '.       " 标准价格  mcr_alv_fieldcat  
'VERPR'       ' ' ' ' TEXT-t37  ' ' ' ' ' ' ' ' ' '.       " 移动平均价  mcr_alv_fieldcat  
'EKALR'       ' ' ' ' TEXT-t39  ' ' ' ' ' ' ' ' ' '.       " 用QS的成本估算  mcr_alv_fieldcat  
'PRCTR2'      ' ' ' ' TEXT-t40  ' ' ' ' ' ' ' ' ' '.       " 利润中心  mcr_alv_fieldcat  
'HKMAT'       ' ' ' ' TEXT-t41  ' ' ' ' ' ' ' ' ' '.       " 物料来源
*    mcr_alv_fieldcat  'BSTME'     ' ' ' ' TEXT-t30  ' ' ' ' ' ' ' ' ' '.      "  
LOOP AT gt_fieldcat INTO gs_fieldcat.    
IF gs_fieldcat-fieldname 'CKBOX'.      gs_fieldcat
-just     'C'.      gs_fieldcat
-checkbox 'X'.      gs_fieldcat
-edit     'X'.
*    ELSEIF gs_fieldcat-fieldname = 'MEINS'.
*      gs_fieldcat-edit_mask = '==CUNIT'.    
ENDIF.    
MODIFY gt_fieldcat FROM gs_fieldcat.  
ENDLOOP.
ENDFORM.   "SUB_FIELDCAT_INIT
*&---------------------------------------------------------------------*
*&      FORM  SUB_EVENTTAB_BUILD
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM sub_eventtab_build.  
REFRESH: gt_events.  

CALL FUNCTION 'REUSE_ALV_EVENTS_GET'    
EXPORTING      i_list_type 
0    
IMPORTING      et_events   
= gt_events.

*........ADD EVENT AT-USER-COMMAND .....................................  
READ TABLE gt_events INTO gs_events WITH KEY name = slis_ev_user_command.  
IF sy-subrc 0.    
CONCATENATE 'SUB_' slis_ev_user_command INTO gs_events-form.    
MODIFY gt_events FROM gs_events INDEX sy-tabix.  
ELSE.    gs_events
-name = slis_ev_user_command.    
CONCATENATE 'SUB_' slis_ev_user_command INTO gs_events-form.    
APPEND gs_events TO gt_events.  
ENDIF.
ENDFORM.                    "SUB_EVENTTAB_BUILD
*&---------------------------------------------------------------------*
*&      Form  SUB_ALV_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RT_EXTAB  text
*----------------------------------------------------------------------*
FORM sub_alv_pf_status  USING pt_extab TYPE slis_t_extab.  
DATA: ls_slis_extab TYPE slis_extab.

*  IF rb_3 = 'X'.
*    ls_slis_extab-fcode = 'ZUPLOAD'.
*    APPEND ls_slis_extab TO pt_extab.
*  ELSE.
*    ls_slis_extab-fcode = 'ZTRANSFER'.
*    APPEND ls_slis_extab TO pt_extab.
*  ENDIF.  
SET PF-STATUS 'STANDARD_ALV1' EXCLUDING pt_extab.
ENDFORM.                    "SUB_ALV_PF_STATUS
*&---------------------------------------------------------------------*
*&      FORM  SUB_USER_COMMAND
*&---------------------------------------------------------------------*
* DYNAMIC CALL FROM THE ALV
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM sub_user_command  USING pv_ucomm LIKE sy-ucomm                             ps_selfield 
TYPE slis_selfield.  
DATA: lo_grid    TYPE REF TO cl_gui_alv_grid.  
DATA: lt_filter  TYPE slis_t_filtered_entries.  
DATA: lv_index LIKE sy-index,        lv_colno 
TYPE slis_sel_tab_field.  lv_index 

= ps_selfield-tabindex.              "LINE IN LIST  lv_colno 
= ps_selfield-sel_tab_field.         "COLUMN HEADER  

"Update ALV Screen  
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      e_grid 
= lo_grid.  

CALL METHOD lo_grid->check_changed_data.  

CASE pv_ucomm.    
WHEN '&F03'.    
WHEN 'CLER'.    
WHEN '&IC1'.          "hotspot      
IF lv_colno 'GT_DATA-MATNR'.        
READ TABLE gt_data INTO gs_data INDEX lv_index.        
CHECK sy-subrc 0.        
SET PARAMETER ID 'MAT' FIELD gs_data-matnr.        
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.      
ELSEIF lv_colno 'GT_DATA2-MATNR'.        
READ TABLE gt_data2 INTO gs_data2 INDEX lv_index.        
CHECK sy-subrc 0.        
SET PARAMETER ID 'MAT' FIELD gs_data2-matnr.        
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.      
ENDIF.    
WHEN 'ZALLSEL'.      
CLEAR: lt_filter.      
CALL FUNCTION 'REUSE_ALV_GRID_LAYOUT_INFO_GET'        
IMPORTING          et_filtered_entries 
= lt_filter        
EXCEPTIONS          no_infos            
1          program_error       
2          
OTHERS              3.      
IF ps_selfield-tabname 'GT_DATA'.        
LOOP AT gt_data INTO gs_data.          
READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY sy-tabix.          
IF sy-subrc 0.            gs_data
-ckbox = space.          
ELSE.            gs_data
-ckbox 'X'.          
ENDIF.          
MODIFY gt_data FROM gs_data TRANSPORTING ckbox.        
ENDLOOP.      
ELSEIF ps_selfield-tabname 'GT_DATA2'.        
LOOP AT gt_data2 INTO gs_data2.          
READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY sy-tabix.          
IF sy-subrc 0.            gs_data2
-ckbox = space.          
ELSE.            gs_data2
-ckbox 'X'.          
ENDIF.          
MODIFY gt_data2 FROM gs_data2 TRANSPORTING ckbox.        
ENDLOOP.      
ENDIF.    
WHEN 'ZNOSEL'.      
IF ps_selfield-tabname 'GT_DATA'.        gs_data
-ckbox = space.        
MODIFY gt_data FROM gs_data TRANSPORTING ckbox WHERE ckbox 'X'.      
ELSEIF ps_selfield-tabname 'GT_DATA2'.        gs_data2
-ckbox = space.        
MODIFY gt_data2 FROM gs_data2 TRANSPORTING ckbox WHERE ckbox 'X'.      
ENDIF.    
WHEN 'ZUPLOAD'.       "数据批导      
PERFORM sub_data_batch_input.          "数据批导    
WHEN OTHERS.  
ENDCASE.  ps_selfield

-refresh 'X'.  ps_selfield
-col_stable 'X'.  ps_selfield
-row_stable 'X'.

ENDFORM.                    "SUB_USER_COMMAND
*&---------------------------------------------------------------------*
*&      FORM  SUB_CALL_ALV
*&---------------------------------------------------------------------*
*       输出ALV屏幕
*----------------------------------------------------------------------*
FORM sub_call_alv USING pt_data TYPE STANDARD TABLE.

* ALV有关参数设置  
CLEAR: gs_layout, gs_settings, gs_variant.  gs_layout

-cwidth_opt 'X'.  gs_layout
-zebra 'X'.  gs_layout
-no_rowmark 'X'.  gs_layout
-sel_mode 'A'.

* ALV输出  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    
EXPORTING      i_callback_program       
= gv_repid      i_callback_pf_status_set 
'SUB_ALV_PF_STATUS'      is_layout_lvc            
= gs_layout      it_fieldcat_lvc          
= gt_fieldcat      it_events                
= gt_events    
TABLES      t_outtab                 
= pt_data    
EXCEPTIONS      program_error            
1      
OTHERS                   2.  

IF sy-subrc <> 0.    
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno          
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4          DISPLAY 
LIKE 'E'.  
ENDIF.
ENDFORM.                    " SUB_CALL_ALV
*&---------------------------------------------------------------------*
*&      Form  SUB_DATA_BATCH_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_data_batch_input .  
DATA: lv_matnr        TYPE mara-matnr,        lv_meins        
TYPE mara-meins,        lv_vrkme        
TYPE mvke-vrkme,        lv_objectkeynew 
TYPE bapi1003_key-object,        ls_headdata     
TYPE bapimathead,        ls_clientdata   
TYPE bapi_mara,        ls_clientdatax  
TYPE bapi_marax,        ls_plantdata    
TYPE bapi_marc,        ls_plantdatax   
TYPE bapi_marcx,        ls_salesdata    
TYPE bapi_mvke,        ls_salesdatax   
TYPE bapi_mvkex,        ls_valuation    
TYPE bapi_mbew,        ls_valuationx   
TYPE bapi_mbewx,        ls_marm         
TYPE bapi_marm,        ls_marmx        
TYPE bapi_marmx,        ls_mlan         
TYPE bapi_mlan,        lt_material     
TYPE TABLE OF bapi_makt,        lt_marm         
TYPE TABLE OF bapi_marm,        lt_marmx        
TYPE TABLE OF bapi_marmx,        lt_mlan         
TYPE TABLE OF bapi_mlan,        ls_material     
TYPE bapi_makt,        ls_return       
TYPE bapiret2,        lt_return       
LIKE TABLE OF ls_return,        ls_zbapi_mara   
TYPE bapi_te_mara2,        ls_zbapi_marax  
TYPE bapi_te_mara2x,        ls_extensionin  
TYPE bapiparex,        lt_extensionin  
TYPE TABLE OF bapiparex,        ls_extensioninx 
TYPE bapiparexx,        lt_extensioninx 
TYPE TABLE OF bapiparexx,        lv_flag         
TYPE c.  

FIELD-SYMBOLS <lfs_data>  TYPE ty_data.

* 检查需要导入的数据  
READ TABLE gt_data TRANSPORTING NO FIELDS       
WITH KEY ckbox 'X'.  

IF sy-subrc <> 0.    
MESSAGE '请选择要导入的数据' TYPE 'E'.  
ENDIF.  

LOOP AT gt_data ASSIGNING <lfs_data> WHERE ckbox 'X' AND icon = space.    

CLEAR: ls_headdata,           ls_clientdata
,           ls_clientdatax
,           ls_plantdata
,           ls_plantdatax
,           ls_salesdata
,           ls_salesdatax
,           ls_valuation
,           ls_valuationx
,           ls_marm
,           ls_marmx
,           ls_mlan
,           lt_material
,           lt_marm
,           lt_marmx
,           lt_mlan
,           ls_material
,           ls_return
,           ls_zbapi_mara
,           ls_zbapi_marax
,           ls_extensionin
,           lt_extensionin
,           ls_extensioninx
,           lt_extensioninx
,           lv_meins
,           lv_vrkme
,           lv_objectkeynew
,           lv_flag
.

*   抬头信息    lv_matnr                  
= <lfs_data>-matnr.    ls_headdata
-ind_sector    = <lfs_data>-mbrsh.  " 行业领域    ls_headdata
-matl_type     = <lfs_data>-mtart.  " 物料类型    
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'      
EXPORTING        
input        = lv_matnr      
IMPORTING        
output       = lv_matnr      
EXCEPTIONS        length_error 
1        
OTHERS       2.    
IF sy-subrc <> 0.
*     Implement suitable error handling here    
ENDIF.    ls_headdata
-material_long = lv_matnr.  " 物料编码    

CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'      
EXPORTING        
input          = <lfs_data>-meins        
language       '1'      
IMPORTING        
output         = lv_meins      
EXCEPTIONS        unit_not_found 
1        
OTHERS         2.    
IF sy-subrc <> 0.
*     Implement suitable error handling here    
ENDIF.

*   创建基本视图    
IF cb_1 'X'.      ls_headdata
-basic_view     'X'.      ls_clientdata
-base_uom     = lv_meins.              " 基本计量单位      ls_clientdatax
-base_uom    'X' .                  " 基本计量单位      ls_clientdata
-matl_group   = <lfs_data>-matkl.      " 物料组      ls_clientdatax
-matl_group  'X' .                  " 物料组      ls_clientdata
-division     = <lfs_data>-spart.      " 产品组      ls_clientdatax
-division    'X' .                  " 产品组      ls_clientdata
-size_dim     = <lfs_data>-groes.      " 大小/量纲      ls_clientdatax
-size_dim    'X'.                   " 大小/量纲      ls_clientdata
-unit_of_wt   = <lfs_data>-gewei.      " 重量单位      ls_clientdatax
-unit_of_wt  'X'.                   " 重量单位      ls_clientdata
-item_cat     = <lfs_data>-mtpos_mara" 普通项目类别组      ls_clientdatax
-item_cat    'X'.                   " 普通项目类别组
*     ls_clientdata-pur_status   = <lfs_data>-mstae.      " 跨工厂物料状态
*     ls_clientdatax-pur_status  = 'X' .                  " 跨工厂物料状态

*     中文描述      
IF <lfs_data>-maktx IS NOT INITIAL.        ls_material
-langu     '1'.        ls_material
-matl_desc = <lfs_data>-maktx.     " 物料描述        
APPEND ls_material TO lt_material.      
ENDIF.      ls_marm

-alt_unit  = lv_meins" 基本计量单位      ls_marmx
-alt_unit = lv_meins" 基本计量单位      
APPEND ls_marm  TO lt_marm.      
APPEND ls_marmx TO lt_marmx.      lv_flag 

= abap_on.    
ENDIF.

*   销售视图    
IF cb_2 'X'.      
IF <lfs_data>-vrkme IS NOT INITIAL.        
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'          
EXPORTING            
input          = <lfs_data>-vrkme            
language       '1'          
IMPORTING            
output         = lv_vrkme          
EXCEPTIONS            unit_not_found 
1            
OTHERS         2.        
IF sy-subrc <> 0.
*     Implement suitable error handling here        
ENDIF.      
ENDIF.      ls_headdata
-sales_view   'X'.      ls_plantdata

-plant       = <lfs_data>-werks.    " 工厂      ls_plantdatax
-plant      = <lfs_data>-werks.    " 工厂      ls_plantdata
-loadinggrp  = <lfs_data>-ladgr.    " 装载组      ls_plantdatax
-loadinggrp 'X'.                 " 装载组      ls_plantdata
-availcheck  = <lfs_data>-mtvfp .   " 可用性检查的检查组      ls_plantdatax
-availcheck 'X' .                " 可用性检查的检查组      ls_plantdata
-profit_ctr  = <lfs_data>-prctr .   " 利润中心      ls_plantdatax
-profit_ctr 'X' .                " 利润中心      
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        
EXPORTING          
input  = ls_plantdata-profit_ctr        
IMPORTING          
output = ls_plantdata-profit_ctr.      ls_clientdata

-division   = <lfs_data>-spart2.   " 产品组      ls_clientdatax
-division  'X' .                " 产品组      ls_clientdata
-trans_grp  = <lfs_data>-tragr.    " 运输组      ls_clientdatax
-trans_grp 'X' .                " 运输组      ls_clientdata
-batch_mgmt  = <lfs_data>-xchpf.    " 批次管理需求的标识      ls_clientdatax
-batch_mgmt 'X'.                 " 批次管理需求的标识      ls_salesdata

-sales_org   = <lfs_data>-vkorg.    " 销售组织      ls_salesdatax
-sales_org  = <lfs_data>-vkorg.    " 销售组织      ls_salesdata
-distr_chan  = <lfs_data>-vtweg.    " 分销渠道      ls_salesdatax
-distr_chan = <lfs_data>-vtweg.    " 分销渠道      ls_salesdata
-delyg_plnt  = <lfs_data>-dwerk.    " 交货工厂      ls_salesdatax
-delyg_plnt 'X'.                 " 交货工厂      ls_salesdata
-sales_unit  = lv_vrkme.            " 销售单位      ls_salesdatax
-sales_unit 'X'.                 " 销售单位      ls_salesdata
-acct_assgt  = <lfs_data>-ktgrm.    " 科目设置组      ls_salesdatax
-acct_assgt 'X'.                 " 科目设置组      ls_salesdata
-item_cat    = <lfs_data>-mtpos.    " 项目类别组      ls_salesdatax
-item_cat   'X'.                 " 项目类别组      ls_salesdata
-mat_pr_grp  = <lfs_data>-kondm.    " 物料价格组      ls_salesdatax
-mat_pr_grp 'X'.                 " 物料价格组      ls_mlan

-depcountry 'CN'.      ls_mlan
-tax_type_1 'MWST'.      ls_mlan
-taxclass_1 = <lfs_data>-taxm1.          " 物料的税分类      
APPEND ls_mlan TO lt_mlan.    
ENDIF.

*   采购视图    
IF cb_3 'X'.      ls_headdata
-purchase_view 'X'.      ls_plantdata
-plant        = <lfs_data>-werks.  " 工厂      ls_plantdatax
-plant       = <lfs_data>-werks.  " 工厂      ls_plantdata
-pur_group    = <lfs_data>-ekgrp.  " 采购组      ls_plantdatax
-pur_group   'X'.               " 采购组
*      ls_clientdata-po_unit     = <lfs_data>-bstme. " 订单单位
*      ls_clientdatax-po_unit    = 'X' .             " 订单单位      lv_flag 
= abap_on.    
ENDIF.

*   会计和成本视图    
IF cb_4 'X'.      ls_headdata
-account_view 'X'.      ls_headdata
-cost_view    'X'.      ls_plantdata
-plant       = <lfs_data>-werks.  " 工厂      ls_plantdatax
-plant      = <lfs_data>-werks.  " 工厂      ls_plantdata
-profit_ctr  = <lfs_data>-prctr2" 利润中心      ls_plantdatax
-profit_ctr 'X'.               " 利润中心      
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        
EXPORTING          
input  = ls_plantdata-profit_ctr        
IMPORTING          
output = ls_plantdata-profit_ctr.      ls_valuation

-val_area    = <lfs_data>-werks.  " 评估范围      ls_valuationx
-val_area   = <lfs_data>-werks.  " 评估范围      ls_valuation
-val_class   = <lfs_data>-bklas.  " 评估类      ls_valuationx
-val_class  'X'.               " 评估类      ls_valuation
-ml_settle   = <lfs_data>-mlast.  " 价格确定      ls_valuationx
-ml_settle  'X'.               " 价格确定      ls_valuation
-price_ctrl  = <lfs_data>-vprsv.  " 价格控制      ls_valuationx
-price_ctrl 'X'.               " 价格控制      ls_valuation
-price_unit  = <lfs_data>-peinh.  " 价格单位      ls_valuationx
-price_unit 'X'.               " 价格单位      ls_valuation
-std_price   = <lfs_data>-stprs.  " 标准价格      ls_valuationx
-std_price  'X'.               " 标准价格      ls_valuation
-moving_pr   = <lfs_data>-verpr.  " 移动平均价      ls_valuationx
-moving_pr  'X'.               " 移动平均价      ls_valuation
-qty_struct  = <lfs_data>-ekalr.  " 用QS的成本估算      ls_valuationx
-qty_struct 'X'.               " 用QS的成本估算      ls_valuation
-orig_mat    = <lfs_data>-hkmat.  " 物料来源      ls_valuationx
-orig_mat   'X'.               " 物料来源    

ENDIF.    

" MRP视图    
IF cb_6 'X'.      ls_headdata
-mrp_view     'X'.      ls_plantdata
-plant       = <lfs_data>-werks.  " 工厂      ls_plantdatax
-plant      = <lfs_data>-werks.  " 工厂      ls_plantdata

-proc_type    = <lfs_data>-beskz" 采购类型      ls_plantdatax
-proc_type   'X'.              " 采购类型      ls_plantdata
-mrp_group    = <lfs_data>-disgr" MRP组      ls_plantdatax
-mrp_group   'X'.              " MRP组      ls_plantdata
-mrp_type     = <lfs_data>-dismm" MRP类型      ls_plantdatax
-mrp_type    'X'.              " MRP类型      ls_plantdata
-mrp_ctrler   = <lfs_data>-dispo" MRP控制者      ls_plantdatax
-mrp_ctrler  'X'.              " MRP控制者      ls_plantdata
-period_ind   = <lfs_data>-perkz" 期间标识      ls_plantdatax
-period_ind  'X'.              " 期间标识      ls_plantdata
-lotsizekey   = <lfs_data>-disls" 批量程序      ls_plantdatax
-lotsizekey  'X'.              " 批量程序      ls_plantdata
-availcheck   = <lfs_data>-mtvfp2." 可用性检查      ls_plantdatax
-availcheck  'X'.              " 可用性检查      ls_plantdata
-safety_stk   = <lfs_data>-eisbe" 安全库存      ls_plantdatax
-safety_stk  'X'.              " 安全库存      ls_plantdata
-plan_strgp   = <lfs_data>-strgr" 计划策略组      ls_plantdatax
-plan_strgp  'X'.              " 计划策略组      ls_plantdata
-rep_manuf    = <lfs_data>-sauft" 重复制造标识      ls_plantdatax
-rep_manuf   'X'.              " 重复制造标识      ls_plantdata
-repmanprof   = <lfs_data>-sfepr" 重复生产参数文件      ls_plantdatax
-repmanprof  'X'.              " 重复生产参数文件    
ENDIF.    

CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'      
EXPORTING        headdata            
= ls_headdata        clientdata          
= ls_clientdata        clientdatax         
= ls_clientdatax        plantdata           
= ls_plantdata        plantdatax          
= ls_plantdatax        valuationdata       
= ls_valuation        valuationdatax      
= ls_valuationx        salesdata           
= ls_salesdata        salesdatax          
= ls_salesdatax      
IMPORTING        
return              = ls_return      
TABLES        materialdescription 
= lt_material        unitsofmeasure      
= lt_marm        unitsofmeasurex     
= lt_marmx        taxclassifications  
= lt_mlan.
*        extensionin         = lt_extensionin
*        extensioninx        = lt_extensioninx.    

IF ls_return-type 'E' OR ls_return-type 'A'.      <lfs_data>
-icon  = icon_red_light.    
ELSEIF ls_return-type 'S'.      <lfs_data>
-icon  = icon_green_light.    
ENDIF.    <lfs_data>

-msgtx = ls_return-message.    

IF rb_1 'X'.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.    
ELSE.      
IF ls_return-type 'E' OR ls_return-type 'A'.        
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      

ELSEIF ls_return-type 'S'.        
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'          
EXPORTING            
wait 'X'.        
" 分类视图        
IF cb_5 'X'.          
CLEAR lt_return[].          lv_objectkeynew 
= lv_matnr.          
CALL FUNCTION 'BAPI_OBJCL_CREATE'            
EXPORTING              objectkeynew   
= lv_objectkeynew              objecttablenew 
'MARA'              classnumnew    
= <lfs_data>-class              classtypenew   
= <lfs_data>-klart            
TABLES              
return         = lt_return.          
READ TABLE lt_return INTO ls_return WITH KEY type 'E'.          
IF sy-subrc EQ 0.            <lfs_data>
-icon  = icon_red_light.            <lfs_data>
-msgtx = ls_return-message.            
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.          
ELSE.            <lfs_data>
-icon  = icon_green_light.            
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'              
EXPORTING                
wait 'X'.          
ENDIF.        
ENDIF.
*        IF lv_flag = abap_on.
*          UPDATE mara SET ztbsrm  = abap_off
*           WHERE matnr   = <lfs_data>-matnr.
*          COMMIT WORK AND WAIT.
*        ENDIF.      
ENDIF.    
ENDIF.  
ENDLOOP.

ENDFORM.                    " SUB_DATA_BATCH_INPUT
*&---------------------------------------------------------------------*
*&       Form SUB_GET_DATA
*&---------------------------------------------------------------------*
*&       抽取数据
*&---------------------------------------------------------------------*
FORM sub_get_data .

* 抽取常规物料数据  
PERFORM sub_get_mara.

ENDFORM.
*&---------------------------------------------------------------------*
*&       Form SUB_GET_MARA
*&---------------------------------------------------------------------*
*&       抽取常规物料数据
*&---------------------------------------------------------------------*
FORM sub_get_mara .  
SELECT a~matnr               "物料号         a
~mbrsh               "行业领域         a
~mtart               "物料类型         a
~meins               "基本单位         a
~matkl               "物料组         a
~mstae               "跨工厂物料状态
*         a~zwldl               "物料大类
*         a~zwlzl               "物料中类
*         a~zwlsl               "物料小类
*         a~zwlxl               "物料细类
*         a~zggxh               "详细规格型号
*         a~ztbsrm     AS zflag "同步状态
*         a~ztbsrmdate AS zdate "上次同步日期         b
~werks               "工厂         b
~ekgrp               "采购组         
c~maktx               "物料描述    
FROM mara AS a   INNER 
JOIN marc AS b      
ON a~matnr = b~matnr    
LEFT JOIN makt AS c      
ON a~matnr c~matnr     
AND c~spras '1'    
INTO CORRESPONDING FIELDS OF TABLE gt_data2   
WHERE a~mtart  <> 'A00Z'.
*     AND a~ztbsrm  = space
*     AND a~matnr  IN s_matnr
*     AND a~laeda  IN s_laeda.  

IF sy-subrc <> 0.    
MESSAGE s002(zmm_01) DISPLAY LIKE 'E'.    
LEAVE LIST-PROCESSING.  
ELSE.    
SORT gt_data2 BY matnr ASCENDING                     werks 
ASCENDING.    
LOOP AT gt_data2 INTO gs_data2.
*添加校验权限      
AUTHORITY-CHECK OBJECT 'Z_MATE_WRK'      
ID 'WERKS' FIELD gs_data2-werks      
ID 'ACTVT' FIELD  '03'.      
IF sy-subrc <> 0.        
DELETE gt_data2.        
CONTINUE.      
ENDIF.    
ENDLOOP.    
IF gt_data2[] IS INITIAL.      
MESSAGE s398(00WITH '该用户没有此工厂权限!' DISPLAY LIKE 'E'.      
LEAVE LIST-PROCESSING.    
ENDIF.  
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&       Form SUB_DATA_TRANSFER
*&---------------------------------------------------------------------*
*&       同步SRM处理
*&---------------------------------------------------------------------*
FORM sub_data_transfer .

*  DATA: lt_data2    TYPE STANDARD TABLE OF ty_data2,
*        ls_material TYPE zxybc01_material_vo,
*        ls_plant    TYPE zxybc01_material_factory_vo,
*        ls_data2    TYPE ty_data2,
*        ls_msge     TYPE zsha047_msgout,
*        lv_err      TYPE i,
*        lv_ok       TYPE i,
*        lv_index    TYPE i.
*
*  lt_data2 = gt_data2.
*  IF sy-batch = abap_off.
*    DELETE lt_data2 WHERE ckbox = abap_off OR zflag = abap_on.
*  ENDIF.
*
*  SORT lt_data2 BY matnr ASCENDING
*                   werks ASCENDING.
*
*  LOOP AT lt_data2 INTO gs_data2.
*
*    ls_data2 = gs_data2.
*    AT NEW matnr.
*      CLEAR: lv_index,
*             ls_material,
*             ls_msge.
*      ls_material-material_code       = ls_data2-matnr.
*      ls_material-material_name       = ls_data2-maktx.
*      ls_material-material_desc       = ls_data2-zggxh.
*      ls_material-base_unit_code      = ls_data2-meins.
*      ls_material-industry_field      = ls_data2-mbrsh.
*      "ls_material-material_type_code  = ls_data2-mtart.
*      ls_material-material_type_code  = ls_data2-zggxh.
*      ls_material-material_group_code = ls_data2-matkl.
*      IF ls_data2-mstae IS INITIAL.
*        ls_material-status              = 0.
*      ELSE.
*        ls_material-status              = 1.
*      ENDIF.
*      ls_material-material_large      = ls_data2-zwldl.
*      ls_material-material_middle     = ls_data2-zwlzl.
*      ls_material-material_small      = ls_data2-zwlsl.
*      ls_material-material_detail     = ls_data2-zwlxl.
*    ENDAT.
*
*    lv_index = lv_index + 1.
*    ls_plant-plant_code   = ls_data2-werks.
*    ls_plant-p_group_code = ls_data2-ekgrp.
*    APPEND ls_plant TO ls_material-material_factory_vos.
*
*    AT END OF matnr.
*
*      CALL FUNCTION 'ZYBC01_IFX004'
*        EXPORTING
*          is_input = ls_material
*        IMPORTING
*          es_msgr  = ls_msge.
*
*      IF ls_msge-msgty = 'E'.
*        ls_data2-icon = icon_red_light.
*        lv_err = lv_err + lv_index.
*      ELSE.
*        ls_data2-icon  = icon_green_light.
*        ls_data2-zflag = abap_on.
*        ls_data2-zdate = sy-datum.
*        lv_ok = lv_ok + lv_index.
*        UPDATE mara SET ztbsrm     = abap_on
*                        ztbsrmdate = sy-datum
*                  WHERE matnr = gs_data2-matnr.
*        COMMIT WORK AND WAIT.
*      ENDIF.
*
*      ls_data2-msgtx = ls_msge-msgtx.
*      MODIFY gt_data2 FROM ls_data2 TRANSPORTING icon msgtx zflag zdate
*                      WHERE matnr = gs_data2-matnr
*                        AND ckbox = abap_on.
*    ENDAT.
*  ENDLOOP.
*
*  IF sy-subrc <> 0.
*    MESSAGE '没有需要要同步的数据' TYPE 'E'.
*  ELSE.
*    IF lv_err > 0 AND lv_ok > 0.
*      IF sy-batch = abap_on.
*        MESSAGE e003(zmm_01) WITH lv_ok lv_err.
*      ELSE.
*        MESSAGE s003(zmm_01) WITH lv_ok lv_err DISPLAY LIKE 'E'.
*      ENDIF.
*    ELSEIF lv_err > 0 AND lv_ok = 0.
*      IF sy-batch = abap_on.
*        MESSAGE e005(zmm_01) WITH lv_err.
*      ELSE.
*        MESSAGE s005(zmm_01) WITH lv_err DISPLAY LIKE 'E'.
*      ENDIF.
*    ELSE.
*      MESSAGE s004(zmm_01) WITH lv_ok.
*    ENDIF.
*  ENDIF.
ENDFORM.

 

 

posted @ 2021-12-17 11:14  東東東東  阅读(511)  评论(0编辑  收藏  举报