AMDP/ADMP 기초

2.4 Using Multiple Selection Criteria

abapta 2023. 8. 23. 09:44

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.

 

반응형