----------------------------------------------sql
本博客全部原創文章,未經博主容許,請勿轉載。數據庫
----------------------------------------------微信
本程序共實現功能以下:app
一、操做界面中,各ALV數據保存到INDX,以及從INDX讀取frontend
二、操做界面中,各ALV數據下載到Excel,以及從Excel上載(按單元格上載,上載速度較慢,暫未作優化處理)ide
三、支持表左鏈接、表別名、同一表出現屢次優化
四、支持錶鏈接時,採用常量鏈接ui
五、ALV字段設置中,包括了單位字段、貨幣字段、參照字段、參照表、轉換例程、列顏色、列描述等spa
六、支持額外附加字段(須要本身添加一些代碼處理)excel
七、必要的字段,基本都提供了搜索幫助
八、生成程序前的數據校驗
九、生成程序前,請本身先建一個激活的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
----------------------------------------------
本博客全部原創文章,未經博主容許,請勿轉載。
----------------------------------------------