본문 바로가기
ABAP

ALV

by clode 2023. 2. 16.
728x90
반응형

ALV

  • ABAP List Viewer
  • 리스트 화면에 데이터 조회
  • 조회된 데이터 수정/변경

* ALV grid control

  • Screen Painter를 이용해 ALV 영역 지정

  • 스크린 영역과 ALV를 연결하는 SAP Container Control이 반드시 존재 해야 함


    #### * Container ![](https://images.velog.io/images/1000nion/post/cd8bf4a0-33c2-4c47-b4f8-ea676be7eede/image.png)
  • SAP Instance를 물리적으로 화면에 보이게 하려면 Screen과 ALV GRID Control의 연결고리 역할을 하는 Container Control이 반드시 존재 해야 함

  • Custom container,Dialog Box Container, Splitter Container 등이 있음


    #### * Field Catalog
  • LVC_T_FCAT TYPE의 Table 구조

  • ALV는 Field Catalog 정보를 저장하는 internal Table을 이용해 필드 타입 인식

  • ABAP Dictionary를 이용한 생성

  • 수동으로 구성하여 생성

  • SET_TABLE_FOR_FIRST_DISPLAY METHOD의 I_STRUCTURE_NAME PARAMETER 사용





실습

[실행 화면]

순번을 입력하고 실행하면

ALV로 리스트를 출력해주는 프로그램을 만들어본다. 이때 ALV 구조는 필드 카탈로그 사용해 수동으로 구성한다. ALV 필드정렬과 레이아웃도 로직으로 구현해 ALV 제어도 해본다.

[프로그램 로직]

INCLUDE ZS1D11_028_TOP                          .    " Global Data
INCLUDE ZS1D11_028_O01                          .  " PBO-Modules
INCLUDE ZS1D11_028_I01                          .  " PAI-Modules
INCLUDE ZS1D11_028_F01                          .  " FORM-Routines


 INITIALIZATION.

AT SELECTION-SCREEN.

START-OF-SELECTION.
  PERFORM select_data.

END-OF-SELECTION.
    CALL SCREEN 100.

<TOP>

REPORT zs1d11_028 MESSAGE-ID zm11.

TABLES: zs1d11t_01.

DATA: ok_code TYPE sy-ucomm,
      gs_tab TYPE zs1d11t_01,
      gt_tab TYPE TABLE OF zs1d11t_01.

"alv관련 데이터 오브젝트
DATA: g_alv TYPE REF TO cl_gui_alv_grid,
      g_custom_con TYPE REF TO cl_gui_custom_container.

DATA: gs_fieldcat TYPE lvc_s_fcat,
      gt_fieldcat TYPE lvc_t_fcat,      "필드 카탈로그
      gs_layo TYPE lvc_s_layo,          "레이아웃 옵션
      gs_sort TYPE lvc_s_sort,          "정렬
      gt_sort TYPE lvc_t_sort,
      gs_functions TYPE ui_functions.

SELECT-OPTIONS s_seqnr FOR zs1d11t_01-seqnr.

실행하면 순번값을 From ~ to 범위로 입력 할수 있는 선택 창은 SELECT-OPTIONS로 생성해준다. 이때 FOR 뒤에오는 테이블은 TABLES로 선언이 되어있어야 한다.


<화면 100>

레이아웃에서 컨테이너를 그려준다.

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
 MODULE SET_ALV.

PROCESS AFTER INPUT.
 MODULE EXIT AT EXIT-COMMAND.
   FIELD OK_CODE  MODULE USER_COMMAND_0100 ON INPUT.

<PBO>

MODULE status_0100 OUTPUT.
 SET PF-STATUS 'S100'.
 SET TITLEBAR 'S100'.
ENDMODULE.


MODULE set_alv OUTPUT.
  "PBO 모듈이 실행될때마다 실행되면 안되므로 한번만 실행되도록 제어함 
  "오브젝트 만들어져있는데 계속 만들면 오류나기 때문
  CHECK g_custom_con IS INITIAL.

  "화면 100에 생성한 컨테이너 참조해 오브젝트 생성
  CREATE OBJECT g_custom_con
    EXPORTING
       container_name = 'HD_CON'.

  "ALV_CON위에서 ALV 오브젝트 생성
  CREATE OBJECT g_alv
    EXPORTING
      i_parent = g_custom_con.


