본문 바로가기
ABAP/Function|Class

[Class] SUBMIT으로 ALV 데이터 조회 - CL_SALV_BS_RUNTIME_INFO

by name_text 2023. 12. 4.

SUBMIT으로 ALV 데이터 조회

CL_SALV_BS_RUNTIME_INFO

 

ABAP내에서 다른 리포트 프로그램의 데이터를 가져오고자 할 경우,

CL_SALV_BS_RUNTIME_INFO 클래스를 이용하여 데이터를 가져올 프로그램을 SUBMIT으로 호출하여 ALV 데이터를 읽어올 수 있습니다.

이 방식은 소스 프로그램의 수정 없이 데이터를 읽어올 수 있어서 표준 리포트의 데이터를 읽어올때 아주 유용합니다.

 

단, 스크린에 표시될 ALV의 데이터를 읽어오는 방식이다 보니 여러 제약사항이 있습니다.

CBO 프로그램간의 데이터 조회는 ABAP MEMORY를 이용하여 EXPORT/IMPORT가 가장 확실한 방법인듯 합니다. 

 

# 사용예시

CL_SALV_BS_RUNTIME_INFO=>SET( DISPLAY  = ABAP_FALSE   "SUBMIT 프로그램의 화면 표시 여부
                              METADATA = ABAP_TRUE    "ALV METADATA 반환 여부(LAYOUT, FIELDCAT 등)
                              DATA     = ABAP_TRUE ).

"ALV 데이터를 읽을 소스 프로그램 호출
SUBMIT YSAND_BOX
WITH P_BUKRS = '1000'
AND RETURN.

TRY.
  "METADATA
  DATA(LT_METADATA) = CL_SALV_BS_RUNTIME_INFO=>GET_METADATA( ).

  "ALV 내용을 DATA로 반환
  CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = DATA(LD_DATA) ).
  ASSIGN LD_DATA->* TO FIELD-SYMBOL(<LFT_DATA>).
CATCH CX_SALV_BS_SC_RUNTIME_INFO.
  "ERROR
  "SUBMIT 프로그램이 ALV를 출력하지 않을 경우 오류 발생
  "SUBMIT 프로그램이 SPLITTER_CONTAINER를 사용하는 경우 Background에서 컨테이너 생성 오류 발생
ENDTRY.

"CLEAR
CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).

"반환 받은 DATA 사용
IF <LFT_DATA> IS ASSIGNED.
  CL_SALV_TABLE=>FACTORY(
    importing
      R_SALV_TABLE   = DATA(LO_SALV)
    changing
      T_TABLE        = <LFT_DATA>
  ).

  CL_SALV_CONTROLLER_METADATA=>SET_LVC_FIELDCATALOG(
    exporting
      T_FIELDCATALOG = LT_METADATA-T_FCAT
      R_COLUMNS      = LO_SALV->GET_COLUMNS( )
      R_AGGREGATIONS = LO_SALV->GET_AGGREGATIONS( )
  ).

  CL_SALV_CONTROLLER_METADATA=>SET_LVC_LAYOUT(
    exporting
      R_FUNCTIONAL_SETTINGS = LO_SALV->GET_FUNCTIONAL_SETTINGS( )
      R_DISPLAY_SETTINGS    = LO_SALV->GET_DISPLAY_SETTINGS( )
      R_COLUMNS             = LO_SALV->GET_COLUMNS( )
      R_AGGREGATIONS        = LO_SALV->GET_AGGREGATIONS( )
      R_SELECTIONS          = LO_SALV->GET_SELECTIONS( )
      S_LAYOUT              = LT_METADATA-S_LAYOUT
  ).

  LO_SALV->DISPLAY( ).
ELSE.
  WRITE:/ 'NOT ASSIGNED'.
ENDIF.

 

댓글