批导自动生成模板-自动化

*REPORT  zcode_generator_batch_input.
REPORT  zme21n_cancel.

TYPE-POOLS: ole2.

TABLES: sscrfields.
SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (28) text1.
SELECTION-SCREEN POSITION 29.
PARAMETERS p_prog TYPE programm.
SELECTION-SCREEN PUSHBUTTON 74(10) gen USER-COMMAND gen.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (28) text2.
SELECTION-SCREEN POSITION 29.
PARAMETERS p_addr1 TYPE char4 DEFAULT 'A2'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (28) text3.
SELECTION-SCREEN POSITION 29.
PARAMETERS p_addr2 TYPE char10 DEFAULT ''.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (28) text4.
SELECTION-SCREEN POSITION 29.
PARAMETERS p_fname TYPE filename LOWER CASE DEFAULT '导入模板.xls'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN ULINE.

SELECTION-SCREEN COMMENT /1(79) cmt1.
SELECTION-SCREEN COMMENT /1(79) cmt2.
SELECTION-SCREEN COMMENT /1(79) cmt3.
SELECTION-SCREEN COMMENT /1(79) cmt4.
SELECTION-SCREEN COMMENT /1(79) cmt5.
SELECTION-SCREEN COMMENT /1(79) cmt6.
SELECTION-SCREEN END OF BLOCK 001.

SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN FUNCTION KEY 3.
SELECTION-SCREEN FUNCTION KEY 4.

*----------------------------------------------------------------------*
*       CLASS lcl_alv_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_f4             FOR EVENT onf4
                  OF cl_gui_alv_grid
        IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells.
ENDCLASS.                    "lcl_alv_event_handler DEFINITION

TYPES:
  BEGIN OF typ_field,
    fieldname TYPE fieldname,
    ref_table TYPE lvc_rtname,
    ref_field TYPE lvc_rfname,
    convexit  TYPE convexit,
    scrtext_l TYPE scrtext_l,
    typ_field TYPE c LENGTH 60,
    mark      TYPE c LENGTH 60,
  END OF typ_field.

DATA:
  go_docking_con  TYPE REF TO cl_gui_docking_container,
  go_alv_fields   TYPE REF TO cl_gui_alv_grid,
  go_event_fields TYPE REF TO lcl_alv_event_handler.

DATA:
  gt_fields TYPE TABLE OF typ_field,
  gs_field  TYPE typ_field.

DATA:
  gt_fieldcat_fields TYPE lvc_t_fcat,
  gs_fieldcat        TYPE lvc_s_fcat,
  gt_f4_fields       TYPE lvc_t_f4,
  gs_f4              TYPE lvc_s_f4,
  gt_exclude         TYPE ui_functions,
  gs_layout          TYPE lvc_s_layo.

DATA:
  ok_code      TYPE sy-ucomm,
  g_flag_error TYPE c,
  g_indxid     TYPE indx_srtfd,
  gt_codes     TYPE TABLE OF string,
  g_code       TYPE string,
  go_excel     TYPE ole2_object,
  go_books     TYPE ole2_object,
  go_book      TYPE ole2_object,
  go_sheet     TYPE ole2_object,
  go_cell      TYPE ole2_object,
  g_row        TYPE i,
  g_col        TYPE i,
  g_value      TYPE string.

DEFINE d_build_fieldcat.
  gs_fieldcat-fieldname  = &3.
  gs_fieldcat-checkbox   = &4.
  gs_fieldcat-f4availabl = &5.
  gs_fieldcat-outputlen  = &6.
  gs_fieldcat-ref_table  = &7.
  gs_fieldcat-ref_field  = &8.
  gs_fieldcat-coltext    = &9.
  APPEND gs_fieldcat TO &1.
  CLEAR gs_fieldcat.

  IF &5 = 'X'.
    gs_f4-fieldname = &3.
    gs_f4-register = 'X'.
    INSERT gs_f4 INTO TABLE &2.
    CLEAR gs_f4.
  ENDIF.
END-OF-DEFINITION.

DEFINE append_code.
  APPEND &1 TO gt_codes.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
*       CLASS lcl_alv_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_handler IMPLEMENTATION .
  METHOD handle_f4.
    PERFORM handle_f4 USING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells.
  ENDMETHOD.                                                "HANDLE_F4
ENDCLASS.                    "lcl_alv_event_handler IMPLEMENTATION

INITIALIZATION.
  sy-title = '自动生成程序系列——自动生成批导程序框架(微信公众号:SAP亮亮)'.
  title1 = '参数设置'.
  text1 = '程序(SMW0中模板文件ID与程序名相同)'.
  text2 = '数据区域的左上角地址'.
  text3 = '数据区域的右下角地址(可不填)'.
  text4 = '文件模板名称'.
  gen = '生成程序'.
  cmt1 = '说明:'.
  cmt2 = '1、生成程序前,请手动创建Report类型的程序,并激活'.
  cmt3 = '2、为使生成的程序可以“下载模板”的功能,请在SMW0中使用与程序名称相同的ID上传Excel模板'.
  cmt4 = '3、本程序自动COPY标准的ALV GUI状态到生成程序,但需要手动激活'.
  cmt5 = '4、需要手动为GUI状态STATUS_ALV增加两个按钮IMPORT和ERRORS,用以“导入数据”和“显示错误”'.
  cmt6 = '5、程序中预留了调用BDC的Form,内有宏代码、示例代码'.
  sscrfields-functxt_01 = '保存设置'.
  sscrfields-functxt_02 = '加载设置'.
  sscrfields-functxt_03 = '下载到Excel'.
  sscrfields-functxt_04 = '从Excel上载'.

AT SELECTION-SCREEN OUTPUT.
  CHECK go_docking_con IS INITIAL.
  "创建容器
  CREATE OBJECT go_docking_con
    EXPORTING
      ratio = 65
      side  = cl_gui_docking_container=>dock_at_bottom.

  "创建FIELDS的ALV
  CREATE OBJECT go_alv_fields
    EXPORTING
      i_parent = go_docking_con.

  "事件响应
  CREATE OBJECT go_event_fields.
  SET HANDLER go_event_fields->handle_f4 FOR go_alv_fields.

  "显示ALV
  PERFORM alv_prepare_toolbar   TABLES    gt_exclude.
  PERFORM alv_prepare_layout    CHANGING  gs_layout.

  d_build_fieldcat:
    gt_fieldcat_fields  gt_f4_fields  'FIELDNAME'  ' '  ' '  15  'DD03L'  'FIELDNAME'    '字段名',
    gt_fieldcat_fields  gt_f4_fields  'REF_TABLE'  ' '  'X'  16  'DD03L'  'TABNAME'      '参照表',
    gt_fieldcat_fields  gt_f4_fields  'REF_FIELD'  ' '  'X'  20  'DD03L'  'FIELDNAME'    '参照字段',
    gt_fieldcat_fields  gt_f4_fields  'CONVEXIT'   ' '  'X'   7  'DD01D'  'CONVEXIT'     '转换例程',
    gt_fieldcat_fields  gt_f4_fields  'SCRTEXT_L'  ' '  ' '  30  'DD04T'  'SCRTEXT_L'    '字段描述'.
  gs_layout-grid_title = '字段设置'.
  CALL METHOD go_alv_fields->set_table_for_first_display
    EXPORTING
      it_toolbar_excluding = gt_exclude
      is_layout            = gs_layout
    CHANGING
      it_outtab            = gt_fields
      it_fieldcatalog      = gt_fieldcat_fields.

  "注册事件
  go_alv_fields->register_f4_for_fields( EXPORTING it_f4 = gt_f4_fields ).
  go_alv_fields->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
  PERFORM f4_prog.

