본문 바로가기

SAP스터디/ABAP 스터디 23기_LV2

[ABAP LV2] LESSON02.

최초 작성일: 23년 2월 28일

최종 작성일: 23년 3월 31일

 

목적:  ALV를 만들고 출력하기!

 

아밥 프로그램에서 AVL는 엑셀 과 비슷함

(범용적이고 데이터를 보기 쉬움)

ALV화면 예시

ALV(abap list viewer)화면은 3가지 방식으로 만들 수 있음(구현방식)

  • FUNCTION 기반의 ALV : object기반으로 alv를 만든다. 현재는 쓰지 않으나 Function module이라고하는 오브젝트를 기반으로 alv 형태로 데이터 출력해줌. 업데이트 되지 않는 버전을 사용하면 function alv를 쓸것
  • CLASS ALV : class 기반이며 현재 범용적으로 사용하고 있는 alv임. 5단계
  • SIMPLE ALV: class기반이며 class에 비해 단계가 심플하다. 1~2 단계

class alv와 simple alv의 차이점

두 alv 구현방식은 종류만 다른데

class는 5가지 과정을 거쳐서 alv를 만들 수 있으나 simple의 경우에는 2~3단계만 거쳐도 alv를 생성할 수 있음.

 

OOP (Object-oriented programming)

객체 기반의 프로그래밍: 클래스 라고 하는 것 자체가 범용적인 컨셉인데 직관적으로 설명하면 오브젝트들 중 하나님.

OOP라고 하면 클래스 기반의 프로그램이다 라고 이해하면됨.

오브젝트(=class)는 data(attribute)와 function(method)이 하나로 묶여 구성된 단위이다.

계산식을 예로 들면 1*2 = 3 이라고 하때 1,2,3이라는 data와 ' * '라는 fuctnion이 존재한다.

 

data선언 (클래스에서는 이걸 attribute라고 부름)

data: gv_v1 type i

 

function ( 클래스에서는 이걸 method, 함수라고 부름. 코딩 할때 마다 이걸 적는게 아니고 함수화 해서 재사용하는 것)

gv_sum = gv_v1 + gv_v2

 

fucntion으로 만들어서 재사용한다.

(재사용)

 

CLASS ALV만드는 방법

 

step1. 변수 선언

 

*class

*class 만들기 위한 선행 작업

*전역변수
INCLUDE ZCLASS_TEST_TOP.
*로컬 클래스
INCLUDE ZCLASS_TEST_cls.
*함수
INCLUDE ZCLASS_TEST_F01.
*PAI
INCLUDE ZCLASS_TEST_l01.
*PBO
INCLUDE ZCLASS_TEST_001.

[ABAP] INCLUDE 프로그램으로 전체프.. : 네이버블로그 (naver.com) -> include관련해서 이거 꼭꼭 참고하기

step 2. 구조

 

객체변수 접근 방법

객체 변수 -> 필드

객체 변수 -> method

객체 변수 -> 테이블

 

선언부

CLASS LO_CLASS DEFINITION.
	PUBLIC SECTION.
    
    
 ENDCLASS.

 

 

구현부

CLASS LO_CLASS IMPLEMENTATION.

실제 로직 기술

ENDCLASS.

step 3. ALV CLASS의 파라미터 (ABAP Class Parameter 값 전달 기법)

 

파라미터란? 입력값, 출력값으로 사용하는 필드를 의미함.

예를들어 import parameter, export parameter.

 

아밥 프로그램에서 10이라고 하는 값을 파라미터로 전달하게되면,  프로그램 입장에서 메서드에 값을 전달함. (출처: 곰선비님 lv2강의 자료)

step 4. ABAP CLASS 접근제한 영역

하나의 CLASS내에 선언된 변수, 구조체, 인터널 테이블 등의 데이터 공간에 접근영역을 제한하는 것을 말함.

  • PUBLICE SECTION :  all class 내에서 접근 가능
  • PRIVATE SECTION: 현재 class 내에서 접근 가능
*구현부
CLASS LO_CLASS DEFINITION.


PUBLIC SECTION.

