참조 : 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
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.
참고:
'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.
'공부 > 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 |