본문 바로가기
공부/SAP

ALV GRID 만들기

by 채소 2024. 1. 24.
728x90

참조 : EASY ABAP 책, https://abapta0903.tistory.com/11#recentEntries

 

1. 프로그램 생성 후 스크린 만들기

 

2.LAYOUT 클릭하여 스크린 페인터를 통해 CUSTOM CONTROL 생성

 

참고

화면 최대 크기 200/255

 

(그 전에 메인 프로그램 세팅)

REPORT ZALVGRID01.


INCLUDE ZALVGRID01TOP.
INCLUDE ZALVGRID01ALV.
INCLUDE ZALVGRID01I01.
INCLUDE ZALVGRID01O01.
INCLUDE ZALVGRID01F01.


START-OF-SELECTION.
CALL SCREEN 100.

 

 

3. 컨테이너 참조 변수 (+ 및 ALV GRID 컨트롤 생성)

 

로직 상(순서상) 컨테이너 참조변수 만들고 오브젝트 생성하고 화면영역 만들고 ALV GRID 컨트롤 생성하고 오브젝트 만들어서 진행해야하는데

 

매번 반복하기 번거로우니 그냥 한번에 ALV 컨테이너 참조변수 만들고 한번에 오브젝트 만들어서 진행하기 

 

ALV 에서 선언함

 

"ALV 컨테이너 참조 변수 생성
DATA: CON1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,


"ALV GRID 컨트롤 생성  
      G_GRID TYPE REF TO CL_GUI_ALV_GRID.


"필드 카탈로그 선언 - 테이블과 구조체 둘다 타입 참조해서
DATA: GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_FIELDCAT TYPE LVC_S_FCAT.


"레이아웃 선언

DATA : GS_LAYOUT TYPE LVC_S_LAYO.

 

4. PBO 생성

스크린에 SAP CUSTOM 컨테이너 오브젝트 생성하기 위해 PBO 모듈 생성하기

PBO = PROCESS BEFORE OUTPUT(PBO) 스크린이 띄워지기 전에 수행되는 사항들

PAI = 스크린 이후에 진행되는 사항들

 

[[[STATUS_0100 설정하기]]

PAI에서 MODULE설정 할예정이므로 FUNCTION TYPE을 다음과같이 변경

 

5. 컨테이너 오브젝트 생성 ( PBO 모듈에서) ( + 및 ALV 오브젝트 생성)

 

=> 컨테이너 오브젝트를 직접 PBO에서 소크도르를 작성해도 상관없고

혹은 생성하는 코드 F01에서 FORM 작성하고 나서 O01(PBO)에서 PERFORM으로 불러와서 사용해도 상관없음

"CONTAINER OBJECT 생성
FORM CREATE_OBJECT.
  CREATE OBJECT '2단계에서 생성한 CL_GUI_CUSTOM_CONTAINER 명'
  EXPORTING
    CONTAINER_NAME = 'SCREEN 생성하고 만든 CUSTOM CONTAINER 명'.

  CREATE OBJECT ''2단계에서 생성한 CL_GUI_ALV_GRID 명'
  EXPORTING
     I_PARENT = '2단계에서 생성한 CL_GUI_CUSTOM_CONTAINER 명'.


ENDFORM.

"안헷갈리게 CLGUI CUSTOM CONTAINER명과 SCREEN에서 생성하고 만든 CUSTOM CONTAINER 명 동일하게 쓰든지 해야겠다..

 

PARENT 컨트롤이 보이는 인스턴스 상위 컨트롤 지정
CONTAINER_NAME 스크린 페인터 지정한 CUSTOM CONTAINER, 즉 스크린의 CUSTOM CONTROL 이름 지정
STYLE 컨트롤의 외형적 스타일 지정
DYNNR 컨트롤 추가하고자하는 스크린번호
REPID 컨트롤에 추가하고자하는 프로그램 ID
LIFETIME 컨트롤의 생명주기 설정
NO_AUTODEF_PROGRID_DYNNR 프로그램 ID와 스크린 번호 지정 

 

 

예시

f01

"CONTAINER OBJECT 생성
FORM CREATE_OBJECT.
  CREATE OBJECT CON1
  EXPORTING
    CONTAINER_NAME = 'CON1'.

  CREATE OBJECT G_GRID
  EXPORTING
     I_PARENT = CON1.


ENDFORM.

 

 

 

PBO

MODULE SET_ALV OUTPUT.

PERFORM CREATE_OBJECT.

ENDMODULE.

 

화면 호출하여 중간점검 'ㅁ' 

=> ALV 와 같은 컨트롤을 올리고자 화면 영역을 생성한 것이기 때문에 현재 화면에는 아무것도 안보이는게 정상

 

START-OF-SELECTION.

CALL SCREEN 100.

 

ALV GRID 컨트롤 생성 요약

1.스크린에서 CUSTOM CONTROL 생성

2. SAP 컨테이너 참조 변수 생성함

3. SAP 컨테이너 오브젝트를 스크린 CUSTOM CONTROL 과 연결하여 생성

4. ALV GRID 참조 변수를 생성하여 SAP 컨테이너 위에 올림

 

 

----------------------------------------

 

6. START-OF SELECTION을 추가하여 데이터 SELECT 한 다음 화면 호출

 

SELECT * FROM sflight
INTO TABLE gt_sflight UP TO 25 ROWS.
CALL SCREEN 100.

 

 

 

7. ALV 출력( 맨 마지막에 해야함 그렇지 않으면 오류 발생)

PATTERN 기능 사용

단축키 CTRL+F6

 

1) CALL METHOD 선택하고