DATA: GV_V1 TYPE I,
      GV_V2 TYPE I,
      GV_V3 TYPE I.

METHODS: SUM_DATA IMPORTING IV_V1 TYPE I
                            IV_V2 TYPE I
                  EXPORTING EV_V1 TYPE I.
ENDCLASS.

*실행부 

CLASS LO_CLASS IMPLEMENTATION.

METHOD SUM_DATA.
*덧셈의 로직
EV_V1 = IV_V1 + IV_V2.

ENDMETHOD.

ENDCLASS.

프로그램이 위에서 아래로 해설되다보니 CLASS가 TOP보다 밑에서 있어서 생긴 이슈?? -> 1) 해결 방법은 CLASS를 맨 위로 옮기거나
선언부가 DEFERED되었다고 선언하면 됨 (CLASS에서 TOP에 있는 변수를 쓰고 싶을때 사용하면 됨)

클래스 선언시 데이터 TYPE은  무조건 '  TYPE REF TO'가 되어야 함.

 

ALV GRID 이론

선행 조건

1) 스크린을 만들어야 함

스크린안에 격자무늬는 인터널 테이블임(결론적으로 인터널 테이블을 화면에 보여줘야함)

따라서 스크린과 인터널 테이블을 만들어야 ALV를 만들 수 있음

 

2) ALV GRID 생성 순서 (이벤트 기반으로)

PBO =  화면을 이쁘게 만든다. 최초에 화면을 출력하는 로직을 설계하는 모듈

PAI = 출력된 화면에서 사용자의 이벤트를 수행하는 모듈

PAI를 통해서 새로운 윈도우 화면을 열었다면 새로운 PBO를 태운거임

 

개발자 입장에서는 사인(버튼의 기능을 명확하게 구분해줘야함)

SY-UCOMM 변수

모든 버튼에는 고유의 Valueable이 있으며 그 valuable을 확인하는 방법은 code기재하는 곳에 '/h'를 입력후 엔터를 누른다음에 값을 확인하고자 하는 버튼을 누른후 sy-ucomm을 입력후 활성화하면 해당 버튼에 할당된 것을 확인할 수 있음

 

alv class는 이미 있는 걸 가져다 쓰는 거임

class : CL_GUI_ALV_GRID

글로벌 클래스이기때문에 어디에든 쓸 수 있음

  • T- CODE: SE24
  • class:  CL_GUI_ALV_GRID
  • ALV생성시 사용되는 기본 METHOD
    •  Constructor
      • ALV GRID Control Instance 생성
    • SET_table_for_first_display
      • Control 내부에서 Internal Table Data를 보여준다
    • refresh_table_display
      • Control 내부에서 Display된 Data들의 변경이 있을 시 사용
      • 사용자가 작업하여 업데이트 사항이 있는 경우 갱신해주는 method

 

ALV GRID에 대한 이해

필드 명 = 메타 데이터 회사코드 계정과목표 G/L 계정 계정 통화
         

Class : ALV container - ALV 생성시 사용되는 기본 METHOD

SAP ABAP Container란, SAP Screen(화면)의 특정 영역을 그릴 때, 사용하게 되는 클래스를 말함.

Container 영역을 설정하는 이유는 사용자 입력 field를 생성하거나 alv grid를 출력하기 위한 목적으로 사용하고 있음

container는 크게 4가지로 사용가능함. continer도 전부 클래스로 이뤄져 있음. container를 쓰려면 create class로 class를 만들어줘야함.

1. CL_GUI_DOCKING _CONTAINER

2.CL_GUI_CUSTOM_CONTAINER

painter를 많이 사용하는데

painter와 아밥 소스 코드의 연결 지점은

CREATE OBJECT GO_CUSTOM_CON
	EXPORTING 
    	CONTAINER_NAME = 'CON100'.
    CREATE OBJECT LO_OBJECT
    	EXPORTING
        I_PARENT = GO_CUSTOME_CON.

3.CL_GUI_DIALOG_BOX_CONTAINER

4. CL_GUI_SPLITTER_CONTAINER