AT SELECTION-SCREEN.
  go_alv_fields->check_changed_data( ).

  g_indxid = p_prog && 'GB'.
  ok_code = sy-ucomm.
  CLEAR sy-ucomm.
  CASE ok_code.
    WHEN 'FC01'.
      EXPORT fields = gt_fields TO DATABASE indx(st) ID g_indxid.
    WHEN 'FC02'.
      IMPORT fields = gt_fields FROM DATABASE indx(st) ID g_indxid.
      PERFORM alv_refresh_display.
    WHEN 'FC03'.
      PERFORM download.
    WHEN 'FC04'.
      PERFORM upload.
      PERFORM alv_refresh_display.
    WHEN 'GEN'.
      PERFORM check.
      CHECK g_flag_error IS INITIAL.
      PERFORM process_data.
      PERFORM generate.
  ENDCASE.

*&---------------------------------------------------------------------*
*&      Form  alv_prepare_toolbar
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_prepare_toolbar  TABLES  pt_exclude TYPE ui_functions.
  REFRESH: pt_exclude.

  APPEND cl_gui_alv_grid=>mc_fc_maximum TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_minimum TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_subtot TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_sum TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_average TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_sum TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_subtot TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_sort_asc TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_sort_dsc TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_find TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_filter TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_print TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_print_prev TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_graph TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_view TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_detail TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_help TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_info TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_variant TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_refresh TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_check TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy TO pt_exclude.
*  APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO pt_exclude.
*  APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO pt_exclude.
*  APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_fc_loc_cut TO pt_exclude.
  APPEND cl_gui_alv_grid=>mc_mb_paste TO pt_exclude.
ENDFORM.                    "alv_prepare_toolbar
*&---------------------------------------------------------------------*
*&      Form  alv_prepare_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_LAYOUT  text
*----------------------------------------------------------------------*
FORM alv_prepare_layout  CHANGING ps_layout TYPE lvc_s_layo.
  ps_layout-zebra = 'X'.
  ps_layout-sel_mode = 'A'.
  ps_layout-smalltitle = 'X'.
  ps_layout-edit = 'X'.
ENDFORM.                    "alv_prepare_layout
*&---------------------------------------------------------------------*
*&      Form  handle_f4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_f4  USING           e_fieldname TYPE lvc_fname
                                e_fieldvalue TYPE lvc_value
                                es_row_no TYPE lvc_s_roid
                                er_event_data TYPE REF TO cl_alv_event_data
                                et_bad_cells TYPE lvc_t_modi.
  DATA: ls_row      TYPE lvc_s_row,
        ls_col      TYPE lvc_s_col,
        ls_modi     TYPE lvc_s_modi,
        l_tabname   TYPE tabname,
        l_fieldtext TYPE fieldtext,
        l_convexit  TYPE convexit.
  FIELD-SYMBOLS: <lt_modi> TYPE lvc_t_modi.

  er_event_data->m_event_handled = 'X'.

  CASE e_fieldname.
    WHEN 'REF_TABLE'.
      PERFORM f4_dd_table(rsaqddic) USING 'SAPLAQJD_CNTRL'
                                          '0300'
                                          'G_DYN_0300-TNAME'
                                    CHANGING e_fieldvalue.  "搜索帮助代码,来于SQVI中“插入表”的搜索帮助

    WHEN 'REF_FIELD'.
      READ TABLE gt_fields INDEX es_row_no-row_id INTO gs_field.
      CHECK gs_field-ref_table IS NOT INITIAL.
      l_tabname = gs_field-ref_table.
      l_fieldtext = gs_field-scrtext_l.
      l_convexit = gs_field-convexit.

      PERFORM f4_field USING l_tabname CHANGING e_fieldvalue l_fieldtext l_convexit.

    WHEN 'CONVEXIT'.
      PERFORM f4_convexit CHANGING e_fieldvalue.

    WHEN OTHERS.
      EXIT.
  ENDCASE.

  ASSIGN er_event_data->m_data->* TO <lt_modi>.
  ls_modi-row_id    = es_row_no-row_id."
  ls_modi-fieldname = e_fieldname.
  ls_modi-value     = e_fieldvalue.
  APPEND ls_modi TO <lt_modi>.
  IF e_fieldname = 'REF_FIELD'.
    ls_modi-row_id    = es_row_no-row_id."
    ls_modi-fieldname = 'SCRTEXT_L'.
    ls_modi-value     = l_fieldtext.
    APPEND ls_modi TO <lt_modi>.

    ls_modi-row_id    = es_row_no-row_id."
    ls_modi-fieldname = 'CONVEXIT'.
    ls_modi-value     = l_convexit.
    APPEND ls_modi TO <lt_modi>.
  ENDIF.

ENDFORM.                                                    "handle_f4
*&---------------------------------------------------------------------*
*&      Form  F4_PROG
*&---------------------------------------------------------------------*
*       程序名称的搜索帮助(同SE38)
*----------------------------------------------------------------------*
FORM f4_prog .
  DATA: lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.

  lt_dynpfields-fieldname  = 'P_PROG'.
  APPEND lt_dynpfields.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname     = sy-repid
      dynumb     = sy-dynnr
    TABLES
      dynpfields = lt_dynpfields[].

  READ TABLE lt_dynpfields INDEX 1.
  p_prog = lt_dynpfields-fieldvalue.

  CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
    EXPORTING
      object_type          = 'PROG'
      object_name          = p_prog
      suppress_selection   = 'X'
    IMPORTING
      object_name_selected = p_prog
    EXCEPTIONS
      cancel               = 01.
ENDFORM.                                                    " F4_PROG
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       处理数据
*----------------------------------------------------------------------*
FORM process_data .
  LOOP AT gt_fields INTO gs_field.
    IF gs_field-ref_table IS INITIAL.
      gs_field-typ_field = gs_field-ref_field.
    ELSE.
      gs_field-typ_field = gs_field-ref_table && '-' && gs_field-ref_field.
    ENDIF.
    CONCATENATE '          "' gs_field-scrtext_l INTO gs_field-mark.
    MODIFY gt_fields FROM gs_field TRANSPORTING typ_field mark.
  ENDLOOP.
ENDFORM.                    " PROCESS_DATA

*&---------------------------------------------------------------------*
*&      Form  generate
*&---------------------------------------------------------------------*
*       生成程序
*----------------------------------------------------------------------*
FORM generate.
  DATA: l_rc(5).
  REFRESH gt_codes.

  CHECK p_prog(1) = 'Y' OR p_prog(1) = 'Z'.

  IF strlen( p_prog ) > 20.
    MESSAGE '程序名长度不能超过20' TYPE 'E' DISPLAY LIKE 'I'.  "主要是因为EXPORT TO DATABASE时INDXID的长度为22位的限制
  ENDIF.

  SELECT SINGLE progname INTO p_prog FROM reposrc WHERE progname = p_prog.
  IF sy-subrc = 0.
*    MESSAGE '程序已经存在' TYPE 'E' DISPLAY LIKE 'I'.
  ENDIF.

  "程序名
  PERFORM gen_report_name.
  "TYPE-POOLS、TABLES等
  PERFORM gen_includes.
  "SELECTION-SCREEN
  PERFORM gen_selection_screen.
  "类型定义
  PERFORM gen_types.
  "数据定义
  PERFORM gen_data_defination.
  "宏定义
  PERFORM gen_macro_defination.
  "初始化
  PERFORM gen_initialization.
  "AT SELECTION-SCREEN
  PERFORM gen_at_selection_screen.
  "START-OF-SELECTION
  PERFORM gen_start_of_selection.
  "FORM CHECK_AUTH
  PERFORM gen_form_check_auth.
  "FORM UPLOAD_DATA
  PERFORM gen_form_upload_data.
  "FORM CHECK_DATA
  PERFORM gen_form_check_data.
  "FORM SELECT_EXCEL_FILE
  PERFORM gen_form_select_excel_file.
  "FORM SET_STATUS_BAR
  PERFORM gen_form_set_status_bar.
  "FORM DOWNLOAD_TEMPLATE
  PERFORM gen_form_download_template.
  "FORM DISPLAY_DATA
  PERFORM gen_form_display_data.
  "FORM PF_STATUS_ALV
  PERFORM gen_form_pf_status_alv.
  "FORM USER_COMMAND_ALV
  PERFORM gen_form_user_command_alv.
  "FORM CALL_BDC
  PERFORM gen_form_call_bdc.

  INSERT REPORT p_prog FROM gt_codes.

  PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND
    USING 'X' 'SAPLKKBL' p_prog 'STANDARD_FULLSCREEN' 'STATUS_ALV'
    CHANGING l_rc.
