이글은 자료실에 있는 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.