본문 바로가기

AMDP/ADMP 기초

2.4 Using Multiple Selection Criteria

ABAP 보고서에서 선택 화면을 정의하는 것은 원하는 요소에 따라 데이터를 필터링할 수 있기 때문에, 비즈니스 사용자의 역량을 강화하는 데 필수적입니다.
선택 기준은 다음을 애플리케이션이 데이터베이스 레이어 에서 원치 않는 데이터를 필터링하여 데이터를 더 빠르게 처리할 수 있음을 보장합니다.
그러나 데이터를 필터링하려면 Parameter, SELECT-OPTIONS를 사용하여 선택 기준을 정의해야 합니다,

Parameter의 목적은 단일 값을 기준으로 레코드를 필터링하는 것이며, 반면에 SELECT-OPTIONS를 사용하면 복잡한 선택 기준을 정의하여 레코드를 필터링할 수 있습니다. 그런 다음 개발자는 이러한 선택 화면 요소를 Open SQL 문에서 직접 사용하여 데이터를 필터링할 수 있습니다. 그런 다음 이러한 선택 기준은 ABAP 어플리케이션 서버을 통해
SQL WHERE 조건으로 변환됩니다.

그러나 AMDP 프로시저에서 이러한 선택 화면 요소를 사용하고자 한다고 가정해 보겠습니다. 이 경우 AMDP 메서드에서 직접 Parameter를 사용할 수 있지만 이접근 방식은 SELECT-OPTIONS에서는 유효하지 않습니다. SELECT-OPTIONS를 AMDP 메서드에 직접 전달할 수 없으므로 AMDP를 사용할 때 이 제한 사항을 염두에 두어야 합니다. SELECT-OPTIONS를 AMDP 메서드로 전달하려면, 먼저 선택 기준을 필터 문자열로 변환한 다음, 이 문자열을 IMPORTING 매개 변수로 AMDP 메서드에 전달해야 합니다. SELECT-OPTIONS (선택 테이블 또는 범위 테이블)을 동적 SQL WHERE 절로 변환하려면 새로운 CL_SHDB_SELTAB 클래스의 Static 메서드인 메서드 COMBINE_SELTABS( )를 사용하면 됩니다.

이렇게 생성된 조건은 AMDP 메소드 구현에서 SQLScript function APPLY_FILTER를 사용해서 데이터 소스를 필터링하는 데 사용할 수 있습니다. 이 함수는 데이터베이스 테이블, 뷰 및 SAP HANA 뷰에 적용할 수 있지만 analytical 변수 또는 table 변수에는 사용할 수 없습니다. APPLY_FILTER 함수에는 두 개의 매개 변수가 필요합니다. 

첫 번째 매개 변수는 적용하려는 데이터 소스이며, 두 번째 매개 변수는 필터를 적용하려는 생성된 WHERE 절로, 문자열 인수로 전달됩니다.
CL_SHDB_SELTAB 클래스는 SAP NetWeaver AS ABAP 7.4에서 사용할 수 없으며 SAP NOTE 2124672에 설명된 단계에 따라 가져와야 합니다. 이 노트를 적용하려면 SAP NetWeaver AS ABAP 7.4 SP08 또는 이상의 버젼이 이 필요합니다.

ABAP 보고서는 아래 코드에 표시된 것처럼 AMDP Method을 사용하여 데이터를 필터링할 수 있습니다. 매개변수를 통한 user selection에 따라 또는 SELECT-OPTION에 따라 특정 날짜 및 고객 카테고리별로 모든 항공사 코드에 대한 예약을 표시하기 위해 데이터를 필터링할 수 있습니다.

* Data declaration
DATA: gwa_sflight TYPE sflight.

* Selection screen
PARAMETERS: p_date TYPE s_date.
SELECT-OPTIONS: s_carrid FOR gwa_sflight-carrid,
				s_connid FOR gwa_sflight-connid.

