Search
Duplicate
🫥

ABAP 레포트 프로그램 구조와 디버깅

ABAP 레포트 프로그램 구조

ABAP 레포트 프로그램은 크게 변수 선언, 조회 화면, 실행 섹션으로 구성됨.

1. 전역 변수 선언

변수 선언 부분(상단): 전역 변수
프로그램의 모든 부분에서 접근 가능한 변수들.
디버깅할 때 프로그램 전체에서 인식됨.

2. 조회 화면

조회 화면에서 사용되는 전역 변수
프로그램 전체에서 인식되며 디버깅할 때도 프로그램 전반에서 사용됨.

3. START OF SELECTION 실행 구문

PERFORM 구문
FORMENDFORM으로 묶인 소스들을 실행함.
PERFORM 구문 안에 소스를 넣어야 제대로 실행됨.
PERFORM 구문 외부에 소스를 넣으면 적용되지 않음.
목적
1.
소스를 정리하고 관리하기 위해.
2.
소스를 재사용하기 위해.
TYPESDATA
TYPES: 구조 선언만 하며, 디버깅 시 인식되지 않음. 구조를 재사용할 때 사용함.
DATA: 디버깅 시 인식되며, 프로그램 실행 중 데이터를 넣고 빼고 수정 가능함.

ABAP에서 사용하는 테이블의 종류

1.
STANDARD TABLE (표준 테이블)
가장 일반적으로 사용되는 테이블 타입 (95% 이상).
TYPE TABLE OF 또는 STANDARD TABLE로 선언.
키가 필요없이 쓰는 경우
특징
쓰기 속도가 가장 빠름.
읽기 속도는 보통.
2.
SORTED TABLE (정렬된 테이블)
정렬 기준값(키)을 선언하여 자동으로 정렬됨.(키가 있는 구조)
특징
읽기 속도가 빠름.
쓰기 속도는 보통.
3.
HASHED TABLE (해시 테이블)
특정 키로 데이터를 빠르게 검색함.( 값을 찾아낼 키가 있어야 함)
특징
읽기 속도가 가장 빠름.
쓰기 속도가 느림.

ABAP ALV 필드 카탈로그와 테이블/행의 정의

ABAP에서 ALV(Grid or List)를 활용하여 데이터를 표 형태로 출력할 때,
필드 카탈로그(fieldcatalog)를 설정하여 각 필드의 속성, 형식 등을 정의함.
필드 카탈로그 정의 예시
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
ABAP
복사
slis_t_fieldcat_alv: SAP에서 제공하는 ALV 필드 카탈로그 테이블 타입.
WITH HEADER LINE: 이 구문은 해당 테이블 타입(slis_t_fieldcat_alv)과 동일한 이름의 행(work area)을 자동으로 생성함.
즉, fieldcatalog라는 이름을 가진 테이블과 행이 동시에 생성됨.
이 행은 테이블의 단일 행을 나타내며, 각 필드에 대한 속성 정보를 입력하기 위해 사용됨.
또 다른 필드 카탈로그 정의 방식
DATA: fieldcatalog TYPE slis_t_fieldcat_alv. DATA: fieldcatalog TYPE LINE OF slis_t_fieldcat_alv.
ABAP
복사
첫 번째 줄: fieldcatalog라는 이름의 테이블을 정의.
두 번째 줄: fieldcatalog라는 이름의 행(work area)을 정의.
LINE OF 키워드는 테이블의 단일 행을 나타내며, 이 경우에도 테이블과 행을 각각 정의하는 형태.
결론: WITH HEADER LINE을 사용하지 않는 경우, 테이블과 행을 각각 정의해야 함.

필드 카탈로그를 사용할 때의 기본 구조

필드 카탈로그를 정의하고 데이터를 추가할 때 다음과 같은 프로세스를 거침.
1.
필드 카탈로그 행(fieldcatalog)에 각 필드의 속성 정보 입력
필드명, 컬럼 위치, 출력 길이, 데이터 타입 등을 설정.
2.
필드 카탈로그 행을 테이블에 추가
APPEND 구문을 사용하여 설정한 행을 테이블에 추가.
추가 후, 다음 필드를 설정하기 전에 CLEAR 구문을 사용해 행을 초기화.
3.
테이블에 추가된 필드 카탈로그 정보를 기반으로 ALV 출력
REUSE_ALV_GRID_DISPLAY 함수 등을 사용하여 데이터 출력.

필드 카탈로그에 사용되는 주요 속성들

