这个功能,还没想好在什么场景下使用,按需生成,的确好玩,以后有需求了,再好好改改
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.