*&---------------------------------------------------------------------*
*& Report ZTHOMAS_DYNAMIC_SQL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTHOMAS_DYNAMIC_SQL.
PARAMETERS:SPFLI RADIOBUTTON GROUP GRP,
SCARR RADIOBUTTON GROUP GRP,
SAPLANE RADIOBUTTON GROUP GRP.
*----------------------------------------------------------------------*
* CLASS demo DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS DEMO DEFINITION.
PUBLIC SECTION.
CLASS-METHODS MAIN.
ENDCLASS. "demo DEFINITION
*----------------------------------------------------------------------*
* CLASS demo IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS DEMO IMPLEMENTATION.
METHOD MAIN.
CONSTANTS LEFT TYPE TABNAME VALUE 'SFLIGHT'."constant variable declaration
DATA:RIGHT TYPE TABNAME,
STRUCT_TYPE TYPE REF TO CL_ABAP_STRUCTDESCR,
TABLE_TYPE TYPE REF TO CL_ABAP_TABLEDESCR,
COMP_TAB1 TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE,
COMP_TAB2 TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE,
COMP1 LIKE LINE OF COMP_TAB1,
COMP2 LIKE LINE OF COMP_TAB2,
SELECT TYPE TABLE OF EDPLINE,
SUBLIST TYPE EDPLINE,
FROM TYPE STRING,
FIRST_ON TYPE ABAP_BOOL VALUE ABAP_TRUE,
TREF TYPE REF TO DATA,
ALV TYPE REF TO CL_SALV_TABLE.
FIELD-SYMBOLS <ITAB> TYPE STANDARD TABLE.
"根据选择的值对right赋值
CASE 'X'.
WHEN SPFLI.
RIGHT = 'SPFLI'.
WHEN SCARR.
RIGHT = 'SCARR'.
WHEN SAPLANE.
RIGHT = 'SAPLANE'.
ENDCASE.
FIRST_ON = ABAP_TRUE.
"初始化select sublist from
CLEAR: SELECT, SUBLIST, FROM.
READ CURRENT LINE LINE VALUE INTO RIGHT.
"获取结构内容
STRUCT_TYPE ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( LEFT ).
COMP_TAB1 = STRUCT_TYPE->GET_COMPONENTS( ).
STRUCT_TYPE ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( RIGHT ).
COMP_TAB2 = STRUCT_TYPE->GET_COMPONENTS( ).
"sql拼接
FROM = LEFT && ` join ` && RIGHT && ` on ` .
"循环两个结构,获取要查绚的字段目录
LOOP AT COMP_TAB1 INTO COMP1 WHERE NAME IS NOT INITIAL.
SUBLIST = LEFT && '~' && COMP1-NAME.
APPEND SUBLIST TO SELECT.
ENDLOOP.
LOOP AT COMP_TAB2 INTO COMP2 WHERE NAME IS NOT INITIAL .
READ TABLE COMP_TAB1 INTO COMP1
WITH TABLE KEY NAME = COMP2-NAME.
IF SY-SUBRC <> 0.
"如果comp2的目录不存在于comp1中就加到comp1中
APPEND COMP2 TO COMP_TAB1.
SUBLIST = RIGHT && '~' && COMP2-NAME.
APPEND SUBLIST TO SELECT.
ELSE.
"如果存在于comp1中就判断first_on的值如果为假,就进行sql拼接
IF FIRST_ON = ABAP_FALSE.
FROM = FROM && ` and `.
ELSE.
FIRST_ON = ABAP_FALSE.
ENDIF.
"sql拼接
FROM = FROM && LEFT && `~` && COMP2-NAME &&
` = ` && RIGHT && `~` && COMP2-NAME.
ENDIF.
ENDLOOP.
"动态创建内表
STRUCT_TYPE = CL_ABAP_STRUCTDESCR=>CREATE( COMP_TAB1 ).
TABLE_TYPE = CL_ABAP_TABLEDESCR=>CREATE( STRUCT_TYPE ).
CREATE DATA TREF TYPE HANDLE TABLE_TYPE.
ASSIGN TREF->* TO <ITAB>.
"动态select语句
SELECT (SELECT) INTO TABLE <ITAB> FROM (FROM).
TRY .
"调用salv进行数据展示
CL_SALV_TABLE=>FACTORY(
IMPORTING R_SALV_TABLE = ALV
CHANGING T_TABLE = <ITAB>
).
ALV->DISPLAY( ).
CATCH CX_SALV_MSG.
MESSAGE 'ALV display not possible' TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD. "main
ENDCLASS. "demo IMPLEMENTATION
START-OF-SELECTION.
DEMO=>MAIN( ).
Abap Dynamic Select
最新推荐文章于 2025-06-10 09:10:26 发布