속성
설명
fieldname
필드 이름을 정의 (예: 'CARRID', 'MANDT')
seltext_m
필드의 설명 텍스트를 정의 (예: 'Airline Code', 'Client')
col_pos
필드가 출력될 컬럼 위치를 지정 (예: 0, 1, 2 등)
outputlen
필드의 출력 길이 (예: 10, 20 등)
inttype
필드의 내부 타입 설정 ('C'로 설정 시, NUMC와 같은 숫자형 문자를 앞에 '0'이 붙도록 설정)
lzero
선행 '0'을 보여줄지 여부 ('X' 설정 시 선행 '0'이 붙음)

필드 카탈로그 설정 예시

NUMC 타입 필드에 대해 앞에 '0'이 붙도록 설정하는 방법
fieldcatalog-fieldname = 'CONNID'. " 필드 이름 설정 fieldcatalog-seltext_m = 'Connection ID'. " 필드 설명 설정 fieldcatalog-col_pos = 2. " 컬럼 위치 설정 fieldcatalog-inttype = 'C'. " NUMC 필드를 문자 타입으로 설정하여 앞에 '0'이 붙도록 설정 APPEND fieldcatalog TO fieldcatalog. " 테이블에 행 추가 CLEAR fieldcatalog. " 다음 행 설정을 위해 초기화
ABAP
복사
ALV 출력 시, 숫자 필드의 앞에 '0'이 붙도록 할 수 있음.

ABAP 디버깅

전역 변수와 로컬 변수

전역 변수: 프로그램 상단에 선언된 변수들로, 프로그램 전체에서 인식됨.
로컬 변수: PERFORM 구문 안에 선언된 변수들로, 해당 구문 안에서만 사용됨.
디버깅은 무조건 활성화 상태에서만 찍힌다. 만약 배경이 회색이다 싶으면 비활성화 상태.
좌측에 노랑색부분을 체크해주거나 상단의 저 아이콘 클릭

디버깅 포인트가 걸리는 부분

1.
REPORT 구문
2.
PERFORM 구문
3.
실행 구문 (ENDFORM)
4.
FUNCTION 시작점

디버깅 포인트가 걸리지 않는 부분

1.
데이터 선언부
2.
START OF SELECTION 이벤트명
3.
FORM 시작점
4.
점이 찍히기 전 사이구문
5.
로컬 변수 선언부

디버깅 포인트 제거 방법

Utilities -> Breakpoint -> Display에서 전체 선택 후 삭제 가능.
1번 눌러서 전체 선택하고 2번눌러서 delete row

디버깅 모드에서 자주 사용하는 옵션

1.
Single Step: 한 줄씩 실행 (가장 많이 사용).
2.
Execute: 하나의 단위를 실행.
3.
Return: 하나의 단위를 실행하고 다음 시작점까지 실행.
4.
Continue: 다음 디버깅 포인트까지 실행. 다음 포인트가 없으면 프로그램을 끝까지 실행.

ALV (ABAP List Viewer) 사용법

fieldcatalog-fieldname = 'MANDT': 행에 있는 필드를 설정.
-로 들어가는건 행에 넣어주는 것
테이블에 데이터 추가: APPEND 구문 사용. 행을 테이블에 추가하는 방식으로 데이터 저장.

테이블과 행 예시

fieldname
seltext_m
col_pos
outputlen
CARRID
Airline Code
1
MANDT
Client
0
10
CLEAR 구문 사용: 다음 데이터를 추가할 때 잔여 데이터를 제거하기 위해 행을 초기화.

ALV GRID DISPLAY 함수 사용

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING: 데이터와 속성을 함수로 전달.
IMPORTING: 함수 결과를 받아옴.
TABLES: 테이블 데이터를 처리.

ABAP 테이블 작업 및 디버깅 실습

필드 카탈로그 옵션 설정 (fieldcatalog)
필드의 데이터 타입이나 출력 형식을 설정.
edit_mask, distance 필드, 레이아웃 옵션 등을 추가로 설정하여 출력 형식을 조정.
디버깅 연습 과제
SCARR, SFLIGHT, SBOOK 테이블 출력 연습.
fltime을 정수로 출력, distance 필드 소수점 제거 등.

다음 학습 주제

조회 화면 구현 방법 소개 예정.

소스보면 이해해보기