ALV Grid 데이터 포맷에 적용할 수 있는 기능

  • layout : 인터널 테이블 전체
    • T-CODE: SE11 
      • LVC_S_LAYO 
        • S:STRUCTURE
  • field category : 각각의 필드
    • T-CODE: SE11 
      • LVC_T_FCAT
      • LVC_S_FCAT
      • UI_FUNCTIONS 

스크린 안에는 Container를 만들어야 함

container, 즉 영역 지정

container도 전부 클래스로 이루어져있음.

 

container 종류

docking container

custom container -gui 기반임

dialog container

spliter container

screnn painter와 아밥 소스코드의 연결방법은

CREATE OBJECT GO_CUSTOM_CON
	EXPORTING
    	CONTAINER_NAME = 'CON100'.
        
        CREATE OBJECT LO_OBJECT
        	EXPORTING
            	I_PARENT = GO_CUSTOM_CON.

alv를 뿌려주고 갱신하는 거외에 인터널 테이블을 화면에 뿌려주는 경우

나눠서 보면

필드명이 필드 라벨로 되어 있고 마스터 데이터임

alv에서는 레이아웃이랑 피드 카테고리 라는 두가지 개념이 있음

레이라웃은 인터널 테이블 전체

필드 카테고리는 필드 각각임

 

 

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100.

*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
 SET PF-STATUS 'PBO_0100'. "버튼 활성화
 SET TITLEBAR 'BPO_0100'.  " ALV 제목

ENDMODULE.                 " STATUS_0100  OUTPUT

 

PBO 화면 만들기

1.

*----------------------------------------------------------------------*
***INCLUDE ZEDU17_ALV_FRONT_PBO_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  PBO_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_0100 OUTPUT.

*1. ALV Container 생성(인스턴스 메모리에 할당)
*Construct 메서드 자동 호출
CREATE OBJECT GO_CUSTOM_CON
 EXPORTING 
   CONTAINER_NAME = 'CON100'.


* 2. ALV Grid 생성 (인스턴스 메모리에 할당) container안에 alv가 들어가서 연결하는 작업이라고 생각하면 될듯

CREATE OBJECT go_alv
  EXPORTING
    i_parent = go_custom_con.

*3. ALV Layout

*4. ALV Field catalog

*5. ALV button Toolbar

*6. ALV Internal Table 화면에 출력



ENDMODULE.                 " PBO_0100  OUTPUT

2. 스크린페인터로 이동하기

name을 con100으로 해서 아밥 소스코드랑 연결 시키기 . 이작업 후 active하

ALV Field catalog 생

*----------------------------------------------------------------------*
***INCLUDE ZEDU17_ALV_FRONT_PBO_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  PBO_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_0100 OUTPUT.

*1. ALV Container 생성(인스턴스 메모리에 할당)
*Construct 메서드 자동 호출
CREATE OBJECT GO_CUSTOM_CON
 EXPORTING
   CONTAINER_NAME = 'CON100'.


* 2. ALV Grid 생성 (인스턴스 메모리에 할당) container안에 alv가 들어가서 연결하는 작업이라고 생각하면 될듯

CREATE OBJECT go_alv
  EXPORTING
    i_parent = go_custom_con."container 연결

*3. ALV Layout
GS_LAYOUT-SEL_MODE = 'A'. " 행 선택 버튼
GS_LAYOUT-ZEBRA = 'X'.    " 격자무늬
GS_LAYOUT-EDIT = 'X'.     " 수정 모드
GS_LAYOUT-NO_TOOLBAR = 'X'. " 툴바 제거

GS_LAYOUT-TOTALS_BEF ='X'. " 합계를 최상단에 위치

*4. ALV Field catalog : 각각의 필드에 대해 제공하는 옵셥이 있음(그래서 테이블형태로 받는다) (=LVC_T_FCAT).

* FIELDNAME, REF_TABLE, REF_FIELD, EMPHASIZE, SCR_TEXT

PERFORM APPED_FCAT USING: 'MANDT' 'SKAT''MANDT' 'C300''클라이언트',
                          'KTOPL' 'SKAT''KTOPL' '' '계정과목표',
                          'TXT20' 'SKAT' 'TXT20' '' 'G/L계정내역',
                          'TXT50' 'SKAT' 'TXT50' '' 'G/L 계정 설명',
                          'MCOD1' 'SKAT' 'MCOD1' 'C800' '검색어'.