" ALV 구성
  PERFORM make_fieldcat.    "필드카탈로그 수동 구성
  PERFORM sort.            "ALV 정렬
  PERFORM layo.             "ALV 레이아웃

  "ALV 출력
         CALL METHOD g_alv->set_table_for_first_display "인스턴스명
           EXPORTING
*            i_structure_name              = 'ZS1D11T_01' "ALV의 구조가 ZS1D11T_01테이블의 구조로 실행된다, ALV구조 자동구성
             is_layout                     = gs_layo
           CHANGING
             it_outtab                     =  gt_tab "INT의 레코드 지칭, 헤더있는 INT선언시 []로 바디 표시
             it_fieldcatalog               = gt_fieldcat "필드 카탈로그
             it_sort                       = gt_sort "정렬
             .
ENDMODULE.

만약 수동으로 필드카탈로그를 구성하는게 아니라 자동으로 테이블 구조와 동일하게 alv를 구성한다고 하면 i_structure_name 주석을 풀고 '테이블 이름'을 입력해주면 테이블과 구조가 동일한 alv로 출력된다.


<PAI>

MODULE exit INPUT.
  CASE ok_code.
  WHEN 'EXIT' OR' CANC'.
    LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.


MODULE user_command_0100 INPUT.
   CASE ok_code.
        WHEN 'BACK'.
    LEAVE TO SCREEN 0.
   ENDCASE.
ENDMODULE.

<FORM>

FORM select_data .
  SELECT * FROM zs1d11t_01
    INTO TABLE gt_tab
    WHERE seqnr IN s_seqnr.       "복수선택이니까 복수조건 in
ENDFORM.


FORM make_fieldcat .
  "ALV 수동구성
  gs_fieldcat-fieldname = 'SEQNR'.
  gs_fieldcat-coltext = '순번'. "필드헤더 텍스트
  gs_fieldcat-just = 'C'. "가운데정렬, L는 왼쪽정렬, R는 오른쪽정렬
  gs_fieldcat-key = 'X'. "키값 고정
  APPEND gs_fieldcat TO gt_fieldcat.  CLEAR: gs_fieldcat.

  gs_fieldcat-fieldname = 'TEAM'.
  gs_fieldcat-coltext = '조'.
  gs_fieldcat-just = 'C'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'NOTE'.
  gs_fieldcat-coltext = '비고1'.
  gs_fieldcat-just = 'L'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

ENDFORM.


FORM sort .
  "ALV 정렬
  "정렬시에 같은값의 셀은 병합되서 나온다.
  gs_sort-spos = 1. "정렬할 열 순서
  gs_sort-fieldname = 'SEQNR'.
  gs_sort-up = 'X'.     "오름차순, 내림차순은 DOWN = 'X'
  APPEND gs_sort TO gt_sort. CLEAR gs_sort.

  gs_sort-spos = 2.
  gs_sort-fieldname = 'TEAM'.
  gs_sort-up = 'X'.     "오름차순, 내림차순은 DOWN = 'X'
  APPEND gs_sort TO gt_sort. CLEAR gs_sort.

  gs_sort-spos = 3.
  gs_sort-fieldname = 'NOTE'.
  gs_sort-down = 'X'.     "오름차순, 내림차순은 DOWN = 'X'
  APPEND gs_sort TO gt_sort. CLEAR gs_sort.
ENDFORM.


FORM layo .
  "ALV 레이아웃 설정
  gs_layo-zebra = 'X'. "줄무늬 
  gs_layo-smalltitle = 'X'.
  gs_layo-cwidth_opt = 'X'. "너비 최적화
  gs_layo-no_merging = 'X'. "셀병합 불가능, 셀의 값이 동일하더라도 셀이 병합되지 않게 하는 기능 
ENDFORM.

기본적으로 ALV는 같은 값의 셀은 병합해서 출력한다. 병합하지 않으려면 ALV 제어: 레이아웃구조를 가진 LVC_S_LAYO에서 NO_MERGING이라는 셀병합 불가능 필드를 사용해준다.

728x90
반응형

'ABAP' 카테고리의 다른 글

ALV 3 (Hotspot)  (0) 2023.02.16
ALV 2 (이벤트)  (0) 2023.02.16
엑셀 업로드 + BDC  (0) 2023.02.16
엑셀 업로드  (2) 2023.02.16
BDC 프로그램  (0) 2023.02.16

댓글