ENDFORM.                    "GENERATE
*&---------------------------------------------------------------------*
*&      Form  GEN_REPORT_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_report_name .
  CONCATENATE 'REPORT' p_prog INTO g_code SEPARATED BY space.
  g_code = g_code && '.'.
  append_code: g_code, ''.
ENDFORM.                    " GEN_REPORT_NAME
*&---------------------------------------------------------------------*
*&      Form  GEN_INCLUDES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_includes .
  append_code:
    'TYPE-POOLS:OLE2.    ',
    '                    ',
    'TABLES: SSCRFIELDS. ',
    '                    '.
ENDFORM.                    " GEN_INCLUDES
*&---------------------------------------------------------------------*
*&      Form  GEN_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_selection_screen .
  append_code:
    'SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE TITLE1.       ',
    'PARAMETERS P_FILE TYPE C LENGTH 1024 LOWER CASE.                   ',
    'SELECTION-SCREEN END OF BLOCK 001.                                 ',
    'SELECTION-SCREEN FUNCTION KEY 1.                                   ',
    '                                                                   '.
ENDFORM.                    " GEN_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*&      Form  GEN_TYPES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_types .
  DATA: l_mark TYPE c LENGTH 60.

  append_code:
    'TYPES:',
    '  BEGIN OF TY_EXCEL,'.
  LOOP AT gt_fields INTO gs_field.
    CONCATENATE gs_field-fieldname 'TYPE' gs_field-typ_field INTO g_code SEPARATED BY space.
    CONCATENATE g_code ',' gs_field-mark INTO g_code.
    SHIFT g_code RIGHT BY 4 PLACES.
    append_code g_code.
  ENDLOOP.

  append_code:
    '  END OF TY_EXCEL,                  ',
    '                                    ',
    '  BEGIN OF TY_ALV,                  ',
    '    SEL TYPE C.                     ',
    '        INCLUDE TYPE TY_EXCEL.      ',
    'TYPES:                              ',
    '  END OF TY_ALV.                    ',
    '                                    '.
ENDFORM.                    " GEN_TYPES
*&---------------------------------------------------------------------*
*&      Form  GEN_DATA_DEFINATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_data_defination .
  append_code:
    'DATA: GT_FIELDCAT TYPE LVC_T_FCAT,                    ',
    '      GS_FIELDCAT TYPE LVC_S_FCAT,                    ',
    '      GS_LAYOUT TYPE LVC_S_LAYO,                      ',
    '      G_OBJID LIKE WWWDATA-OBJID VALUE SY-REPID,      ',
    '      GS_EXCEL TYPE TY_EXCEL,                         ',
    '      GT_EXCEL TYPE TABLE OF TY_EXCEL,                ',
    '      GS_ALV TYPE TY_ALV,                             ',
    '      GT_ALV TYPE TABLE OF TY_ALV.                    ',
    '                                                      '.
ENDFORM.                    " GEN_DATA_DEFINATION
*&---------------------------------------------------------------------*
*&      Form  gen_macro_defination
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_macro_defination .
  append_code:
    'DEFINE D_BUILD_FIELDCAT.                         ',
    '  GS_FIELDCAT-FIELDNAME     = &1.                ',
    '  GS_FIELDCAT-QFIELDNAME    = &2.                ',
    '  GS_FIELDCAT-CFIELDNAME    = &3.                ',
    '  GS_FIELDCAT-REF_TABLE     = &4.                ',
    '  GS_FIELDCAT-REF_FIELD     = &5.                ',
    '  GS_FIELDCAT-CONVEXIT      = &6.                ',
    '  GS_FIELDCAT-EMPHASIZE     = &7.                ',
    '  GS_FIELDCAT-SCRTEXT_L     = &8.                ',
    '  GS_FIELDCAT-COLDDICTXT    = ''L''.             ',
    '  APPEND GS_FIELDCAT TO GT_FIELDCAT.             ',
    '  CLEAR: GS_FIELDCAT.                            ',
    'END-OF-DEFINITION.                               ',
    '                                                 '.
ENDFORM.                    "gen_macro_defination
*&---------------------------------------------------------------------*
*&      Form  GEN_INITIALIZATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_initialization .
  append_code:
    'INITIALIZATION.                                            ',
    '  TITLE1 = ''选择条件''.                                   ',
    '  %_P_FILE_%_APP_%-TEXT = ''选择文件''.                    ',
    '  SSCRFIELDS-FUNCTXT_01 = ''@49@下载模板''.                ',
    '                                                           '.