*5. ALV button Toolbar

*6. ALV Internal Table 화면에 출력



ENDMODULE.                 " PBO_0100  OUTPUT

PERFORM 생성

 

*----------------------------------------------------------------------*
***INCLUDE ZEDU17_ALV_FRONT_APPED_FCATF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  APPED_FCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0036   text
*      -->P_0037   text
*      -->P_0038   text
*----------------------------------------------------------------------*
FORM APPED_FCAT  USING    VALUE(P_0036)
                          VALUE(P_0037)
                          VALUE(P_0038).

ENDFORM.                    " APPED_FCAT
FORM APPED_FCAT  USING    VALUE(P_0036)"필드명
                          VALUE(P_0037)"참조테이블
                          VALUE(P_0038)."COLOR

DATA: ls_fcat TYPE lvc_s_fcat .
ls_fcat-fieldname = p_0036.
ls_fcat-ref_table = p_0037.
ls_fcat-color = p_0038.

ls_fcat-scrtext_l = ls_fcat-scrtext_s = ls_fcat-scrtext_m = p_0052.

ENDFORM.

class/interface에 avl아니고 alv

*----------------------------------------------------------------------*
***INCLUDE ZEDU17_ALV_FRONT_PBO_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  PBO_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_0100 OUTPUT.

*1. ALV Container 생성(인스턴스 메모리에 할당)
*Construct 메서드 자동 호출
CREATE OBJECT GO_CUSTOM_CON
 EXPORTING
   CONTAINER_NAME = 'CON100'.


* 2. ALV Grid 생성 (인스턴스 메모리에 할당) container안에 alv가 들어가서 연결하는 작업이라고 생각하면 될듯

CREATE OBJECT go_alv
  EXPORTING
    i_parent = go_custom_con."container 연결

*3. ALV Layout
GS_LAYOUT-SEL_MODE = 'A'. " 행 선택 버튼
GS_LAYOUT-ZEBRA = 'X'.    " 격자무늬
GS_LAYOUT-EDIT = 'X'.     " 수정 모드
GS_LAYOUT-NO_TOOLBAR = 'X'. " 툴바 제거

GS_LAYOUT-TOTALS_BEF ='X'. " 합계를 최상단에 위치

*4. ALV Field catalog : 각각의 필드에 대해 제공하는 옵셥이 있음(그래서 테이블형태로 받는다) (=LVC_T_FCAT).

* FIELDNAME, REF_TABLE, REF_FIELD, EMPHASIZE, SCR_TEXT

PERFORM APPED_FCAT USING: 'MANDT' 'SKAT''MANDT' 'C300''클라이언트',
                          'KTOPL' 'SKAT''KTOPL' '' '계정과목표',
                          'TXT20' 'SKAT' 'TXT20' '' 'G/L계정내역',
                          'TXT50' 'SKAT' 'TXT50' '' 'G/L 계정 설명',
                          'MCOD1' 'SKAT' 'MCOD1' 'C800' '검색어'.

*5. ALV button Toolbar

*6. ALV Internal Table 화면에 출력
CALL METHOD GO_ALV->SET_TABLE_FOR_FIRST_DISPLAY
*  EXPORTING
*    I_BUFFER_ACTIVE               =
*    I_BYPASSING_BUFFER            =
*    I_CONSISTENCY_CHECK           =
*    I_STRUCTURE_NAME              =
*    IS_VARIANT                    =
*    I_SAVE                        =
*    I_DEFAULT                     = 'X'
*    IS_LAYOUT                     =
*    IS_PRINT                      =
*    IT_SPECIAL_GROUPS             =
*    IT_TOOLBAR_EXCLUDING          =
*    IT_HYPERLINK                  =
*    IT_ALV_GRAPHICS               =
*    IT_EXCEPT_QINFO               =
*    IR_SALV_ADAPTER               =
  CHANGING
    IT_OUTTAB                     =