2) INSTANCE : 인스턴스 명( ALV GRID 명)

3) CLASS : CL_GUI ALV_GRID

4) METHOD : SET_TABLE_FOR_FIRST_DISPLAY

 

 

FORM DISPLAY_ALV.
CALL METHOD G_GRID->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                     = GS_LAYOUT
*    IS_PRINT                      =
*    IT_SPECIAL_GROUPS             =
*    IT_TOOLBAR_EXCLUDING          =
*    IT_HYPERLINK                  =
*    IT_ALV_GRAPHICS               =
*    IT_EXCEPT_QINFO               =
*    IR_SALV_ADAPTER               =
  CHANGING
    IT_OUTTAB                     = GT_SFLIGHT
*    IT_FIELDCATALOG               =
*    IT_SORT                       =
*    IT_FILTER                     =
*  EXCEPTIONS
*    INVALID_PARAMETER_COMBINATION = 1
*    PROGRAM_ERROR                 = 2
*    TOO_MANY_LINES                = 3
*    OTHERS                        = 4
        .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.

 

 

실무에서 EASY ABAP처럼 테이블 하나만 사용하는게 아니라 여러개 합쳐서 인터널 테이블을 생성해야 되니까... 

일단 ALV GRID 생성하는 로직  이해하기 쉽게 간단히 작성하였고

 

다시 5번 부터  자세히 작성함.

 

5. ALV 관련 FORM 세팅 ( 후 컨테이너 오브젝트 생성 ( PBO 모듈에서) ( + 및 ALV 오브젝트 생성) 하기 전 PERFORM) 

 

IF G_GRID IS INITIAL

->G_GRID IS INITIAL. 처음 ALV를 만드는 것이라면 이후 작업을 건너 띄어라 라는 의미. 만약 ALV에서 작업이 수정된다면 6번의 REFRESH로 넘어갈 수 있도록 하기 위해서 사용.

FORM ALV_SET.

  IF G_GRID IS INITIAL.


    "인스턴스 생성
    PERFORM CREATE_OBJECT.

    "필드카탈로그 생성
"    PERFORM SET_FIELDCATALOG.

    "레이아웃 세팅
"    PERFORM SET_LAYOUT.

    "ALV 호출  맨마지막에 뿌려줘야함 안그러면 화면 호출되지 않은 에러 발생함!!!!!!!!!
    PERFORM DISPLAY_ALV.
    
    ELSE.
    


    "G_GRID가 초기값이 아닐 경우 REFRESH
PERFORM REFERSH_DATA.

  ENDIF.

ENDFORM.

 

6. 데이터 가져오기

TOP에서 선언

MAIN START OF SELECTION에서 불러옴

 

 

참고

1. INTO CORRESPONDING FILED OF TABLE 인터널테이블명

2. APPENDING CORRESPONDING FIELD OF TABLE 인터널테이블 명

두 구문 차이점

INTO 구문(1) 사용할 경우 INTERNAL TABLE이 초기화 되면서 데이터가 저장되지만

APPENDING 구문(2) 사용할 경우 INTERNAL TABLE의 데이터가 추가되는 형태로 데이터가 저장됨

 

 