ENDFORM.                    " GEN_INITIALIZATION
*&---------------------------------------------------------------------*
*&      Form  GEN_AT_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_at_selection_screen .
  append_code:
    'AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.                                         ',
    '  PERFORM SELECT_EXCEL_FILE CHANGING P_FILE.                                             ',
    '                                                                                         ',
    'AT SELECTION-SCREEN.                                                                     ',
    '  CASE SSCRFIELDS-UCOMM.                                                                 ',
    '    WHEN ''FC01''.                                                                       '.
  CONCATENATE '      PERFORM DOWNLOAD_TEMPLATE USING G_OBJID ''XLS'' ''' p_fname '''.' INTO g_code.
  append_code g_code.
  append_code:
    '  ENDCASE.                                                                               ',
    '                                                                                         ',
    '  "检查权限                                                                                  ',
    '  PERFORM CHECK_AUTH.                                                                    ',
    '                                                                                         '.
ENDFORM.                    "GEN_AT_SELECTION_SCREEN
*&---------------------------------------------------------------------*
*&      Form  GEN_START_OF_SELECTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_start_of_selection .
  append_code:
    'START-OF-SELECTION.                                                                  ',
    '  IF P_FILE IS INITIAL.                                                              ',
    '    MESSAGE ''请选择文件'' TYPE ''S''.                                               ',
    '    LEAVE LIST-PROCESSING.                                                           ',
    '  ENDIF.                                                                             ',
    '                                                                                     ',
    '  "读取文件                                                                          '.
  CONCATENATE '  PERFORM UPLOAD_DATA USING ''' p_addr1 '''  ''' p_addr2 '''.  "数据开始的单元格,可根据实际情况更改' INTO g_code.
  append_code g_code.
  append_code:
    '  PERFORM CHECK_DATA.                                                                ',
    '  PERFORM DISPLAY_DATA.                                                              ',
    '                                                                                     '.
ENDFORM.                    " GEN_START_OF_SELECTION
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_CHECK_AUTH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_check_auth.
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  CHECK_AUTH                                                ',
    '*&---------------------------------------------------------------------*',
    '*       检查权限                                                        ',
    '*----------------------------------------------------------------------*',
    'FORM CHECK_AUTH.                                                        ',
    '*  AUTHORITY-CHECK OBJECT ''M_BANF_WRK''                                ',
    '*           ID ''ACTVT'' FIELD ''01''                                   ',
    '*           ID ''WERKS'' FIELD P_WERKS.                                 ',
    '*  IF SY-SUBRC <> 0.                                                    ',
    '*    MESSAGE ''您没有该工厂的操作权限'' TYPE ''E''.                     ',
    '*  ENDIF.                                                               ',
    'ENDFORM.                    "CHECK_AUTH                                 '.
ENDFORM.                    "GEN_FORM_CHECK_AUTH
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_upload_data .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  UPLOAD_DATA                                               ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM UPLOAD_DATA USING P_TOP_LEFT_ADDR TYPE STRING                      ',
    '                       P_BOTTOM_RIGHT_ADDR TYPE STRING.                 ',
    '                                                                        ',
    '  DATA: BEGIN OF LT_LINES OCCURS 0,                                     ',
    '          ROW(4096) TYPE C,                                             ',
    '        END OF LT_LINES,                                                ',
    '        BEGIN OF LT_FIELDS OCCURS 0,                                    ',
    '          VALUE(500) TYPE C,                                            ',
    '        END OF LT_FIELDS,                                               ',
    '        LO_EXCEL TYPE OLE2_OBJECT,                                      ',
    '        LO_BOOKS TYPE OLE2_OBJECT,                                      ',
    '        LO_BOOK TYPE OLE2_OBJECT,                                       ',
    '        LO_SHEET TYPE OLE2_OBJECT,                                      ',
    '        LO_USEDRANGE TYPE OLE2_OBJECT,                                  ',
    '        LO_USEDROWS TYPE OLE2_OBJECT,                                   ',
    '        LO_USEDCOLS TYPE OLE2_OBJECT,                                   ',
    '        LO_CELL_BOTTOM_RIGHT TYPE OLE2_OBJECT,                          ',
    '        LO_RANGE TYPE OLE2_OBJECT,                                      ',
    '        LO_CELL_TOP_LEFT TYPE OLE2_OBJECT,                              ',
    '        L_TOPROW TYPE I,                                                ',
    '        L_LEFTCOL TYPE I,                                               ',
    '        L_USEDROWS TYPE I,                                              ',
    '        L_USEDCOLS TYPE I,                                              ',
    '        L_MAXROW TYPE I,                                                ',
    '        L_MAXCOL TYPE I,                                                ',
    '        L_ADDR TYPE STRING,                                             ',
    '        L_ROWINDEX TYPE STRING,                                         ',
    '        L_COUNT TYPE STRING,                                            ',
    '        L_MSG TYPE STRING.                                              ',
    '  FIELD-SYMBOLS <L_FIELDVALUE> TYPE ANY.                                ',
    '                                                                        ',
    '  "创建EXCEL程序                                                        ',
    '  CREATE OBJECT LO_EXCEL ''EXCEL.APPLICATION''.                         ',
    '  IF SY-SUBRC <> 0.                                                     ',
    '    MESSAGE ''创建EXCEL APPLICATION失败!'' TYPE ''S'' DISPLAY LIKE ''E''.',
    '    LEAVE LIST-PROCESSING.                                              ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  "打开EXCEL文件                                                        ',
    '  GET PROPERTY OF LO_EXCEL ''WORKBOOKS'' = LO_BOOKS.                    ',
    '  CALL METHOD OF LO_BOOKS ''OPEN'' = LO_BOOK                            ',
    '    EXPORTING                                                           ',
    '      #1       = P_FILE.                                                ',
    '  IF SY-SUBRC <> 0.                                                     ',
    '    MESSAGE ''打开EXCEL文件失败!'' TYPE ''S'' DISPLAY LIKE ''E''.      ',
    '    LEAVE LIST-PROCESSING.                                              ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  "取最大行和最大列                                                     ',
    '  GET PROPERTY OF LO_EXCEL ''ACTIVESHEET'' = LO_SHEET.                  ',
    '  GET PROPERTY OF LO_SHEET ''USEDRANGE'' = LO_USEDRANGE.                ',
    '  GET PROPERTY OF LO_USEDRANGE ''ROW'' = L_TOPROW.                      ',
    '  GET PROPERTY OF LO_USEDRANGE ''COLUMN'' = L_LEFTCOL.                  ',
    '  GET PROPERTY OF LO_USEDRANGE ''ROWS'' = LO_USEDROWS.                  ',
    '  GET PROPERTY OF LO_USEDROWS ''COUNT'' = L_USEDROWS.                   ',
    '  GET PROPERTY OF LO_USEDRANGE ''COLUMNS'' = LO_USEDCOLS.               ',
    '  GET PROPERTY OF LO_USEDCOLS ''COUNT'' = L_USEDCOLS.                   ',
    '  L_MAXROW = L_TOPROW + L_USEDROWS - 1.                                 ',
    '  L_MAXCOL = L_LEFTCOL + L_USEDCOLS - 1.                                ',
    '                                                                        ',
    '  "确定数据范围                                                         ',
    '  IF P_BOTTOM_RIGHT_ADDR IS INITIAL.                                    ',
    '    GET PROPERTY OF LO_SHEET ''CELLS'' = LO_CELL_BOTTOM_RIGHT           ',
    '      EXPORTING                                                         ',
    '        #1       = L_MAXROW                                             ',
    '        #2       = L_MAXCOL.                                            ',
    '    GET PROPERTY OF LO_SHEET ''RANGE'' = LO_RANGE                       ',
    '      EXPORTING                                                         ',
    '        #1       = P_TOP_LEFT_ADDR                                      ',
    '        #2       = LO_CELL_BOTTOM_RIGHT.                                ',
    '  ELSE.                                                                 ',
    '    GET PROPERTY OF LO_SHEET ''RANGE'' = LO_RANGE                       ',
    '      EXPORTING                                                         ',
    '        #1       = P_TOP_LEFT_ADDR                                      ',
    '        #2       = P_BOTTOM_RIGHT_ADDR.                                 ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  "检查是否存在数据                                                     ',
    '  GET PROPERTY OF LO_RANGE ''ROW'' = L_TOPROW.                          ',
    '  GET PROPERTY OF LO_RANGE ''COLUMN'' = L_LEFTCOL.                      ',
    '  GET PROPERTY OF LO_SHEET ''CELLS'' = LO_CELL_TOP_LEFT                 ',
    '    EXPORTING                                                           ',
    '      #1       = L_TOPROW                                               ',
    '      #2       = L_LEFTCOL.                                             ',
    '  GET PROPERTY OF LO_CELL_TOP_LEFT ''ADDRESS'' = L_ADDR                 ',
    '    EXPORTING                                                           ',
    '      #1 = 0                                                            ',
    '      #2 = 0.                                                           ',
    '  IF L_ADDR <> P_TOP_LEFT_ADDR. "无数据                                 ',
    '    CALL METHOD OF LO_BOOK ''CLOSE''.                                   ',
    '    CALL METHOD OF LO_EXCEL ''QUIT''.                                   ',
    '    MESSAGE ''文件中无有效数据!'' TYPE ''S'' DISPLAY LIKE ''E''.       ',
    '    LEAVE LIST-PROCESSING.                                              ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  "替换CHR(13)+CHR(10) WITH CHR(10) 【CHR(13)属于EXCEL单元格内容中的非正常输入字符,必会导致ABAP内表数据串行】',
    '  SET PROPERTY OF LO_EXCEL ''DISPLAYALERTS'' = 0.                       ',
    '  CALL METHOD OF LO_RANGE ''REPLACE''                                   ',
    '    EXPORTING                                                           ',
    '      #1        = CL_ABAP_CHAR_UTILITIES=>CR_LF             "000D000A CHR(13) + CHR(10)',
    '      #2        = CL_ABAP_CHAR_UTILITIES=>NEWLINE.          "000A CHR(10)',
    '                                                                        ',
    '  "复制数据                                                             ',
    '  CALL METHOD OF LO_RANGE ''COPY''.                                     ',
    '  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT                ',
    '    IMPORTING                                                           ',
    '      DATA   = LT_LINES[]                                               ',
    '    EXCEPTIONS                                                          ',
    '      OTHERS = 1.                                                       ',
    '                                                                        ',
    '  "关闭EXCEL                                                            ',
    '  CALL METHOD OF LO_BOOK ''CLOSE''.                                     ',
    '  CALL METHOD OF LO_EXCEL ''QUIT''.                                     ',
    '                                                                        ',
    '  "拆分数据                                                             ',
    '  LOOP AT LT_LINES.                                                     ',
    '    L_ROWINDEX = SY-TABIX + L_TOPROW - 1.                               ',
    '    SPLIT LT_LINES-ROW AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE LT_FIELDS.',
    '    LOOP AT LT_FIELDS.                                                  ',
    '      L_COUNT = SY-TABIX.                                               ',
    '      ASSIGN COMPONENT SY-TABIX OF STRUCTURE GS_EXCEL TO <L_FIELDVALUE>.',
    '      CHECK SY-SUBRC = 0.                                               ',
    '      CATCH SYSTEM-EXCEPTIONS CONVT_NO_NUMBER = 1 OTHERS = 2.           ',
    '        <L_FIELDVALUE> = LT_FIELDS-VALUE.                               ',
    '      ENDCATCH.                                                         ',
    '      IF SY-SUBRC <> 0.                                                 ',
    '        CONCATENATE '''' L_ROWINDEX ''行中第'' L_COUNT ''个字段的值'' GS_FIELDCAT-FIELDNAME ''在格式转换时出错,请检查!'' INTO L_MSG.',
    '        MESSAGE L_MSG TYPE ''S'' DISPLAY LIKE ''E''.                    ',
    '        LEAVE LIST-PROCESSING.                                          ',
    '      ENDIF.                                                            ',
    '      UNASSIGN <L_FIELDVALUE>.                                          ',
    '    ENDLOOP.                                                            ',
    '                                                                        ',
    '    APPEND GS_EXCEL TO GT_EXCEL.                                        ',
    '    CLEAR GS_EXCEL.                                                     ',
    '  ENDLOOP.                                                              ',
    'ENDFORM.                    "UPLOAD_DATA                                '.
