이글은 자료실에 있는 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.
댓글 3
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
22 | [ABAPDOCU] 뜯어봅시다 18 [5] | 뽀꼬 | 2011.10.28 | 486 |
» | [ABAP] Dynamic SQL ( FROM clause,Rel4.10,One table ) [3] | 문바이 | 2011.10.25 | 464 |
20 | [ABAPDOCU] 뜯어봅시다 17 [6] | 뽀꼬 | 2011.10.11 | 508 |
19 | [ABAPDOCU] 뜯어봅시다 16 [8] | 뽀꼬 | 2011.10.08 | 304 |
18 | [ABAPDOCU] 뜯어봅시다 15 [7] | 뽀꼬 | 2011.10.05 | 337 |
17 | [ABAPDOCU] 뜯어봅시다 14 [10] | 뽀꼬 | 2011.10.01 | 295 |
16 | [ABAPDOCU] 뜯어봅시다 13 [7] | 뽀꼬 | 2011.09.30 | 280 |
15 | [ABAPDOCU] 뜯어봅시다 12 [7] | 뽀꼬 | 2011.09.29 | 313 |
14 | [ABAPDOCU] 뜯어봅시다 11 [14] | 뽀꼬 | 2011.09.27 | 404 |
13 | [ABAPDOCU] 뜯어봅시다 10 [14] | 뽀꼬 | 2011.09.23 | 412 |
12 | [ABAPDOCU] 뜯어봅시다 9 [15] | 뽀꼬 | 2011.09.20 | 409 |
11 | [ABAPDOCU] 뜯어봅시다 8 [14] | 뽀꼬 | 2011.09.19 | 490 |
10 | [ABAPDOCU] 뜯어봅시다 7 [14] | 뽀꼬 | 2011.09.15 | 550 |
9 | [번외] Field symbol과 Data reference [14] | 뽀꼬 | 2011.09.15 | 975 |
8 | [ABAPDOCU] 뜯어봅시다 6 [22] | 뽀꼬 | 2011.09.14 | 539 |
7 | [ABAPDOCU] 뜯어봅시다 5 [16] | 뽀꼬 | 2011.09.10 | 576 |
6 | [ABAPDOCU] 뜯어봅시다 4 [20] | 뽀꼬 | 2011.09.09 | 708 |
5 | [ABAPDOCU] 뜯어봅시다 1 [54] | 뽀꼬 | 2011.09.08 | 1786 |
4 | [ABAPDOCU] 뜯어봅시다. 3 [30] | 뽀꼬 | 2011.09.08 | 956 |
3 | [ABAPDOCU] 뜯어봅시다. 2 [42] | 뽀꼬 | 2011.09.07 | 2187 |
와~~~ 이 방 전세살이 끝났다~~
감사합니다~~ ^^