TYPES: BEGIN OF t_scarr, mandt TYPE scarr-mandt, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, currcode TYPE scarr-currcode, url TYPE scarr-url, END OF t_scarr. DATA: it_scarr TYPE STANDARD TABLE OF t_scarr INITIAL SIZE 0, wa_scarr TYPE t_scarr. *ALV data declarations DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid.
ABAP
복사
여기서
TYPES: BEGIN OF t_scarr, mandt TYPE scarr-mandt, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, currcode TYPE scarr-currcode, url TYPE scarr-url, END OF t_scarr.
ABAP
복사
TYPES는 구조일뿐이고 재사용가능하다. 근데 디버깅 불가능. 인식이 안됨
t_scarr는 이 구조의 이름
5개의 타입으로 이루어진 구조
5개 필드가 있는 하나의 행 구조.
DATA: it_scarr TYPE STANDARD TABLE OF t_scarr INITIAL SIZE 0, wa_scarr TYPE t_scarr.
ABAP
복사
DATA는 디버깅할때 인식이 가능. 프로그램 실행할 때 넣고 뺄 수 있다.
TYPE은 오른쪽에 있는걸 왼쪽으로 복사
t_scarr 구조를 wa_scarr로 복사. 그래서 wa_scarr도 행 구조가 된다.
it_scarr TYPE STANDARD TABLE OF t_scarr
STANDARD TABLE OF t_scarr
테이블로 이 구조를 변경하겠다.
t_scarr의 행 구조를 it_scarr 테이블로 변경하면서 복사.
여러 행을 넣을 수 있는 테이블이 됨
*ALV data declarations DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid.
ABAP
복사
slis_t_fieldcat_alv 를 더블클릭하면
occurs가 붙어 있는 테이블.. 계속 타고 타고 가면 필드가 엄청 많이 있다.
WITH HEADER LINE
같은 이름으로 테이블과 행이 동시에 생성.
fieldcatalog 위에 하나의 행이 더 생긴다.
이제 직접 디버깅하면서 봐보자.
디버깅 하나만 찍고 실행버튼 누르면 (물론 active 한 상태에서 해야함)
이렇게 디버깅 화면이 나온다.
6번째 줄 실행중이라고 표시가 된다
SY-SUBRC
성공은 0
실패는 다른숫자
SY-TABIX
테이블 다룰때 몇번째 횡을 다루고 있는지 표시
Single Step (F5)
한 줄씩 실행 (가장 많이 사용).
Execute (F6)
하나의 단위를 실행.(범위)
Return (F7)
하나의 단위를 실행하고 다음 시작점까지 실행.
오래타는 구문들을(function)에서 빨리 빠져나오고 싶을 때 실행.
Continue (F8)
다음 디버깅 포인트까지 실행. 다음 포인트가 없으면 프로그램을 끝까지 실행.
1번과 4번을 가장 많이 쓰인다.
싱글 스탭 딱 한번 누르니까
PERFORM으로 왔다
한번 더 누르면
이제 PERFORM 구문 안으로 들어옴
it_scarr 를 더블 클릭하면 우측하단에 variable 표시가 된다
근데 이게 좁으면 Desktop3 누르면 크게 볼 수 있음
다 두번씩 클릭해두면 우측에서 다 볼 수 있다
올라온거 목록 한번에 날리고 싶으면 해당 아이콘 클릭
하나씩 지우고 싶으면 우측에 있는 - 아이콘 있는거 지우면 된다
0은 행의 갯수
5는 열의 갯수(5개의 필드)
한번 더 싱글스탭 진행하면 우측에 행의 갯수가 18로 바꼈다
상세 정보를 보고 싶으면 더블 클릭하고
ld_color도 더블클릭해서 우측에서 구조를 봐보자. 그러면 타입이 C라고 잘 선언되어 있다
여기서 다시 싱글스탭 진행하면 이제 벗어나서 인식이 안될거다
번개 표시가 나타나면서 유효 하지않는 변수라고 나타내준다.
로컬 변수라서 그렇다.
이제 다음 PERFORM 으로 넘어가게 싱글스탭을 한번 더 해주면
이제 fieldcatalog로 오는데 더블 클릭해주면 두개가 나타난다
아까 여기 소스에서 WITH HEADER LINE으로 같은 이름으로 테이블과 행이 동시에 생성된다 했는데
똑같은 이름으로 튀어나왔다.
행과 테이블이 이름을 다르게 나올 수 있게 할 수 있지만 같은 이름으로 한줄로 선언할 수 있어서 이렇게 선언한거다.
근데 지금
fieldcatalog-fieldname = 'MANDT'.
ABAP
복사
MANDT라는 이름이 행에 들어갔는지 테이블에 들어갔는지 판단이 안선다..
하나씩 더블 클릭해서 상세하게 봐보자.
FIELDCATALOG
FIELDCATALOG[]
이제 싱글스탭으로 어디에 들어가는지 봐보자
FIELDCATALOG
fieldcatalog-fieldname = 'MANDT'.
ABAP
복사
이렇게 - 가 들어가서 넣어주는거는 행에 있는 필드에다가 넣어주는거다.
물론 테이블에 넣는 구문이 다로 있는데 그 구문을 통해서 행 전체를 추가하는 형태로 간다.
하나의 필드씩 테이블에 넣지는 않는다
그리고 타입 I는 아무것도 안넣으면 초기값 0이 미리 셋팅되어 있다
APPEND fieldcatalog() TO fieldcatalog(테이블).
ABAP
복사
테이블에 행을 추가하는 구문
어펜드까지 싱글스탭을 진행하면 우측에 이제 행이 1로 바뀐다
CLEAR filedcatalog
ABAP
복사
테이블이 아니라 행을 지워라 라는 뜻
이걸 왜 비워주냐면 만약 안지우고 진행 할 경우에는
다음 행에 대해서 진행할때 outputlen의 값은 CARRID에 없는 값이라 지워지지 않는 상태에서 같이 테이블에 들어가게 된다.
그래서 깔끔하게 지우고 진행해주면 이렇게 들어가줘야 한다.
즉 다음 행의 데이터를 넣을때 기존 잔재 데이터가 안들어가게 하기 위함.
REFRESH filedcatalog
ABAP
복사
테이블을 싹다 비워라~
이제 이걸 너무 오래 하나씩 넘겨야 하다보니까 한방에 넘기게 ENDFORM에 디버깅 걸고
(F8)컨티뉴 버튼을 눌러준다
그러고 테이블을 보면
다 실행된 데이터를 한번에 볼 수 있다.
다음으로 넘어가서
보면은 deep이라는 구조로 되어있는데
이렇게 하단에 있는 데이터 하나만 눌러서 들어가보면은 (HEADER1 눌러보기)
이렇게 -(대시) 가 2개나 있다.
필드 안에 또다른 필드가 들어갔다는 것.
지금까지는 출력을 해준게 아니라 테이블에 데이터들을 넣는걸 본거다.
FORM display_alv_report. gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid is_layout = gd_layout it_fieldcat = fieldcatalog[] i_save = 'X' TABLES t_outtab = it_scarr EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM.
ABAP
복사
gd_repid = sy-repid.
ABAP
복사
시스템 안의 repid 라는 만들어준 파일명 변수를 갖고와서 gd_repid에 넣어준다
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid is_layout = gd_layout it_fieldcat = fieldcatalog[] i_save = 'X' TABLES t_outtab = it_scarr EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
ABAP
복사
출력해주는 function
IF sy-subrc <> 0.
성공하면 0
더 자세하게 function을 이해해보자

