이글은 자료실에 있는 DynamicOpenSql 영문파일을 정리한 것이다.
Dynamic Open SQL.
내역 : SELECT clause, GROUP BY clause. HAVING clause.
문법 : SELECT (lv_select) FROM spfli GROUP BY (lv_group) HAVING (lv_having).
SELECT절 : Alias를 사용할 수 있다. column명, 집합함수를 사용할 수 있다.
GROUP BY절 : 집합함수의 구분자를 SELECT 맞추워 준다.
HAVING절 : 집합함수에 조건을 걸때 사용한다. (Rel6.10 이상부터 사용가능)
기술 : 가) Dynamic Open SQL,
나) Field-Symbols
다) Database TableName을 넘기면 소속 column정보를 가져오는 함수
라) Report Program(Type-1)의 Event처리 기술
마) GUI 기술 pf-status를 사용할 줄알며 구성할 줄 안다.
프로그램 구동내역 설명
1) Selection-Screen에 Parameter 3개를 보여준다.
p_lt : Parameter Less than(보다작다) ==> "<"을 의미함
p_gt : Parameter Greater than(보다크다) ==> ">"을 의미함
p_value : Parameter value
결론 : is > 10, is < 5 의 구성하게 된다.
2) F8 ( start-of-selection)을 누른다. (start-of-select)
Database table [spfli]로부터 column정보를 얻어와서 화면상에 표시한다
표시방법 : [] column명 ex) [] mandt.
3) 원하는 컬럼에 체크한후 pf-status에서 선언한 [main]의 버튼을 누른다
내부 동적SQL절의 로직을 마무리한다.
4) 해당 SQL에 맞는 DATA를 화면에 표시해 준다.
DATA : lo_dref TYPE REF TO data.
프로그램 원문.
*&---------------------------------------------------------------------*
REPORT YTEST_DYNAMIC_OPEN_SQL02.
TYPE-POOLS ABAP.
PARAMETERS: p_lt RADIOBUTTON GROUP 1 DEFAULT 'X',
p_gt RADIOBUTTON GROUP 1,
p_value TYPE I.
DATA: BEGIN OF wa,
count TYPE I.
INCLUDE TYPE SPFLI.
DATA: END OF wa.
DATA: checked,
name TYPE FIELDNAME,
lines TYPE I,
descr_ref TYPE REF TO CL_ABAP_STRUCTDESCR,
sel_list TYPE TABLE OF EDPLINE,
group_list TYPE TABLE OF EDPLINE,
having TYPE STRING,
lv_value1 TYPE I value 1.
FIELD-SYMBOLS: <fs> TYPE ANY,
<comp_wa> TYPE ABAP_COMPDESCR.
START-OF-SELECTION.
SET PF-STATUS 'MAIN'.
* GET ALL COMPONENTS OF TABLE 'SPFLI'
descr_ref ?=
CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( 'SPFLI' ).
LOOP AT descr_ref->COMPONENTS ASSIGNING <comp_wa>.
name = <comp_wa>-name.
WRITE: / checked AS CHECKBOX, name.
ENDLOOP.
LINES = LINES( descr_ref->COMPONENTS ).
AT USER-COMMAND.
* DETERMINE SELECTED COLUMNS
CLEAR: sel_list, group_list.
APPEND 'COUNT(*) AS COUNT' TO sel_list.
DO LINES TIMES.
READ LINE SY-INDEX FIELD VALUE checked.
IF CHECKED = 'X'.
READ LINE SY-INDEX FIELD VALUE name.
APPEND NAME TO: sel_list, group_list.
ENDIF.
ENDDO.
* DETERMINE OPERATOR
IF p_gt = 'X'.
HAVING = 'COUNT(*) > p_value'.
ELSE.
HAVING = 'COUNT(*) < p_value'.
ENDIF.
SELECT (sel_list)
FROM SPFLI UP TO 20 ROWS
INTO CORRESPONDING FIELDS OF WA
GROUP BY (group_list)
HAVING (HAVING). "REMOVE FOR 4.6
* WRITE ALL COMPONENTS TO LIST
WRITE: / WA-COUNT.
LOOP AT group_list INTO NAME.
ASSIGN COMPONENT NAME OF STRUCTURE wa TO <fs>.
WRITE: <fs>.
ENDLOOP.
ENDSELECT.
좋은 정보 감사합니다. 잘 보고 갑니다.