7. 필드 카탈로그 생성

 

필드 카탈로그 - LVC_S_FCAT 역할 정의

카탈로그 속성 내용 사용 목적
CFIELDNAME Currency 단위를 참고하는 필드 이름 단위와 함께 값을 보여준다
CHECKBOX 체크박스로 보여줌 칼럼 아웃풋 옵션
COL_POS 칼럼의 output 순서 칼럼 아웃풋 옵션
COLDDICTXT Header의 라벨 설정(L, M, S, R) 텍스트
COLTEXT 칼럼 라벨 텍스트 텍스트
CURRENCY Currency 단위 단위와 함께 값을 보여준다
DD_OUTLEN Output 길이(Characters) DDIC를 참고하지 않음
DECIMALS_O 소수점 자릿수 정의 칼럼 값의 포맷
DECMLFIELD Decimal 필드 정의 칼럼 값의 포맷
DO_SUM 합계 표시 칼럼 아웃풋 옵션
DRAGDROPID Drag & Drop 용도  
EDIT_MASK 데이터 포맷 변경 칼럼 값의 포맷 
EMPHASIZE 칼럼 색상 강조 칼럼 아웃풋 옵션
EXPONENT 부동 표현에 대한 지수 칼럼 값의 포맷 
FIELDNAME 내부 테이블필드의 필드 이름 아웃풋 테이블 필드
HOTSPOT 마우스의 Single-click에 반응 칼럼 아웃풋 옵션
ICON Icon으로 보여줌 칼럼 값의 포맷
INTLEN 내부 길이( 바이트 단위 ) DDIC를 참고하지 않음 
INTTYPE ABAP 데이터 타입(C, D, N, …) DDIC를 참고하지 않음 
JUST 정렬( L, R, C ) 칼럼 값의 포맷 
KEY Key 필드 칼럼 아웃풋 옵션
LOWERCASE 소문자 사용/금지 칼럼 아웃풋 옵션
LZERO 선행에 제로 출력 여부 칼럼 값의 포맷 
NO_OUT 필드 숨김 칼럼 아웃풋 옵션
NO_SIGN 출력 부호 제거 칼럼 값의 포맷 
NO_SUM 열 값에 관한 합계 처리하지 않음 칼럼 아웃풋 옵션
NO_ZERO ZERO 삭제 칼럼 값의 포맷 
OUTPUTLNE 문자의 열 너비 칼럼 아웃풋 옵션
QFIELDNAME 참조한 단위 필드이름 단위와 함께 값 보여줌
QUANTITY 단위 단위와 함께 값 보여줌
REF_FIELD 내부 테이블 필드에 대한 참조 필드 이름 ABAP Dictionary 참고
REF_TABLE 내부 테이블 필드에 대한 참조 테이블 이름 ABAP Dictionary 참고
REPTEXT Data Element 텍스트 텍스트 
ROLLNAME F1 도움말을 위한 데이터 요소 DDIC를 참고하지 않음
ROUND ROUND 값 칼럼 값의 포맷 
ROUNDFIELD ROUND 특성에 있는 필드 이름 칼럼 값의 포맷 
SCRTEXT_L 긴 필드 라벨(40byte) 텍스트 
SCRTEXT_M 중간 필드 라벨(20byte) 텍스트 
SCRTEXT_S 짧은 필드 라벨(10byte) 텍스트 
SELDDICTXT DDIC 텍스트 참조 결정 텍스트 
SELTEXT 다이얼로그 기능에 대한 열 식별자 텍스트 
SP_GROUP 그룹 키 Other Fields
SYMBOL 기호로 출력 칼럼 값의 포맷
TECH Layout 설정에서도 필드가 안보이게 칼럼 아웃풋 옵션
TIPDDICTXT DDIC 텍스트 참조 결정 텍스트 
TOOLTIOP 열 헤더에 대한 툴 팁 텍스트 
TXT_FIELD 내부 테이블 필드의 필드 이름 Other Fields

 

아래와 같이 일일히 입력하여 필드 카탈로그 생성을 해줘 도 되는데 그냥 여러 건일 경우가 많으니까 ^-^

FORM set_fieldcatalog.
//I_STRUCUTRE_NAME을 쓰는 것보다는 CATALOG를 사용하는 것이 더 편할 수 있음.
//요구사항에 따라서 그때그때 다르게 사용하기