ENDFORM.                    " GEN_FORM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_check_data .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  CHECK_DATA                                                ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM CHECK_DATA.                                                        ',
    '  DATA: L_FLAG TYPE C,                                                  ',
    '        L_TABIX TYPE I,                                                 ',
    '        L_MSG TYPE STRING,                                              ',
    '        L_VALUE TYPE STRING,                                            ',
    '        L_INDEX TYPE I VALUE 1.                                         ',
    '                                                                        ',
    '  DEFINE D_STORE_MESSAGE.                                               ',
    '    L_FLAG = ''X''.                                                     ',
    '    CALL FUNCTION ''MESSAGE_STORE''                                     ',
    '      EXPORTING                                                         ',
    '        ARBGB = &1                                                      ',
    '        MSGTY = &2                                                      ',
    '        TXTNR = &3                                                      ',
    '        MSGV1 = &4                                                      ',
    '        MSGV2 = &5                                                      ',
    '        MSGV3 = &6                                                      ',
    '        MSGV4 = &7                                                      ',
    '        ZEILE = L_INDEX.                                                ',
    '    L_INDEX = L_INDEX + 1.                                              ',
    '  END-OF-DEFINITION.                                                    ',
    '                                                                        ',
    '  CALL FUNCTION ''MESSAGES_INITIALIZE''.                                ',
    '                                                                        ',
    '  LOOP AT GT_EXCEL INTO GS_EXCEL.                                       '.

  LOOP AT gt_fields INTO gs_field.
    CHECK gs_field-convexit IS NOT INITIAL.
    CONCATENATE '    "' gs_field-scrtext_l '-转码' INTO g_code.
    append_code g_code.
    CONCATENATE '    CALL FUNCTION ''CONVERSION_EXIT_' gs_field-convexit '_INPUT''' INTO g_code.
    append_code g_code.
    append_code '      EXPORTING'.
    CONCATENATE '        INPUT        = GS_EXCEL-' gs_field-fieldname INTO g_code.
    append_code g_code.
    append_code:
      '      IMPORTING                ',
      '        OUTPUT       = L_VALUE ',
      '      EXCEPTIONS               ',
      '        LENGTH_ERROR = 1       ',
      '        OTHERS       = 2.      ',
      '    IF SY-SUBRC <> 0.          ',
      '    ENDIF.                     ',
      '                               '.
  ENDLOOP.

  append_code:
    '*    示例                                                               ',
    '*    L_MSG = '''' && L_TABIX && ''行的采购申请编码不能为空''.         ',
    '*    D_STORE_MESSAGE: ''00'' ''E'' ''001'' L_MSG '''' '''' ''''.        ',
    '                                                                        ',
    '    MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.                              ',
    '    APPEND GS_ALV TO GT_ALV.                                            ',
    '    CLEAR GS_ALV.                                                       ',
    '  ENDLOOP.                                                              ',
    '                                                                        ',
    '  IF L_FLAG = ''X''.                                                    ',
    '    CALL FUNCTION ''MESSAGES_SHOW''.                                    ',
    '    LEAVE LIST-PROCESSING.                                              ',
    '  ENDIF.                                                                ',
    'ENDFORM.                    "CHECK_DATA                                 '.
ENDFORM.                    "GEN_FORM_CHECK_DATA                         ',
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_SELECT_EXCEL_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_select_excel_file .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  SELECT_EXCEL_FILE                                         ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM SELECT_EXCEL_FILE CHANGING P_FILE.                                 ',
    '  DATA: LT_FILETABLE TYPE FILETABLE WITH HEADER LINE,                   ',
    '        L_RC TYPE I,                                                    ',
    '        L_ACTION TYPE I.                                                ',
    '                                                                        ',
    '  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG                ',
    '    EXPORTING                                                           ',
    '      DEFAULT_EXTENSION = ''XLS''                                       ',
    '      DEFAULT_FILENAME  = ''*.XLS;*.XLSX''                              ',
    '      FILE_FILTER       = ''EXCEL FILE (*.XLS;*.XLSX)''                 ',
    '      MULTISELECTION    = ''''                                          ',
    '    CHANGING                                                            ',
    '      FILE_TABLE        = LT_FILETABLE[]                                ',
    '      RC                = L_RC                                          ',
    '      USER_ACTION       = L_ACTION                                      ',
    '    EXCEPTIONS                                                          ',
    '      OTHERS            = 1.                                            ',
    '  IF L_ACTION NE 0.                                                     ',
    '    EXIT.                                                               ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  READ TABLE LT_FILETABLE INDEX 1.                                      ',
    '  P_FILE = LT_FILETABLE-FILENAME.                                       ',
    'ENDFORM.                    "SELECT_EXCEL_FILE                          '.
ENDFORM.                    " GEN_FORM_SELECT_EXCEL_FILE
*&---------------------------------------------------------------------*
*&      Form  gen_form_set_status_bar
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_set_status_bar.
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  SET_STATUS_BAR                                            ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM SET_STATUS_BAR USING P_PERCENT P_MESSAGE.                          ',
    '  CALL FUNCTION ''SAPGUI_PROGRESS_INDICATOR''                           ',
    '    EXPORTING                                                           ',
    '      PERCENTAGE = P_PERCENT                                            ',
    '      TEXT       = P_MESSAGE.                                           ',
    'ENDFORM.                    "SET_STATUS_BAR                             '.
ENDFORM.                    "gen_form_set_status_bar                     ',
*&---------------------------------------------------------------------*
*&      Form  gen_form_download_template
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_download_template.
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  DOWNLOAD_TEMPLATE                                         ',
    '*&---------------------------------------------------------------------*',
    '*       下载模板用                                                      ',
    '*       P_OBJID: SMW0中的文件ID                                         ',
    '*       P_EXTENSION: 文件扩展名,如XLS、DOC                             ',
    '*       P_DEFAULT_FILENAME: 默认文件名                                  ',
    '*----------------------------------------------------------------------*',
    'FORM DOWNLOAD_TEMPLATE USING P_OBJID P_EXTENSION P_DEFAULT_FILENAME.    ',
    '  DATA: L_FILENAME     TYPE STRING,                                     ',
    '        L_FULLPATH     TYPE STRING,                                     ',
    '        L_PATH         TYPE STRING,                                     ',
    '        LS_OBJDATA     TYPE WWWDATATAB,                                 ',
    '        L_DESTINATION  TYPE RLGRAP-FILENAME,                            ',
    '        L_RC           TYPE I.                                          ',
    '                                                                        ',
    '  SELECT SINGLE RELID OBJID INTO CORRESPONDING FIELDS OF LS_OBJDATA FROM WWWDATA WHERE SRTF2 = 0 AND RELID = ''MI'' AND OBJID = P_OBJID.',
    '  IF SY-SUBRC <> 0.                                                     ',
    '    MESSAGE ''模板文件不存在'' TYPE ''E''.                              ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG                ',
    '    EXPORTING                                                           ',
    '      DEFAULT_EXTENSION = P_EXTENSION                                   ',
    '      DEFAULT_FILE_NAME = P_DEFAULT_FILENAME                            ',
    '    CHANGING                                                            ',
    '      FILENAME          = L_FILENAME                                    ',
    '      PATH              = L_PATH                                        ',
    '      FULLPATH          = L_FULLPATH                                    ',
    '    EXCEPTIONS                                                          ',
    '      OTHERS            = 1.                                            ',
    '  IF L_FULLPATH = ''''.                                                 ',
    '    MESSAGE ''没有选择文件'' TYPE ''E''.                                ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  IF STRLEN( L_FULLPATH ) > 128.                                        ',
    '    MESSAGE ''文件名长度超出128,请重新选择文件'' TYPE ''S'' DISPLAY LIKE ''E''.',
    '    STOP.                                                               ',
    '  ENDIF.                                                                ',
    '                                                                        ',
    '  L_DESTINATION = L_FULLPATH.                                           ',
    '  CALL FUNCTION ''DOWNLOAD_WEB_OBJECT''                                 ',
    '    EXPORTING                                                           ',
    '      KEY         = LS_OBJDATA                                          ',
    '      DESTINATION = L_DESTINATION                                       ',
    '    IMPORTING                                                           ',
    '      RC          = L_RC.                                               ',
    '  IF L_RC <> 0.                                                         ',
    '    MESSAGE ''导入模板下载失败'' TYPE ''E''.                            ',
    '  ENDIF.                                                                ',
    'ENDFORM.                    "DOWNLOAD_TEMPLATE                          '.