* Build dynamic where clause
	TRY.
        DATA(lv_where_clause) = cl_shdb_seltab=>combine_seltabs(
        						it_named_seltabs = VALUE #(
                                ( name = 'CARRID' dref = REF #( s_carrid[] ) )
                                ( name = 'CONNID' dref = REF #( s_connid[] ) ) )
                                iv_client_field = 'MANDT' ).
        CATCH cx_shdb_exception INTO DATA(lref_shdb_exception).
        DATA(lv_meesage) = lref_shdb_exception->get_text( ).
    ENDTRY.
* AMDP Method call to summarize booking amount by flight, airline code, date, and customer type
    zcl_amdp_sflight_details=>get_data(
        EXPORTING
            iv_client = sy-mandt
            iv_date = p_date
            iv_filters = lv_where_clause
        IMPORTING
        	et_results = DATA(gt_results) ).
        * Display results
        cl_demo_output=>display_data(
        EXPORTING
        	value = gt_results
    		name = 'Flight Booking information').

아래 코드에 표시된 AMDP 방법은  위 코드에 표시된 응용 프로그램에서 전달된 파라미터와 위 코드의 앞부분에 표시된 응용 프로그램에서 전달된 매개변수 및 선택 옵션을 기반으로 SQLScript 함수 APPLY_FILTER 를 사용하여 데이터를 필터링하는 것입니다.

CLASS zcl_amdp_sflight_details DEFINITION
    PUBLIC
    FINAL
    CREATE PUBLIC.
	PUBLIC SECTION.
    
* AMDP Marker Interface
	INTERFACES: if_amdp_marker_hdb.
    
* Data declaration

    TYPES: BEGIN OF d_sflight,
        carrid TYPE s_carr_id,
        connid TYPE s_conn_id,
        fldate TYPE s_date,
        type TYPE string,
        total TYPE s_l_cur_pr,
    END OF d_sflight,
    
    tty_sflight TYPE STANDARD TABLE OF d_sflight.
    
* AMDP Method
        CLASS-METHODS get_data
        IMPORTING
            VALUE(iv_client) TYPE sy-mandt
            VALUE(iv_date) TYPE s_date
            VALUE(iv_filters) TYPE string
        EXPORTING
        	VALUE(et_results) TYPE tty_sflight.
        PROTECTED SECTION.
        PRIVATE SECTION.
    ENDCLASS.
    
CLASS zcl_amdp_sflight_details IMPLEMENTATION.
	METHOD get_data BY DATABASE PROCEDURE
					FOR HDB
					LANGUAGE SQLSCRIPT
					OPTIONS READ-ONLY
	USING sflight sbook.

    ET_RESULTS = SELECT a.carrid, 
    					a.connid, 
                        b.fldate,
                        CASE b.custtype
                        WHEN 'B' then 'Business Customer'
                        WHEN 'P' then 'Private Customer'
                        ELSE 'Others'
                        END AS "TYPE",
    					SUM(b.loccuram) AS TOTAL
    from sflight as a INNER JOIN
           sbook as b on a.carrid = b.carrid
    				 and a.connid = b.connid
    WHERE a.mandt = :iv_client --Parameters
    AND b.fldate = :iv_date --Parameters
    GROUP BY a.carrid, a.connid, b.fldate, b.custtype ;
    "Filter based on Selection screen (Select options)"
    ET_RESULTS = APPLY_FILTER( :ET_RESULTS, :iv_filters );
    ENDMETHOD.
ENDCLASS.

 

반응형

'AMDP > ADMP 기초' 카테고리의 다른 글

2.5 Feature Support Check Using Global Classes  (0) 2023.08.23
2.3 Calling AMDP Methods in Applications  (0) 2023.08.22
2.2 Implementing AMDP Methods  (0) 2023.08.22
2.1 Prerequisites  (0) 2023.08.21
2. Creating AMDP Classes  (0) 2023.08.19