//먼저 CLEAR 해주기.
CLEAR : gs_fieldcat.
CLEAR : gT_fieldcat.

GS_FIELDCAT-FIELDNAME = 'EBELN'.
GS_FIELDCAT-COLTEXT = '구매문서넘버'.
GS_FIELDCAT-KEY = 'X'.
APPEND gs_fieldcat TO gt_fieldcat

 

먼저 FILEDCAT_APPEND 생성

FORM FIELDCAT_APPEND USING PV_FIELDNAME
                           PV_COLTEXT
                           PV_LENGTH
                           PV_EDIT. " 편집하는거

  GS_FIELDCAT-FIELDNAME     =   PV_FIELDNAME.
  GS_FIELDCAT-COLTEXT     =   PV_COLTEXT.
  GS_FIELDCAT-OUTPUTLEN     =   PV_LENGTH.
  GS_FIELDCAT-EDIT = PV_EDIT.

CASE PV_FIELDNAME.
  WHEN  'CARRID'.
  GS_FIELDCAT-CHECKBOX = 'X'.
ENDCASE.


APPEND GS_FIELDCAT TO  GT_FIELDCAT.
 CLEAR GS_FIELDCAT.

ENDFORM.

 

FORM FIELDCAT_SEE.
  PERFORM   FIELDCAT_APPEND   USING:
      'CARRID'          TEXT-H01        05  ' ' ,
      'CONNID'         TEXT-H02       12 ' ' ,
      'FLDATE'         TEXT-H03        10 ' ' .
ENDFORM.

 

8. 레이아웃 설정

레이아웃은 LVC_S_LAYO 타입의 STRUCTURE이며 SE11에서 조회 가능

 

출처: https://abapta0903.tistory.com/14?category=924968

 

ALV GRID 레이아웃

▪CL_GUI_ALV_GRID 클래스의 ALV를 만드는 메소드인 set_table_for_first_display에서 ▪IS_LAYOUT 파라미터를 이용하여 합계 금액을 보여주거나 줄무늬 패턴으로 조회되도록 하는 등 ALV GRID 컨트롤의 화면 속성

abapta0903.tistory.com

 

LAYOUT 화면이 속성ㅇ을 정의하는 것은 맞지만 이 레이아웃 자체에서 데이터 바꾸거나 제공되는 버튼을 누르는 것의 행위는 GRID상에서만 이루어지고 SCREEN PBO 나 PAI타는 것이 아니다. 그렇기 때문에 CLASS 선언해주어 TOOLBAR에서 버튼을 만들어준다던가, USER_COMMAND에서 버튼에 대한 역할을 주어야지 GRID상에서 변화나 버튼에 대해 TABLE/ DB 반영 가능

 

CTAB_FNAME 필드 셀 색상 지정 색상
CWIDTH_OPT 칼럼 길이 지정 GRID 속성
DETAILINIT 상세화면에서 기본 값 보여줄건지 INTERACTION
DETAILTITL 상세화면의 타이틀 바 보여줌 INTERACTION
EXCP_CONDS 예외 사항의 필드 SUB TOTAL 보여줌 EXCEPTIONS
EXCEP_FNAME 예외 사항 필드 지정 EXCEPTIONS
EXCEP_LED 예외 사항 필드를 신호등 표시가 아니라,LED로 보여줌 EXCEPTIONS
EXCEP_ROLLN 예외사항 도움말 표시 EXCEPTIONS
GRID_TITLE 타이틀 바의 내역 지정 GRID 속성
INFO_FNAME 라인의 색상을 지정한다  색상
NO_HEADERS 칼럼 헤더가 보이지 않는다 GRID속성
NO_TOOLBAR 툴바 보이지 않는다 GRID속성
NUMC_TOTAL NUMC 필드의 함계 금액을 보여준다 TOTALS옵

 

 

"레이아웃 세팅
FORM SET_LAYOUT.
*  DATA: LS_LVC_S_F4 TYPE LVC_S_F4,
*        LT_LVC_T_F4 TYPE LVC_T_F4.

*Layout Setting
  GS_LAYOUT-CWIDTH_OPT = 'X'.         "Column Width ### ####
  GS_LAYOUT-NO_ROWMARK = ' '.
  GS_LAYOUT-SEL_MODE   = 'D'.        "Row ####
  GS_LAYOUT-BOX_FNAME  = 'MARK'.
