SAP/ABAP

SUBMIT (program) 시 ABAP Memory 사용하지 않고, 결과만 가져오기

Buggie 2024. 4. 11. 17:31

오랜만에 남기는 글이다.

언제나 그렇듯이 이제는 좀 자주 남기려고 생각은 하고 있다. 생각은 자유니께 ㅎ

별거 아니라도 말이다.. ㅎㅎ

 

(Case)

SUBMIT 기능 자주 사용은 하는데, 실제로 Process 제어를 넘기고 싶지는 않고,

Result Set 만 가져오고자 할 때 ABAP Memory 를 사용한다.

EXPORT (IMPORT) MEMORY 구문을 써서 하면 간단하면서도

이게.. 은근 귀찮다.

변수 타입도 정확하게 맞춰줘야 하고 Memory 변수명도 그렇고.

 

이럴 때, 귀찮은 과정 생략하고 결과만 딱 가져올 수 있는 방법이다.

 

(Solution)

클래스

CL_SALV_BS_RUNTIME_INFO

이 녀석을 사용하면 제공되는 메소드 중에 이런 유용한 기능을 하는 애들이 포함되어 있다.

 

 

 

간단하게 예제 프로그램 소스를 보면,

 

(Source)

REPORT YTSR00160.

FIELD-SYMBOLS <LT_OUTTAB> TYPE STANDARD TABLE.


* Instruct Model to get the data
CL_SALV_BS_RUNTIME_INFO=>SET(
  DISPLAY        = SPACE
  METADATA       = SPACE
  DATA           = 'X'
).

SUBMIT SALV_DEMO_TABLE_SIMPLE AND RETURN.

* Retrieve Data
DATA: LO_DATA TYPE REF TO DATA.
TRY.
    CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF(
      IMPORTING
        R_DATA            = LO_DATA
    ).

    ASSIGN LO_DATA->* TO <LT_OUTTAB>.
    BREAK-POINT.

    CL_DEMO_OUTPUT=>DISPLAY_DATA( <LT_OUTTAB> ).

  CATCH CX_SALV_BS_SC_RUNTIME_INFO.
    MESSAGE 'Unable to get data from SALV' TYPE 'I'.
ENDTRY.

 

아래처럼 Debugging 상에서 데이터가 들어오는 것을 볼 수 있다.

 

 

 

여기까지 하고 끝내려고 했으나,

호출되는 프로그램의 조회조건에 조건을 걸어 줄 필요가 있다면.. 저대로는 쓸 수가 없다.

 

그래서 추가작업을 좀 해줘봤다.

 

1. 조회조건 세팅하는 로직을 넣어주기

2. 함수로 만들어서 범용으로 사용할 수 있도록 등록

 

 

1.조회조건 세팅 로직

 1.1. 변수 / 매크로 선언부

(Src.)

DATA: LT_SELECTION TYPE RSPARAMS_TT.

 

DEFINE _GMC_INPUT_SELECTION.
  APPEND VALUE #( SELNAME = &2
                                   KIND         = &3
                                   SIGN         = &4
                                   OPTION    = &5
                                   LOW          = &6
                                   HIGH         = &7 ) TO &1.
END-OF-DEFINITION.

 

 

SALV_DEMO_TABLE_SIMPLE 프로그램의 조회조건 중에 

Parameter 와 Radio Button 이 있다.

 

1) Parameter (Number of Data Records)

  - P_AMOUNT

2) Radio Btn (출력형태)

 - P_FULL

 - P_LIST

 - P_GRID

 

 1.2. 조회조건 Setting Logic

(Src.)

_GMC_INPUT_SELECTION: LT_SELECTION 'P_AMOUNT' 'P' 'I' 'EQ' 10 SPACE.

_GMC_INPUT_SELECTION: LT_SELECTION 'P_FULL' 'P' 'I' 'EQ' SPACE SPACE,
                                                LT_SELECTION 'P_LIST' 'P' 'I' 'EQ' 'X'   SPACE,
                                                LT_SELECTION 'P_GRID' 'P' 'I' 'EQ' SPACE SPACE.

 

(중략)

SUBMIT SALV_DEMO_TABLE_SIMPLE WITH SELECTION-TABLE LT_SELECTION
                                                                   AND RETURN.

(중략)

 

그런데,, 결과값만 Itab 형태로 가져올 것이기 때문에 사실 Radio Btn 조건은 의미가 없다.

바보짓. ㅎㅎ

 

어쨌든.. 조회건수 조건에 10 을 지정했더니, 30 이 아닌 10 건만 가져옴을 확인했다.

 

 

2. 범용 Function 으로 생성

 

 

(Src.)

FUNCTION ZMM_GET_SUBMIT_RESULT.

  IF IV_PROGNAME IS INITIAL.
    RAISE NO_PROGNAME.
  ENDIF.

  CL_SALV_BS_RUNTIME_INFO=>SET( EXPORTING DISPLAY  = ABAP_FALSE
                                          METADATA = IV_METADATA
                                          DATA     = ABAP_TRUE ).

  TRY.
      CLEAR SY-BATCH.
      SUBMIT (IV_PROGNAME) WITH SELECTION-TABLE IT_SELECTION
                           AND RETURN.
    CATCH CX_ROOT.
      RAISE SUBMIT_ERROR.
  ENDTRY.

  TRY.
      IF IV_METADATA = ABAP_TRUE.
        ES_METADATA = CL_SALV_BS_RUNTIME_INFO=>GET_METADATA( ).
      ENDIF.

      CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = EO_DATA ).
    CATCH CX_SALV_BS_SC_RUNTIME_INFO.
      CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).
      RAISE SALV_BS_RUNTIME_INFO_ERROR.
  ENDTRY.

  CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).  

ENDFUNCTION.