[ABAP] SET_SCREEN_POP_UP

Jubami·2023년 8월 21일
0

SAP 

목록 보기
7/13
post-thumbnail

변수 선언하기

  • 레이아웃 설정
  • 컬럼 색깔, no_out 설정
  • 정렬, 필터, 이벤트 등록을 위한 변수 선언
    - 필터 적용을 위한 변수 추가 선언.
DATA:  lt_tab       TYPE REF TO cl_salv_table,
            lr_cols      TYPE REF TO cl_salv_columns_table,    "레이아웃
            lr_col        TYPE REF TO cl_salv_column_table, "컬럼 속성 제어
            ls_color    TYPE lvc_s_colo,                    " 컬럼 색깔
            lo_sorts    TYPE REF TO cl_salv_sorts,                 " 정렬
            lr_display  TYPE REF TO cl_salv_display_settings, " 헤더
            lr_filter     TYPE REF TO cl_salv_filters," 필터
            lo_event TYPE REF TO cl_salv_events_table. " event

" 필터 적용 변수
  DATA:  l_low TYPE salv_de_selopt_low,
            l_fname TYPE lvc_fname,
            l_option TYPE salv_de_selopt_option,
            l_sign TYPE salv_de_selopt_sign,
            l_high TYPE salv_de_selopt_high.

설정 시작~

  • PF-STATUS을 따로 선언해서 연동할 수 있다.
    - SET_SCREEN_POP_UP은 버튼이 아래에 붙는다.
    • PF-STATUS의 EXIT을 유저 커맨드 E로 선언해서 팝업에 X 표시를 달자.
  • cl_salv_table을 사용하여 아주 간단하게 alv를 띄워보자
  cl_salv_table=>factory(
    IMPORTING
      r_salv_table   =    lt_tab " Basis Class Simple ALV Tables
    CHANGING
      t_table        =  gt_log ).


*-- Layout & Column  설정
  lr_cols = gt_disp->get_columns( ).    "OPTIMIZE LAYOUT
*  lr_cols->set_optimize( abap_true ).

  " 필드명
  lr_col ?= lr_cols->get_column( 'STATUS' ).
  lr_col->set_long_text( '상태').
  lr_col->set_medium_text( '상태').
  lr_col->set_short_text( '상태').

  lr_col ?= lr_cols->get_column( 'BANFN' ).
  ls_color-col = '4'.
  ls_color-int = '1'.
  ls_color-inv = '0'.
  lr_col->set_color( ls_color ).
  lr_col->set_output_length( 10 ).

  lr_col ?= lr_cols->get_column( 'BNFPO' ).
  ls_color-col = '4'.
  ls_color-int = '1'.
  ls_color-inv = '0'.
  lr_col->set_color( ls_color ).
  lr_col->set_output_length( 6 ).

  lr_col ?= lr_cols->get_column( 'MSG' ).
  lr_col->set_output_length( 50 ).

  lr_col ?= lr_cols->get_column( 'NUMBER' ).
  lr_col->set_visible( ' ' ).

*-- POP 타이틀 헤더 설정
  lr_display = gt_disp->get_display_settings( ).
  lr_display->set_list_header( '에러 로그 확인' ).

*-- PF-STATUS 설정
  gt_disp->set_screen_status(
                          pfstatus = 'POPUP_STATUS'
                          report = sy-repid
                          set_functions = gt_disp->c_functions_all ).

*-- 필터 설정 ( 에러 로그 )
  l_fname = 'STATUS'.
  l_low = icon_led_red.

  lr_filter = gt_disp->get_filters( ).
  lr_filter->add_filter(
    EXPORTING
      columnname =  l_fname
      sign       = 'I'    " Selection Condition Sign
      option     = 'EQ'    " Selection Condition Option
      low        =   l_low  ).

*-- 위치 조정
  CALL METHOD gt_disp->set_screen_popup
    EXPORTING
      start_column = 10
      end_column   = 90 " 가로
      start_line   = 1
      end_line     = 25.

*-- SORT 설정
  " 요청번호, 구매문서번호, 고정공급업체 별 sort
  CALL METHOD gt_disp->get_sorts
    RECEIVING
      value = lo_sorts." ALV Sort

  CALL METHOD lo_sorts->add_sort
    EXPORTING
      columnname = 'BANFN'
      sequence   = if_salv_c_sort=>sort_down.    " Sort Sequence

  CALL METHOD lo_sorts->add_sort
    EXPORTING
      columnname = 'BNFPO'
      sequence   = if_salv_c_sort=>sort_down.    " Sort Sequence


*-- 이벤트 등록
  lo_event = gt_disp->get_event( ).

  SET HANDLER lcl_handler=>on_user_command2  FOR lo_event.