ENDFORM.                    "gen_form_download_template
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_display_data .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  DISPLAY_DATA                                              ',
    '*&---------------------------------------------------------------------*',
    '*       显示数据                                                        ',
    '*----------------------------------------------------------------------*',
    'FORM DISPLAY_DATA.                                                      ',
    '  D_BUILD_FIELDCAT:                                                     ',
    '*     字段     单位字段  金额字段   参照表    参照字段      转码     列颜色      描述'.

  LOOP AT gt_fields INTO gs_field.
    IF sy-tabix = lines( gt_fields ).
      g_code = '.'.
    ELSE.
      g_code = ','.
    ENDIF.

    CONCATENATE '    ''' gs_field-fieldname '''   '''   '''   '''   '''    '''
      gs_field-ref_table '''    ''' gs_field-ref_field '''      ''' gs_field-convexit '''   '''    '''  '''
      gs_field-scrtext_l ''''
      g_code
      INTO g_code.
    append_code g_code.
  ENDLOOP.

  append_code ''.

  "LAYOUT
  append_code:
    '  GS_LAYOUT-CWIDTH_OPT = ''X''.',
    '  GS_LAYOUT-BOX_FNAME = ''SEL''.',
    ''.

  append_code:
    '  CALL FUNCTION ''REUSE_ALV_GRID_DISPLAY_LVC''        ',
    '    EXPORTING                                         ',
    '      I_CALLBACK_PROGRAM       = SY-REPID             ',
    '      I_CALLBACK_PF_STATUS_SET = ''PF_STATUS''        ',
    '      I_CALLBACK_USER_COMMAND  = ''USER_COMMAND''     ',
    '      IT_FIELDCAT_LVC          = GT_FIELDCAT          ',
    '      IS_LAYOUT_LVC            = GS_LAYOUT            ',
    '      I_DEFAULT                = ''X''                ',
    '      I_SAVE                   = ''A''                ',
    '    TABLES                                            ',
    '      T_OUTTAB                 = GT_ALV               ',
    '    EXCEPTIONS                                        ',
    '      OTHERS                   = 1.                   '.
  "ALV展示
  append_code 'ENDFORM.                    "DISPLAY_DATA'.
ENDFORM.                    " GEN_FORM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_PF_STATUS_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_pf_status_alv .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  PF_STATUS                                                 ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB .                       ',
    '  SET PF-STATUS ''STATUS_ALV'' EXCLUDING RT_EXTAB.                      ',
    'ENDFORM.                    "PF_STATUS                                  '.
ENDFORM.                    " GEN_FORM_PF_STATUS_ALV
*&---------------------------------------------------------------------*
*&      Form  GEN_FORM_USER_COMMAND_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_user_command_alv .
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  USER_COMMAND                                             ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM USER_COMMAND USING R_UCOMM     LIKE SY-UCOMM                       ',
    '                        RS_SELFIELD TYPE SLIS_SELFIELD.                 ',
    '  CASE R_UCOMM.                                                         ',
    '    WHEN ''IMPORT''.                                                    ',
    '      READ TABLE GT_ALV WITH KEY SEL = ''X'' TRANSPORTING NO FIELDS.    ',
    '      IF SY-SUBRC <> 0.                                                 ',
    '        MESSAGE ''请至少选择一个行项目'' TYPE ''S'' DISPLAY LIKE ''E''. ',
    '        EXIT.                                                           ',
    '      ENDIF.                                                            ',
    '                                                                        ',
    '      CALL FUNCTION ''MESSAGES_INITIALIZE''.                            ',
    '                                                                        ',
    '      "准备数据进行批导                                                 ',
    '      LOOP AT GT_ALV INTO GS_ALV WHERE SEL = ''X''.                     ',
    '                                                                        ',
    '      ENDLOOP.                                                          ',
    '                                                                        ',
    '    WHEN ''ERRORS''.                                                    ',
    '      CALL FUNCTION ''MESSAGES_SHOW''.                                  ',
    '  ENDCASE.                                                              ',
    'ENDFORM.                    "USER_COMMAND                               '.
ENDFORM.                    " GEN_FORM_USER_COMMAND_ALV
*&---------------------------------------------------------------------*
*&      Form  gen_form_call_bdc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM gen_form_call_bdc.
  append_code:
    '*&---------------------------------------------------------------------*',
    '*&      FORM  CALL_BDC                                                  ',
    '*&---------------------------------------------------------------------*',
    '*       TEXT                                                            ',
    '*----------------------------------------------------------------------*',
    'FORM CALL_BDC .                                                         ',
    '  DATA: LT_BDC TYPE TABLE OF BDCDATA,                                   ',
    '        LS_BDC TYPE BDCDATA,                                            ',
    '        L_OPT TYPE CTU_PARAMS,                                          ',
    '        LT_MESSAGES TYPE TABLE OF BDCMSGCOLL,                           ',
    '        LS_MESSAGE TYPE BDCMSGCOLL.                                     ',
    '                                                                        ',
    '  DEFINE D_GEN_BDC_CODE.                                                ',
    '    LS_BDC-PROGRAM  = &1.                                               ',
    '    LS_BDC-DYNPRO   = &2.                                               ',
    '    LS_BDC-DYNBEGIN = &3.                                               ',
    '    LS_BDC-FNAM     = &4.                                               ',
    '    LS_BDC-FVAL     = &5.                                               ',
    '    APPEND LS_BDC TO LT_BDC.                                            ',
    '    CLEAR: LS_BDC.                                                      ',
    '  END-OF-DEFINITION.                                                    ',
    '                                                                        ',
    '  CALL FUNCTION ''MESSAGES_INITIALIZE''.                                ',
    '                                                                        ',
    '  L_OPT-DISMODE = ''N''.                                                ',
    '  L_OPT-DEFSIZE = ''X''.                                                ',
    '                                                                        ',
    '*  D_GEN_BDC_CODE:                                                      ',
    '*    ''SAPLCOMK''  ''0120''  ''X'' ''''  '''',                          ',
    '*    ''''  ''''  ''''  ''BDC_CURSOR''  ''RESBD-MATNR(01)'',             ',
    '*    ''''  ''''  ''''  ''BDC_OKCODE''  ''=KEIN''.                       ',
    '*                                                                       ',
    '*  CALL TRANSACTION ''CO02'' USING LT_BDC OPTIONS FROM L_OPT MESSAGES INTO LT_MESSAGES.',
    '                                                                        ',
    '  LOOP AT LT_MESSAGES INTO LS_MESSAGE.                                  ',
    '    CALL FUNCTION ''MESSAGE_STORE''                                     ',
    '      EXPORTING                                                         ',
    '        ARBGB = LS_MESSAGE-MSGID                                        ',
    '        MSGTY = LS_MESSAGE-MSGTYP                                       ',
    '        MSGV1 = LS_MESSAGE-MSGV1                                        ',
    '        MSGV2 = LS_MESSAGE-MSGV2                                        ',
    '        MSGV3 = LS_MESSAGE-MSGV3                                        ',
    '        MSGV4 = LS_MESSAGE-MSGV4                                        ',
    '        TXTNR = LS_MESSAGE-MSGNR                                        ',
    '        ZEILE = SY-TABIX.                                               ',
    '  ENDLOOP.                                                              ',
    '                                                                        ',
    '  REFRESH: LT_BDC, LT_MESSAGES.                                         ',
    'ENDFORM.                    " CALL_BDC                                  '.
ENDFORM.                    "gen_form_call_bdc
*&---------------------------------------------------------------------*
*&      Form  f4_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f4_field USING p_tabname TYPE tabname
              CHANGING p_fieldname p_fieldtext p_convexit.
  DATA: lt_return    TYPE TABLE OF ddshretval WITH HEADER LINE,
        lt_dfies_tab TYPE TABLE OF dfies WITH HEADER LINE,
        BEGIN OF lt_fields OCCURS 0,
          fieldname TYPE fieldname,
          fieldtext TYPE fieldtext,
          keyflag   TYPE keyflag,
          datatype  TYPE dynptype,
          leng      TYPE ddleng,
          decimals  TYPE decimals,
          convexit  TYPE convexit,
        END OF lt_fields.

  CALL FUNCTION 'DDIF_FIELDINFO_GET'
    EXPORTING
      tabname        = p_tabname
      langu          = sy-langu
    TABLES
      dfies_tab      = lt_dfies_tab[]
    EXCEPTIONS
      not_found      = 1
      internal_error = 2
      OTHERS         = 3.

  CHECK sy-subrc = 0.

  DELETE lt_dfies_tab WHERE fieldname = 'MANDT'.
  LOOP AT lt_dfies_tab.
    lt_fields-fieldname = lt_dfies_tab-fieldname.
    lt_fields-fieldtext = lt_dfies_tab-fieldtext.
    lt_fields-keyflag   = lt_dfies_tab-keyflag  .
    lt_fields-datatype  = lt_dfies_tab-datatype .
    lt_fields-leng      = lt_dfies_tab-leng     .
    lt_fields-decimals  = lt_dfies_tab-decimals .
    lt_fields-convexit  = lt_dfies_tab-convexit .
    APPEND lt_fields.
  ENDLOOP.
  "调用F4
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield     = 'FIELDNAME'
      window_title = '选择'
      value_org    = 'S'
    TABLES
      value_tab    = lt_fields[]
      return_tab   = lt_return[].

  IF lt_return[] IS NOT INITIAL.
    READ TABLE lt_return INDEX 1.
    p_fieldname = lt_return-fieldval.
    READ TABLE lt_fields WITH KEY fieldname = p_fieldname.
    p_fieldtext = lt_fields-fieldtext.
    p_convexit  = lt_fields-convexit.
  ENDIF.
ENDFORM.                                                    "f4_field
*&---------------------------------------------------------------------*
*&      Form  f4_convexit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f4_convexit CHANGING p_convexit.
  STATICS call_times TYPE i.
  DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
        BEGIN OF lt_convexits OCCURS 0,
          convexit TYPE convexit,
          text     TYPE fieldtext,
        END OF lt_convexits.

  "从表TFDIR中取CONVERSION_EXIT*的函数,太多了,此处只列出常用的几个
  IF call_times IS INITIAL.
    MESSAGE '系统中的转换例程太多,此处只列出常用的一些' TYPE 'I'.
    ADD 1 TO call_times.
  ENDIF.

  lt_convexits-convexit = 'ALPHA'. lt_convexits-text = '前导零'. APPEND lt_convexits.
  lt_convexits-convexit = 'MATN1'. lt_convexits-text = '物料号'. APPEND lt_convexits.
  lt_convexits-convexit = 'CUNIT'. lt_convexits-text = '计量单位'. APPEND lt_convexits.
  lt_convexits-convexit = 'KONPD'. lt_convexits-text = '项目编码'. APPEND lt_convexits.
  lt_convexits-convexit = 'ABPSP'. lt_convexits-text = 'WBS编码'. APPEND lt_convexits.
  lt_convexits-convexit = 'PARVW'. lt_convexits-text = '合作伙伴'. APPEND lt_convexits.
  "调用F4
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield     = 'CONVEXIT'
      window_title = '选择'
      value_org    = 'S'
    TABLES
      value_tab    = lt_convexits[]
      return_tab   = lt_return[].

  IF lt_return[] IS NOT INITIAL.
    READ TABLE lt_return INDEX 1.
    p_convexit = lt_return-fieldval.
  ENDIF.
ENDFORM.                    "f4_convexit
*&---------------------------------------------------------------------*
*&      Form  download
*&---------------------------------------------------------------------*
*       下载到Excel
*----------------------------------------------------------------------*
FORM download.
  DATA: l_file     TYPE string,
        l_path     TYPE string,
        l_fullpath TYPE string,
        l_action   TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_file_name = l_file
    CHANGING
      filename          = l_file
      path              = l_path
      fullpath          = l_fullpath
      user_action       = l_action.

  CHECK l_action = 0.

  PERFORM create_excel_app.
  PERFORM open_workbook USING l_fullpath.

* =========FIELDS==========
  CALL METHOD OF
      go_book
      'Sheets' = go_sheet
    EXPORTING
      #1       = 'FIELDS'.
  IF sy-subrc <> 0.
    MESSAGE '打开FIELDS工作表失败' TYPE 'E'.
  ENDIF.

  LOOP AT gt_fields INTO gs_field.
    g_row = sy-tabix + 1.
    PERFORM set_cell_value USING g_row 1 gs_field-fieldname.
    PERFORM set_cell_value USING g_row 2 gs_field-ref_table.
    PERFORM set_cell_value USING g_row 3 gs_field-ref_field.
    PERFORM set_cell_value USING g_row 4 gs_field-convexit.
    PERFORM set_cell_value USING g_row 5 gs_field-scrtext_l.
  ENDLOOP.
  CALL METHOD cl_gui_cfw=>flush.

  CALL METHOD OF
    go_book
    'SAVE'.
  SET PROPERTY OF go_excel 'Visible' = 1.

  MESSAGE '已下载到Excel文件中,请查看' TYPE 'S'.
ENDFORM.                    "download
*&---------------------------------------------------------------------*
*&      Form  upload
*&---------------------------------------------------------------------*
*       从Excel上载
*----------------------------------------------------------------------*
FORM upload.
  DATA: lt_list      TYPE TABLE OF spopli WITH HEADER LINE,
        l_answer     TYPE c,
        lt_filetable TYPE filetable WITH HEADER LINE,
        l_rc         TYPE i,
        l_action     TYPE i,
        l_flag_close TYPE c.

  IF go_excel IS NOT INITIAL.
    lt_list-varoption = '从刚下载的Excel文件上载'. APPEND lt_list.
    lt_list-varoption = '选择新的Excel文件进行上载'. APPEND lt_list.

    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
      EXPORTING
        textline1 = '如果还未关闭已经下载的Excel,可以选择从该Excel文件上载'
        titel     = '选择'
      IMPORTING
        answer    = l_answer
      TABLES
        t_spopli  = lt_list[].

    CHECK l_answer <> 'A'.
  ENDIF.

  IF go_excel IS INITIAL OR l_answer = 2.
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        default_extension       = 'XLS'
        default_filename        = '*.xls;*.xlsx'
        file_filter             = 'Excel File (*.xls;*.xlsx)'
        multiselection          = ''
      CHANGING
        file_table              = lt_filetable[]
        rc                      = l_rc
        user_action             = l_action
      EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        not_supported_by_gui    = 4
        OTHERS                  = 5.

    CHECK l_action = 0.

    PERFORM create_excel_app.

    READ TABLE lt_filetable INDEX 1.
    PERFORM open_workbook USING lt_filetable-filename.

    l_flag_close = 'X'.
  ENDIF.

  CLEAR: gt_fields.

* =========FIELDS==========
  CALL METHOD OF
      go_book
      'Sheets' = go_sheet
    EXPORTING
      #1       = 'FIELDS'.
  IF sy-subrc <> 0.
    MESSAGE '打开FIELDS工作表失败' TYPE 'E'.
  ENDIF.

  WHILE 1 = 1.
    CLEAR: gs_field.
    g_row = sy-index + 1.
    PERFORM get_cell_value USING g_row 1 CHANGING gs_field-fieldname.
    IF gs_field-fieldname IS INITIAL.
      EXIT.
    ENDIF.
    PERFORM get_cell_value USING g_row 2 CHANGING gs_field-ref_table.
    PERFORM get_cell_value USING g_row 3 CHANGING gs_field-ref_field.
    PERFORM get_cell_value USING g_row 4 CHANGING gs_field-convexit.
    PERFORM get_cell_value USING g_row 5 CHANGING gs_field-scrtext_l.
    APPEND gs_field TO gt_fields.
  ENDWHILE.

  IF l_flag_close = 'X'.
    CALL METHOD OF
      go_book
      'Close'.
    CALL METHOD OF
      go_excel
      'QUIT'.
    FREE OBJECT: go_sheet, go_book, go_books, go_excel.
  ENDIF.

  MESSAGE '上载完成' TYPE 'S'.
ENDFORM.                    "upload
*&---------------------------------------------------------------------*
*&      Form  create_excel_app
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_excel_app.
  IF go_excel IS INITIAL.
    CREATE OBJECT go_excel 'Excel.Application'.
    IF sy-subrc <> 0.
      MESSAGE '创建Excel程序失败' TYPE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.                    "create_excel_app
*&---------------------------------------------------------------------*
*&      Form  open_workbook
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM open_workbook USING p_path.
  CALL METHOD OF
    go_excel
      'Workbooks' = go_books.
  CALL METHOD OF
      go_books
      'Open'   = go_book
    EXPORTING
      #1       = p_path.
  IF sy-subrc <> 0.
    MESSAGE '打开Excel文件失败' TYPE 'E'.
  ENDIF.
ENDFORM.                    "open_workbook
*&---------------------------------------------------------------------*
*&      Form  set_cell_value
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_cell_value USING p_row TYPE i
                          p_col TYPE i
                          p_value.
  g_row = p_row.
  g_col = p_col.
  g_value = p_value.

  CALL METHOD OF
      go_sheet
      'CELLS'  = go_cell
      NO
      FLUSH

    EXPORTING
      #1       = g_row
      #2       = g_col.
  SET PROPERTY OF go_cell 'Value' = g_value NO FLUSH.
ENDFORM.                    "set_cell_value
*&---------------------------------------------------------------------*
*&      Form  get_cell_value
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_cell_value USING p_row TYPE i
                          p_col TYPE i
                    CHANGING p_value.
  CALL METHOD OF
      go_sheet
      'CELLS'  = go_cell
    EXPORTING
      #1       = p_row
      #2       = p_col.
  GET PROPERTY OF go_cell 'Value' = p_value.
ENDFORM.                    "get_cell_value
*&---------------------------------------------------------------------*
*&      Form  CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM check .
  DATA: l_index   TYPE i VALUE 1,
        l_tabix   TYPE i,
        lt_fields TYPE TABLE OF typ_field,
        l_msg     TYPE string,
        l_flag    TYPE c.

  DEFINE d_store_message.
    g_flag_error = 'X'.
    CALL FUNCTION 'MESSAGE_STORE'
      EXPORTING
        arbgb = '00'
        msgty = 'E'
        txtnr = '001'
        msgv1 = l_msg
        msgv2 = ''
        msgv3 = ''
        msgv4 = ''
        zeile = l_index.
    l_index = l_index + 1.
  END-OF-DEFINITION.

  CALL FUNCTION 'MESSAGES_INITIALIZE'.
  CLEAR g_flag_error.

  IF gt_fields IS INITIAL.
    l_msg = '字段设置为空'.
    d_store_message.
  ENDIF.

  "字段重复校验
  lt_fields = gt_fields.
  SORT lt_fields BY fieldname.
  DELETE ADJACENT DUPLICATES FROM lt_fields COMPARING fieldname.
  IF lines( lt_fields ) <> lines( gt_fields ).
    l_msg = '字段设置:存在重复字段'.
    d_store_message.
  ENDIF.

  "字段设置
  LOOP AT gt_fields INTO gs_field.
    l_tabix = sy-tabix.
    IF gs_field-fieldname IS INITIAL.
      l_msg = '字段设置:行' && l_tabix && ',字段不能为空'.
      d_store_message.
    ENDIF.
    IF gs_field-ref_table IS NOT INITIAL.
      SELECT SINGLE tabname INTO gs_field-ref_table FROM dd02l WHERE tabname = gs_field-ref_table AND as4vers = 'A'.
      IF sy-subrc <> 0.
        l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照表' && gs_field-ref_table && '不存在或未激活'.
        d_store_message.
      ELSEIF gs_field-ref_field IS NOT INITIAL.
        PERFORM check_field_exist USING gs_field-ref_table gs_field-ref_field CHANGING l_flag.
        IF l_flag = 'X'.
          l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照表' && gs_field-ref_table && '中参照字段' && gs_field-ref_field &&'不存在或未激活'.
          d_store_message.
        ENDIF.
      ENDIF.
    ELSE.
      IF gs_field-ref_field IS NOT INITIAL.
        SELECT SINGLE rollname INTO gs_field-ref_field FROM dd04l WHERE rollname = gs_field-ref_field AND as4vers = 'A'.
        IF sy-subrc <> 0.
          l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field-fieldname && '的参照字段(数据元素)' && gs_field-ref_field &&'不存在或未激活'.
          d_store_message.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF g_flag_error = 'X'.
    CALL FUNCTION 'MESSAGES_SHOW'.
  ENDIF.
ENDFORM.                    " CHECK
*&---------------------------------------------------------------------*
*&      Form  ALV_REFRESH_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_refresh_display .
  go_alv_fields->refresh_table_display( ).
ENDFORM.                    " ALV_REFRESH_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  check_field_exist
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM check_field_exist USING p_tabname TYPE tabname
                             p_fieldname TYPE fieldname
                       CHANGING p_flag TYPE c.
  DATA: l_fieldname TYPE fieldname.

  CLEAR p_flag.
  SELECT SINGLE fieldname INTO l_fieldname FROM dd03l
    WHERE tabname = p_tabname AND fieldname = p_fieldname AND as4local = 'A'.
  CHECK sy-subrc <> 0.
  p_flag = 'X'.
ENDFORM.                    "check_field_exist

 

转载于:https://www.cnblogs.com/ckstock/p/11589076.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值