메뉴 건너뛰기

SAP 한국 커뮤니티

[ABAP] Dynamic SQL ( FROM clause,Rel4.10,One table )

문바이 2011.10.24 20:04 조회 수 : 442

이글은 자료실에 있는 DynamicOpenSql 영문파일을 정리한 것이다.

 

Dynamic Open SQL.

내역 : FROM clause 기초다지기

      (Rel4.6이전 버젼내역 설명, Rel6.10이후부터는 Join을 허용하므로 다음 강좌를보자).

사전지식 :  Oracle Native SQL사용가능( 집합함수를 사용할 줄 안다.)

 문법 : SELECT * FROM (lv_tabname).
        FROM절에서 사용되는 table이름 단독으로 사용된다.
        inner join, outter join등은 허용되지 않는다.
        이 이야기는 결국 lv_tabname의 type이 internal table 필요가 없을음 알수있다

 기술 : 가) Dynamic Open SQL
        나) Data Object 참조선언 REF TO
        다) Field-Symbols
        라) ALV Grid Control
           -> ALV를 그릴려니 Screen이 필요하고 Screen을 그리자니 PBO,PAI기술이 필요하다

 

프로그램 구동내역 설명

        1) lv_tabname이 Runtime에 바꾼다.
        2) lv_tabname에 따라서 Select 되는 Field의 내용이 그때 그때 바꾼다.
        3) 그럼 lv_tabname에 상관없이 Select되는 Data를 담을 수 있는
           Structure또는 Internal Table이 필요하다
        4) Data Object 를 참조변수로 선언하여 runtime에 같이 그 유형을 lv_tabname에 맞게 변경해 준다.
           DATA : lo_dref TYPE REF TO data.
           CREATE DATA lo_dref TYPE TABLE OF (lv_tabname).
        5) 이제 lo_dref는 (lv_tabname)의 테이블을 유형의 internal Table이 되었다.
        6) 그러나 lo_dref는 코딩상에서 직접 제어 할수 없으므로 제어를 위한 Field-Symbol을 사용하자
           FIELD-SYMBOLS : <itab> TYPE ANY TABLE.
           ASSIGN lo_dref->* TO <itab>.
        7) 이제 <itab>은 테이블의 내용을 담을수 있는 충분한 그릇이 되었다.
           SELECT *
             INTO CORRESPONDING FIELDS OF TABLE <itab>
             FROM (lv_tabname) UP TO 20 ROWS.
        8) 이 <itab>을 화면에 Display해야 한다. ALV Grid Control을 사용하자
           DATA : lo_alv     TYPE REF TO CL_GUI_ALV_GRID.
           CREATE OBJECT lo_alv
              EXPORTING i_parent = cl_gui_container=>screen0.
        9) ALV Control이 화면상에 표시될 바탕이 필요하다 (Screen 100)
           Create Screen을 이용하여 0100번 Screen을 만든다.
           Screen에서 F3을 눌렀을 때 Back할수 있도록 코드를 약간 넣어준다.
           INCLUDE  YTEST_DYNAMIC_OPEN_SQLO01.
           INCLUDE  YTEST_DYNAMIC_OPEN_SQLI01.

 

프로그램 원문.
*&---------------------------------------------------------------------*

REPORT   YTEST_DYNAMIC_OPEN_SQL.
INCLUDE  YTEST_DYNAMIC_OPEN_SQLO01.
INCLUDE  YTEST_DYNAMIC_OPEN_SQLI01.

DATA: lv_tabname  TYPE        TABNAME.
DATA: lv_tabname1 TYPE        string.

"From절은 internal table로 선언할 수 없다. 이유는 위쪽의 내용을 읽기 바람.
DATA: BEGIN OF lt_tabname2 OCCURS 0 ,
        dat1 TYPE string,
      END OF lt_tabname2.
DATA: ls_tabname2 LIKE lt_tabname2.


DATA: lo_dref    TYPE REF TO DATA,
      lo_alv     TYPE REF TO CL_GUI_ALV_GRID.


FIELD-SYMBOLS: <itab> TYPE ANY TABLE.


    START-OF-SELECTION.
    WRITE: / 'SPFLI', / 'SFLIGHT', / 'SBOOK'.


    AT LINE-SELECTION.
         READ CURRENT LINE LINE VALUE INTO lv_tabname1.

         CREATE DATA lo_dref TYPE TABLE OF (lv_tabname1).

         lv_tabname = lv_tabname1.
         ASSIGN lo_dref->* TO <itab>.

         ls_tabname2-dat1 = lv_tabname1.
         append ls_tabname2 to lt_tabname2.

         SELECT *
         INTO TABLE <itab>
         FROM (lv_tabname1) UP TO 20 ROWS
         .

         CREATE OBJECT lo_alv
            EXPORTING  i_parent = cl_gui_container=>screen0.

         CALL METHOD  lo_alv->SET_TABLE_FOR_FIRST_DISPLAY
            EXPORTING i_structure_name = lv_tabname
            CHANGING  it_outtab        = <itab>.

         CALL SCREEN 100.