ABAP 选择屏幕动态 / Free Selection
原文链接:https://blog.csdn.net/xiefireworks/article/details/124160452
常规实现方式:
1. 动态控制属性,使用如下语句代码控制。
2. 标准模块实现的free selection
3. 结合逻辑数据库的动态选择屏幕
具体实现:
第一种大致通过如下代码实现
AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. ENDLOOP.
第三种结合逻辑数据库,自定义逻辑数据库场景稀见。
这里主要说明第二种,SAP 提供了function FREE_SELECTIONS_INIT和FREE_SELECTIONS_DIALOG来实现基于用户自由调整的选择屏幕。
Demo实现效果如下:
执行程序页面如下

点击新字段选择可自由添加旋转屏幕字段

执行输出结果

Demo代码:
DATA: where_clauses TYPE rsds_twhere, expressions TYPE rsds_texpr, field_ranges TYPE rsds_trange, number_of_active_fields TYPE sy-tfill, tables_tab TYPE STANDARD TABLE OF rsdstabs, tabfields_not_display TYPE STANDARD TABLE OF rsdsfields, fields_tab TYPE STANDARD TABLE OF rsdsfields, field_desc TYPE STANDARD TABLE OF fldconvert, field_texts TYPE STANDARD TABLE OF rsdstexts, events TYPE STANDARD TABLE OF rsdsevents, event_fields TYPE STANDARD TABLE OF rsdsevflds, fields_not_selected TYPE STANDARD TABLE OF rsdsfields, no_int_check TYPE STANDARD TABLE OF rsdstabs, alv_qinfo TYPE STANDARD TABLE OF lvc_s_qinf, selection_id TYPE rsdynsel-selid. DATA: dbtab TYPE string VALUE 'T001', dref TYPE REF TO data. FIELD-SYMBOLS: <table> TYPE STANDARD TABLE, <where> LIKE LINE OF where_clauses. TRY. DATA(checked_dbtab) = cl_abap_dyn_prg=>check_table_name_str( val = dbtab packages = 'FBZCORE' ). CATCH cx_abap_not_a_table. MESSAGE 'Database table not found' TYPE 'I' DISPLAY LIKE 'E'. LEAVE PROGRAM. CATCH cx_abap_not_in_package. MESSAGE 'Only tables from the flight data model are allowed' TYPE 'I' DISPLAY LIKE 'E'. LEAVE PROGRAM. ENDTRY. tables_tab = VALUE #( ( prim_tab = checked_dbtab ) ). fields_tab = VALUE #( ( tablename = 'T001' fieldname = 'BUKRS' ) ). CALL FUNCTION 'FREE_SELECTIONS_INIT' EXPORTING kind = 'T' * FIELD_RANGES_INT = " 选择屏幕初始值 IMPORTING selection_id = selection_id TABLES tables_tab = tables_tab "如果kind为T,则定义选择屏幕字段来源表 tabfields_not_display = tabfields_not_display fields_tab = fields_tab"如果kind为T,则为默认选择字段,为F则为可选选择字段清单 field_desc = field_desc field_texts = field_texts events = events " 选择屏幕事件进行逻辑处理 event_fields = event_fields fields_not_selected = fields_not_selected no_int_check = no_int_check alv_qinfo = alv_qinfo EXCEPTIONS fields_incomplete = 1 fields_no_join = 2 field_not_found = 3 no_tables = 4 table_not_found = 5 expression_not_supported = 6 incorrect_expression = 7 illegal_kind = 8 area_not_found = 9 inconsistent_area = 10 kind_f_no_fields_left = 11 kind_f_no_fields = 12 too_many_fields = 13 dup_field = 14 field_no_type = 15 field_ill_type = 16 dup_event_field = 17 node_not_in_ldb = 18 area_no_field = 19 OTHERS = 20. IF sy-subrc <> 0. MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'. LEAVE PROGRAM. ENDIF. CALL FUNCTION 'FREE_SELECTIONS_DIALOG' EXPORTING selection_id = selection_id title = 'Free Selection' status = '1' "选择屏幕状态 as_window = ' ' " 是否弹窗 tree_visible = ' ' "选择树是否可见 IMPORTING where_clauses = where_clauses"选择屏幕返回的选择条件,自动处理的where条件表,可直接使用 TABLES fields_tab = fields_tab EXCEPTIONS internal_error = 1 no_action = 2 selid_not_found = 3 illegal_status = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE 'No free selection created' TYPE 'I'. LEAVE PROGRAM. ENDIF. START-OF-SELECTION. ASSIGN where_clauses[ tablename = checked_dbtab ] TO <where>. CREATE DATA dref TYPE TABLE OF (checked_dbtab). ASSIGN dref->* TO <table>. TRY. IF <where> IS ASSIGNED AND <where>-where_tab IS NOT INITIAL. SELECT * FROM (checked_dbtab) WHERE (<where>-where_tab) INTO TABLE @<table>. ELSE. SELECT * FROM (checked_dbtab) INTO TABLE @<table>. ENDIF. CATCH cx_sy_dynamic_osql_error. MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'. LEAVE PROGRAM. ENDTRY. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(alv) CHANGING t_table = <table> ). alv->display( ). CATCH cx_salv_msg. MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'. ENDTRY.
简介:
1. 可弹窗,可一般选择屏幕效果
2. 根据表自动带出所需选择字段(可多表,可排除部分字段)
3. 可自定义字段清单,灵活组合
4. 可设置选择屏幕字段默认值
5. 可填充选择屏幕逻辑流事件逻辑
应用场景:
1. 取值表中字段均为选择屏幕字段,实现如demo即可
2. 程序执行过程中需要弹窗交互输入筛选条件,FREE_SELECTIONS_DIALOG 中参数as_window设置为'X'且status设置为0即可
3. 选择屏幕字段过多,构成可选字段池,允许用户自由选择所需字段,通过参数FREE_SELECTIONS_INIT中参数kind = 'F' 表参数中field_tab实现
posted on 2022-04-14 09:27 seven1314pp 阅读(1314) 评论(0) 收藏 举报
浙公网安备 33010602011771号