본문 바로가기

AMDP/ADMP 기초

2.3 Calling AMDP Methods in Applications

ABAP 응용 프로그램에서 AMDP 메서드를 호출하는 방법은 일반적인 메서드와 유사합니다. 이는 ADT의 기반으로 하는 Eclipse 기반 폼 에디터나 SAP GUI 기반 트랜잭션을 통해 이루어집니다.

이러한 메서드는 항상 정적 메서드 호출로 실행됩니다. 실제로 인스턴스 메서드로 정의되었더라도 정적 메서드 호출로 실행됩니다.

ABAP 응용 프로그램에서 AMDP 메서드를 호출하는 방법은 여러 가지가 있습니다. Eclipse 기반의 ABAP 퍼스펙티브(그림 6.8 참조)에서는 (Ctrl) + (Space)를 눌러 AMDP 메서드를 호출하는 코드 완성 템플릿을 사용할 수 있습니다. SAP GUI 기반 에디터(그림 6.9 참조)에서는 (Ctrl) + (F6)를 눌러 ABAP 기반 패턴을 사용할 수 있습니다.

그림 6.8

 

그림 6.9

그러나 AMDP를 사용하려면 SAP NetWeaver AS ABAP의 중앙 데이터베이스가 해당 AMDP 메서드가 구현된 데이터베이스 시스템에 의해 관리되어야 합니다. 그렇지 않으면 프로시저 호출은 런타임 오류를 발생시킵니다.

그림 6.10에 나와 있는 것처럼 첫 번째 메서드 호출 전에 ABAP 런타임 환경은 AMDP 메서드에 구현된 프로시저를 데이터베이스 시스템에 생성하거나 AMDP가 변경되었을 경우 기존의 데이터베이스 프로시저를 업데이트합니다(그림 6.11 참조). 한 번 메서드가 호출되면 실행은 데이터베이스 시스템에서 수행됩니다. 인터페이스의 매개변수는 네이티브 SQL 인터페이스에서 데이터베이스 시스템으로 전달되거나 데이터베이스 시스템에서 적용됩니다.

그림 6.10

AMDP를 사용하여 관리되는 데이터베이스 프로시저가 생성되면(ZCL_AMDP_DEMO_01=>GET_FLIGHT_DATA)가 생성되면(그림 6.11 참조), 이 프로시저는 데이터베이스 구문을 사용하여 다른 데이터베이스 프로시저에서 호출할 수 있습니다.
데이터베이스에서 이 액세스를 허용하는 경우 AMDP 프로시저(또는 AMDP에서 관리하지 않는 데이터베이스 프로시저)를 포함하여 다른 데이터베이스 프로시저에서 이 프로시저를 호출할 수 있습니다.

AMDP 프로시저가 다른 프로시저를 호출하는 경우, 이 프로시저는 호출 메서드에 USING을 추가하여 지정해야 합니다.
일반적으로 다른 클래스의 AMDP 메서드에서 호출되지 않는 AMDP 프로시저 구현은 AMDP 클래스의 Private 메서드로 생성하고 로 생성하고 일반 ABAP 메서드에서 호출하는 것이 좋습니다.

하기 코드에 표시된 것처럼 ABAP 애플리케이션은 AMDP 프로시저를 호출하여 사용자의 선택에 따라항공편 예약 정보를 표시할 수 있습니다. 이 예는 또한  SELECT-OPTIONS 를 사용하여 데이터 레코드를 필터링하는 방법도 보여줍니다.

REPORT zcl_amdp_demo_call_01.

" Data declaration"
 DATA: gwa_sflight TYPE sflight.

"Select Options"
 SELECT-OPTIONS: s_carrid FOR gwa_sflight-carrid,
				 s_connid FOR gwa_sflight-connid.

"Types Declaration"
 TYPES: BEGIN OF d_flight,
		 carrid TYPE s_carr_id,
		 connid TYPE s_conn_id,
		 bookamt TYPE s_f_cur_pr,
		 loccurkey TYPE s_currcode,
	    END OF d_flight.

"Internal table"
 DATA: gt_flight TYPE STANDARD TABLE OF d_flight.

"Variable"
 DATA: gv_return TYPE i.

"Build dynamic where clause, and pass it to the AMDP method"
 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[] ) ) ) ).
  CATCH cx_shdb_exception INTO DATA(lref_shdb_exception).
  DATA(lv_meesage) = lref_shdb_exception->get_text( ).
 ENDTRY.

" AMDP Method Call"
 TRY.
	zcl_amdp_demo_01=>get_flight_data(
    EXPORTING
        iv_filters = lv_where_clause
        iv_client = sy-mandt
    IMPORTING
        e_flight = gt_flight
    CHANGING
        c_return = gv_return ).

" Error Handling"
  CATCH cx_amdp_no_connection INTO DATA(lref_no_connection).
  DATA(lv_error) = lref_no_connection->get_text( ).
  CATCH cx_amdp_execution_error INTO DATA(lref_amdp_execution_error).
  lv_error = lref_amdp_execution_error->get_text( ).
 ENDTRY.

" Display results"
 IF lv_error IS INITIAL.
  cl_demo_output=>display_data(
	EXPORTING
		value = gt_flight
		name = 'Flight Booking information').

" Error Handling"
 ELSE.
	WRITE: lv_error.
 ENDIF.

 

반응형

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

2.5 Feature Support Check Using Global Classes  (0) 2023.08.23
2.4 Using Multiple Selection Criteria  (0) 2023.08.23
2.2 Implementing AMDP Methods  (0) 2023.08.22
2.1 Prerequisites  (0) 2023.08.21
2. Creating AMDP Classes  (0) 2023.08.19