SAP FREE_SELECTIONS_INIT多表动态选择演示
1.代码
- 基于视图 SFLIGHTS
DATA: ls_selid TYPE rsdynsel-selid,
lt_rsdtab TYPE TABLE OF rsdstabs.
DATA: lt_cond TYPE rsds_twhere,
lt_field TYPE TABLE OF rsdsfields.
DATA: dref TYPE REF TO data.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <cond> LIKE LINE OF lt_cond.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE l_text.
PARAMETERS: p_pritab TYPE tabname DEFAULT 'SFLIGHTS' OBLIGATORY, "这是一个视图
p_stab1 TYPE tabname DEFAULT 'SCARR' OBLIGATORY, "这是一个表
p_stab2 TYPE tabname DEFAULT 'SPFLI' OBLIGATORY, "这是一个表
p_stab3 TYPE tabname DEFAULT 'SFLIGHT' OBLIGATORY. "这是一个表
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
l_text = '选择透明表'.
START-OF-SELECTION.
PERFORM frm_check_existence USING p_pritab 'X'. "'X' VIEW
PERFORM frm_check_existence USING p_stab1 ''.
PERFORM frm_check_existence USING p_stab2 ''.
PERFORM frm_check_existence USING p_stab3 ''.
PERFORM frm_generate_condition.
PERFORM frm_show_alv.
end-of-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_check_existence
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_existence USING p1 p2.
IF p2 = 'X'.
TRY.
p1 = cl_abap_dyn_prg=>check_table_or_view_name_str(
val = p1
packages = 'SAPBC_DATAMODEL_SERVICE' ).
CATCH cx_abap_not_a_table.
MESSAGE |视图:{ p1 }不存在!| TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
CATCH cx_abap_not_in_package.
MESSAGE |只能输入 PACKAGE: SAPBC_DATAMODEL_SERVICE 中的视图!| TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
ELSE.
TRY.
p1 = cl_abap_dyn_prg=>check_table_name_str(
val = p1
packages = 'SAPBC_DATAMODEL' ).
CATCH cx_abap_not_a_table.
MESSAGE |透明表:{ p1 }不存在!| TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
CATCH cx_abap_not_in_package.
MESSAGE |只能输入 PACKAGE: SAPBC_DATAMODEL 中的视图!| TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_Generate_condition
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_generate_condition .
lt_rsdtab = VALUE #( ( prim_tab = p_pritab sec_tab = p_stab1 prim_fname = 'CARRID' sec_fname = 'CARRID' )
( prim_tab = p_pritab sec_tab = p_stab2 prim_fname = 'CARRID' sec_fname = 'CARRID' )
( prim_tab = p_pritab sec_tab = p_stab2 prim_fname = 'CONNID' sec_fname = 'CONNID' )
( prim_tab = p_pritab sec_tab = p_stab3 prim_fname = 'CARRID' sec_fname = 'CARRID' )
( prim_tab = p_pritab sec_tab = p_stab3 prim_fname = 'CONNID' sec_fname = 'CONNID' )
( prim_tab = p_pritab sec_tab = p_stab3 prim_fname = 'FLDATE' sec_fname = 'FLDATE' ) ).
DATA lt_11 TYPE rsds_texpr.
CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'T'
IMPORTING
selection_id = ls_selid
TABLES
tables_tab = lt_rsdtab
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE '初始化动态选择失败!' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
PERFORM frm_selections_dialog.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECTIONS_DIALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_selections_dialog .
CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = ls_selid
title = '屏幕字段动态选择对话窗口'
as_window = ' '
IMPORTING
where_clauses = lt_cond
TABLES
fields_tab = lt_field
EXCEPTIONS
OTHERS = 4.
IF lt_field IS INITIAL AND sy-subrc = 0.
MESSAGE '未选择任何字段,请重新输入!' TYPE 'S'.
PERFORM frm_selections_dialog.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_alv .
CREATE DATA dref TYPE TABLE OF (p_pritab).
ASSIGN dref->* TO <table>.
IF lt_cond IS NOT INITIAL.
ASSIGN lt_cond[ tablename = p_pritab ] TO <cond>.
"get data
TRY.
SELECT *
FROM (p_pritab)
WHERE (<cond>-where_tab)
INTO TABLE @<table>.
CATCH cx_sy_dynamic_osql_error.
MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
ENDIF.
"show alv
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.
ENDFORM.
2.效果
post SAP-Garson
原文链接:https://blog.csdn.net/qq_30797051/article/details/123660771文章来自于网络,如果侵犯了您的权益,请联系站长删除!