* GS_LAYOUT-STYLEFNAME = GC_CELLTAB.
  GS_LAYOUT-NO_TOTLINE = SPACE.
  GS_LAYOUT-TOTALS_BEF = 'X'.
  GS_LAYOUT-ZEBRA      = 'X'.
  GS_LAYOUT-NUMC_TOTAL = SPACE.
* GS_LAYOUT-INFO_FNAME = GC_COLORLINE.



ENDFORM.

 

 

9. ALV 출력

 

FORM DISPLAY_ALV.
CALL METHOD G_GRID->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                     = GS_LAYOUT
*    IS_PRINT                      =
*    IT_SPECIAL_GROUPS             =
*    IT_TOOLBAR_EXCLUDING          =
*    IT_HYPERLINK                  =
*    IT_ALV_GRAPHICS               =
*    IT_EXCEPT_QINFO               =
*    IR_SALV_ADAPTER               =
  CHANGING
    IT_OUTTAB                     = GT_SFLIGHT
*    IT_FIELDCATALOG               = GT_FIELDCAT
*    IT_SORT                       =
*    IT_FILTER                     =
*  EXCEPTIONS
*    INVALID_PARAMETER_COMBINATION = 1
*    PROGRAM_ERROR                 = 2
*    TOO_MANY_LINES                = 3
*    OTHERS                        = 4
        .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.

 

 

 

 

 

10. REFRESH ALV 설정

G_GRID가 초기값이 아닐 경우 REFRESH

FORM REFERESH_ALV_DATA.

CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY
*  EXPORTING
*    IS_STABLE      =
*    I_SOFT_REFRESH =
*  EXCEPTIONS
*    FINISHED       = 1
*    OTHERS         = 2
        .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.


ENDFORM.

 

 

11. SCREEN 100 PAI 설정

TOP에서 

 "아이콘 기능을 위한 OK_CODE
 DATA : OK_CODE TYPE SY-UCOMM.

 

선언

 

 MODULE EXIT_COMMAND_0100.


참고:

https://only10.tistory.com/entry/SAP-ABAP-AT-EXIT-COMMAND%EA%B3%BC-OKCODE-%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

SAP ABAP AT EXIT-COMMAND과 OK_CODE 방식의 차이점

SAP ABAP AT EXIT-COMMAND과 OK_CODE 방식의 차이점 AT EXIT-COMMAND와 OK_CODE 방식으로 화면 프로그램에서 나올 때 차이점을 알아보도록 하겠습니다. 우선, GUI Status에서 EXIT-COMMAND의 설정에 대한 '역할'을 알아

only10.tistory.com

 

'back','canc','exit' 모듈 이름을 바로 사용할 때는 아래 소스코드와 같이 사용함

MODULE EXIT_COMMAND_0100 INPUT.

CASE OK_CODE.
  WHEN 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.
  WHEN 'EXIT'.
      LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

 

만약 OK_CODE를 현재 모듈 내에서 정의하고 있다면 다음과 같이 CLEAR 명령을 사용하여 초기화할 수 있습니다.

사전에 top에서 다음과 같이 선언을 해주었으면

 GC_EXIT      TYPE CHAR4  VALUE 'EXIT',
           GC_CANC      TYPE CHAR6  VALUE 'CANC',
           GC_BACK      TYPE CHAR6  VALUE 'BACK',

CLEAR:OK_CODE를 삽입하여 소스코드를 작성하는게 적절

MODULE EXIT_COMMAND_0100 INPUT.

  CLEAR : GV_UCOMM.

* CALL METHOD GO_CUSTOM_CONTAINER->FREE.
  CALL METHOD GO_GRID->FREE.
* CALL METHOD CL_GUI_CFW=>FLUSH.

  CLEAR:   GO_CUSTOM_CONTAINER,  GO_GRID.

  GV_UCOMM   =  OK_CODE.
  "UCOMM :  MENU에서 선택된 ICON의 FUNCTION CODE를 할당함(TEXT 값)
  CLEAR: OK_CODE.

  CASE GV_UCOMM.
    WHEN GC_BACK OR GC_CANC OR GC_EXIT.
       LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.

 

 

728x90

'공부 > SAP' 카테고리의 다른 글

constants || data, TYPE Pool 설명  (0) 2024.01.29
ALV 파라미터 (메서드 )  (1) 2024.01.24
report program <12 단원 복습>  (1) 2024.01.22
SAP 단축키  (0) 2023.01.02