*-- popup alv display.
  gt_disp->display( ).
  • 여기서 ?=가 쓰이는데 ?=는 부모 클래스의 component를 자식 클래스의 component로 가져올 때 사용 ?=는 DOWNCAST 상황에 사용된다.

-> 자식 클래스 ?= 부모 클래스의 경우에 사용.

lr_col ?= lr_cols->get_column( 'NUMBER' ).
lr_col->set_visible( ' ' ).

부모 클래스(lr_cols)의 get_column 메소드를 통한 값을 lr_col에 넘겨서 사용.

PF-STATUS

이벤트 선언

CLASS lcl_handler DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS:
          
            on_user_command2 FOR EVENT added_function OF cl_salv_events_table
                    IMPORTING e_salv_function.  " popup toolbar control

ENDCLASS.                    "lcl_handler DEFINITION

CLASS lcl_handler IMPLEMENTATION.

  METHOD on_user_command2.
    CASE e_salv_function.
      WHEN 'CANC'.
        LEAVE TO SCREEN 0.
      WHEN 'ALL'.
        " popup toolbar 버튼 클릭 시.
        PERFORM disp_all_log. " 성공 로그까지 Display
       WHEN 'ERROR'.
         " popup toolbar 버튼 클릭 시.
         PERFORM disp_error_log.
    ENDCASE.

  ENDMETHOD.                    "on_user_command2

ENDCLASS.                    "lcl_handler IMPLEMENTATION
  • pf-status가 적용된 popup

필터를 적용해보아요~

  • 앞선 코드에서 l_low로 필터가 적용된 팝업이 호출된다.
    - 에러 로그는 초기 필터가 적용된 팝업을 호출하고,

    • 전체 로그는 초기 필터를 제거한 ITAB을 호출해보자.
  • 초기 필터 적용부는 앞선 코드 참고

전체 로그 버튼 구현부

  • 요기 상세
  METHOD on_user_command2.
    CASE e_salv_function.
      WHEN 'CANC'.
        LEAVE TO SCREEN 0.
      WHEN 'ALL'.
        " 전체 로그
        PERFORM disp_all_log. 
       WHEN 'ERROR'.
         " 에러 로그
         PERFORM disp_error_log.
    ENDCASE.
  ENDMETHOD.                    "on_user_command2
  • PERFORM disp_all_log
    - 코드 핵심은 기존에 등록된 필터를 제거하고 cl_salv_table을 refresh 하는 것.
    • 필터가 적용된 컬럼을 찾아서 remove_filter.
    • lr_fitler의 type ref to cl_salv_filters를 찾아가면 적용되는 여러 함수들이 있음
DATA:  lr_filter     TYPE REF TO cl_salv_filters, " 필터
       lo_event TYPE REF TO cl_salv_events_table. " event

  DATA: l_fname TYPE lvc_fname.



*-- 필터 설정 ( 에러 로그 )
  l_fname = 'STATUS'.


  lr_filter = gt_disp->get_filters( ).
  lr_filter->remove_filter( columnname =  l_fname ).

  gt_disp->refresh( ).
  • PERFORM disp_error_log
    - 해당 서브루틴은 초기 popup을 다시 세팅한다.
    • 처음 호출 시 바로 버튼을 눌렀을 때, 필터를 초기화하지 않으면 덤프가 뜨기 때문에,
      어떤 상황이든 필터를 초기화하고, 다시 필터를 적용하면 초기 상태(popup)을 계속 보여줄 수 있음요.
	DATA:
            lr_filter     TYPE REF TO cl_salv_filters, " 필터
            lo_event TYPE REF TO cl_salv_events_table. " event

  DATA:  l_low TYPE salv_de_selopt_low,
            l_fname TYPE lvc_fname,
            l_option TYPE salv_de_selopt_option,
            l_sign TYPE salv_de_selopt_sign,
            l_high TYPE salv_de_selopt_high.

*-- 필터 설정 ( 에러 로그 )
  l_fname = 'STATUS'.
  l_low = icon_led_red.

  lr_filter = gt_disp->get_filters( ).
  lr_filter->remove_filter( columnname =  l_fname ).

  lr_filter->add_filter(
    EXPORTING
      columnname =  l_fname
      sign       = 'I'    " Selection Condition Sign
      option     = 'EQ'    " Selection Condition Option
      low        =   l_low  ).


  gt_disp->refresh( ).

ㅂㅂ

profile
LV.1 아밥퍼

1개의 댓글

comment-user-thumbnail
2023년 11월 6일

코드 색깔 어떻게 알록달록하게 하셨나요?? -.-

답글 달기