Abap Dynamic Select

*&---------------------------------------------------------------------*
*& 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 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 .
"动态select语句
SELECT (SELECT) INTO TABLE FROM (FROM).
TRY .
"调用salv进行数据展示
        CL_SALV_TABLE=>FACTORY(
IMPORTING R_SALV_TABLE = ALV
CHANGING  T_TABLE      =
).
        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)