zoukankan      html  css  js  c++  java
  • 【原创】REPORT自动生成工具

    ----------------------------------------------

    本博客所有原创文章,未经博主允许,请勿转载。

    ----------------------------------------------

    本程序共实现功能如下:

    1、操作界面中,各ALV数据保存到INDX,以及从INDX读取

    2、操作界面中,各ALV数据下载到Excel,以及从Excel上载(按单元格上载,上载速度较慢,暂未做优化处理)

    3、支持表左连接、表别名、同一表出现多次

    4、支持表连接时,采用常量连接

    5、ALV字段设置中,包括了单位字段、货币字段、参照字段、参照表、转换例程、列颜色、列描述等

    6、支持额外附加字段(需要自己添加一些代码处理)

    7、必要的字段,基本都提供了搜索帮助

    8、生成程序前的数据校验

    9、生成程序前,请自己先建一个激活的report程序

    相关下载请移步:http://pan.baidu.com/s/1c2xoVqK 提取码 gwq6 

     

    BUG反馈,请联系QQ或微信:286503700,谢谢!

       1 REPORT  zreport_generator.
       2 
       3 TYPE-POOLS: ole2.
       4 
       5 TABLES: sscrfields.
       6 
       7 SELECTION-SCREEN BEGIN OF LINE.
       8 SELECTION-SCREEN COMMENT (6) text.
       9 SELECTION-SCREEN POSITION 7.
      10 PARAMETERS p_prog TYPE programm.
      11 SELECTION-SCREEN PUSHBUTTON 50(10) gen USER-COMMAND gen.
      12 SELECTION-SCREEN END OF LINE.
      13 
      14 SELECTION-SCREEN FUNCTION KEY 1.
      15 SELECTION-SCREEN FUNCTION KEY 2.
      16 SELECTION-SCREEN FUNCTION KEY 3.
      17 SELECTION-SCREEN FUNCTION KEY 4.
      18 
      19 *----------------------------------------------------------------------*
      20 *       CLASS lcl_alv_event_handler DEFINITION
      21 *----------------------------------------------------------------------*
      22 *
      23 *----------------------------------------------------------------------*
      24 CLASS lcl_alv_event_handler DEFINITION.
      25   PUBLIC SECTION.
      26     METHODS:
      27       handle_toolbar        FOR EVENT toolbar
      28                             OF cl_gui_alv_grid
      29                             IMPORTING e_object e_interactive,
      30 
      31       handle_f4             FOR EVENT onf4
      32                             OF cl_gui_alv_grid
      33                             IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells,
      34 
      35       handle_user_command   FOR EVENT user_command
      36                             OF cl_gui_alv_grid
      37                             IMPORTING e_ucomm.
      38 ENDCLASS.                    "lcl_alv_event_handler DEFINITION
      39 
      40 TYPES:
      41   BEGIN OF typ_table,
      42     tabname   TYPE tabname,
      43     leftjoin  TYPE c,
      44     astable   TYPE tabname,
      45   END OF typ_table,
      46 
      47   BEGIN OF typ_join,
      48     tab1      TYPE tabname,
      49     field1    TYPE fieldname,
      50     tab2      TYPE tabname,
      51     field2    TYPE fieldname,
      52   END OF typ_join,
      53 
      54   BEGIN OF typ_field1,
      55     astable     TYPE tabname,
      56     fieldname   TYPE fieldname,
      57     asfield     TYPE lvc_fname,
      58     query       TYPE c,
      59     query_pos   TYPE i,
      60     single      TYPE c,
      61     display     TYPE c,
      62     qfieldname  TYPE lvc_qfname,
      63     cfieldname  TYPE lvc_cfname,
      64     ref_table   TYPE lvc_rtname,
      65     ref_field   TYPE lvc_rfname,
      66     convexit    TYPE convexit,
      67     emphasize   TYPE lvc_emphsz,
      68     scrtext_l   TYPE scrtext_l,
      69     sel_field   TYPE fieldname,
      70     sql_field   TYPE c LENGTH 60,
      71     out_field   TYPE fieldname,
      72     typ_field   TYPE c LENGTH 60,
      73     mark        TYPE c LENGTH 60,
      74   END OF typ_field1,
      75 
      76   BEGIN OF typ_field2,
      77     fieldname   TYPE lvc_fname,
      78     qfieldname  TYPE lvc_qfname,
      79     cfieldname  TYPE lvc_cfname,
      80     ref_table   TYPE lvc_rtname,
      81     ref_field   TYPE lvc_rfname,
      82     convexit    TYPE convexit,
      83     emphasize   TYPE lvc_emphsz,
      84     scrtext_l   TYPE scrtext_l,
      85     typ_field   TYPE c LENGTH 60,
      86   END OF typ_field2.
      87 
      88 DATA:
      89   go_docking_con        TYPE REF TO cl_gui_docking_container,
      90   go_splitter_con       TYPE REF TO cl_gui_splitter_container,
      91   go_splitter_con_left  TYPE REF TO cl_gui_splitter_container,
      92   go_splitter_con_right TYPE REF TO cl_gui_splitter_container,
      93   go_con_tables         TYPE REF TO cl_gui_container,
      94   go_con_joins          TYPE REF TO cl_gui_container,
      95   go_con_fields1        TYPE REF TO cl_gui_container,
      96   go_con_fields2        TYPE REF TO cl_gui_container,
      97   go_alv_tables         TYPE REF TO cl_gui_alv_grid,
      98   go_alv_joins          TYPE REF TO cl_gui_alv_grid,
      99   go_alv_fields1        TYPE REF TO cl_gui_alv_grid,
     100   go_alv_fields2        TYPE REF TO cl_gui_alv_grid,
     101   go_event_tables       TYPE REF TO lcl_alv_event_handler,
     102   go_event_joins        TYPE REF TO lcl_alv_event_handler,
     103   go_event_fields1      TYPE REF TO lcl_alv_event_handler,
     104   go_event_fields2      TYPE REF TO lcl_alv_event_handler.
     105 
     106 DATA:
     107   gt_tables             TYPE TABLE OF typ_table,
     108   gs_table              TYPE typ_table,
     109   gt_joins              TYPE TABLE OF typ_join,
     110   gs_join               TYPE typ_join,
     111   gt_fields1            TYPE TABLE OF typ_field1,
     112   gs_field1             TYPE typ_field1,
     113   gt_fields2            TYPE TABLE OF typ_field2,
     114   gs_field2             TYPE typ_field2,
     115   gt_query              TYPE TABLE OF typ_field1,
     116   gs_query              TYPE typ_field1.
     117 
     118 DATA:
     119   gt_fieldcat_tables    TYPE lvc_t_fcat,
     120   gt_fieldcat_joins     TYPE lvc_t_fcat,
     121   gt_fieldcat_fields1   TYPE lvc_t_fcat,
     122   gt_fieldcat_fields2   TYPE lvc_t_fcat,
     123   gs_fieldcat           TYPE lvc_s_fcat,
     124   gt_f4_tables          TYPE lvc_t_f4,
     125   gt_f4_joins           TYPE lvc_t_f4,
     126   gt_f4_fields1         TYPE lvc_t_f4,
     127   gt_f4_fields2         TYPE lvc_t_f4,
     128   gs_f4                 TYPE lvc_s_f4,
     129   gt_exclude            TYPE ui_functions,
     130   gs_layout             TYPE lvc_s_layo.
     131 
     132 DATA:
     133   BEGIN OF gt_color OCCURS 0,
     134     sel TYPE c,
     135     color TYPE c LENGTH 4,
     136     value TYPE c LENGTH 4,
     137   END OF gt_color.
     138 
     139 DATA:
     140   ok_code TYPE sy-ucomm,
     141   g_flag_error TYPE c,
     142   g_indxid TYPE indx_srtfd,
     143   gt_codes TYPE TABLE OF string,
     144   g_code TYPE string,
     145   go_excel TYPE ole2_object,
     146   go_books TYPE ole2_object,
     147   go_book TYPE ole2_object,
     148   go_sheet TYPE ole2_object,
     149   go_cell TYPE ole2_object,
     150   g_row TYPE i,
     151   g_col TYPE i,
     152   g_value TYPE string.
     153 
     154 DEFINE d_build_fieldcat.
     155   gs_fieldcat-fieldname  = &3.
     156   gs_fieldcat-edit       = &4.
     157   gs_fieldcat-checkbox   = &5.
     158   gs_fieldcat-f4availabl = &6.
     159   gs_fieldcat-outputlen  = &7.
     160   gs_fieldcat-coltext    = &8.
     161   append gs_fieldcat to &1.
     162   clear gs_fieldcat.
     163 
     164   if &6 = 'X'.
     165     gs_f4-fieldname = &3.
     166     gs_f4-register = 'X'.
     167     insert gs_f4 into table &2.
     168     clear gs_f4.
     169   endif.
     170 END-OF-DEFINITION.
     171 
     172 DEFINE append_code.
     173   append &1 to gt_codes.
     174 END-OF-DEFINITION.
     175 *----------------------------------------------------------------------*
     176 *       CLASS lcl_alv_event_handler IMPLEMENTATION
     177 *----------------------------------------------------------------------*
     178 *
     179 *----------------------------------------------------------------------*
     180 CLASS lcl_alv_event_handler IMPLEMENTATION .
     181   METHOD handle_toolbar.
     182     PERFORM handle_toolbar USING  e_object e_interactive.
     183   ENDMETHOD.                    "HANDLE_TOOLBAR
     184 
     185   METHOD handle_f4.
     186     PERFORM handle_f4 USING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells.
     187   ENDMETHOD.                                                "HANDLE_F4
     188 
     189   METHOD handle_user_command.
     190     PERFORM handle_user_command USING e_ucomm.
     191   ENDMETHOD.                    "HANDLE_USER_COMMAND
     192 ENDCLASS.                    "lcl_alv_event_handler IMPLEMENTATION
     193 
     194 INITIALIZATION.
     195   text = '程序'.
     196   gen = '生成程序'.
     197   sscrfields-functxt_01 = '保存设置'.
     198   sscrfields-functxt_02 = '加载设置'.
     199   sscrfields-functxt_03 = '下载到Excel'.
     200   sscrfields-functxt_04 = '从Excel上载'.
     201 
     202 AT SELECTION-SCREEN OUTPUT.
     203   CHECK go_docking_con IS INITIAL.
     204   "创建容器
     205   CREATE OBJECT go_docking_con
     206     EXPORTING
     207       ratio = 95
     208       side  = cl_gui_docking_container=>dock_at_bottom.
     209 
     210   "拆分为左、右
     211   CREATE OBJECT go_splitter_con
     212     EXPORTING
     213       parent  = go_docking_con
     214       rows    = 1
     215       columns = 2.
     216   go_splitter_con->set_column_width( EXPORTING id = 1 width = 25 ).
     217 
     218   "左侧再次拆分为上下
     219   CREATE OBJECT go_splitter_con_left
     220     EXPORTING
     221       parent  = go_splitter_con->get_container( row = 1 column = 1 )
     222       rows    = 2
     223       columns = 1.
     224   go_splitter_con_left->set_row_height( EXPORTING id = 1 height = 40 ).
     225 
     226   "右侧再次拆分为上下
     227   CREATE OBJECT go_splitter_con_right
     228     EXPORTING
     229       parent  = go_splitter_con->get_container( row = 1 column = 2 )
     230       rows    = 2
     231       columns = 1.
     232   go_splitter_con_right->set_row_height( EXPORTING id = 2 height = 40 ).
     233 
     234   "创建TABLES的ALV
     235   go_con_tables = go_splitter_con_left->get_container( row = 1 column = 1 ).
     236   CREATE OBJECT go_alv_tables
     237     EXPORTING
     238       i_parent = go_con_tables.
     239 
     240   "创建JOINS的ALV
     241   go_con_joins = go_splitter_con_left->get_container( row = 2 column = 1 ).
     242   CREATE OBJECT go_alv_joins
     243     EXPORTING
     244       i_parent = go_con_joins.
     245 
     246   "创建FIELDS1的ALV
     247   go_con_fields1 = go_splitter_con_right->get_container( row = 1 column = 1 ).
     248   CREATE OBJECT go_alv_fields1
     249     EXPORTING
     250       i_parent = go_con_fields1.
     251 
     252   "创建FIELDS2的ALV
     253   go_con_fields2 = go_splitter_con_right->get_container( row = 2 column = 1 ).
     254   CREATE OBJECT go_alv_fields2
     255     EXPORTING
     256       i_parent = go_con_fields2.
     257 
     258   "事件响应
     259   CREATE OBJECT: go_event_tables, go_event_joins, go_event_fields1, go_event_fields2.
     260   SET HANDLER:
     261     go_event_tables->handle_f4  FOR go_alv_tables,
     262     go_event_joins->handle_f4   FOR go_alv_joins,
     263     go_event_fields1->handle_f4 FOR go_alv_fields1,
     264     go_event_fields1->handle_toolbar FOR go_alv_fields1,
     265     go_event_fields1->handle_user_command FOR go_alv_fields1,
     266     go_event_fields2->handle_f4 FOR go_alv_fields2.
     267 
     268   "显示ALV
     269   PERFORM alv_prepare_toolbar   TABLES    gt_exclude.
     270   PERFORM alv_prepare_layout    CHANGING  gs_layout.
     271 
     272   d_build_fieldcat:
     273     gt_fieldcat_tables  gt_f4_tables  'TABNAME'    'X'   ' '   'X'  12  '表名',
     274     gt_fieldcat_tables  gt_f4_tables  'LEFTJOIN'   'X'   'X'   ' '   6  '左连接',
     275     gt_fieldcat_tables  gt_f4_tables  'ASTABLE'    'X'   ' '   ' '   4  '别名'.
     276   gs_layout-grid_title = '表清单【表顺序可以上下拖动】'.
     277   CALL METHOD go_alv_tables->set_table_for_first_display
     278     EXPORTING
     279       it_toolbar_excluding = gt_exclude
     280       is_layout            = gs_layout
     281     CHANGING
     282       it_outtab            = gt_tables
     283       it_fieldcatalog      = gt_fieldcat_tables.
     284 
     285   d_build_fieldcat:
     286     gt_fieldcat_joins  gt_f4_joins  'TAB1'       'X'   ' '   'X'  12  '表1',
     287     gt_fieldcat_joins  gt_f4_joins  'FIELD1'     'X'   ' '   'X'  15  '字段1',
     288     gt_fieldcat_joins  gt_f4_joins  'TAB2'       'X'   ' '   'X'  12  '表2',
     289     gt_fieldcat_joins  gt_f4_joins  'FIELD2'     'X'   ' '   'X'  15  '字段2(或特定值)'.
     290   gs_layout-grid_title = '表关联【请遵循本程序约定:表1在“表清单”中的位置需要在表2以下】'.
     291   CALL METHOD go_alv_joins->set_table_for_first_display
     292     EXPORTING
     293       it_toolbar_excluding = gt_exclude
     294       is_layout            = gs_layout
     295     CHANGING
     296       it_outtab            = gt_joins
     297       it_fieldcatalog      = gt_fieldcat_joins.
     298 
     299   d_build_fieldcat:
     300     gt_fieldcat_fields1  gt_f4_fields1  'ASTABLE'      'X'   ' '  'X'  12  '表名',
     301     gt_fieldcat_fields1  gt_f4_fields1  'FIELDNAME'    'X'   ' '  'X'  15  '字段名',
     302     gt_fieldcat_fields1  gt_f4_fields1  'ASFIELD'      'X'   ' '  ' '   8  '字段别名',
     303     gt_fieldcat_fields1  gt_f4_fields1  'QUERY'        'X'   'X'  ' '   4  '查询',
     304     gt_fieldcat_fields1  gt_f4_fields1  'QUERY_POS'    'X'   ' '  ' '   4  '位置',
     305     gt_fieldcat_fields1  gt_f4_fields1  'SINGLE'       'X'   'X'  ' '   4  '单值',
     306     gt_fieldcat_fields1  gt_f4_fields1  'DISPLAY'      'X'   'X'  ' '   4  '输出',
     307     gt_fieldcat_fields1  gt_f4_fields1  'QFIELDNAME'   'X'   ' '  'X'   8  '单位字段',
     308     gt_fieldcat_fields1  gt_f4_fields1  'CFIELDNAME'   'X'   ' '  'X'   8  '货币字段',
     309     gt_fieldcat_fields1  gt_f4_fields1  'REF_TABLE'    'X'   ' '  ' '  12  '参照表',
     310     gt_fieldcat_fields1  gt_f4_fields1  'REF_FIELD'    'X'   ' '  ' '  15  '参照字段',
     311     gt_fieldcat_fields1  gt_f4_fields1  'CONVEXIT'     'X'   ' '  ' '   7  '转换例程',
     312     gt_fieldcat_fields1  gt_f4_fields1  'EMPHASIZE'    'X'   ' '  'X'   6  '列颜色',
     313     gt_fieldcat_fields1  gt_f4_fields1  'SCRTEXT_L'    'X'   ' '  ' '  20  '字段描述'.
     314   gs_layout-grid_title = '字段设置【该表格中的所有字段都会出现在SELECT中,查询字段出现在选择屏幕中,输出字段出现在ALV中】'.
     315   CALL METHOD go_alv_fields1->set_table_for_first_display
     316     EXPORTING
     317       it_toolbar_excluding = gt_exclude
     318       is_layout            = gs_layout
     319     CHANGING
     320       it_outtab            = gt_fields1
     321       it_fieldcatalog      = gt_fieldcat_fields1.
     322 
     323   d_build_fieldcat:
     324     gt_fieldcat_fields2  gt_f4_fields2  'FIELDNAME'    'X'   ' '  ' '  15  '字段名',
     325     gt_fieldcat_fields2  gt_f4_fields2  'QFIELDNAME'   'X'   ' '  'X'   8  '单位字段',
     326     gt_fieldcat_fields2  gt_f4_fields2  'CFIELDNAME'   'X'   ' '  'X'   8  '货币字段',
     327     gt_fieldcat_fields2  gt_f4_fields2  'REF_TABLE'    'X'   ' '  ' '  12  '参照表',
     328     gt_fieldcat_fields2  gt_f4_fields2  'REF_FIELD'    'X'   ' '  ' '  15  '参照字段',
     329     gt_fieldcat_fields2  gt_f4_fields2  'CONVEXIT'     'X'   ' '  ' '   7  '转换例程',
     330     gt_fieldcat_fields2  gt_f4_fields2  'EMPHASIZE'    'X'   ' '  'X'   6  '列颜色',
     331     gt_fieldcat_fields2  gt_f4_fields2  'SCRTEXT_L'    'X'   ' '  ' '  20  '字段描述'.
     332   gs_layout-grid_title = '附加字段【如:汇总字段、合并字段等】'.
     333   CALL METHOD go_alv_fields2->set_table_for_first_display
     334     EXPORTING
     335       it_toolbar_excluding = gt_exclude
     336       is_layout            = gs_layout
     337     CHANGING
     338       it_outtab            = gt_fields2
     339       it_fieldcatalog      = gt_fieldcat_fields2.
     340 
     341   "注册事件
     342   go_alv_tables->register_f4_for_fields(  EXPORTING it_f4 = gt_f4_tables  ).
     343   go_alv_joins->register_f4_for_fields(   EXPORTING it_f4 = gt_f4_joins   ).
     344   go_alv_fields1->register_f4_for_fields( EXPORTING it_f4 = gt_f4_fields1 ).
     345   go_alv_fields2->register_f4_for_fields( EXPORTING it_f4 = gt_f4_fields2 ).
     346   go_alv_tables->register_edit_event(  EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
     347   go_alv_joins->register_edit_event(   EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
     348   go_alv_fields1->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
     349   go_alv_fields2->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
     350 
     351 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
     352   PERFORM f4_prog.
     353 
     354 AT SELECTION-SCREEN.
     355   go_alv_tables->check_changed_data( ).
     356   go_alv_joins->check_changed_data( ).
     357   go_alv_fields1->check_changed_data( ).
     358   go_alv_fields2->check_changed_data( ).
     359 
     360   g_indxid = p_prog && 'RG'.
     361   ok_code = sy-ucomm.
     362   CLEAR sy-ucomm.
     363   CASE ok_code.
     364     WHEN 'FC01'.
     365       EXPORT tables = gt_tables joins = gt_joins fields1 = gt_fields1 fields2 = gt_fields2 TO DATABASE indx(st) ID g_indxid.
     366     WHEN 'FC02'.
     367       IMPORT tables = gt_tables joins = gt_joins fields1 = gt_fields1 fields2 = gt_fields2 FROM DATABASE indx(st) ID g_indxid.
     368       PERFORM alv_refresh_display.
     369     WHEN 'FC03'.
     370       PERFORM download.
     371     WHEN 'FC04'.
     372       PERFORM upload.
     373       PERFORM alv_refresh_display.
     374     WHEN 'GEN'.
     375       PERFORM check.
     376       CHECK g_flag_error IS INITIAL.
     377       PERFORM process_data.
     378       PERFORM generate.
     379   ENDCASE.
     380 
     381 *&---------------------------------------------------------------------*
     382 *&      Form  alv_prepare_toolbar
     383 *&---------------------------------------------------------------------*
     384 *       text
     385 *----------------------------------------------------------------------*
     386 FORM alv_prepare_toolbar  TABLES  pt_exclude TYPE ui_functions.
     387   REFRESH: pt_exclude.
     388 
     389   APPEND cl_gui_alv_grid=>mc_fc_maximum TO pt_exclude.
     390   APPEND cl_gui_alv_grid=>mc_fc_minimum TO pt_exclude.
     391   APPEND cl_gui_alv_grid=>mc_fc_subtot TO pt_exclude.
     392   APPEND cl_gui_alv_grid=>mc_fc_sum TO pt_exclude.
     393   APPEND cl_gui_alv_grid=>mc_fc_average TO pt_exclude.
     394   APPEND cl_gui_alv_grid=>mc_mb_sum TO pt_exclude.
     395   APPEND cl_gui_alv_grid=>mc_mb_subtot TO pt_exclude.
     396   APPEND cl_gui_alv_grid=>mc_fc_sort_asc TO pt_exclude.
     397   APPEND cl_gui_alv_grid=>mc_fc_sort_dsc TO pt_exclude.
     398   APPEND cl_gui_alv_grid=>mc_fc_find TO pt_exclude.
     399   APPEND cl_gui_alv_grid=>mc_fc_filter TO pt_exclude.
     400   APPEND cl_gui_alv_grid=>mc_fc_print TO pt_exclude.
     401   APPEND cl_gui_alv_grid=>mc_fc_print_prev TO pt_exclude.
     402   APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
     403   APPEND cl_gui_alv_grid=>mc_fc_graph TO pt_exclude.
     404   APPEND cl_gui_alv_grid=>mc_mb_export TO pt_exclude.
     405   APPEND cl_gui_alv_grid=>mc_mb_view TO pt_exclude.
     406   APPEND cl_gui_alv_grid=>mc_fc_detail TO pt_exclude.
     407   APPEND cl_gui_alv_grid=>mc_fc_help TO pt_exclude.
     408   APPEND cl_gui_alv_grid=>mc_fc_info TO pt_exclude.
     409   APPEND cl_gui_alv_grid=>mc_mb_variant TO pt_exclude.
     410   APPEND cl_gui_alv_grid=>mc_fc_refresh TO pt_exclude.
     411   APPEND cl_gui_alv_grid=>mc_fc_check TO pt_exclude.
     412   APPEND cl_gui_alv_grid=>mc_fc_loc_copy TO pt_exclude.
     413 *  APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO pt_exclude.
     414 *  APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO pt_exclude.
     415   APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO pt_exclude.
     416 *  APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO pt_exclude.
     417   APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO pt_exclude.
     418   APPEND cl_gui_alv_grid=>mc_fc_loc_cut TO pt_exclude.
     419   APPEND cl_gui_alv_grid=>mc_mb_paste TO pt_exclude.
     420 ENDFORM.                    "alv_prepare_toolbar
     421 *&---------------------------------------------------------------------*
     422 *&      Form  alv_prepare_layout
     423 *&---------------------------------------------------------------------*
     424 *       text
     425 *----------------------------------------------------------------------*
     426 *      -->PS_LAYOUT  text
     427 *----------------------------------------------------------------------*
     428 FORM alv_prepare_layout  CHANGING ps_layout TYPE lvc_s_layo.
     429   ps_layout-zebra = 'X'.
     430   ps_layout-sel_mode = 'A'.
     431   ps_layout-smalltitle = 'X'.
     432 ENDFORM.                    "alv_prepare_layout
     433 *&---------------------------------------------------------------------*
     434 *&      Form  handle_toolbar
     435 *&---------------------------------------------------------------------*
     436 *       text
     437 *----------------------------------------------------------------------*
     438 FORM handle_toolbar USING  e_object TYPE REF TO cl_alv_event_toolbar_set
     439                             e_interactive TYPE char1.
     440   DATA: ls_toolbar TYPE stb_button.
     441 
     442   ls_toolbar-function = 'IMPORT'.
     443   ls_toolbar-icon = icon_import.
     444   ls_toolbar-text = '导入表格字段'.
     445   ls_toolbar-quickinfo = '导入表格字段'.
     446   APPEND ls_toolbar TO e_object->mt_toolbar.
     447   CLEAR: ls_toolbar.
     448 
     449   ls_toolbar-function = 'ALL'.
     450   ls_toolbar-text = '输出:全选'.
     451   ls_toolbar-quickinfo = '全部输出'.
     452   APPEND ls_toolbar TO e_object->mt_toolbar.
     453   CLEAR: ls_toolbar.
     454 
     455   ls_toolbar-function = 'NONE'.
     456   ls_toolbar-text = '输出:取消全选'.
     457   ls_toolbar-quickinfo = '全部不输出'.
     458   APPEND ls_toolbar TO e_object->mt_toolbar.
     459   CLEAR: ls_toolbar.
     460 ENDFORM.                    "handle_toolbar
     461 *&---------------------------------------------------------------------*
     462 *&      Form  handle_user_command
     463 *&---------------------------------------------------------------------*
     464 *       text
     465 *----------------------------------------------------------------------*
     466 FORM handle_user_command  USING    e_ucomm.
     467   DATA: l_astable TYPE tabname,
     468         l_tabname TYPE tabname,
     469         lt_dfies_tab TYPE TABLE OF dfies WITH HEADER LINE.
     470 
     471   ok_code = e_ucomm.
     472   CLEAR e_ucomm.
     473 
     474   CASE ok_code.
     475     WHEN 'IMPORT'.
     476       "选择表
     477       PERFORM f4_table CHANGING l_astable.
     478       CHECK l_astable IS NOT INITIAL.
     479 
     480       "获取真实表名
     481       READ TABLE gt_tables WITH KEY astable = l_astable INTO gs_table.
     482       IF sy-subrc = 0.
     483         l_tabname = gs_table-tabname.
     484       ELSE.
     485         l_tabname = l_astable.
     486       ENDIF.
     487 
     488       "获取字段
     489       CALL FUNCTION 'DDIF_FIELDINFO_GET'
     490         EXPORTING
     491           tabname        = l_tabname
     492           langu          = sy-langu
     493         TABLES
     494           dfies_tab      = lt_dfies_tab[]
     495         EXCEPTIONS
     496           not_found      = 1
     497           internal_error = 2
     498           OTHERS         = 3.
     499       CHECK sy-subrc = 0.
     500 
     501       "添加到ALV
     502       LOOP AT lt_dfies_tab.
     503         CHECK lt_dfies_tab-fieldname <> 'MANDT'.
     504         CLEAR: gs_field1.
     505         gs_field1-astable = l_astable.
     506         gs_field1-fieldname = lt_dfies_tab-fieldname.
     507         gs_field1-scrtext_l = lt_dfies_tab-fieldtext.
     508         gs_field1-ref_table = l_tabname.
     509         gs_field1-ref_field = lt_dfies_tab-fieldname.
     510         APPEND gs_field1 TO gt_fields1.
     511       ENDLOOP.
     512 
     513       go_alv_fields1->refresh_table_display( ).
     514 
     515     WHEN 'ALL'.
     516       gs_field1-display = 'X'.
     517       MODIFY gt_fields1 FROM gs_field1 TRANSPORTING display WHERE display = ''.
     518       go_alv_fields1->refresh_table_display( ).
     519     WHEN 'NONE'.
     520       gs_field1-display = ''.
     521       MODIFY gt_fields1 FROM gs_field1 TRANSPORTING display WHERE display = 'X'.
     522       go_alv_fields1->refresh_table_display( ).
     523   ENDCASE.
     524 ENDFORM.                    "handle_user_command
     525 *&---------------------------------------------------------------------*
     526 *&      Form  handle_f4
     527 *&---------------------------------------------------------------------*
     528 *       text
     529 *----------------------------------------------------------------------*
     530 FORM handle_f4  USING           e_fieldname TYPE lvc_fname
     531                                 e_fieldvalue TYPE lvc_value
     532                                 es_row_no TYPE lvc_s_roid
     533                                 er_event_data TYPE REF TO cl_alv_event_data
     534                                 et_bad_cells TYPE lvc_t_modi.
     535   DATA: ls_row TYPE lvc_s_row,
     536         ls_col TYPE lvc_s_col,
     537         ls_modi TYPE lvc_s_modi,
     538         l_tabname TYPE tabname,
     539         l_fieldtext TYPE fieldtext,
     540         l_ref_table TYPE lvc_rtname,
     541         l_ref_field TYPE lvc_rfname.
     542   FIELD-SYMBOLS: <lt_modi> TYPE lvc_t_modi.
     543 
     544   er_event_data->m_event_handled = 'X'.
     545 
     546   CASE e_fieldname.
     547     WHEN 'TABNAME'.
     548       PERFORM f4_dd_table(rsaqddic) USING 'SAPLAQJD_CNTRL'
     549                                           '0300'
     550                                           'G_DYN_0300-TNAME'
     551                                     CHANGING e_fieldvalue.  "搜索帮助代码,来于SQVI中“插入表”的搜索帮助
     552 
     553     WHEN 'TAB1' OR 'TAB2' OR 'ASTABLE'.
     554       PERFORM f4_table CHANGING e_fieldvalue.
     555 
     556     WHEN 'FIELD1' OR 'FIELD2' OR 'FIELDNAME'.
     557       go_alv_tables->check_changed_data( ).
     558 
     559       IF e_fieldname = 'FIELD1'.
     560         READ TABLE gt_joins INDEX es_row_no-row_id INTO gs_join.
     561         CHECK gs_join-tab1 IS NOT INITIAL.
     562         l_tabname = gs_join-tab1.
     563       ELSEIF e_fieldname = 'FIELD2'.
     564         READ TABLE gt_joins INDEX es_row_no-row_id INTO gs_join.
     565         CHECK gs_join-tab2 IS NOT INITIAL.
     566         l_tabname = gs_join-tab2.
     567       ELSEIF e_fieldname = 'FIELDNAME'.
     568         READ TABLE gt_fields1 INDEX es_row_no-row_id INTO gs_field1.
     569         CHECK gs_field1-astable IS NOT INITIAL.
     570         l_tabname = gs_field1-astable.
     571         l_fieldtext = gs_field1-scrtext_l.
     572         l_ref_table = gs_field1-ref_table.
     573         l_ref_field = gs_field1-ref_field.
     574       ENDIF.
     575 
     576       READ TABLE gt_tables WITH KEY astable = l_tabname INTO gs_table.
     577       IF sy-subrc = 0.
     578         l_tabname = gs_table-tabname.
     579       ENDIF.
     580 
     581       PERFORM f4_field USING l_tabname CHANGING e_fieldvalue l_fieldtext l_ref_table l_ref_field.
     582 
     583     WHEN 'QFIELDNAME' OR 'CFIELDNAME'.
     584       PERFORM f4_field_in_itab CHANGING e_fieldvalue.
     585 
     586     WHEN 'EMPHASIZE'.
     587       PERFORM f4_color CHANGING e_fieldvalue.
     588 
     589     WHEN OTHERS.
     590       EXIT.
     591   ENDCASE.
     592 
     593   ASSIGN er_event_data->m_data->* TO <lt_modi>.
     594   ls_modi-row_id    = es_row_no-row_id."
     595   ls_modi-fieldname = e_fieldname.
     596   ls_modi-value     = e_fieldvalue.
     597   APPEND ls_modi TO <lt_modi>.
     598   IF e_fieldname = 'FIELDNAME'.
     599     ls_modi-row_id    = es_row_no-row_id."
     600     ls_modi-fieldname = 'SCRTEXT_L'.
     601     ls_modi-value     = l_fieldtext.
     602     APPEND ls_modi TO <lt_modi>.
     603 
     604     ls_modi-row_id    = es_row_no-row_id."
     605     ls_modi-fieldname = 'REF_TABLE'.
     606     ls_modi-value     = l_ref_table.
     607     APPEND ls_modi TO <lt_modi>.
     608 
     609     ls_modi-row_id    = es_row_no-row_id."
     610     ls_modi-fieldname = 'REF_FIELD'.
     611     ls_modi-value     = l_ref_field.
     612     APPEND ls_modi TO <lt_modi>.
     613   ENDIF.
     614 
     615 ENDFORM.                                                    "handle_f4
     616 *&---------------------------------------------------------------------*
     617 *&      Form  F4_PROG
     618 *&---------------------------------------------------------------------*
     619 *       程序名称的搜索帮助(同SE38)
     620 *----------------------------------------------------------------------*
     621 FORM f4_prog .
     622   DATA: lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.
     623 
     624   lt_dynpfields-fieldname  = 'P_PROG'.
     625   APPEND lt_dynpfields.
     626 
     627   CALL FUNCTION 'DYNP_VALUES_READ'
     628     EXPORTING
     629       dyname     = sy-repid
     630       dynumb     = sy-dynnr
     631     TABLES
     632       dynpfields = lt_dynpfields[].
     633 
     634   READ TABLE lt_dynpfields INDEX 1.
     635   p_prog = lt_dynpfields-fieldvalue.
     636 
     637   CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
     638     EXPORTING
     639       object_type          = 'PROG'
     640       object_name          = p_prog
     641       suppress_selection   = 'X'
     642     IMPORTING
     643       object_name_selected = p_prog
     644     EXCEPTIONS
     645       cancel               = 01.
     646 ENDFORM.                                                    " F4_PROG
     647 *&---------------------------------------------------------------------*
     648 *&      Form  PROCESS_DATA
     649 *&---------------------------------------------------------------------*
     650 *       处理数据
     651 *----------------------------------------------------------------------*
     652 FORM process_data .
     653   DATA: l_tabname TYPE tabname,
     654         l_as_flag TYPE c.
     655 
     656   LOOP AT gt_fields1 INTO gs_field1.
     657     "取真实表名
     658     READ TABLE gt_tables WITH KEY astable = gs_field1-astable INTO gs_table.
     659     IF sy-subrc = 0.
     660       l_tabname = gs_table-tabname.
     661       l_as_flag = 'X'.
     662     ELSE.
     663       l_tabname = gs_field1-astable.
     664       l_as_flag = ''.
     665     ENDIF.
     666 
     667     "根据单选和多选情况,确定选择条件的参数
     668     IF gs_field1-query = 'X'.
     669       IF gs_field1-asfield IS INITIAL.
     670         gs_field1-sel_field = gs_field1-fieldname.
     671       ELSE.
     672         gs_field1-sel_field = gs_field1-asfield.
     673       ENDIF.
     674 
     675       IF gs_field1-single = 'X'.
     676         gs_field1-sel_field = 'P_' && gs_field1-sel_field.
     677       ELSE.
     678         gs_field1-sel_field = 'S_' && gs_field1-sel_field.
     679       ENDIF.
     680     ENDIF.
     681 
     682     "确定SQL字段的名称
     683     IF l_as_flag = ''.
     684       gs_field1-sql_field = l_tabname && '~' && gs_field1-fieldname.
     685     ELSE.
     686       gs_field1-sql_field = gs_field1-astable && '~' && gs_field1-fieldname.
     687     ENDIF.
     688 
     689     "确定显示字段的名称
     690     IF gs_field1-asfield IS INITIAL.
     691       gs_field1-out_field = gs_field1-fieldname.
     692     ELSE.
     693       gs_field1-out_field = gs_field1-asfield.
     694       "SQL字段别名处理
     695       CONCATENATE gs_field1-sql_field 'AS' gs_field1-asfield INTO gs_field1-sql_field SEPARATED BY space.
     696     ENDIF.
     697 
     698     "确定参照字段的名称
     699     gs_field1-typ_field = l_tabname && '-' && gs_field1-fieldname.
     700 
     701     gs_field1-mark = '"' && gs_field1-scrtext_l.
     702     SHIFT gs_field1-mark RIGHT BY 10 PLACES.
     703     MODIFY gt_fields1 FROM gs_field1 TRANSPORTING sel_field sql_field out_field typ_field mark.
     704   ENDLOOP.
     705 
     706   gt_query = gt_fields1.
     707   DELETE gt_query WHERE query  = ''.
     708   SORT gt_query STABLE BY query_pos.
     709 
     710   LOOP AT gt_fields2 INTO gs_field2.
     711     IF gs_field2-ref_table IS INITIAL.
     712       gs_field2-typ_field = gs_field2-ref_field.
     713     ELSE.
     714       gs_field2-typ_field = gs_field2-ref_table && '-' && gs_field2-ref_field.
     715     ENDIF.
     716     MODIFY gt_fields2 FROM gs_field2 TRANSPORTING typ_field.
     717   ENDLOOP.
     718 ENDFORM.                    " PROCESS_DATA
     719 
     720 *&---------------------------------------------------------------------*
     721 *&      Form  generate
     722 *&---------------------------------------------------------------------*
     723 *       生成程序
     724 *----------------------------------------------------------------------*
     725 FORM generate.
     726   REFRESH gt_codes.
     727 
     728   CHECK p_prog(1) = 'Y' OR p_prog(1) = 'Z'.
     729 
     730   IF strlen( p_prog ) > 20.
     731     MESSAGE '程序名长度不能超过20' TYPE 'E' DISPLAY LIKE 'I'.
     732   ENDIF.
     733 
     734   SELECT SINGLE progname INTO p_prog FROM reposrc WHERE progname = p_prog.
     735   IF sy-subrc = 0.
     736 *    MESSAGE '程序已经存在' TYPE 'E' DISPLAY LIKE 'I'.
     737   ENDIF.
     738 
     739   "程序名
     740   PERFORM gen_report_name.
     741   "TABLES
     742   PERFORM gen_tables_clause.
     743   "SELECTION-SCREEN
     744   PERFORM gen_selection_screen.
     745   "类型定义
     746   PERFORM gen_types.
     747   "数据定义
     748   PERFORM gen_data_defination.
     749   "初始化
     750   PERFORM gen_initialization.
     751   "START-OF-SELECTION
     752   PERFORM gen_start_of_selection.
     753   "FORM GET_DATA
     754   PERFORM gen_form_get_data.
     755   "FORM PROCESS_DATA
     756   PERFORM gen_form_process_data.
     757   "FORM BUILD_FIELDCAT
     758   PERFORM gen_form_build_fieldcat.
     759   "FORM DISPLAY_DATA
     760   PERFORM gen_form_display_data.
     761   "FORM PF_STATUS_ALV
     762   PERFORM gen_form_pf_status_alv.
     763   "FORM USER_COMMAND_ALV
     764   PERFORM gen_form_user_command_alv.
     765 
     766   INSERT REPORT p_prog FROM gt_codes.
     767 ENDFORM.                    "GENERATE
     768 *&---------------------------------------------------------------------*
     769 *&      Form  GEN_REPORT_NAME
     770 *&---------------------------------------------------------------------*
     771 *       text
     772 *----------------------------------------------------------------------*
     773 FORM gen_report_name .
     774   CONCATENATE 'REPORT' p_prog INTO g_code SEPARATED BY space.
     775   g_code = g_code && '.'.
     776   append_code: g_code, ''.
     777 ENDFORM.                    " GEN_REPORT_NAME
     778 *&---------------------------------------------------------------------*
     779 *&      Form  GEN_TABLES_CLAUSE
     780 *&---------------------------------------------------------------------*
     781 *       text
     782 *----------------------------------------------------------------------*
     783 FORM gen_tables_clause .
     784   DATA: lt_tables TYPE TABLE OF typ_table.
     785 
     786   lt_tables = gt_tables.
     787   SORT lt_tables BY tabname.
     788   DELETE ADJACENT DUPLICATES FROM lt_tables COMPARING tabname.
     789 
     790   g_code = 'TABLES:'.
     791   LOOP AT lt_tables INTO gs_table.
     792     CONCATENATE g_code gs_table-tabname INTO g_code SEPARATED BY space.
     793     IF sy-tabix = lines( lt_tables ).
     794       g_code = g_code && '.'.
     795     ELSE.
     796       g_code = g_code && ','.
     797     ENDIF.
     798   ENDLOOP.
     799   append_code: g_code, ''.
     800 ENDFORM.                    " GEN_TABLES_CLAUSE
     801 *&---------------------------------------------------------------------*
     802 *&      Form  GEN_SELECTION_SCREEN
     803 *&---------------------------------------------------------------------*
     804 *       text
     805 *----------------------------------------------------------------------*
     806 FORM gen_selection_screen .
     807   append_code 'SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE TEXT-001.'.
     808 
     809   LOOP AT gt_query INTO gs_query.
     810     IF gs_query-single = 'X'.
     811       CONCATENATE 'PARAMETERS' gs_query-sel_field 'TYPE' gs_query-typ_field INTO g_code SEPARATED BY space.
     812     ELSE.
     813       CONCATENATE 'SELECT-OPTIONS' gs_query-sel_field 'FOR' gs_query-typ_field INTO g_code SEPARATED BY space.
     814     ENDIF.
     815     g_code = g_code && '.' && gs_query-mark.
     816     append_code g_code.
     817   ENDLOOP.
     818 
     819   append_code 'SELECTION-SCREEN END OF BLOCK 001.'.
     820   append_code ''.
     821 ENDFORM.                    " GEN_SELECTION_SCREEN
     822 *&---------------------------------------------------------------------*
     823 *&      Form  GEN_TYPES
     824 *&---------------------------------------------------------------------*
     825 *       text
     826 *----------------------------------------------------------------------*
     827 FORM gen_types .
     828   DATA: l_mark TYPE c LENGTH 60.
     829 
     830   append_code:
     831     'TYPES:',
     832     '  BEGIN OF TYP_DATA,'.
     833   LOOP AT gt_fields1 INTO gs_field1.
     834     CONCATENATE gs_field1-out_field 'TYPE' gs_field1-typ_field INTO g_code SEPARATED BY space.
     835     g_code = g_code && ',' && gs_field1-mark.
     836     SHIFT g_code RIGHT BY 4 PLACES.
     837     append_code g_code.
     838   ENDLOOP.
     839 
     840   LOOP AT gt_fields2 INTO gs_field2.
     841     CONCATENATE gs_field2-fieldname 'TYPE' gs_field2-typ_field INTO g_code SEPARATED BY space.
     842     l_mark = '"' && gs_field2-scrtext_l.
     843     SHIFT l_mark RIGHT BY 10 PLACES.
     844     g_code = g_code && ',' && l_mark.
     845     SHIFT g_code RIGHT BY 4 PLACES.
     846     append_code g_code.
     847   ENDLOOP.
     848 
     849   append_code: '  END OF TYP_DATA.', ''.
     850 ENDFORM.                    " GEN_TYPES
     851 *&---------------------------------------------------------------------*
     852 *&      Form  GEN_DATA_DEFINATION
     853 *&---------------------------------------------------------------------*
     854 *       text
     855 *----------------------------------------------------------------------*
     856 FORM gen_data_defination .
     857   append_code:
     858     '  DATA:',
     859     '    GT_DATA     TYPE TABLE OF TYP_DATA,',
     860     '    GS_DATA     TYPE TYP_DATA,',
     861     '    GT_FIELDCAT TYPE LVC_T_FCAT,',
     862     '    GS_FIELDCAT TYPE LVC_S_FCAT,',
     863     '    GS_LAYOUT   TYPE LVC_S_LAYO.',
     864     ''.
     865 ENDFORM.                    " GEN_DATA_DEFINATION
     866 *&---------------------------------------------------------------------*
     867 *&      Form  GEN_INITIALIZATION
     868 *&---------------------------------------------------------------------*
     869 *       text
     870 *----------------------------------------------------------------------*
     871 FORM gen_initialization .
     872   append_code 'INITIALIZATION.'.
     873   LOOP AT gt_query INTO gs_query.
     874     g_code = '  %_' && gs_query-sel_field && '_%_APP_%-TEXT'.
     875     g_code = g_code && ' = ''' && gs_query-scrtext_l && '''.'.
     876     append_code g_code.
     877   ENDLOOP.
     878   append_code ''.
     879 ENDFORM.                    " GEN_INITIALIZATION
     880 *&---------------------------------------------------------------------*
     881 *&      Form  GEN_START_OF_SELECTION
     882 *&---------------------------------------------------------------------*
     883 *       text
     884 *----------------------------------------------------------------------*
     885 FORM gen_start_of_selection .
     886   append_code:
     887     'START-OF-SELECTION.',
     888     '  PERFORM GET_DATA.',
     889     '  PERFORM PROCESS_DATA.',
     890     '  PERFORM DISPLAY_DATA.',
     891     ''.
     892 ENDFORM.                    " GEN_START_OF_SELECTION
     893 *&---------------------------------------------------------------------*
     894 *&      Form  GEN_FORM_GET_DATA
     895 *&---------------------------------------------------------------------*
     896 *       text
     897 *----------------------------------------------------------------------*
     898 FORM gen_form_get_data .
     899   DATA: l_joinfield TYPE string,
     900         l_tabname TYPE tabname,
     901         l_join_counts TYPE i,
     902         l_index TYPE i.
     903 
     904   append_code:
     905     '*&---------------------------------------------------------------------*',
     906     '*&      FORM  GET_DATA                                                  ',
     907     '*&---------------------------------------------------------------------*',
     908     '*       获取数据                                                        ',
     909     '*----------------------------------------------------------------------*',
     910     'FORM GET_DATA.                                                          '.
     911 
     912   "SELECT字段
     913   append_code '  SELECT'.
     914   LOOP AT gt_fields1 INTO gs_field1.
     915     g_code = gs_field1-sql_field && gs_field1-mark.
     916     SHIFT g_code RIGHT BY 4 PLACES.
     917     append_code g_code.
     918   ENDLOOP.
     919   IF gt_fields2 IS INITIAL.
     920     append_code '    INTO TABLE GT_DATA'.
     921   ELSE.
     922     append_code '    INTO CORRESPONDING FIELDS OF TABLE GT_DATA'.
     923   ENDIF.
     924 
     925   "FROM语句
     926   READ TABLE gt_tables INDEX 1 INTO gs_table.
     927   CONCATENATE 'FROM' gs_table-tabname INTO g_code SEPARATED BY space.
     928   IF gs_table-astable IS NOT INITIAL.
     929     CONCATENATE g_code 'AS' gs_table-astable INTO g_code SEPARATED BY space.
     930   ENDIF.
     931   SHIFT g_code RIGHT BY 4 PLACES.
     932   append_code g_code.
     933 
     934   "JOIN语句
     935   LOOP AT gt_tables INTO gs_table FROM 2.
     936     IF gs_table-leftjoin = 'X'.
     937       CONCATENATE '    LEFT JOIN' gs_table-tabname INTO g_code SEPARATED BY space.
     938     ELSE.
     939       CONCATENATE '    INNER JOIN' gs_table-tabname INTO g_code SEPARATED BY space.
     940     ENDIF.
     941 
     942     IF gs_table-astable IS INITIAL.
     943       l_tabname = gs_table-tabname.
     944     ELSE.
     945       l_tabname = gs_table-astable.
     946       CONCATENATE g_code 'AS' l_tabname INTO g_code SEPARATED BY space.
     947     ENDIF.
     948 
     949     CONCATENATE g_code 'ON' INTO g_code SEPARATED BY space.
     950 
     951     CLEAR: l_join_counts.
     952     LOOP AT gt_joins INTO gs_join WHERE tab1 = l_tabname.
     953       ADD 1 TO l_join_counts.
     954       IF l_join_counts > 1.
     955         CONCATENATE g_code 'AND' INTO g_code SEPARATED BY space.
     956       ENDIF.
     957 
     958       l_joinfield = gs_join-tab1 && '~' && gs_join-field1.
     959       CONCATENATE g_code l_joinfield '=' INTO g_code SEPARATED BY space.
     960 
     961       IF gs_join-tab2 IS INITIAL.
     962         l_joinfield = gs_join-field2.
     963       ELSE.
     964         l_joinfield = gs_join-tab2 && '~' && gs_join-field2.
     965       ENDIF.
     966       CONCATENATE g_code l_joinfield INTO g_code SEPARATED BY space.
     967     ENDLOOP.
     968     append_code g_code.
     969   ENDLOOP.
     970 
     971   "WHERE语句
     972   LOOP AT gt_query INTO gs_query.
     973     l_index = sy-tabix.
     974 
     975     g_code = gs_query-astable && '~' && gs_query-fieldname.
     976     IF l_index = 1.
     977       CONCATENATE '    WHERE' g_code INTO g_code SEPARATED BY space.
     978     ELSE.
     979       CONCATENATE '      AND' g_code INTO g_code SEPARATED BY space.
     980     ENDIF.
     981     IF gs_query-single = 'X'.
     982       CONCATENATE g_code '=' gs_query-sel_field INTO g_code SEPARATED BY space.
     983     ELSE.
     984       CONCATENATE g_code 'IN' gs_query-sel_field INTO g_code SEPARATED BY space.
     985     ENDIF.
     986 
     987     IF l_index = lines( gt_query ).
     988       g_code = g_code && '.'.
     989     ENDIF.
     990 
     991     append_code g_code.
     992   ENDLOOP.
     993 
     994   append_code 'ENDFORM.                    "GET_DATA'.
     995 ENDFORM.                    " GEN_FORM_GET_DATA
     996 *&---------------------------------------------------------------------*
     997 *&      Form  GEN_FORM_PROCESS_DATA
     998 *&---------------------------------------------------------------------*
     999 *       text
    1000 *----------------------------------------------------------------------*
    1001 FORM gen_form_process_data .
    1002   append_code:
    1003     '*&---------------------------------------------------------------------*',
    1004     '*&      FORM  PROCESS_DATA                                              ',
    1005     '*&---------------------------------------------------------------------*',
    1006     '*       处理数据                                                        ',
    1007     '*----------------------------------------------------------------------*',
    1008     'FORM PROCESS_DATA.                                                       ',
    1009     '                                                                         ',
    1010     'ENDFORM.                    "PROCESS_DATA                                '.
    1011 ENDFORM.                    "GEN_FORM_PROCESS_DATA
    1012 *&---------------------------------------------------------------------*
    1013 *&      Form  GEN_FORM_BUILD_FIELDCAT
    1014 *&---------------------------------------------------------------------*
    1015 *       text
    1016 *----------------------------------------------------------------------*
    1017 FORM gen_form_build_fieldcat .
    1018   append_code:
    1019     '*&---------------------------------------------------------------------*',
    1020     '*&      Form  BUILD_FIELDCAT                                            ',
    1021     '*&---------------------------------------------------------------------*',
    1022     '*       TEXT                                                            ',
    1023     '*----------------------------------------------------------------------*',
    1024     'FORM BUILD_FIELDCAT USING P_FIELDNAME   TYPE FIELDNAME                  ',
    1025     '                          P_QFIELDNAME  TYPE LVC_QFNAME                 ',
    1026     '                          P_CFIELDNAME  TYPE LVC_CFNAME                 ',
    1027     '                          P_REF_TABLE   TYPE LVC_RTNAME                 ',
    1028     '                          P_REF_FIELD   TYPE LVC_RFNAME                 ',
    1029     '                          P_CONVEXIT    TYPE CONVEXIT                   ',
    1030     '                          P_EMPHASIZE   TYPE LVC_EMPHSZ                 ',
    1031     '                          P_SCRTEXT_L   TYPE SCRTEXT_L.                 ',
    1032     '  GS_FIELDCAT-FIELDNAME     = P_FIELDNAME.                              ',
    1033     '  GS_FIELDCAT-QFIELDNAME    = P_QFIELDNAME.                             ',
    1034     '  GS_FIELDCAT-CFIELDNAME    = P_CFIELDNAME.                             ',
    1035     '  GS_FIELDCAT-REF_TABLE     = P_REF_TABLE.                              ',
    1036     '  GS_FIELDCAT-REF_FIELD     = P_REF_FIELD.                              ',
    1037     '  GS_FIELDCAT-CONVEXIT      = P_CONVEXIT.                               ',
    1038     '  GS_FIELDCAT-EMPHASIZE     = P_EMPHASIZE.                              ',
    1039     '  GS_FIELDCAT-SCRTEXT_L     = P_SCRTEXT_L.                              ',
    1040     '  GS_FIELDCAT-COLDDICTXT    = ''L''.                                    ',
    1041     '  APPEND GS_FIELDCAT TO GT_FIELDCAT.                                    ',
    1042     '  CLEAR: GS_FIELDCAT.                                                   ',
    1043     'ENDFORM.                    "BUILD_FIELDCAT                             '.
    1044 ENDFORM.                    " GEN_FORM_BUILD_FIELDCAT
    1045 *&---------------------------------------------------------------------*
    1046 *&      Form  GEN_FORM_DISPLAY_DATA
    1047 *&---------------------------------------------------------------------*
    1048 *       text
    1049 *----------------------------------------------------------------------*
    1050 FORM gen_form_display_data .
    1051   append_code:
    1052    '*&---------------------------------------------------------------------*',
    1053    '*&      FORM  DISPLAY_DATA                                              ',
    1054    '*&---------------------------------------------------------------------*',
    1055    '*       显示数据                                                        ',
    1056    '*----------------------------------------------------------------------*',
    1057    'FORM DISPLAY_DATA.                                                      '.
    1058 
    1059   "FIELDCAT
    1060   LOOP AT gt_fields1 INTO gs_field1 WHERE display = 'X'.
    1061     g_code = '  PERFORM BUILD_FIELDCAT USING ''' &&
    1062               gs_field1-out_field && ''' ''' &&
    1063               gs_field1-qfieldname && ''' ''' &&
    1064               gs_field1-cfieldname && ''' ''' &&
    1065               gs_field1-ref_table && ''' ''' &&
    1066               gs_field1-ref_field && ''' ''' &&
    1067               gs_field1-convexit && ''' ''' &&
    1068               gs_field1-emphasize && ''' ''' &&
    1069               gs_field1-scrtext_l && '''.'.
    1070     append_code g_code.
    1071   ENDLOOP.
    1072   LOOP AT gt_fields2 INTO gs_field2.
    1073     g_code = '  PERFORM BUILD_FIELDCAT USING ''' &&
    1074               gs_field2-fieldname && ''' ''' &&
    1075               gs_field2-qfieldname && ''' ''' &&
    1076               gs_field2-cfieldname && ''' ''' &&
    1077               gs_field2-ref_table && ''' ''' &&
    1078               gs_field2-ref_field && ''' ''' &&
    1079               gs_field2-convexit && ''' ''' &&
    1080               gs_field2-emphasize && ''' ''' &&
    1081               gs_field2-scrtext_l && '''.'.
    1082     append_code g_code.
    1083   ENDLOOP.
    1084   append_code ''.
    1085 
    1086   "LAYOUT
    1087   append_code:
    1088     '  gs_layout-cwidth_opt = ''X''.',
    1089     '  gs_layout-zebra = ''X''.',
    1090     ''.
    1091 
    1092   append_code:
    1093     '  CALL FUNCTION ''REUSE_ALV_GRID_DISPLAY_LVC''        ',
    1094     '    EXPORTING                                         ',
    1095     '      I_CALLBACK_PROGRAM       = SY-REPID             ',
    1096     '"      I_CALLBACK_PF_STATUS_SET = ''PF_STATUS_ALV''   ',
    1097     '      I_CALLBACK_USER_COMMAND  = ''USER_COMMAND_ALV'' ',
    1098     '      IT_FIELDCAT_LVC          = GT_FIELDCAT          ',
    1099     '      IS_LAYOUT_LVC            = GS_LAYOUT            ',
    1100     '      I_DEFAULT                = ''X''                ',
    1101     '      I_SAVE                   = ''A''                ',
    1102     '    TABLES                                            ',
    1103     '      T_OUTTAB                 = GT_DATA              ',
    1104     '    EXCEPTIONS                                        ',
    1105     '      OTHERS                   = 1.                   '.
    1106   "ALV展示
    1107   append_code 'ENDFORM.                    "DISPLAY_DATA'.
    1108 ENDFORM.                    " GEN_FORM_DISPLAY_DATA
    1109 *&---------------------------------------------------------------------*
    1110 *&      Form  GEN_FORM_PF_STATUS_ALV
    1111 *&---------------------------------------------------------------------*
    1112 *       text
    1113 *----------------------------------------------------------------------*
    1114 FORM gen_form_pf_status_alv .
    1115   append_code:
    1116     '**&---------------------------------------------------------------------*',
    1117     '**&      FORM  PF_STATUS_ALV                                             ',
    1118     '**&---------------------------------------------------------------------*',
    1119     '**       TEXT                                                            ',
    1120     '**----------------------------------------------------------------------*',
    1121     '*FORM PF_STATUS_ALV USING RT_EXTAB TYPE SLIS_T_EXTAB .                   ',
    1122     '*  SET PF-STATUS ''STATUS_ALV'' EXCLUDING RT_EXTAB.                      ',
    1123     '*ENDFORM.                    "PF_STATUS_ALV                              '.
    1124 ENDFORM.                    " GEN_FORM_PF_STATUS_ALV
    1125 *&---------------------------------------------------------------------*
    1126 *&      Form  GEN_FORM_USER_COMMAND_ALV
    1127 *&---------------------------------------------------------------------*
    1128 *       text
    1129 *----------------------------------------------------------------------*
    1130 FORM gen_form_user_command_alv .
    1131   append_code:
    1132     '*&---------------------------------------------------------------------*',
    1133     '*&      FORM  USER_COMMAND_ALV                                          ',
    1134     '*&---------------------------------------------------------------------*',
    1135     '*       TEXT                                                            ',
    1136     '*----------------------------------------------------------------------*',
    1137     'FORM USER_COMMAND_ALV USING R_UCOMM     LIKE SY-UCOMM                   ',
    1138     '                            RS_SELFIELD TYPE SLIS_SELFIELD.             ',
    1139     '  CASE R_UCOMM.                                                         ',
    1140     '    WHEN ''&IC1''.                                                      ',
    1141     '      CASE RS_SELFIELD-FIELDNAME.                                       ',
    1142     '        WHEN ''''.                                                      ',
    1143     '*          CHECK RS_SELFIELD-VALUE IS NOT INITIAL.                      ',
    1144     '*          SET PARAMETER ID ''MBN'' FIELD RS_SELFIELD-VALUE.            ',
    1145     '*          CALL TRANSACTION ''MB03'' AND SKIP FIRST SCREEN.             ',
    1146     '      ENDCASE.                                                          ',
    1147     '  ENDCASE.                                                              ',
    1148     'ENDFORM.                    "USER_COMMAND_ALV                           '.
    1149 ENDFORM.                    " GEN_FORM_USER_COMMAND_ALV
    1150 *&---------------------------------------------------------------------*
    1151 *&      Form  f4_table
    1152 *&---------------------------------------------------------------------*
    1153 *       text
    1154 *----------------------------------------------------------------------*
    1155 FORM f4_table CHANGING p_tabname.
    1156   DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
    1157   DATA: BEGIN OF lt_tables OCCURS 0,
    1158           astable TYPE tabname,
    1159           tabname TYPE tabname,
    1160         END OF lt_tables.
    1161 
    1162   go_alv_tables->check_changed_data( ).
    1163 
    1164   LOOP AT gt_tables INTO gs_table.
    1165     IF gs_table-astable IS INITIAL.
    1166       lt_tables-astable = gs_table-tabname.
    1167     ELSE.
    1168       lt_tables-astable = gs_table-astable.
    1169     ENDIF.
    1170 
    1171     lt_tables-tabname = gs_table-tabname.
    1172     APPEND lt_tables.
    1173   ENDLOOP.
    1174 
    1175   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    1176     EXPORTING
    1177       retfield     = 'ASTABLE'
    1178       window_title = '选择'
    1179       value_org    = 'S'
    1180     TABLES
    1181       value_tab    = lt_tables[]
    1182       return_tab   = lt_return[].
    1183 
    1184   IF lt_return[] IS NOT INITIAL.
    1185     READ TABLE lt_return INDEX 1.
    1186     p_tabname = lt_return-fieldval.
    1187   ENDIF.
    1188 ENDFORM.                                                    "f4_table
    1189 *&---------------------------------------------------------------------*
    1190 *&      Form  f4_field
    1191 *&---------------------------------------------------------------------*
    1192 *       text
    1193 *----------------------------------------------------------------------*
    1194 FORM f4_field USING p_tabname TYPE tabname
    1195               CHANGING p_fieldname p_fieldtext p_ref_table p_ref_field.
    1196   DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
    1197         lt_dfies_tab TYPE TABLE OF dfies WITH HEADER LINE,
    1198         BEGIN OF lt_fields OCCURS 0,
    1199           fieldname TYPE fieldname,
    1200           fieldtext TYPE fieldtext,
    1201           keyflag   TYPE keyflag,
    1202           datatype  TYPE dynptype,
    1203           leng      TYPE ddleng,
    1204           decimals  TYPE decimals,
    1205         END OF lt_fields.
    1206 
    1207   CALL FUNCTION 'DDIF_FIELDINFO_GET'
    1208     EXPORTING
    1209       tabname        = p_tabname
    1210       langu          = sy-langu
    1211     TABLES
    1212       dfies_tab      = lt_dfies_tab[]
    1213     EXCEPTIONS
    1214       not_found      = 1
    1215       internal_error = 2
    1216       OTHERS         = 3.
    1217 
    1218   CHECK sy-subrc = 0.
    1219 
    1220   DELETE lt_dfies_tab WHERE fieldname = 'MANDT'.
    1221   LOOP AT lt_dfies_tab.
    1222     lt_fields-fieldname = lt_dfies_tab-fieldname.
    1223     lt_fields-fieldtext = lt_dfies_tab-fieldtext.
    1224     lt_fields-keyflag   = lt_dfies_tab-keyflag  .
    1225     lt_fields-datatype  = lt_dfies_tab-datatype .
    1226     lt_fields-leng      = lt_dfies_tab-leng     .
    1227     lt_fields-decimals  = lt_dfies_tab-decimals .
    1228     APPEND lt_fields.
    1229   ENDLOOP.
    1230                                                             "调用F4
    1231   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    1232     EXPORTING
    1233       retfield     = 'FIELDNAME'
    1234       window_title = '选择'
    1235       value_org    = 'S'
    1236     TABLES
    1237       value_tab    = lt_fields[]
    1238       return_tab   = lt_return[].
    1239 
    1240   IF lt_return[] IS NOT INITIAL.
    1241     READ TABLE lt_return INDEX 1.
    1242     p_fieldname = lt_return-fieldval.
    1243     READ TABLE lt_fields WITH KEY fieldname = p_fieldname.
    1244     p_fieldtext = lt_fields-fieldtext.
    1245     p_ref_table = p_tabname.
    1246     p_ref_field = p_fieldname.
    1247   ENDIF.
    1248 ENDFORM.                                                    "f4_field
    1249 *&---------------------------------------------------------------------*
    1250 *&      Form  F4_FIELD_IN_ITAB
    1251 *&---------------------------------------------------------------------*
    1252 *       GT_FIELDS的字段
    1253 *----------------------------------------------------------------------*
    1254 FORM f4_field_in_itab CHANGING p_fieldname.
    1255   DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
    1256         BEGIN OF lt_fields OCCURS 0,
    1257           fieldname TYPE fieldname,
    1258           fieldtext TYPE fieldtext,
    1259         END OF lt_fields.
    1260 
    1261   LOOP AT gt_fields1 INTO gs_field1.
    1262     IF gs_field1-asfield IS INITIAL.
    1263       lt_fields-fieldname = gs_field1-fieldname.
    1264     ELSE.
    1265       lt_fields-fieldname = gs_field1-asfield.
    1266     ENDIF.
    1267     lt_fields-fieldtext = gs_field1-scrtext_l.
    1268     APPEND lt_fields.
    1269   ENDLOOP.
    1270 
    1271   LOOP AT gt_fields2 INTO gs_field2.
    1272     lt_fields-fieldname = gs_field2-fieldname.
    1273     lt_fields-fieldtext = gs_field2-scrtext_l.
    1274     APPEND lt_fields.
    1275   ENDLOOP.
    1276                                                             "调用F4
    1277   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    1278     EXPORTING
    1279       retfield     = 'FIELDNAME'
    1280       window_title = '选择'
    1281       value_org    = 'S'
    1282     TABLES
    1283       value_tab    = lt_fields[]
    1284       return_tab   = lt_return[].
    1285 
    1286   IF lt_return[] IS NOT INITIAL.
    1287     READ TABLE lt_return INDEX 1.
    1288     p_fieldname = lt_return-fieldval.
    1289   ENDIF.
    1290 ENDFORM.                    " F4_FIELD_IN_ITAB
    1291 *&---------------------------------------------------------------------*
    1292 *&      Form  f4_color
    1293 *&---------------------------------------------------------------------*
    1294 *       text
    1295 *----------------------------------------------------------------------*
    1296 *      -->P_COLOR    text
    1297 *----------------------------------------------------------------------*
    1298 FORM f4_color CHANGING p_color.
    1299   DATA:
    1300     lt_fieldcat TYPE TABLE OF slis_fieldcat_alv,
    1301     ls_fieldcat TYPE slis_fieldcat_alv,
    1302     ls_layout TYPE slis_layout_alv.
    1303 
    1304   CLEAR: gt_color, gt_color[].
    1305   DO 7 TIMES.
    1306     gt_color-color = gt_color-value = 'C' && sy-index && '00'. APPEND gt_color.
    1307     gt_color-color = gt_color-value = 'C' && sy-index && '01'. APPEND gt_color.
    1308     gt_color-color = gt_color-value = 'C' && sy-index && '10'. APPEND gt_color.
    1309   ENDDO.
    1310 
    1311   ls_fieldcat-fieldname = 'VALUE'.
    1312   ls_fieldcat-seltext_l = '颜色码'.
    1313   APPEND ls_fieldcat TO lt_fieldcat.
    1314 
    1315   ls_layout-box_fieldname = 'SEL'.
    1316   ls_layout-info_fieldname = 'COLOR'.
    1317 
    1318   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    1319     EXPORTING
    1320       i_callback_program      = sy-repid
    1321       i_callback_user_command = 'USER_COMMAND_COLOR'
    1322       is_layout               = ls_layout
    1323       it_fieldcat             = lt_fieldcat
    1324       i_screen_start_column   = 130
    1325       i_screen_start_line     = 5
    1326       i_screen_end_column     = 150
    1327       i_screen_end_line       = 25
    1328     TABLES
    1329       t_outtab                = gt_color[].
    1330 
    1331   READ TABLE gt_color WITH KEY sel = 'X'.
    1332   p_color = gt_color-value.
    1333 ENDFORM.                                                    "f4_color
    1334 *&---------------------------------------------------------------------*
    1335 *&      Form  USER_COMMAND_COLOR
    1336 *&---------------------------------------------------------------------*
    1337 *       text
    1338 *----------------------------------------------------------------------*
    1339 FORM user_command_color USING r_ucomm     LIKE sy-ucomm
    1340                               rs_selfield TYPE slis_selfield.
    1341   DATA: lt_color LIKE TABLE OF gt_color.
    1342   CASE r_ucomm.
    1343     WHEN '&ONT'.
    1344       lt_color[] = gt_color[].
    1345       DELETE lt_color WHERE sel = ''.
    1346       IF lines( lt_color ) <> 1.
    1347         MESSAGE '请选择一个行项目' TYPE 'E'.
    1348       ENDIF.
    1349     WHEN '&IC1'.
    1350       gt_color-sel = 'X'.
    1351       MODIFY gt_color INDEX rs_selfield-tabindex TRANSPORTING sel.
    1352       LEAVE TO SCREEN 0.
    1353   ENDCASE.
    1354 ENDFORM.                    "USER_COMMAND_COLOR
    1355 *&---------------------------------------------------------------------*
    1356 *&      Form  download
    1357 *&---------------------------------------------------------------------*
    1358 *       下载到Excel
    1359 *----------------------------------------------------------------------*
    1360 FORM download.
    1361   DATA: l_file TYPE string,
    1362         l_path TYPE string,
    1363         l_fullpath TYPE string,
    1364         l_action TYPE i.
    1365 
    1366   CALL METHOD cl_gui_frontend_services=>file_save_dialog
    1367     EXPORTING
    1368       default_file_name = l_file
    1369     CHANGING
    1370       filename          = l_file
    1371       path              = l_path
    1372       fullpath          = l_fullpath
    1373       user_action       = l_action.
    1374 
    1375   CHECK l_action = 0.
    1376 
    1377   PERFORM create_excel_app.
    1378   PERFORM open_workbook USING l_fullpath.
    1379 
    1380 * =========TABLES==========
    1381   CALL METHOD OF
    1382       go_book
    1383       'Sheets' = go_sheet
    1384     EXPORTING
    1385       #1       = 'TABLES'.
    1386   IF sy-subrc <> 0.
    1387     MESSAGE '打开TABLES工作表失败' TYPE 'E'.
    1388   ENDIF.
    1389 
    1390   LOOP AT gt_tables INTO gs_table.
    1391     g_row = sy-tabix + 1.
    1392     PERFORM set_cell_value USING g_row 1 gs_table-tabname.
    1393     IF gs_table-leftjoin = 'X'.
    1394       PERFORM set_cell_value USING g_row 2 1.
    1395     ENDIF.
    1396     PERFORM set_cell_value USING g_row 3 gs_table-astable.
    1397   ENDLOOP.
    1398   CALL METHOD cl_gui_cfw=>flush.
    1399 
    1400 * =========JOINS==========
    1401   CALL METHOD OF
    1402       go_book
    1403       'Sheets' = go_sheet
    1404     EXPORTING
    1405       #1       = 'JOINS'.
    1406   IF sy-subrc <> 0.
    1407     MESSAGE '打开JOINS工作表失败' TYPE 'E'.
    1408   ENDIF.
    1409 
    1410   LOOP AT gt_joins INTO gs_join.
    1411     g_row = sy-tabix + 1.
    1412     PERFORM set_cell_value USING g_row 1 gs_join-tab1.
    1413     PERFORM set_cell_value USING g_row 2 gs_join-field1.
    1414     PERFORM set_cell_value USING g_row 3 gs_join-tab2.
    1415     PERFORM set_cell_value USING g_row 4 gs_join-field2.
    1416   ENDLOOP.
    1417   CALL METHOD cl_gui_cfw=>flush.
    1418 
    1419 * =========FIELDS1==========
    1420   CALL METHOD OF
    1421       go_book
    1422       'Sheets' = go_sheet
    1423     EXPORTING
    1424       #1       = 'FIELDS1'.
    1425   IF sy-subrc <> 0.
    1426     MESSAGE '打开FIELDS1工作表失败' TYPE 'E'.
    1427   ENDIF.
    1428 
    1429   LOOP AT gt_fields1 INTO gs_field1.
    1430     g_row = sy-tabix + 1.
    1431     PERFORM set_cell_value USING g_row 1 gs_field1-astable.
    1432     PERFORM set_cell_value USING g_row 2 gs_field1-fieldname.
    1433     PERFORM set_cell_value USING g_row 3 gs_field1-asfield.
    1434     IF gs_field1-query = 'X'.
    1435       PERFORM set_cell_value USING g_row 4 1.
    1436     ENDIF.
    1437     PERFORM set_cell_value USING g_row 5 gs_field1-query_pos.
    1438     IF gs_field1-single = 'X'.
    1439       PERFORM set_cell_value USING g_row 6 1.
    1440     ENDIF.
    1441     IF gs_field1-display = 'X'.
    1442       PERFORM set_cell_value USING g_row 7 1.
    1443     ENDIF.
    1444     PERFORM set_cell_value USING g_row 8 gs_field1-qfieldname.
    1445     PERFORM set_cell_value USING g_row 9 gs_field1-cfieldname.
    1446     PERFORM set_cell_value USING g_row 10 gs_field1-ref_table.
    1447     PERFORM set_cell_value USING g_row 11 gs_field1-ref_field.
    1448     PERFORM set_cell_value USING g_row 12 gs_field1-convexit.
    1449     PERFORM set_cell_value USING g_row 13 gs_field1-emphasize.
    1450     PERFORM set_cell_value USING g_row 14 gs_field1-scrtext_l.
    1451   ENDLOOP.
    1452   CALL METHOD cl_gui_cfw=>flush.
    1453 
    1454 * =========FIELDS2==========
    1455   CALL METHOD OF
    1456       go_book
    1457       'Sheets' = go_sheet
    1458     EXPORTING
    1459       #1       = 'FIELDS2'.
    1460   IF sy-subrc <> 0.
    1461     MESSAGE '打开FIELDS2工作表失败' TYPE 'E'.
    1462   ENDIF.
    1463 
    1464   LOOP AT gt_fields2 INTO gs_field2.
    1465     g_row = sy-tabix + 1.
    1466     PERFORM set_cell_value USING g_row 1 gs_field2-fieldname.
    1467     PERFORM set_cell_value USING g_row 2 gs_field2-qfieldname.
    1468     PERFORM set_cell_value USING g_row 3 gs_field2-cfieldname.
    1469     PERFORM set_cell_value USING g_row 4 gs_field2-ref_table.
    1470     PERFORM set_cell_value USING g_row 5 gs_field2-ref_field.
    1471     PERFORM set_cell_value USING g_row 6 gs_field2-convexit.
    1472     PERFORM set_cell_value USING g_row 7 gs_field2-emphasize.
    1473     PERFORM set_cell_value USING g_row 8 gs_field2-scrtext_l.
    1474   ENDLOOP.
    1475   CALL METHOD cl_gui_cfw=>flush.
    1476 
    1477   CALL METHOD OF
    1478       go_book
    1479       'SAVE'.
    1480   SET PROPERTY OF go_excel 'Visible' = 1.
    1481 
    1482   MESSAGE '已下载到Excel文件中,请查看' TYPE 'S'.
    1483 ENDFORM.                    "download
    1484 *&---------------------------------------------------------------------*
    1485 *&      Form  upload
    1486 *&---------------------------------------------------------------------*
    1487 *       从Excel上载
    1488 *----------------------------------------------------------------------*
    1489 FORM upload.
    1490   DATA: lt_list TYPE TABLE OF spopli WITH HEADER LINE,
    1491         l_answer TYPE c,
    1492         lt_filetable TYPE filetable WITH HEADER LINE,
    1493         l_rc TYPE i,
    1494         l_action TYPE i,
    1495         l_flag_close TYPE c.
    1496 
    1497   IF go_excel IS NOT INITIAL.
    1498     lt_list-varoption = '从刚下载的Excel文件上载'. APPEND lt_list.
    1499     lt_list-varoption = '选择新的Excel文件进行上载'. APPEND lt_list.
    1500 
    1501     CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
    1502       EXPORTING
    1503         textline1 = '如果还未关闭已经下载的Excel,可以选择从该Excel文件上载'
    1504         titel     = '选择'
    1505       IMPORTING
    1506         answer    = l_answer
    1507       TABLES
    1508         t_spopli  = lt_list[].
    1509 
    1510     CHECK l_answer <> 'A'.
    1511   ENDIF.
    1512 
    1513   IF go_excel IS INITIAL OR l_answer = 2.
    1514     CALL METHOD cl_gui_frontend_services=>file_open_dialog
    1515       EXPORTING
    1516         default_extension       = 'XLS'
    1517         default_filename        = '*.xls;*.xlsx'
    1518         file_filter             = 'Excel File (*.xls;*.xlsx)'
    1519         multiselection          = ''
    1520       CHANGING
    1521         file_table              = lt_filetable[]
    1522         rc                      = l_rc
    1523         user_action             = l_action
    1524       EXCEPTIONS
    1525         file_open_dialog_failed = 1
    1526         cntl_error              = 2
    1527         error_no_gui            = 3
    1528         not_supported_by_gui    = 4
    1529         OTHERS                  = 5.
    1530 
    1531     CHECK l_action = 0.
    1532 
    1533     PERFORM create_excel_app.
    1534 
    1535     READ TABLE lt_filetable INDEX 1.
    1536     PERFORM open_workbook USING lt_filetable-filename.
    1537 
    1538     l_flag_close = 'X'.
    1539   ENDIF.
    1540 
    1541   CLEAR: gt_tables, gt_joins, gt_fields1, gt_fields2.
    1542 
    1543 * =========TABLES==========
    1544   CALL METHOD OF
    1545       go_book
    1546       'Sheets' = go_sheet
    1547     EXPORTING
    1548       #1       = 'TABLES'.
    1549   IF sy-subrc <> 0.
    1550     MESSAGE '打开TABLES工作表失败' TYPE 'E'.
    1551   ENDIF.
    1552 
    1553   WHILE 1 = 1.
    1554     CLEAR: gs_table.
    1555     g_row = sy-index + 1.
    1556     PERFORM get_cell_value USING g_row 1 CHANGING gs_table-tabname.
    1557     IF gs_table-tabname IS INITIAL.
    1558       EXIT.
    1559     ENDIF.
    1560     PERFORM get_cell_value USING g_row 2 CHANGING gs_table-leftjoin.
    1561     IF gs_table-leftjoin = '1'.
    1562       gs_table-leftjoin = 'X'.
    1563     ELSE.
    1564       gs_table-leftjoin = ''.
    1565     ENDIF.
    1566     PERFORM get_cell_value USING g_row 3 CHANGING gs_table-astable.
    1567     APPEND gs_table TO gt_tables.
    1568   ENDWHILE.
    1569 
    1570 * =========JOINS==========
    1571   CALL METHOD OF
    1572       go_book
    1573       'Sheets' = go_sheet
    1574     EXPORTING
    1575       #1       = 'JOINS'.
    1576   IF sy-subrc <> 0.
    1577     MESSAGE '打开JOINS工作表失败' TYPE 'E'.
    1578   ENDIF.
    1579 
    1580   WHILE 1 = 1.
    1581     CLEAR: gs_join.
    1582     g_row = sy-index + 1.
    1583     PERFORM get_cell_value USING g_row 1 CHANGING gs_join-tab1.
    1584     IF gs_join-tab1 IS INITIAL.
    1585       EXIT.
    1586     ENDIF.
    1587     PERFORM get_cell_value USING g_row 2 CHANGING gs_join-field1.
    1588     PERFORM get_cell_value USING g_row 3 CHANGING gs_join-tab2.
    1589     PERFORM get_cell_value USING g_row 4 CHANGING gs_join-field2.
    1590     APPEND gs_join TO gt_joins.
    1591   ENDWHILE.
    1592 
    1593 * =========FIELDS1==========
    1594   CALL METHOD OF
    1595       go_book
    1596       'Sheets' = go_sheet
    1597     EXPORTING
    1598       #1       = 'FIELDS1'.
    1599   IF sy-subrc <> 0.
    1600     MESSAGE '打开FIELDS1工作表失败' TYPE 'E'.
    1601   ENDIF.
    1602 
    1603   WHILE 1 = 1.
    1604     CLEAR: gs_field1.
    1605     g_row = sy-index + 1.
    1606     PERFORM get_cell_value USING g_row 1 CHANGING gs_field1-astable.
    1607     IF gs_field1-astable IS INITIAL.
    1608       EXIT.
    1609     ENDIF.
    1610     PERFORM get_cell_value USING g_row 2 CHANGING gs_field1-fieldname.
    1611     PERFORM get_cell_value USING g_row 3 CHANGING gs_field1-asfield.
    1612     PERFORM get_cell_value USING g_row 4 CHANGING gs_field1-query.
    1613     IF gs_field1-query = '1'.
    1614       gs_field1-query = 'X'.
    1615     ELSE.
    1616       gs_field1-query = ''.
    1617     ENDIF.
    1618     PERFORM get_cell_value USING g_row 5 CHANGING gs_field1-query_pos.
    1619     PERFORM get_cell_value USING g_row 6 CHANGING gs_field1-single.
    1620     IF gs_field1-single = '1'.
    1621       gs_field1-single = 'X'.
    1622     ELSE.
    1623       gs_field1-single = ''.
    1624     ENDIF.
    1625     PERFORM get_cell_value USING g_row 7 CHANGING gs_field1-display.
    1626     IF gs_field1-display = '1'.
    1627       gs_field1-display = 'X'.
    1628     ELSE.
    1629       gs_field1-display = ''.
    1630     ENDIF.
    1631     PERFORM get_cell_value USING g_row 8 CHANGING gs_field1-qfieldname.
    1632     PERFORM get_cell_value USING g_row 9 CHANGING gs_field1-cfieldname.
    1633     PERFORM get_cell_value USING g_row 10 CHANGING gs_field1-ref_table.
    1634     PERFORM get_cell_value USING g_row 11 CHANGING gs_field1-ref_field.
    1635     PERFORM get_cell_value USING g_row 12 CHANGING gs_field1-convexit.
    1636     PERFORM get_cell_value USING g_row 13 CHANGING gs_field1-emphasize.
    1637     PERFORM get_cell_value USING g_row 14 CHANGING gs_field1-scrtext_l.
    1638     APPEND gs_field1 TO gt_fields1.
    1639   ENDWHILE.
    1640 
    1641 * =========FIELDS2==========
    1642   CALL METHOD OF
    1643       go_book
    1644       'Sheets' = go_sheet
    1645     EXPORTING
    1646       #1       = 'FIELDS2'.
    1647   IF sy-subrc <> 0.
    1648     MESSAGE '打开FIELDS2工作表失败' TYPE 'E'.
    1649   ENDIF.
    1650 
    1651   WHILE 1 = 1.
    1652     CLEAR: gs_field2.
    1653     g_row = sy-index + 1.
    1654     PERFORM get_cell_value USING g_row 1 CHANGING gs_field2-fieldname.
    1655     IF gs_field2-fieldname IS INITIAL.
    1656       EXIT.
    1657     ENDIF.
    1658     PERFORM get_cell_value USING g_row 2 CHANGING gs_field2-qfieldname.
    1659     PERFORM get_cell_value USING g_row 3 CHANGING gs_field2-cfieldname.
    1660     PERFORM get_cell_value USING g_row 4 CHANGING gs_field2-ref_table.
    1661     PERFORM get_cell_value USING g_row 5 CHANGING gs_field2-ref_field.
    1662     PERFORM get_cell_value USING g_row 6 CHANGING gs_field2-convexit.
    1663     PERFORM get_cell_value USING g_row 7 CHANGING gs_field2-emphasize.
    1664     PERFORM get_cell_value USING g_row 8 CHANGING gs_field2-scrtext_l.
    1665     APPEND gs_field2 TO gt_fields2.
    1666   ENDWHILE.
    1667 
    1668   IF l_flag_close = 'X'.
    1669     CALL METHOD OF
    1670         go_book
    1671         'Close'.
    1672     CALL METHOD OF
    1673         go_excel
    1674         'QUIT'.
    1675     FREE OBJECT: go_sheet, go_book, go_books, go_excel.
    1676   ENDIF.
    1677 
    1678   MESSAGE '上载完成' TYPE 'S'.
    1679 ENDFORM.                    "upload
    1680 *&---------------------------------------------------------------------*
    1681 *&      Form  create_excel_app
    1682 *&---------------------------------------------------------------------*
    1683 *       text
    1684 *----------------------------------------------------------------------*
    1685 FORM create_excel_app.
    1686   IF go_excel IS INITIAL.
    1687     CREATE OBJECT go_excel 'Excel.Application'.
    1688     IF sy-subrc <> 0.
    1689       MESSAGE '创建Excel程序失败' TYPE 'E'.
    1690     ENDIF.
    1691   ENDIF.
    1692 ENDFORM.                    "create_excel_app
    1693 *&---------------------------------------------------------------------*
    1694 *&      Form  open_workbook
    1695 *&---------------------------------------------------------------------*
    1696 *       text
    1697 *----------------------------------------------------------------------*
    1698 FORM open_workbook USING p_path.
    1699   CALL METHOD OF
    1700       go_excel
    1701       'Workbooks' = go_books.
    1702   CALL METHOD OF
    1703       go_books
    1704       'Open'   = go_book
    1705     EXPORTING
    1706       #1       = p_path.
    1707   IF sy-subrc <> 0.
    1708     MESSAGE '打开Excel文件失败' TYPE 'E'.
    1709   ENDIF.
    1710 ENDFORM.                    "open_workbook
    1711 *&---------------------------------------------------------------------*
    1712 *&      Form  set_cell_value
    1713 *&---------------------------------------------------------------------*
    1714 *       text
    1715 *----------------------------------------------------------------------*
    1716 FORM set_cell_value USING p_row TYPE i
    1717                           p_col TYPE i
    1718                           p_value.
    1719   g_row = p_row.
    1720   g_col = p_col.
    1721   g_value = p_value.
    1722 
    1723   CALL METHOD OF
    1724       go_sheet
    1725       'CELLS'  = go_cell
    1726       NO
    1727       FLUSH
    1728 
    1729     EXPORTING
    1730       #1       = g_row
    1731       #2       = g_col.
    1732   SET PROPERTY OF go_cell 'Value' = g_value NO FLUSH.
    1733 ENDFORM.                    "set_cell_value
    1734 *&---------------------------------------------------------------------*
    1735 *&      Form  get_cell_value
    1736 *&---------------------------------------------------------------------*
    1737 *       text
    1738 *----------------------------------------------------------------------*
    1739 FORM get_cell_value USING p_row TYPE i
    1740                           p_col TYPE i
    1741                     CHANGING p_value.
    1742   CALL METHOD OF
    1743       go_sheet
    1744       'CELLS'  = go_cell
    1745     EXPORTING
    1746       #1       = p_row
    1747       #2       = p_col.
    1748   GET PROPERTY OF go_cell 'Value' = p_value.
    1749 ENDFORM.                    "get_cell_value
    1750 *&---------------------------------------------------------------------*
    1751 *&      Form  CHECK
    1752 *&---------------------------------------------------------------------*
    1753 *       text
    1754 *----------------------------------------------------------------------*
    1755 FORM check .
    1756   DATA: l_index TYPE i VALUE 1,
    1757         l_index1 TYPE i,
    1758         l_index2 TYPE i,
    1759         l_tabix TYPE i,
    1760         l_len TYPE i,
    1761         l_off TYPE i,
    1762         l_msg TYPE string,
    1763         l_flag TYPE c,
    1764         ls_dd02l TYPE dd02l,
    1765         BEGIN OF lt_astable OCCURS 0,
    1766           astable TYPE tabname,
    1767           tabname TYPE tabname,
    1768           index TYPE i,
    1769         END OF lt_astable,
    1770         BEGIN OF lt_asfield OCCURS 0,
    1771           fieldname TYPE fieldname,
    1772         END OF lt_asfield,
    1773         BEGIN OF lt_syst OCCURS 0,
    1774           fieldname TYPE fieldname,
    1775         END OF lt_syst.
    1776 
    1777   DEFINE d_store_message.
    1778     g_flag_error = 'X'.
    1779     call function 'MESSAGE_STORE'
    1780       exporting
    1781         arbgb = '00'
    1782         msgty = 'E'
    1783         txtnr = '001'
    1784         msgv1 = l_msg
    1785         msgv2 = ''
    1786         msgv3 = ''
    1787         msgv4 = ''
    1788         zeile = l_index.
    1789     l_index = l_index + 1.
    1790   END-OF-DEFINITION.
    1791 
    1792   SELECT fieldname INTO TABLE lt_syst FROM dd03l WHERE tabname = 'SYST' ORDER BY fieldname.
    1793   LOOP AT lt_syst.
    1794     lt_syst-fieldname = 'SY-' && lt_syst-fieldname.
    1795     MODIFY lt_syst.
    1796   ENDLOOP.
    1797 
    1798   CALL FUNCTION 'MESSAGES_INITIALIZE'.
    1799   CLEAR g_flag_error.
    1800 
    1801   "表清单校验
    1802   LOOP AT gt_tables INTO gs_table.
    1803     l_tabix = sy-tabix.
    1804     SELECT SINGLE * INTO ls_dd02l FROM dd02l WHERE tabname = gs_table-tabname AND as4vers = 'A'.
    1805     IF sy-subrc <> 0.
    1806       l_msg = '表清单:行' && l_tabix && ',表或视图' && gs_table-tabname && '不存在或未激活'.
    1807       d_store_message.
    1808     ELSEIF ls_dd02l-tabclass = 'CLUSTER'.
    1809       IF lines( gt_tables ) > 1.
    1810         l_msg = '表清单:行' && l_tabix && ',不能使用簇表' && gs_table-tabname.
    1811         d_store_message.
    1812       ENDIF.
    1813     ELSEIF ls_dd02l-tabclass = 'VIEW'.
    1814       IF ls_dd02l-viewclass <> 'D'.
    1815         l_msg = '表清单:行' && l_tabix && ',视图' && gs_table-tabname && '不是数据库视图'.
    1816         d_store_message.
    1817       ENDIF.
    1818     ENDIF.
    1819 
    1820     IF gs_table-astable IS NOT INITIAL.
    1821       IF 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' NA gs_table-astable(1).
    1822         l_msg = '表清单:行' && l_tabix && ',别名' && gs_table-astable && '必须以字母开头'.
    1823         d_store_message.
    1824       ENDIF.
    1825       lt_astable-astable = gs_table-astable.
    1826       lt_astable-tabname = gs_table-tabname.
    1827       ADD 1 TO lt_astable-index.
    1828       APPEND lt_astable.
    1829     ELSE.
    1830       lt_astable-astable = gs_table-tabname.
    1831       lt_astable-tabname = gs_table-tabname.
    1832       ADD 1 TO lt_astable-index.
    1833       APPEND lt_astable.
    1834     ENDIF.
    1835   ENDLOOP.
    1836 
    1837   SORT lt_astable BY astable.
    1838   DELETE ADJACENT DUPLICATES FROM lt_astable COMPARING astable.
    1839   IF lines( lt_astable ) <> lines( gt_tables ).
    1840     l_msg = '表清单:存在重复的表名或表别名'.
    1841     d_store_message.
    1842   ENDIF.
    1843 
    1844   "表关联校验
    1845   LOOP AT gt_joins INTO gs_join.
    1846     l_tabix = sy-tabix.
    1847     CLEAR: l_index1, l_index2.
    1848 
    1849     IF gs_join-tab1 IS INITIAL OR gs_join-field1 IS INITIAL.
    1850       l_msg = '表关联:行' && l_tabix && ',表1和字段1不能为空'.
    1851       d_store_message.
    1852     ELSE.
    1853       READ TABLE lt_astable WITH KEY astable = gs_join-tab1 BINARY SEARCH.
    1854       IF sy-subrc <> 0.
    1855         l_msg = '表关联:行' && l_tabix && ',表1-' && gs_join-tab1 && '不存在'.
    1856         d_store_message.
    1857       ELSE.
    1858         l_index1 = lt_astable-index.
    1859         PERFORM check_field_exist USING lt_astable-tabname gs_join-field1 CHANGING l_flag.
    1860         IF l_flag = 'X'.
    1861           l_msg = '表关联:行' && l_tabix && ',表1-' && gs_join-tab1 && '中字段' && gs_join-field1 &&'不存在或未激活'.
    1862           d_store_message.
    1863         ENDIF.
    1864       ENDIF.
    1865     ENDIF.
    1866 
    1867     IF gs_join-tab2 IS INITIAL. "校验特定值
    1868       IF gs_join-field2 IS INITIAL.
    1869         l_msg = '表关联:行' && l_tabix && ',字段2或特定值不存在'.
    1870         d_store_message.
    1871       ELSEIF gs_join-field2(1) <> ''''.
    1872         READ TABLE lt_syst WITH KEY fieldname = gs_join-field2 BINARY SEARCH TRANSPORTING NO FIELDS.
    1873         IF sy-subrc <> 0.
    1874           l_msg = '表关联:行' && l_tabix && ',特定值' && gs_join-field2 && '填写错误,只能为SYST中字段或常数'.
    1875           d_store_message.
    1876         ENDIF.
    1877       ELSE.
    1878         l_len = strlen( gs_join-field2 ).
    1879         IF l_len = 1.
    1880           l_msg = '表关联:行' && l_tabix && ',特定值' && gs_join-field2 && '填写错误,只能为SYST中字段或常数'.
    1881           d_store_message.
    1882         ELSE.
    1883           l_off = l_len - 1.
    1884           IF gs_join-field2+l_off(1) <> ''''.
    1885             l_msg = '表关联:行' && l_tabix && ',特定值' && gs_join-field2 && '填写错误,只能为SYST中字段或常数'.
    1886             d_store_message.
    1887           ENDIF.
    1888         ENDIF.
    1889       ENDIF.
    1890     ELSE.
    1891       READ TABLE lt_astable WITH KEY astable = gs_join-tab2 BINARY SEARCH.
    1892       IF sy-subrc <> 0.
    1893         l_msg = '表关联:行' && l_tabix && ',表2-' && gs_join-tab2 && '不存在'.
    1894         d_store_message.
    1895       ELSE.
    1896         l_index2 = lt_astable-index.
    1897         PERFORM check_field_exist USING lt_astable-tabname gs_join-field2 CHANGING l_flag.
    1898         IF l_flag = 'X'.
    1899           l_msg = '表关联:行' && l_tabix && ',表2-' && gs_join-tab2 && '中字段' && gs_join-field2 &&'不存在或未激活'.
    1900           d_store_message.
    1901         ELSE.
    1902           IF l_index1 < l_index2 AND l_index1 > 0.
    1903             l_msg = '表关联:行' && l_tabix && ',请遵循约定:表1-' && gs_join-tab1 && '在“表清单”位置需要在表2-' && gs_join-tab2 && '以下'.
    1904             d_store_message.
    1905           ENDIF.
    1906         ENDIF.
    1907       ENDIF.
    1908     ENDIF.
    1909   ENDLOOP.
    1910 
    1911   "字段重复性校验
    1912   LOOP AT gt_fields1 INTO gs_field1.
    1913     IF gs_field1-asfield IS INITIAL.
    1914       lt_asfield-fieldname = gs_field1-fieldname.
    1915     ELSE.
    1916       lt_asfield-fieldname = gs_field1-asfield.
    1917     ENDIF.
    1918     APPEND lt_asfield.
    1919     CLEAR lt_asfield.
    1920   ENDLOOP.
    1921 
    1922   LOOP AT gt_fields2 INTO gs_field2.
    1923     lt_asfield-fieldname = gs_field2-fieldname.
    1924     APPEND lt_asfield.
    1925     CLEAR lt_asfield.
    1926   ENDLOOP.
    1927 
    1928   SORT lt_asfield BY fieldname.
    1929   DELETE ADJACENT DUPLICATES FROM lt_asfield COMPARING fieldname.
    1930   IF lines( lt_asfield ) <> lines( gt_fields1 ) + lines( gt_fields2 ).
    1931     l_msg = '字段设置、附加字段:存在重复的字段名或字段别名'.
    1932     d_store_message.
    1933   ENDIF.
    1934 
    1935   "字段设置
    1936   READ TABLE gt_fields1 WITH KEY query = 'X' TRANSPORTING NO FIELDS.
    1937   IF sy-subrc <> 0.
    1938     l_msg = '字段设置:请至少设置一个查询条件'.
    1939     d_store_message.
    1940   ENDIF.
    1941   READ TABLE gt_fields1 WITH KEY display = 'X' TRANSPORTING NO FIELDS.
    1942   IF sy-subrc <> 0.
    1943     l_msg = '字段设置:请至少设置一个输出字段'.
    1944     d_store_message.
    1945   ENDIF.
    1946   LOOP AT gt_fields1 INTO gs_field1.
    1947     l_tabix = sy-tabix.
    1948     IF gs_field1-astable IS INITIAL OR gs_field1-fieldname IS INITIAL.
    1949       l_msg = '字段设置:行' && l_tabix && ',表和字段不能为空'.
    1950     ELSE.
    1951       READ TABLE lt_astable WITH KEY astable = gs_field1-astable BINARY SEARCH.
    1952       IF sy-subrc <> 0.
    1953         l_msg = '字段设置:行' && l_tabix && ',表' && gs_field1-astable && '不存在'.
    1954         d_store_message.
    1955       ELSE.
    1956         PERFORM check_field_exist USING lt_astable-tabname gs_field1-fieldname CHANGING l_flag.
    1957         IF l_flag = 'X'.
    1958           l_msg = '字段设置:行' && l_tabix && ',表' && gs_field1-astable && '中字段' && gs_field1-fieldname &&'不存在或未激活'.
    1959           d_store_message.
    1960         ENDIF.
    1961       ENDIF.
    1962     ENDIF.
    1963     IF gs_field1-asfield IS NOT INITIAL.
    1964       IF 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' NA gs_field1-asfield(1).
    1965         l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的别名' && gs_field1-asfield && '必须以字母开头'.
    1966         d_store_message.
    1967       ENDIF.
    1968     ENDIF.
    1969     IF gs_field1-ref_table IS NOT INITIAL.
    1970       SELECT SINGLE tabname INTO gs_field1-ref_table FROM dd02l WHERE tabname = gs_field1-ref_table AND as4vers = 'A'.
    1971       IF sy-subrc <> 0.
    1972         l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的参照表' && gs_field1-ref_table && '不存在或未激活'.
    1973         d_store_message.
    1974       ELSEIF gs_field1-ref_field IS NOT INITIAL.
    1975         PERFORM check_field_exist USING gs_field1-ref_table gs_field1-ref_field CHANGING l_flag.
    1976         IF l_flag = 'X'.
    1977           l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的参照表' && gs_field1-ref_table && '中参照字段' && gs_field1-ref_field &&'不存在或未激活'.
    1978           d_store_message.
    1979         ENDIF.
    1980       ENDIF.
    1981     ELSE.
    1982       IF gs_field1-ref_field IS NOT INITIAL.
    1983         SELECT SINGLE rollname INTO gs_field1-ref_field FROM dd04l WHERE rollname = gs_field1-ref_field AND as4vers = 'A'.
    1984         IF sy-subrc <> 0.
    1985           l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的参照字段(数据元素)' && gs_field1-ref_field &&'不存在或未激活'.
    1986           d_store_message.
    1987         ENDIF.
    1988       ENDIF.
    1989     ENDIF.
    1990     IF gs_field1-qfieldname IS NOT INITIAL.
    1991       READ TABLE lt_asfield WITH KEY fieldname = gs_field1-qfieldname BINARY SEARCH TRANSPORTING NO FIELDS.
    1992       IF sy-subrc <> 0.
    1993         l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的单位字段' && gs_field1-qfieldname &&'不存在'.
    1994         d_store_message.
    1995       ENDIF.
    1996     ENDIF.
    1997     IF gs_field1-cfieldname IS NOT INITIAL.
    1998       READ TABLE lt_asfield WITH KEY fieldname = gs_field1-cfieldname BINARY SEARCH TRANSPORTING NO FIELDS.
    1999       IF sy-subrc <> 0.
    2000         l_msg = '字段设置:行' && l_tabix && ',字段' && gs_field1-fieldname && '的货币字段' && gs_field1-cfieldname &&'不存在'.
    2001         d_store_message.
    2002       ENDIF.
    2003     ENDIF.
    2004   ENDLOOP.
    2005 
    2006   "附加字段
    2007   LOOP AT gt_fields2 INTO gs_field2.
    2008     l_tabix = sy-tabix.
    2009     IF gs_field2-ref_table IS NOT INITIAL.
    2010       SELECT SINGLE tabname INTO gs_field2-ref_table FROM dd02l WHERE tabname = gs_field2-ref_table AND as4vers = 'A'.
    2011       IF sy-subrc <> 0.
    2012         l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的参照表' && gs_field2-ref_table && '不存在或未激活'.
    2013         d_store_message.
    2014       ELSEIF gs_field2-ref_field IS NOT INITIAL.
    2015         PERFORM check_field_exist USING gs_field2-ref_table gs_field2-ref_field CHANGING l_flag.
    2016         IF l_flag = 'X'.
    2017           l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的参照表' && gs_field2-ref_table && '中参照字段' && gs_field2-ref_field &&'不存在或未激活'.
    2018           d_store_message.
    2019         ENDIF.
    2020       ENDIF.
    2021     ELSE.
    2022       IF gs_field2-ref_field IS NOT INITIAL.
    2023         SELECT SINGLE rollname INTO gs_field2-ref_field FROM dd04l WHERE rollname = gs_field2-ref_field AND as4vers = 'A'.
    2024         IF sy-subrc <> 0.
    2025           l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的参照字段(数据元素)' && gs_field2-ref_field &&'不存在或未激活'.
    2026           d_store_message.
    2027         ENDIF.
    2028       ELSE.
    2029         l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的参照属性必须指定'.
    2030         d_store_message.
    2031       ENDIF.
    2032     ENDIF.
    2033     IF gs_field2-qfieldname IS NOT INITIAL.
    2034       READ TABLE lt_asfield WITH KEY fieldname = gs_field2-qfieldname BINARY SEARCH TRANSPORTING NO FIELDS.
    2035       IF sy-subrc <> 0.
    2036         l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的单位字段' && gs_field2-qfieldname &&'不存在'.
    2037         d_store_message.
    2038       ENDIF.
    2039     ENDIF.
    2040     IF gs_field2-cfieldname IS NOT INITIAL.
    2041       READ TABLE lt_asfield WITH KEY fieldname = gs_field2-cfieldname BINARY SEARCH TRANSPORTING NO FIELDS.
    2042       IF sy-subrc <> 0.
    2043         l_msg = '附加字段:行' && l_tabix && ',字段' && gs_field2-fieldname && '的货币字段' && gs_field2-cfieldname &&'不存在'.
    2044         d_store_message.
    2045       ENDIF.
    2046     ENDIF.
    2047   ENDLOOP.
    2048 
    2049   IF g_flag_error = 'X'.
    2050     CALL FUNCTION 'MESSAGES_SHOW'.
    2051   ENDIF.
    2052 ENDFORM.                    " CHECK
    2053 *&---------------------------------------------------------------------*
    2054 *&      Form  ALV_REFRESH_DISPLAY
    2055 *&---------------------------------------------------------------------*
    2056 *       text
    2057 *----------------------------------------------------------------------*
    2058 FORM alv_refresh_display .
    2059   go_alv_tables->refresh_table_display( ).
    2060   go_alv_joins->refresh_table_display( ).
    2061   go_alv_fields1->refresh_table_display( ).
    2062   go_alv_fields2->refresh_table_display( ).
    2063 ENDFORM.                    " ALV_REFRESH_DISPLAY
    2064 *&---------------------------------------------------------------------*
    2065 *&      Form  check_field_exist
    2066 *&---------------------------------------------------------------------*
    2067 *       text
    2068 *----------------------------------------------------------------------*
    2069 FORM check_field_exist USING p_tabname TYPE tabname
    2070                              p_fieldname TYPE fieldname
    2071                        CHANGING p_flag TYPE c.
    2072   DATA: l_fieldname TYPE fieldname.
    2073 
    2074   CLEAR p_flag.
    2075   SELECT SINGLE fieldname INTO l_fieldname
    2076     FROM dd03l
    2077     WHERE tabname = p_tabname
    2078       AND fieldname = p_fieldname
    2079       AND as4local = 'A'.
    2080   CHECK sy-subrc <> 0.
    2081   p_flag = 'X'.
    2082 ENDFORM.                    "check_field_exist

    ----------------------------------------------

    本博客所有原创文章,未经博主允许,请勿转载。

    ----------------------------------------------

  • 相关阅读:
    线性表3 数据结构和算法08
    线性表3 数据结构和算法08
    线性表的链式存储结构
    OD使用教程9 调试篇09|解密系列
    线性表
    线性表
    线性表
    OD使用教程9 调试篇09|解密系列
    验证中英文数字和下划线中划线
    formEl.submit is not a function的原因
  • 原文地址:https://www.cnblogs.com/abap-ll/p/7373134.html
Copyright © 2011-2022 走看看