메뉴 건너뛰기

SAP 한국 커뮤니티

[ABAP] Dynamic SQL ( SELECT/GROUP BY/HAVING clause )

문바이 2011.11.19 00:39 조회 수 : 3297

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