함수 호출 구조

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid " 호출할 프로그램 이름 is_layout = gd_layout " ALV 출력의 레이아웃 속성 it_fieldcat = fieldcatalog[] " 필드별 속성을 정의한 필드 카탈로그 테이블 i_save = 'X' " 레이아웃 저장 옵션 IMPORTING " 필요시 데이터를 가져오는 옵션 TABLES t_outtab = it_scarr " 출력할 데이터 테이블 EXCEPTIONS program_error = 1 " 프로그램 에러 시 OTHERS = 2. " 기타 에러 시
ABAP
복사

세부 설명

1.
EXPORTING
의미: 오른쪽에 있는 값들을 함수에 보낸다.
파라미터 설명
i_callback_program: 호출할 프로그램 이름 (gd_repid).
is_layout: 출력할 표의 레이아웃 속성 (gd_layout). ALV의 컬럼 크기, 레이아웃 옵션 등을 설정함.
it_fieldcat: 필드 카탈로그 테이블 (fieldcatalog[]). ALV 출력 시 각 필드의 속성(이름, 설명, 길이, 타입 등)을 정의함.
i_save: 레이아웃 저장 버튼 속성. 값으로는 다음과 같은 옵션을 설정할 수 있음
'' (빈 문자열): 저장 버튼을 비활성화.
'X': 표준(스탠다드) 레이아웃으로 저장.
'U': 사용자 정의 레이아웃으로 저장.
'A': 표준(스탠다드) 및 사용자 정의 레이아웃 모두 사용 가능.
더블클릭
2.
IMPORTING
의미: 함수에서 처리된 값을 가져와서 넣는다.
설명: 실제 사용되는 경우는 드물며, 보통 데이터 처리 후 값을 반환 받을 때 사용함.
3.
TABLES
의미: 오른쪽 값이 비어있으면 함수에서 데이터를 가져오고(IMPORTING), 값이 채워져 있으면 오른쪽 값을 함수로 보내는(EXPORTING) 역할을 함.
파라미터 설명
t_outtab: 출력할 데이터가 담긴 테이블 (it_scarr). 이미 SELECT 문을 사용해 데이터를 불러와서 이 테이블에 담아둠. 함수를 호출하면 이 데이터를 ALV 형태로 출력.
4.
EXCEPTIONS
의미: 예외 상황 발생 시에 대해 정의. sy-subrc 값이 0이 아니면 실패로 간주.
파라미터 설명
program_error: 프로그램 에러 발생 시 sy-subrc 값이 1로 설정.
OTHERS: 그 외의 에러 발생 시 sy-subrc 값이 2로 설정.

