본문 바로가기
ABAP/개발Tip

[개발Tip] ALV 리포트의 백그라운드 실행

by name_text 2025. 3. 2.

ALV 리포트의 백그라운드 실행

cl_gui_alv_grid=>offline( )

 

ALV를 사용하는 CBO 리포트를 백그라운드로 실행시 Container 생성에서 덤프가 발생하는 경우가 종종 있습니다.

 

Dialog가 아닌 경우 구조적으로 GUI Container를 생성할 수 없어서, 대부분의 표준 리포트는

cl_gui_alv_grid=>offline 메소드를 이용하여 현재 사용 환경이 Dialog인지 Background(또는 RFC 등등 Dialog 환경이 아닌 경우)인지 구분하여 container 생성 여부를 분기 처리합니다.

 

# 소스코드 예시

  DATA: BEGIN OF lo_grid,
          container TYPE REF TO cl_gui_docking_container,
          grid      TYPE REF TO cl_gui_alv_grid,
        END OF lo_grid.

  IF cl_gui_alv_grid=>offline( ) IS INITIAL.
    "Dialog

    "Docking Container 생성
    CREATE OBJECT lo_grid-container
      EXPORTING
        extension                   = 2500
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.
  ELSE.
    "Background

    IF lo_grid-container IS BOUND.
      CALL METHOD lo_grid-container->free
        EXCEPTIONS
          cntl_error        = 1
          cntl_system_error = 2
          OTHERS            = 3.

      CLEAR lo_grid-container.
    ENDIF.
  ENDIF.

  "ALV Grid 생성
  CREATE OBJECT lo_grid-grid
    EXPORTING
      i_parent          = lo_grid-container
    EXCEPTIONS
      error_cntl_create = 1
      error_cntl_init   = 2
      error_cntl_link   = 3
      error_dp_create   = 4
      OTHERS            = 5.
ABAP

 

# New Syntax 소스코드 예시

  IF cl_gui_alv_grid=>offline( ) IS INITIAL.
    "Dialog

    "Docking Container 생성
    lo_grid-container = NEW #( extension = 2500 ).

    "ALV Grid 생성
    lo_grid-grid = NEW #( i_parent = lo_grid-container ).
  ELSE.
    "Background

    "ALV Grid 생성
    lo_grid-grid = NEW #( i_parent = VALUE #( ) ).
  ENDIF.
ABAP

 

# New Syntax로 더 단축할 경우

  lo_grid-grid = NEW #( i_parent = COND #( WHEN cl_gui_alv_grid=>offline( ) IS INITIAL
                                           THEN NEW cl_gui_docking_container( extension = 2500 )
                                           ELSE VALUE #( ) ) ).
ABAP

 

댓글