Popup ALV

Jiwowow·2024년 10월 18일

SAP ABAP 배우기

목록 보기
4/6

SCREEN 채번 규칙

  • 100 ← Main Screen ( + 100 단위로 증가
  • 101 ← Popup screen ( 소속된 Main screen으로부터 +1 되는 규칙. 101, 201, 301…
  • 110 ← Sub screen ( 소속된 Main screen으로부터 +10 되는 규칙. 110, 210, 310…
    • 가급적 지켜야하는 규칙이고 무조건 지켜야 하는 것은 아님
    • 이걸 따르는 곳도 있지만 아닌 곳도 있음

팝업 창 띄우기

  • STARTING AT : 시작 지점, ENDING AT : 종료 지점

  • POPUP 스크린의 크기 = screen painter에서 screen element 크기로 지정함

    • 시작 지점만 지정하고, screen element 크기만큼 나오게 하는 것이 제일 좋음
    • Ending at 설정하면 스크롤바가 생길 수도 있는 문제
  • lc = left column . ← 4 넣으면 왼쪽에서부터 4 칼럼 이동한 위치.

  • ur = upper row. ← 2 넣으면 위에서부터 2 row 이동한 위치.

  • Screen type - Modal dialog box 아니고 Normal 로 할 것( 모달로 하면 번거로움)

    • 실무에서도 항상 Normal로 함
  • 정해진 팝업 위치는 없으니 적당히 띄워 만들면 됨


- 단, 팝업 스크린을 docking container로 만들면 설정한 크기만큼 뜨지 않는 문제 발생
- → 팝업 스크린은 custom container로 만듦



실습 (1) : cl_demo_output → popup alv로 변경

*& Include Z~~~TOP     

*-- Popup
DATA : go_pop_cont TYPE REF TO cl_gui_custom_container, " Popup
       go_pop_grid TYPE REF TO cl_gui_alv_grid.         " Popup

" ...

DATA : gt_scarr LIKE TABLE OF gs_scarr,
       gt_spfli TYPE TABLE OF spfli. " For display Popup
       
" ...

*-- For Popup
DATA : gt_pfcat   TYPE lvc_t_fcat,
       gs_pfcat   TYPE lvc_s_fcat,
       gs_playout TYPE lvc_s_layo.
  • 팝업에 사용되는 itab 은 반드시 전역으로 선언..?
FORM handle_double_click  USING pv_row pv_column.

"  DATA : lt_spfli   TYPE TABLE OF spfli,
"         lt_sflight TYPE TABLE OF sflight.

*-- Get Selected row
  CLEAR gs_scarr.
  READ TABLE gt_scarr INTO gs_scarr INDEX pv_row.

*-- Get popup data
  CLEAR gt_spfli.
  SELECT carrid connid countryfr countryto cityfrom cityto
    INTO CORRESPONDING FIELDS OF TABLE gt_spfli
    FROM spfli
   WHERE carrid EQ gs_scarr-carrid.

   IF gt_spfli IS INITIAL.
     MESSAGE s037 DISPLAY LIKE 'E'.
     EXIT. **" 100번 스크린 내에서 STOP 금지. 대신 EXIT 사용해 루틴 빠져나감**
*   ELSE.   **<- ELSE 해도 되긴 한데 그냥 if initial. Exit이 더 깔끔.**
*     CALL SCREEN 101 STARTING AT 03 05.
   ENDIF.

*-- Call popup screen
   CALL SCREEN 101 STARTING AT 03 05.

*-- Column 별로 logic 분리
*  CASE pv_column.
*    WHEN 'CARRID'.
*      PERFORM get_spfli USING gs_scarr-carrid.
*    WHEN 'CARRNAME'.
*      PERFORM get_sflight USING gs_scarr-carrid.
*  ENDCASE.

ENDFORM.
  • 100번 스크린이 이미 뜬 상황에서 101번 스크린 띄우는 과정 중 STOP 하면 안됨(덤프 발생)

MODULE init_popup_control OUTPUT.

  PERFORM display_popup.

ENDMODULE.
FORM display_popup .

  IF go_pop_cont IS NOT BOUND.

    CLEAR : gt_pfcat, gs_pfcat.
    PERFORM set_pop_field_catalog USING : 'X' 'CARRID'    'SPFLI' 'C' ' ',
                                          'X' 'CONNID'    'SPFLI' 'C' ' ',
                                          ' ' 'COUNTRYFR' 'SPFLI' 'C' ' ',
                                          ' ' 'COUNTRYTO' 'SPFLI' 'C' ' ',
                                          ' ' 'CITYFROM'  'SPFLI' ' ' 'X',
                                          ' ' 'CITYTO'    'SPFLI' ' ' 'X'.

*-- set popup layout
    gs_playout-zebra      = abap_true.
    gs_playout-cwidth_opt = 'A'.
    gs_playout-sel_mode   = 'D'.

    PERFORM create_pop_object.

    CALL METHOD go_pop_grid->set_table_for_first_display
      EXPORTING
        i_save          = 'A'
        i_default       = 'X'
        is_layout       = gs_playout
      CHANGING
        it_outtab       = gt_spfli
        it_fieldcatalog = gt_pfcat.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_pop_field_catalog
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&---------------------------------------------------------------------*
FORM set_pop_field_catalog  USING pv_key pv_field pv_table pv_just pv_emph.

  gs_pfcat-key       = pv_key.
  gs_pfcat-fieldname = pv_field.
  gs_pfcat-ref_table = pv_table.
  gs_pfcat-just      = pv_just.
  gs_pfcat-emphasize = pv_emph.

  APPEND gs_pfcat TO gt_pfcat.
  CLEAR gs_pfcat.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_pop_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_pop_object .

*-- Create popup container (Custom container)
  CREATE OBJECT go_pop_cont
    EXPORTING
      container_name = 'POP_CONT'.

*-- Create popup grid
  CREATE OBJECT go_pop_grid
    EXPORTING
      i_parent = go_pop_cont.

ENDFORM.
MODULE exit_pop INPUT.

  CALL METHOD : go_pop_grid->free,
                go_pop_cont->free.

  FREE : go_pop_grid, go_pop_cont.

  LEAVE TO SCREEN 0.

ENDMODULE.

결과 : Function key는 없지만 F3 / x버튼 누르면 종료됨( exit 모듈 있어야만 종료됨)


Custom container - screen painter에서 설정해준 크기만큼만 팝업 스크린이 띄워지는 것 알 수 있음

팝업 ALV의 layout 변경

  • Toolbar 삭제
    - 팝업 ALV는 상세 정보 조회용이 많아서 sort, find 등 여러 기능 필요 없는 경우가 많음

    layout- no_toolbar 속성에 ‘X’ 주면 툴바 사라짐
gs_playout-no_toolbar = abap_true. 
  • Grid 자체 타이틀 설정

layout-grid_title 주면 alv 자체에 title 설정 가능

 gs_playout-grid_title = 'Flight schedule'.

결과 : 툴바 없어짐. alv 자체 타이틀 생성됨

  • Grid title 글씨 크기 줄이기
 gs_playout-smalltitle = abap_true.

profile
병아리 ABAP 개발 일지

0개의 댓글