*    IT_FIELDCATALOG               =
*    IT_SORT                       =
*    IT_FILTER                     =
*  EXCEPTIONS
*    INVALID_PARAMETER_COMBINATION = 1
*    PROGRAM_ERROR                 = 2
*    TOO_MANY_LINES                = 3
*    OTHERS                        = 4
        .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.



ENDMODULE.                 " PBO_0100  OUTPU
*----------------------------------------------------------------------*
***INCLUDE ZEDU17_ALV_FRONT_PBO_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  PBO_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_0100 OUTPUT.

*1. ALV Container 생성(인스턴스 메모리에 할당)
*Construct 메서드 자동 호출
CREATE OBJECT GO_CUSTOM_CON
 EXPORTING
   CONTAINER_NAME = 'CON100'.


* 2. ALV Grid 생성 (인스턴스 메모리에 할당) container안에 alv가 들어가서 연결하는 작업이라고 생각하면 될듯

CREATE OBJECT go_alv
  EXPORTING
    i_parent = go_custom_con."container 연결

*3. ALV Layout
GS_LAYOUT-SEL_MODE = 'A'. " 행 선택 버튼
GS_LAYOUT-ZEBRA = 'X'.    " 격자무늬
GS_LAYOUT-EDIT = 'X'.     " 수정 모드
GS_LAYOUT-NO_TOOLBAR = 'X'. " 툴바 제거

GS_LAYOUT-TOTALS_BEF ='X'. " 합계를 최상단에 위치

*4. ALV Field catalog : 각각의 필드에 대해 제공하는 옵셥이 있음(그래서 테이블형태로 받는다) (=LVC_T_FCAT).

* FIELDNAME, REF_TABLE, REF_FIELD, EMPHASIZE, SCR_TEXT

PERFORM APPED_FCAT USING: 'MANDT' 'SKAT''MANDT' 'C300''클라이언트',
                          'KTOPL' 'SKAT''KTOPL' '' '계정과목표',
                          'TXT20' 'SKAT' 'TXT20' '' 'G/L계정내역',
                          'TXT50' 'SKAT' 'TXT50' '' 'G/L 계정 설명',
                          'MCOD1' 'SKAT' 'MCOD1' 'C800' '검색어'.

*5. ALV button Toolbar

*6. ALV Internal Table 화면에 출력 -> 출력 시점에 alv option이 적용된다
CALL METHOD GO_ALV->SET_TABLE_FOR_FIRST_DISPLAY
  EXPORTING

    IS_VARIANT                    = gs_variant  "ALV Variant
    I_SAVE                        = 'A'         "ALV Variant 저장기능 활성(, user specific)
    I_DEFAULT                     = 'X'         "전체 사용자 variant
    IS_LAYOUT                     = gs_layout  " ALV LAYOUT
    IT_TOOLBAR_EXCLUDING          = gs_toolbar  "ALV TOOLBAR

  CHANGING
    IT_OUTTAB                     = gt_itab   "Internal table
    IT_FIELDCATALOG               = gt_fcat   "field catalog

  EXCEPTIONS
    INVALID_PARAMETER_COMBINATION = 1
    PROGRAM_ERROR                 = 2
    TOO_MANY_LINES                = 3
    OTHERS                        = 4
        .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.



ENDMODULE.                 " PBO_0100  OUTPUT

후에 활성화 하기

PAI에서 'MODULE USER_COMMAND_0100'을 에 주석 처리 삭제후 저장 및 USER_COMMAND로 활성화 시킬

MODULE USER_COMMAND_0100 INPUT.


MODULE USER_COMMAND_0100 INPUT.

GV_OKCODE = SY-UCOMM.
CASE GV_OKCODE.

WHEN 'BACK' OR 'CANC' OR 'EXIT'.
  LEAVE TO SCREEN 0.
ENDCASE.
  

ENDMODULE. "USER_COMMAND_0100 INPUT

'SAP스터디 > ABAP 스터디 23기_LV2' 카테고리의 다른 글

[ABAP LV2] LESSON01.  (0) 2023.02.19
진도표  (0) 2023.02.18