실패 처리 로직

IF sy-subrc <> 0. " 함수 실행 실패 시 처리 * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO "에러 메시지 출력 * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
ABAP
복사
sy-subrc: SAP의 표준 시스템 필드로, 마지막 실행한 ABAP 명령어의 성공 여부를 나타냄.
0: 성공.
그 외의 값: 실패 (예외 처리).
MESSAGE 구문: 실패 시 에러 메시지를 출력하는데 사용.

잠깐 만약 메세지로 노출해주고 싶다면?

IF sy-subrc <> 0. CASE sy-subrc. WHEN 1. MESSAGE 'Program error occurred while displaying ALV grid.' TYPE 'E'. WHEN OTHERS. MESSAGE 'An unknown error occurred.' TYPE 'E'. ENDCASE. ENDIF.
ABAP
복사
sy-subrc 값이 0이 아닌 경우(즉, 오류 발생 시) CASE 구문을 통해 발생한 오류를 구분하여 처리.
WHEN 1: REUSE_ALV_GRID_DISPLAY 함수에서 프로그램 오류가 발생한 경우를 처리하며, 오류 메시지를 출력.
WHEN OTHERS: 알 수 없는 오류가 발생한 경우(프로그램 오류 이외의 모든 경우) "알 수 없는 오류" 메시지를 출력.

메시지 유형

'E' (Error): 오류 메시지.
프로그램의 현재 작업이 중단되며, 사용자는 잘못된 입력 등을 수정해야 계속 진행 가능.
'W' (Warning): 경고 메시지.
경고 메시지는 프로그램의 흐름을 중단하지 않으며, 사용자가 경고를 무시하고 계속 진행 가능.
'I' (Information): 정보 메시지.
단순히 사용자가 알 수 있도록 정보를 제공하며, 프로그램의 흐름을 중단하지 않는다.
'A' (Abort): 심각한 오류 메시지.
프로그램 실행이 완전히 중단되고, 시스템은 작업을 종료.
'S' (Success): 성공 메시지.
일반적으로 프로그램이 정상적으로 완료된 후 성공적으로 처리되었음을 사용자에게 알리는 데 사용.
function을 어떻게 넣는지 잘 모르겠다 싶으면 Pattern누르고
모든 단어가 정확하게 기억안나면 그냥 특정 단어치고 *(아스타) 넣어주고 우측의 버튼 누르면
해당 되는 펑션들이 쫙 나온다.
그러고 하나 선택해서 진행하면
화면에 이렇게 출력하는 소스가 나옴

i_save 유저 모드 설정

U모드라하면 자동으로 User-specific이 체크가 된다
FORM display_alv_report. gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid is_layout = gd_layout it_fieldcat = fieldcatalog[] i_save = 'X' * i_save = 'A' * i_save = 'U' TABLES t_outtab = it_scarr EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " DISPLAY_ALV_REPORT
ABAP
복사
i_save = 'X'
표준 레이아웃 저장 기능 활성화.
ALV에서 기본적으로 제공되는 표준 레이아웃을 사용하고, 사용자가 선택한 레이아웃을 저장할 수 있는 옵션을 제공.
레이아웃을 저장하면, 이후 동일한 프로그램을 실행할 때 저장된 레이아웃이 자동으로 적용됨.
ALV 화면에서 저장 버튼이 활성화.
i_save = 'A'
표준 레이아웃 강제 사용.
스탠다드 레이아웃만을 사용하고, 사용자 정의 레이아웃은 사용할 수 없다.
저장된 레이아웃이 있더라도 항상 기본 레이아웃이 적용.
사용자는 레이아웃을 저장할 수 없으며, 기존에 저장된 사용자 레이아웃도 적용되지 않는다.
i_save = 'U'
사용자 레이아웃 불러오기.
사용자가 저장한 레이아웃을 불러올 수 있으며, 새로운 레이아웃도 저장할 수 있음.
기본 레이아웃 외에 사용자 정의 레이아웃을 적용할 수 있는 옵션이 활성화.
ALV 화면에서 사용자 정의 레이아웃을 저장하고 불러올 수 있다.