1. 과일로 만든 아이스크림

- 아이스크림맛이 과일맛 기반이고, 3000개 이상 팔린 맛 출력하기

SELECT a.FLAVOR from FIRST_HALF as a
inner join ICECREAM_INFO as b
on a.FLAVOR = b.FLAVOR
WHERE b.INGREDIENT_TYPE = 'FRUIT_BASED'
and a.TOTAL_ORDER > 3000;

 

2. 평균일일요금구하기

- 차량이 suv인 일평균요금 구하기

SELECT ROUND(AVG(DAILY_FEE), 0) as AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
GROUP BY CAR_TYPE = 'SUV';

 

3. 조건에 맞는 도서 구하기

- 2021년도 인문 책의 id, 출판일 출력하기

SELECT BOOK_ID, 
DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d')
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) LIKE '2021'
and CATEGORY='인문'
ORDER BY PUBLISHED_DATE;
  1.  

- SUBSTRING을 사용하여, SUBSTRING(PUBLISHED_DATE, 1, 4)를 하려고 했으나, PUBLISHED_DATE가 date 형식이라서  안되었다. 조건문을 잘 확인하도록 해야겠다.

4. 파이썬 개발자 찾기

- 파이썬 skill을 할 수 있는 개발자  찾기 

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME 
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python' or SKILL_2 = 'Python' or SKILL_3 = 'Python'
ORDER BY ID ASC;

 

5. 조건에 부합하는 중고거래 댓글 조회

- 2022-10월에 쓰인 게시판글의 글 아이디, 댓글 조회하기 

SELECT a.TITLE, a.BOARD_ID, b.REPLY_ID, b.WRITER_ID, b.CONTENTS, DATE_FORMAT(b.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE
FROM USED_GOODS_BOARD as a
JOIN USED_GOODS_REPLY as b
ON a.BOARD_ID = b.BOARD_ID
WHERE a.CREATED_DATE like '2022-10%'
ORDER BY b.CREATED_DATE, a.TITLE;

 

6. 역순정렬하기

- 젊은 동물 출력하기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID

 

7. 모든 레코드 조회하기

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

8. 조건에 맞는 회원수 구하기

SELECT COUNT(*) AS USERS
FROM USER_INFOWHERE AGE >= 20 and AGE <= 29
AND YEAR(JOINED) = 2021;

 

9. 여러 기준으로 정렬하기

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

 

10. 가장 큰 물고기 10마리 구하기

SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID ASC
LIMIT 10

 

11. 어린 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID

 

 

12. 파이썬 개발자 찾기

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python' or SKILL_2 = 'Python' or SKILL_3 = 'Python'
ORDER BY ID ASC;

 

 

13. 인기 있는 아이스크림

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;

 

14. 아픈 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick';

 

15. 흉부외과 또는 일반외과 의사목록 출력

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d')
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC

 

 

16. 강원도에 위치한 생산 공장 목록 출력하기

- 공장 위치가 강원도인 공장 목록 출력하기(substring사용)

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE SUBSTRING(ADDRESS, 1, 3) = '강원도'

아밥 써티를 드디어 취득했다!

나는 러닝허브를 구독했기 때문에, 시험을 1년동안 4번 볼 수 있는 횟수권이 있었다.

다른 조건 없이 바로 시험을 신청할 수 있기 때문에 편했다!

 

 

schedule an exam누르고 시험을 신청하면 되는데,

내가 원하는 날짜 시간이 거의 선택이 가능하기에 굉-장히 편하다.

가격이 비싸서 그런지, 취소 및 변경도 쉽다.

 

 

보통 ABAP EXAM을 취득하기 위해선

SAP Certified Associate - Back-End Developer-ABAP CLOUD 를 취득하면 된다. exam title은 C_ABAPD_2309이다.

 

 

시험보기 전날에 메일도 친절하게 오고,

어떤 걸 준비해야할 지 알려준다.

 

 

준비사항

 

1. 영문이름이 적힌 신분증 2개

- 나라에서 인정하는 신분증1개(영문이름) - 여권, 국제운전면허증

- 영문이름이 적힌 신용카드

 

2. 퀘스천마크 시큐어 어플

 

이건 메일에서 미리 깔아두면 편하다고 소개해놨다.

애플 앱에서 미리 깔아놓으면 좋다.

 

3. zoom

줌도 미리 설치하면 좋다. 줌으로 화면공유하고, 내 화면을 보여주고, 내 방과 책상에 치팅할 게 없는 지 확인한다.

 

4. 홀로 있을 방.

 

5. 💎중요💎 이메일 두개 설정하기 

- 다른 도메인의 이메일 2개가 설정되어야 한다고 해서 혹시몰라서 하나 더 추가했다. (총3개)ㅋㅋ

- 설정이 안되어있으면 이메일이 안갈수도 있다고..!

 


시험후기

 

시간 맞춰 시험장에 들어가면, (schedule exam했던 페이지에 들어가야한다)

시험관리분이 기다리고 있다.

 

아밥 후기를 많이 읽어 익히 알고 있었지만, 정말 뭐라고 하시는 지 잘 안들린다 ..

넘 죄송하지만 한번만 더 말씀가능하냐고 부탁을 2번 드렸다.

 

1. 화면 공유 해줘라

2. 신분증 두개 보여줘라

3. 방, 책상 보여줘라

 

요 3가지를 검사한 후에, 시험이 시작된다.

시험시간은 3시간이며, 총 80문제다.

 

나는 15분 정도 걸려서 다 풀었는데 다시 검사하느라 30분 정도 소요되고 제출했다.

제출이 끝나니, 감독관이 수고했다고 한 후에 바로 나가셨다 ㅋㅋㅋ

그리고 메일로 바로 시험결과가 옴!!

 

 

 

합격했다고 바로 연락왔다 야호

사실 다 맞을 줄 알았는데 몇개 틀려서 의아했다ㅋㅋㅋㅋ

왜틀렸지?!

싶긴한데 70%이상이 합격인데 89%라 잘봤겠거니 싶어서 그냥 넘어갔다.

 

 

 

시험 합격-!

5월 27일 합격, 내년 5월 28일 만료다

가격도 비싼데 3년으로라도 연장해줬으면 좋겠다 🥹

 

시험 후기는,

너무 긴장되었지만 공부했으면 다 아는 문제라

금방 잘 풀 수 있었다는것!이다.

생각보다 더 괜찮았지만 그래도 시험은 시험이라고, 긴장된 마음이 한결 풀어졌다.

sap gui 환경을 learning hub 서버를 빌려서 하다가

너무 느려서 화딱지가 나서 결국 유료로 결제하기로 했다.

처음에는 docker로 설치하는 방법이 있다해서, mac으로도 해보고 window로도 설치를 해봤으나,

sap gui 인터페이스까지는 설치까지는 되지만 [ 허용되지 않은 환경(ip)입니다 ] 와 같은 메세지가 여러 번 띄어져서, 결국 포기했다.

러닝허브에서 빌려주는 서버 - s4h00

그래서 결국 다시 learning hub로 복귀ㅠ.ㅠ

써보면 알겠지만, 정말 느리다. 독일 가상환경서버를 빌려서 하는 거다 보니, 오래 접속하면 먹통이 되기도 하고, 타자 치면 1초 후쯤에 써지고....

또 중요한 건 2주마다 계정이 리셋돼서 내가 했던 모든 프로그램이 사라지곤 했다.

어차피 연습 프로그램이라 상관없긴 했지만, 어쨌든 결론적으로는 너무x1000000 불편했다.

 

그냥 돈내고 쓰자. 하고 결제를 알아봄 ㅠㅠㅋㅋ 

https://idesremote.com/

 

SAP Remote Access $30/month, SAP IDES, Online SAP System, SAP Online,IDES Access, SAP remote Access, sap acces, sap acess, sapac

 

idesremote.com

 

 

 

이 환경을 추천받아서, 들어가서 보는데 

 

 

 

진짜 너무 비쌈..

이게 일주일 빌리는데만 44.55 달러라서, 한달이면 거의 100달러였다.

 

 

 

추천받은 ECC ABAP버전으로 고~!

ECC 30일 버전은 구버전이라고 한다.

한달에 49달러라서 바로 구매했다.

*결제는 페이팔로 하는 게 좋다. 마스터카드, 비자로는 결제가 안되기 때문..

 

 

결제하고 나면, sap gui 설치에 관련한 이메일이 온다.

그냥 하라는대로 하면 되는데, mac버전이 있길래 따라서 해봤으나, 실패했다.

이것도 설치까지는 되는데, 이미 맥에는 자바가 깔려있어서 그대로 설치했으나,

java 버전이 자꾸 다르다고 떴다. 그래서 또 다른 자바버전으로 깔았으나,

결국 안돼서 window 로 설치했다.

 

그런데, 그마저도 2시간 넘게 깔 수가 없었다.

 

클릭하라고 하는데 저 문구가 클릭이 안됨 ㅠㅠ

그래서 뭐가 관리자모드로도 실행해보고, 지웠다가 다시 깔아보고.. 너무 안돼서 이메일까지 썼다 ㅋㅋㅋㅋ

 

그러다가 i.s.h.med..라고 써져있는 부분을 눌러봤는데,

거기에 작게 java설치해야돼!!

라는 문구를 발견했다.

 

문구 복붙해서 해당 자바를 찾아서 설치했고, 

다시 한번 저 설치 페이지로 가니까 버튼이 눌렸다!!!! 유레카ㅠㅠㅠ

*자바에 대한 부분은 macos설치시에 설명이 되어있는데, window에는 어디에도 되어있지 않았다.

 

 

나머지는 설명서대로 그대로 따라하면 쉽게 설치가 된다.

야~~호 드디어 빠른 환경에서 개발을 할 수 있게 됐다.

 

정말 감사한 일이다.

 

 

 

1. 리스트 프로세싱이란?

TOP-OF-PAGE.
END-OF-PAGE.
AT LINE-SELECTION.
AT PF<NN>
AT USER-COMMAND>.

- 리스트 처리는 기본적으로 사용자가 데이터를 리스트 형태로 출력하고, 상호작용 할 수 있게 해주는 것

- 사용자가 특정 행을 클릭했을 때 이벤트를 발생시킴

- 특정 위치나 값이 클릭되면 다른 화면으로 이동

 

2. 기본 흐름

START-OF-SELECTION.
  LOOP AT itab INTO wa.
    WRITE: / wa-field1, wa-field2.
  ENDLOOP.

- 이렇게 하면 리스트 출력 화면이 나타나느데, 여기서 인터랙션을 원하면 이벤트 핸들러를 사용할 수 있다.

 

 3. 주요 이벤트

이벤트 설명
AT LINE-SELECTION 리스트에서 한 줄을 더블클릭하면 발생
AT USER-COMMAND PF-STATUS에 등록된 버튼이나 함수 키(F코드) 클릭 시 발생
AT PFnn F1~F12 같은 Function Key 누름 감지
TOP-OF-PAGE 리스트 상단에 제목, 열 헤더 등을 지정
END-OF-PAGE 페이지 끝에 푸터나 고정 내용 출력

 

4. 예시: 더블클릭 시 상세보기

START-OF-SELECTION.
  LOOP AT gt_scarr INTO gs_scarr.
    WRITE: / gs_scarr-carrid, gs_scarr-carrname.
    HIDE gs_scarr.
  ENDLOOP.

AT LINE-SELECTION.
  WRITE: / 'Selected Carrier:', gs_scarr-carrid,
           / 'Name:', gs_scarr-carrname.

- HIDE gs_scarr : 클릭한 줄에 있는 데이터를 숨겨서 저장 => 나중에 at line-selection에서 불러올 수 있음 

 

5. TOP-OF-PAGE 예시 (제목 등)

TOP-OF-PAGE.
  WRITE: / '항공사 목록 보고서', / sy-uline.

 

 

6. 추가 팁: NEW-PAGE 사용

 

  • NEW-PAGE. → 새로운 페이지로 넘어감 (ex. 상세 페이지)
  • NEW-PAGE PRINT ON. → 프린트용 리스트 시작

 

1) TOP-OF-PAGE 

- 새로운 page에 첫번째 데이터가 출력되기전에 수행됨 

- no standard page heading 옵션으로 생성된 프로그램에서 직접 header을 입력할 때 사용함

- 추가적인 옵션이 없을 때에는 기초적인 LIST생성 시에만 사용

- NEW PAGE구문에서는 EVENT를 수행하지 않음 

 

 

2)END-OF-PAGE

- end-of-page는 현재 페이지의 남은 공간이 부족할 때 수행되는 이벤트

- 즉, 페이지의 footer를 지정함

- list-count를 지정하면, 페이지가 line-count수를 넘어가면 수행됨 

- line-count 10 => 한 페이지의 총 라인수 의미

- (2) -> page footer에 뿌려줄 라인 수를 의미한다.

 

3) AT LINE-SELECTION

- report 할 때 LINE-SIZE와 COUNT를 함

- click this line하니까 정말로 그 페이지에 가진다! 짱신기하고 재밌다...우왕 

 

4) AT PF<NN>

AT PF <NN>.

- PF<nn> 으로 선언된 function을 수행한다. function key nn번을 눌렀을 때 발생하는 이벤트

- <nn>은 1~24번까지의 숫자

- F5 를 누르면, PF05가 나온다.

 

5. AT USER-COMMAND

 

6. TOP-OF-PAGE DURING LINE-SELECTION

 

7. HIDE AREA

- hide로 선언된 변수는 LIST에서 더블클릭하면 HIDE WORK AREA로 데이터가 저장됨

- HIDE기본 리스트(List)에 출력된 데이터와 “연결된 숨겨진 값”을 저장해두는 구문 -> 사용자가 리스트의 해당 행을 선택(클릭)했을 때, 그 숨겨둔 값을 자동으로 복원해서 사용!

REPORT zhide_example.

TABLES: sflight.

DATA: gs_sflight TYPE sflight.

START-OF-SELECTION.

  SELECT carrid connid
    FROM sflight
    INTO gs_sflight.

    WRITE: / '항공사:', gs_sflight-carrid.
    HIDE gs_sflight.

  ENDSELECT.

TOP-OF-PAGE DURING LINE-SELECTION.
  WRITE: / '*** 상세 정보 ***'.

AT LINE-SELECTION.
  " 사용자가 클릭한 행의 gs_sflight가 자동 복원됨!
  WRITE: / '선택된 항공사:', gs_sflight-carrid.
  WRITE: / '선택된 항공편:', gs_sflight-connid.

 

8. WRITE 구문

- write 구문은 output 리스트에 데이터를 쓰는 기능을 함

- 값을 할당하는 기능도 수행

- 리스트용으로 사용될 때는 데이터를 list buffer에 저장함

  • data 구문으로 선언된 필드
  • tables 구문으로 선언된 구조체의 항목
  • field-symbol로 선언된 필드심볼
  • 언어에 종속적이지 않은 text문장

1) AT pl

- 필드의 위치와 길이를 지정해서 줌

- 슬래시 기호는 new line을 의미하며, 숫자 앞에 선언되어야 함 

REPORT z12_24 NO STANDARD PAGE HEADING
                      LINE-SIZE 120
                      LINE-COUNT 78.

DATA : gt_data TYPE TABLE OF sflight WITH HEADER LINE.

TOP-OF-PAGE.
  WRITE : /50 'REPORT FORMAT' CENTERED.
  WRITE : /48 '--------------' CENTERED.
  SKIP 2.

START-OF-SELECTION.
  WRITE : /(51) sy-uline, 53(68) sy-uline,
    / sy-vline NO-GAP, 51 sy-vline NO-GAP, 53 sy-vline NO-GAP, 120 sy-vline NO-GAP.

  WRITE : 2(9) 'Report no' NO-GAP CENTERED, sy-vline NO-GAP.
  WRITE : 12(5) '00001' NO-GAP, 51 sy-vline NO-GAP.

  WRITE : 54(11) 'Report date' NO-GAP CENTERED, sy-vline NO-GAP.
  WRITE : 66(10) sy-datum NO-GAP CENTERED, 120 sy-vline NO-GAP.
  WRITE : /(51) sy-uline, 53(68) sy-uline.
  SKIP.

  WRITE : /(120) sy-uline.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data FROM sflight UP TO 10 ROWS.
  LOOP AT gt_data.
    WRITE : / sy-vline NO-GAP, 2(10) 'Carrier Id', sy-vline NO-GAP.
    WRITE : 14(4) gt_data-carrid, sy-vline NO-GAP.
    WRITE : 20(18) 'connection number', sy-vline NO-GAP.
    WRITE : 40(4) gt_data-connid, sy-vline NO-GAP.
    WRITE : 46(12) 'flight date', sy-vline NO-GAP.
    WRITE : 60(12) gt_data-fldate, sy-vline NO-GAP.
    WRITE : 74(10) 'Air Fare', sy-vline NO-GAP.
    WRITE : 86(11) gt_data-price, sy-vline NO-GAP.
    WRITE : 100(15) 'Local currency', sy-vline NO-GAP.
    WRITE : 116(3) gt_data-currency, sy-vline NO-GAP.
    WRITE : /(120) sy-uline.

  ENDLOOP.

- sflight테이블에서 항공편 정보를 최대 10건까지 조회하여, 리스트 형태로 보고서를 출력하는 예제 => 고전 리스트 보고서 출력 형태

 

2) write option

옵션 설명
NO-GAP 출력 간 공백 없이 바로 붙여 출력
CENTERED 지정 위치에 텍스트를 가운데 정렬
LEFT-JUSTIFIED 왼쪽 정렬 (기본값)
RIGHT-JUSTIFIED 오른쪽 정렬
(len) 출력할 필드 길이 지정 (WRITE : (10) var.)
UNDER 기존에 출력된 필드 아래에 출력
AT 특정 필드 값이 바뀔 때만 출력 (AT NEW, AT END OF 이벤트와 함께 사용)
/ 줄바꿈 (WRITE : / 'Hello'. → 다음 줄에 출력됨)

 

3) write output 포맷

 

4) Write as checkbox

- modify는 리스트의 line속성을 변경하는 명령어

5) WRITE AS SYMBOL

- LIST의 필드를 심볼로 보여줌 

INCLUDE <SYMBOL>.

WRITE : SYM_RIGHT_HAND AS SYMBOL,
	'ENJOY ABAP',
    SYM_LEFT_HAND AS SYMBOL.

6) WRITE AS LINE

 

7) write as quickinfo

- mouse 올리면 'this is quick info'라고 뜸

 

- submit구문을 이용해 12-1을 호출해서 실행하면, AA 에 대한 정보가 나온다.

 

 SUBMIT 구문이란?

다른 ABAP 리포트 프로그램을 실행시키는 명령어

마치 SE38에서 실행하듯이 실행시킴

SUBMIT zreport_name.

- 다른 리포트 프로그램 zreport_name을 실행한다.

- 실행 후 리포트가 종료되면 현재 프로그램으로는 돌아오지 않는다.

- 마치 프로그램이 넘어간 것처럼 된다

SUBMIT zreport_name AND RETURN.

- 실행 후 되돌아오게 하는 것

- 리포트가 끝나면 원래 내 프로그램으로 돌아옴

리포트에 값 넘기기

SELECT-OPTIONS: s_carr FOR sflight-carrid.
PARAMETERS: p_date TYPE sflight-fldate.

SUBMIT zreport_name
  WITH s_carr IN s_carr_range
  WITH p_date = '20250101'
  AND RETURN.

 

🌠 동적으로 넘기기(중요!!)

DATA: gt_seltab TYPE TABLE OF rsparams WITH HEADER LINE.

CLEAR gt_seltab.
gt_seltab-selname = 'S_CARR'.
gt_seltab-kind = 'S'.     " SELECT-OPTION
gt_seltab-sign = 'I'.     " Include
gt_seltab-option = 'EQ'.  " Equal
gt_seltab-low = 'AA'.
APPEND gt_seltab.

SUBMIT zreport_name
  WITH SELECTION-TABLE gt_seltab
  AND RETURN.

- abap 표준 구조체 RSPARAMS를 활용하면 리포트에 넘기는 값을 코드로 구성해서 넘길 수 있음

 

EVENT

- 프로그램을 실행하면 화면에 보이는 필드들을 초기화하고, 사용자가 입력한 값에 대한 결과를 반환하는 사용자 이벤트

블록 발생
INITALIZATION selection-screen 화면이 열리기 전 화면 필드 값을 초기화하는데 사용
AT SELECTION-SCREEN 사용자가 selection-screen에 값을 입력하기 전/후에 작동
START-OF-SELECTION 사용자가 실횅버튼을 클릭하면 LDB에서 값을 읽어옴
END-OF-SELECTION 데이터를 읽은 후의 작업을 수행하는 블록

 

INITALIZATION

 

- 이벤트 중 프로그램을 실행했을 때 가장 먼저 수행되는 것

- selection-screen이 조회되기 전에 작동하므로 변수에 초기값을 지정할 때 사용됨

- 즉, Initialization 이벤트에서 selection-screen에 사용되는 필드들의 초기값을 지정함으로써, 사용자가 자주 사용하는 값을 자동으로 입력함

위와같이 프로그래밍됨.

- select-option은 인터널 테이블 형태이기 때문에 반드시 append구문으로 데이터를 추가해야함

 

AT SELECTION-SCREEN

- selection-screen에서 input field의 값이 변동되었을 때 실행되는 이벤트

- initalization과 start-of-selection사이에 수행되어 사용자 액션에 대해 반응하고, 화면 필드를 조절함 

 

1. AT SELECTION-SCREEN ON <FIELD>

- selection screen에 전달되는 특정 필드에 대해 수행

- 오류 메세지가 발생하면 해당 필드는 다시 값을 받기 위해 커서가 위치함

AT SELECTION-SCREEN ON <FIELD>.
TABLES : scarr.
SELECT-OPTIONS : s_carrid FOR scarr-carrid.
AT SELECTION-SCREEN ON s_carrid.
	IF s_carrid-low <> 'AA".
    	Message 'It is required to input AA' TYPE 'E'.
    ENDIF.

 

결과값!

 

2. AT SELECTION-SCREEN ON END OF sel

- selection screen에서 여러 건의 값을 입력할 때 전체 selection table의 입력값을 제어할 수 있음

- 하한/상한값, 미 입력 값등의 체크 시 사용 가능

AT SELECTION-SCREEN ON END OF sel.

 

 

START-OF-SELECTION & END-OF-SELECTION

- start-of-selection : 조회 화면의 필드에 대한 초기값 세팅 및 데이터 검증이 완료되면, db에서 원하는 데이터를 가져오는 작업을 수행해야함

- end-of-selection : 실행환경에서 호출되는 마지막 이벤트로서 select구문에서 모든 데이터를 읽은 후 화면에 write하기 전에 수행한다.

REPORT PROGRAM

- Executable Program

- Interactive Program

- 데이터베이스에서 원하는 데이터를 추출하고 해당 데이터를 정보로 활용할 수 있는 구조로 변경하여 리포트 형식으로 조회

- 자체적으로 직접 실행해서 submit을 통해 다른 프로그램에서 호출가능함

 

Report 프로그램은 3가지 구조로 분류됨

1. 데이터 선언부와 조회 선택화면 (Selection-Screen)

2. 실행 시점까지의 Event

3. 데이터를 뿌려주는 List Event

 

위 코드의 report 프로그램의 3가지 분류

1. 프로그램 및 데이터 선언

REPORT pgm_id
TABLES : sflight.
DATA : l_carrid type sflight-carrid.

SELECTION-OPTIONS: sel_carr FOR sflight-carrid.
PARAMETERS : P_carr LIKE sflight-carrid.

 

2. 이벤트

INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION.
...
END-OF-SELECTION.

 

3. List Process이벤트

TOP-OF-PAGE.
END-OF-PAGE.
AT LINE-SELECTION.
AT PF<NN>
AT USER-COMMAND.

 

프로그램 선언문

1) 프로그램 list heading 지정

REPORT z12_02 NO STANDARD PAGE HEADING.

이러면 heading 제목이 안나온다.

2) Line-Size

REPORT Z12_02 LINE-SIZE 30.

 

3) Message ID

이렇게 Message-ID를 선언하고 에러처리를 하면,

위와 같이 뜬다-!

 

DATA 선언

프로그램에서 사용하게 될 테이블과 데이터를 선언한다.

복잡한 프로그램에서는 INCLUDE(프로그램이름) TOP구문에 포함된다.

REPORT pgm_id
INCLUDE pgm_idTOP.

 

SELECTION-SCREEN

SELECT-OPTIONS: s_carrid FOR sflight-carrid.
항공사 코드 : [_____] ~ [_____] ← 여러 개 or 범위 입력 가능

- 프로그램 조회 조건을 입력하는 selection screen을 생성하는 부분

- 리포트 프로그램이 실행되면 selection-screen이 자동으로 생성됨

- selection-screen은 사용자와 상호작용하기 위한 input필드와 같이 선택 조건을 입력할 수 있는 화면을 제공

- 리포트 프로그램에서 selection screen은 'include 프로그램명sel(or TOP)에 포함하는 것이 좋음 

 

PARAMETERS

PARAMETERS: p_carrid TYPE sflight-carrid.
항공사 코드 : [______]   ← 단일 입력 가능

- parameters는 사용자가 값을 입력하도록 INPUT 필드를 정의함 <-> select-options: 여러값, 범위 선택가능

- parameters 변수와 같이 type을 지정하지 않으면 기본 char 1자리 type이 정의됨

- parameters에 입력된 값은 데이터를 조회하는 select 구문의 조건 등에 사용된다.

- 파라미터는 1개의 값만 입력받으며, 체크 박스와 같은 옵션을 추가할 수 있다.

 

PARAMETERS 주요 옵션 정리

 

옵션 설명
OBLIGATORY 필수 입력 필드로 만들어줌 (입력 안 하면 오류 발생)
DEFAULT 기본값 지정
LOWER CASE 소문자 입력 허용 (기본은 자동 대문자 변환)
AS CHECKBOX 체크박스 형태로 표시 (값은 'X' 또는 초기값)
RADIOBUTTON GROUP 라디오 버튼 그룹 지정하여 단일 선택 가능
MODIF ID 다이나믹 화면 제어 시 사용 (선택화면의 특정 항목만 ON/OFF 등)

 

PARAMETERS: p_name     TYPE char20 OBLIGATORY,
            p_age      TYPE i       DEFAULT 25,
            p_accept   AS CHECKBOX,
            p_gender1  RADIOBUTTON GROUP grp1 DEFAULT 'X',
            p_gender2  RADIOBUTTON GROUP grp1,
            p_note     TYPE char100 LOWER CASE.

 

  • p_name: 꼭 입력해야 함.
  • p_age: 기본값 25.
  • p_accept: 체크박스 (X 또는 공백).
  • p_gender1, p_gender2: 성별 중 택1 선택 (라디오버튼).
  • p_note: 소문자 허용.

 

Parameters와 함께 쓰이는 구문

 

위와 같이 결과값이 출력된다!

 

SELECT-OPTIONS 

 

SELECT-OPTIONS <seltab> FOR <f>.

- 2개의 input필드를 통해 다양한 조건 값을 입력받을 수 있음

- range 변수와 같은 구조_인터널 테이블을 가지고 있다.

- select-options는 항상 for문과 같이 병핸한다.

- for문 다음으로 올 수 있는 값은 tables로 선언된 테이블 필드명이나, data로 선언된 변수이어야 한다.

옵션 설명
OBLIGATORY 필수로 입력해야 함
DEFAULT 초기값 지정
NO INTERVALS 범위 입력 안 됨 → 단일값만 입력 가능
NO-EXTENSION 여러 줄 입력 금지 → 하나의 값/조건만 입력
LOWER CASE 소문자 입력 허용

 

 

selection-screen

 

parameters와 selection-option을 사용하면 abap프로그램이 자동으로 필드내역과 길이를 조절하여, 화면(Selection-screen)을 생성한다.

구문 발생
selection-screen begin of line.
selection-screen end of line.
- 파라미터를 여러 개 묶어서 한 라인으로 생성
- 라인에서 selection-options, selection -screen skip n구문은 사용이 안됨
selection-screen skip n. 빈 라인 n개를 삽입함
selection-screen ULINE. Under line을 추가함
- selection-screen uline /1(10) : /는 new 라인, 위치
- selection-screen uline pos_low(10) : 파라미터 위치에서 시작
- selection-screen uline pos_high(10) : 리포트 라인 길이 끝에서 시작
selection-screen POSITION pos. selection-screen begin of line. 블록 안에서 파라미터의 위치를 지정함
selection-screen COMMENT fmt name. 파라미터에 대한 내역을 지정
- fmt는 /pos(len) or (len)을 의미
- selection-screen comment 1(10) text-1 FOR FIELD p_1.
selection-screen PUSHBUTTON fmt name
USER-COMMAND ucom.
화면 버튼을 추가하여 클릭하면 AT SELECTION-SCREEN에서 SSCRFIELDS-UCOMM에 저장됨
selection-screen BEGIN OF BLOCK block.
selection-screen END OF BLOCK blcok.
Parameter, select-options등 블록형성
selection-screen FUNCTION key n. 펑션 키를 추가함

실행
결과

'SAP' 카테고리의 다른 글

easy abap 41. Report Program - List Process  (0) 2025.05.16
easy abap 40. Report Program - 이벤트  (0) 2025.05.16
easy abap 38. 필드심볼_Field Symbol  (0) 2025.05.16
easy abap 37. VIEW_뷰, 도메인  (0) 2025.05.14
easy abap 36. strucutre  (0) 2025.05.14

 

필드 심볼(Field Symbol)이란?

: abap에서 메모리의 특정위치를 가리키는 이름 없는 변수

- 변수에 직접 접근 x

- 참조 형태로 데이터에 접근

- 필드심볼은 ABAP 프로그램 내에서 변수에 동적인 접근이 가능하게 함

- 필드심볼은 자기 자신을 위한 메모리 공간을 점유하지 않는다.

- 필드심볼의 데이터 이름과 속성은 실행 시점에 결정된다.

- 필드 심볼은 모든 데이터 오브젝트에 지정될 수 있다.

- 필드심볼이 할당되면 데이터 오브젝트와 필드심볼간에는 차이가 없다.

- Move와 같은 Abap명령어도 같이 사용할 수 있다.

- 필드 심볼을 명시하여 선언하거나 타입 없이 생성할 수 있다. 타입이 명시되지 않으면 할당되는 필드(오브젝트)의 타입을 그대로 상속받는다.

 

- gv_var의 변수의 값은 'A'였지만, write결과 'B'가 된것을 확인할 수 있다.

- 이는 gv_var 변수를 필드 심볼에 Assign했고, 필드 심볼의 값을 'B'로 변경했기 때문이다.

 

Generic TYPE Field Symbol

- 필드심볼을 선언할 때 타입을 지정하지 않고 할당되는 데이터 오브젝트 유형에 따라 기술적인 속성을 상속받게 된다. 

- Field-symbols <f2> type any tablr을 사용하려면 assign 구문에서 할당할 오브젝트가 인터널 테이블 타입으로 선언되어야 한다. 

- 이렇게 선언된 필드 심볼은 그 자체가 인터널 테이블이 되어 READ와 같은 구문을 사용할 수 있다.

- TABLE키워드를 삭제하고 TYPE ANY만 사용하면 LINE 타입의 구조체로 활용할 수 있다.

 

gv_var is B, fs is B. 이다.

 

- TYPE ANY는 정확한 데이터 타입을 모를 때 쓰는 가변 타입

- 필드 심볼이나, DATA ... FIELD-SYMBOLS선언 시,

- 동적으로 구조체의 필드를 참조할 때,

- Assign문과 함께 쓸 떄 사용함

 - 단점으로는 정적 타입체크가 안된다는 점이 있음 

 

Fully Type Field Symbol

- 필드 심볼을 정의할 때부터 타입이 완전히 정해진 형태로 선언

- 필드 심볼의 기술적인 속성은 할당되는 데이터 오브젝트와 같아야함

FIELD-SYMBOLS <fs3> TYPE SFLIGHT.
FIELD-SYMBOLS <fs4> LIKE LINE OF gt_tab.

 

- 필드심볼 <fs3>은 Sflight 테이블과 같은 구조를 가지는 구조체 타이블로 선언됨

- fs4는 인터널 테이블 Gt_tab과 같은 구조를 가지는 LINE타입의 필드심볼을 선언함

- 변수 이름은 메모리 정적인 주소를 가리키고 있다 (변수이름 = 메모리주소)

- fully type을 이용하면 명시적으로 구조체의 필드명을 호출해 사용할 수 있다

MOVE <fs3>-carrid TO <fs4>-carrid.

 

필드 심볼 할당

 

TYPES : BEGIN OF t_line,
	col1 TYPE c,
    col2 TYPE c,
    END OF t_line.
    
DATA : gs_wa TYPE t_line,
gt_itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1, 
	key(4) TYPE c VALUE 'COL1'.
    
FILED-SYMBOLS <fs> TYPE ANY TABLE.
ASSIGN gt_itab TO <fs>.

 

- 필드 심볼에 오브젝트를 할당하려면 ASSIGN구문을 활용한다.

- ASSIGN구문 3가지 기능 분류

  • - assign 구문의 기본 구조
  • - 구조체 필드를 필드 심볼에 assign
  • - 필드심볼과 casting

 

Assign 구문의 기본구조

1. static assign 

ASSIGN dobj TO <fs>.

- ASSIGN이 성공하면 시스템 변수 sy-subrc는 0, 실패하면 4를 반환함

 

Offset을 이용한 static assign

- 문자열의 특정위치(인덱스)부터 일부만 참조하거나 대입하는 방식 => 위치와 길이가 고정되어있기 때문에 정적 assign이라고 함 

- 인덱스 기반으로 잘라서 사용하는 방법

변수+시작오프셋(길이)

 

1. 문자열 일부 출력

DATA lv_text TYPE string VALUE 'ABCDEFGHIJ'.

WRITE: / lv_text+0(3).   " 결과: ABC
WRITE: / lv_text+3(2).   " 결과: DE
WRITE: / lv_text+5(5).   " 결과: FGHIJ

lv_text+3(2) -> 4번째 문자부터 2글자 출력(인덱스는 0부터 시작)

2. 일부대입(Static assign)

DATA lv_text TYPE c LENGTH 10 VALUE 'ABCDEFGHIJ'.

lv_text+2(3) = 'XYZ'.

WRITE: / lv_text.   " 결과: ABXYZFGHIJ

lv_text+2(3) : 3번째 문자부터 3글자를 XYZ로 교체

 

3. 동적 offset

DATA lv_offset TYPE i VALUE 2.
DATA lv_len    TYPE i VALUE 3.

WRITE: / lv_text+lv_offset(lv_len).  " 동적으로 접근, 결과: XYZ

- runtime에 계산이 되므로 offset에 대한 동적 Offset

 

오프셋을 초과하면 에러가 발생하고 컴파일되지 않는다.

=> ghijkl ghijkl ghijk 가 출력

offset이 0보다 큰 값이 할당된 경우에는 애스터리스크(*)문자를 사용해야한다. => 필드 심볼이 오브젝트 길이를 넘는 것을 방지함 

 

Assign구문의 동적인 사용

- 필드 심볼에 할당하는 필드명을 알 수 없는 경우(프포그램 내에서 동적으로 할당되는 경우) => 동적 assign구문을 이용함

ASSIGN (dobj) TO <fs>.

 

-> 이와 같이 답이 나온다

 

- assign table field to <fs>구문에서 sflight-carrid라는 필드가 존재하므로 sy-subrc = 0값을 반한함

- name1이라는 테이블 필드가 존재지 않으므로 시스템 변수 sy-subrc가 4를 반환함

 

구조체의 필드를 필드 심볼에 Assign

ASSIGN COMPONENT comp of STURCUTURE struc TO <fs>.

- 구조체의 개별 필드를 필드 심볼에 assign할 수 있다.

- 구조체 struc의 comp(필드)를 필드심볼 <fs>에 할당한다. 

 

항목 첫코드 두번째 코드
접근 방법 필드의 순서(index) 필드의 이름(name)
유연성 구조체 필드명 변경돼도 잘 작동함 필드명 규칙이 바뀌면 코드도 수정 필요
용도 필드 순서 기반 처리 명명 규칙이 있는 필드에 유용

 

필드심볼과 casting

- 데이터 오브젝트를 필드심볼에 assign할 경우, cast를 이용해 모든 데이터 타입을 필드심볼에 Assign할 수 있다.

CAST는 암묵적 형 변환과 명시적 형 변환 2가지로 분류되어 사용됨

암묵적 형 변환(Implicit Casting)

- 필드 심볼의 data type : fully type으로 선언되어 있거나 기본 데이터 타입 -c, -n, p, x-를 사용한 경우에 암묵적 형 변환을 사용함

DATA: num TYPE i VALUE 10,
      text TYPE c LENGTH 5.

text = num.  " 정수 10이 문자 '10'으로 자동 변환됨

- 타입이 정해진 필드 심볼과 데이터 오브젝트 타입이 다른 경우에는 cating구문을 사용해 assign해야함

ASSIGN <var> TO <fs> CASTING.

구조체 변환

DATA: gv_addr(30) TYPE c VALUE 'Korea Seoul Twin Building'.

FIELD-SYMBOLS: <fs> TYPE t_line.

ASSIGN gv_addr TO <fs>.  " ❌ 오류 발생!

gv_addr은 단순 문자형_c이고, <fs>는 구조체 t_line이기에 전혀 호환이 안된다. -> 개발자가 명확히 casting한 것으로 알려줘야함!!

 

명시적 형 변환(Explict Casting)

FIELD-SYMBOLS : <f1> TYPE ANY.
=>
ASSIGN ADDR TO <F1> CASTING TYPE line.

casting type구문을 이용해 정해진 타입으로 형 변환을 수행하는 것을 명시적 형 변환이라고 한다.

 

필드심볼과 인터널 테이블

- 변수와 같이 인터널 테이블도 같은 과정으로 필드 심볼에 할당하여 사용할 수 있다.

- 필드 심볼을 이용해 인터널 테이블을 변경하면, Work Area로 복사하는 과정이 생략되기에 성능이 향상된다

 

- FIELD-SYMBOLS를 쓸 때 generic하게 써야하기 때문에 type any table로 써야한다.

 

필드 심볼과 구조체

DATA : BEGIN OF gs_line,
	col1(1) TYPE c,
    col2(1) TYPE c VALUE 'X',
    END OF gs_line.
    
FIELD-SYMBOLS <fs> LIKE gs_line.
ASSIGN gs_line TO <fs>.
MOVE <fs>-col2 TO <fs>-col1.

 

- 필드심볼을 구조체처럼 사용할 경우에는 필드 심볼 선언 시에 LIKE or TYPE을 선언해야함

- 필드 심볼 타입이 이미 정의되어 있다면, 필드 심볼과 기술적 속성이 같은 데이터 오브젝트만이 필드 심볼에 할당될 수 있음을 의미한다.

 

여기서 갑자기 드는 의문

field-symbols와 like line of등과 같은 Work area는 어떻게 다른걸까? 거의 비슷한 역할을 한다고 생각이 들었다.

구분 FIELD-SYMOLS LIKE LINE OF로 선언한 Work Area
개념 “참조 (reference)” “복사된 값 (copy of a row)”
메모리 방식 원본 데이터를 직접 가리킴 내부 테이블의 한 줄 값을 복사해서 저장
수정 시 영향 원본 내부 테이블이 직접 변경됨 Work area만 바뀌고 원본은 변하지 않음
성능 빠름 (복사 없음) 복사 발생 → 약간 느릴 수 있음
유연성 유연하고 동적 처리에 적합 정적이고 단순한 구조에 적합

 

 

LIKE LINE OF 예시

DATA: gt_itab TYPE STANDARD TABLE OF sflight,
      gs_line LIKE LINE OF gt_itab.

LOOP AT gt_itab INTO gs_line.
  gs_line-price = gs_line-price * 2. " 원본에는 영향 X
ENDLOOP.

- gs_line은 복사된 값이기 때문에, gt_itab의 실제 데이터는 수정되지 않는다.

 

FIELD-SYMBOLS 예시

FIELD-SYMBOLS <fs> TYPE sflight.

LOOP AT gt_itab ASSIGNING <fs>.
  <fs>-price = <fs>-price * 2. " 원본 데이터가 직접 바뀜
ENDLOOP.

- <fs>는 원본의 참조이므로 gt_itab의 내용이 직접 변경된다.

- 필드심볼 사용

- 참조처럼 작동해서 메모리를 직접 다룰 수 있음

- ASSIGNING을 써서 자동으로 원본 데이터를 수정할 수 있음 

- 복사 없이 데이터를 바로 다를 수 있음

 

 

- 워크에어리어 사용

- 안정성이 높고, 복사한 구조체기 때문에 실수 방지에 좋음

- 코드가 명확함 

- Modify, append, insert사용

- 매번 복사/복원하기에 성능이 떨어질 수도 있음

 

데이터 참조

PARAMETERS p_tname(30) DEFAULT 'sflight'.

- 사용자가 테이블 이름을 입력할 수 있게 함

- 기본값은 'sflight'. 아무것도 안넣으면 sflight 테이블 기준으로 실행됨

DATA: dref TYPE REF TO data.
FIELD-SYMBOLS: <fsl> TYPE any, <fs2> TYPE any.

- dref : 데이터 객체를 참조(포인터)할 수 있는 변수

- <fs1> : 테이블 구조 전체를 가르키는 필드 심볼

- <fs2> : 한 컬럼의 값을 기키는 필드 심볼

CREATE DATA dref TYPE (p_tname).
ASSIGN dref->* TO <fsl>.

- p_tname에 들어온 테이블명을 기반으로 그 테이블 구조를 동적으로 생성

- 구조를 <fs1> 필드 심볼에 연결(포인터 연결)

SELECT * FROM (p_tname) INTO <fsl> UP TO 3 ROWS.

- 사용자가 입력한 테이블에서 최대 3개의 레코드만 읽어서 <fs1>에 담는다.

- p_tname은 동적 SQL.

DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE <fsl> TO <fs2>.

- <fs1> 구조의 각 필드 컬럼을 순서대로 <fs2>에 할당함

- sy-index는 do루프의 반복번호다.

결과값

 

- 데이터 참조는 데이터 오브젝트를 가리키는 포인터, 필드 심볼을 통해 데이터 오브젝트의 값에 접근한다.

- 프로그램 실행 시점에 데이터 오브젝트는 동적으로 생성되기에 메모리 주소도 동적으로 할당됨

 

🔑 1. 참조 변수 (Reference Variable)

DATA dref TYPE REF TO data.

- 어떤 데이터 오브젝트(객체, 구조체, 테이블 등)의 주소를 저장하는 변수

- dref는 참조 변수

- 어떤 데이터 오브젝트의 주소를 저장하는 변수

- 자체는 데이터를 갖지 않고 있고, 어떤 오브젝트를 가르키는 역할만 함

- 아무것도 가르키지 않은 상태(dref = null 상태)

 

오브젝트연결

 

1) CREATE DATA 또는  GET REFERENCE 등으로 명시적 연결

CREATE DATA dref.           " dref가 가리킬 메모리 공간 동적 생성

 

 2) GET REFERENCE OF  기존 변수 연결

DATA val TYPE i VALUE 100.
GET REFERENCE OF val INTO dref.

- 기존 변수 val의 주소를 dref가 가리킴

 

 연결 가능한 오브젝트들

타입 예시 설명
데이터 객체 DATA val TYPE i. 기본형 값, 구조, 내부 테이블 등
클래스 인스턴스 REF TO zcl_my_class 객체지향에서 클래스 인스턴스를 가리킴
동적 타입 객체 REF TO data, FIELD-SYMBOLS TYPE ANY 실제 타입은 나중에 결정됨
필드심볼 <fs> 간접접근이 가능함

 

  • 참조가 연결되지 않은 상태에서 dref->* 접근 시 → Dump
  • 반드시 IS BOUND 체크하는 습관:
IF dref IS BOUND.
  ASSIGN dref->* TO <fs>.
ENDIF.

 

 

🔁 2. 역참조 (Dereferencing)

ASSIGN dref->* TO <fs>.

- 역참조는 포인터가 가르키는 주소에 저장된 데이터에 접근하는 것으로 정의됨 

- 참조변수는 단지 데이터 오브젝트의 주소만 알고 있고, 실제 데이터를 사용하려면 해당 주소에 접근해야하는데 이걸 역참조라고함

- 즉, 데이터 참조가 가리키는 데이터 오브젝트의 변숫값에 접근하려면 Dereference과정을 거쳐야 한다.

- 필드 심볼에서의 casting 기능도 동일하게 사용할 수 있다.

 

DATA dref TYPE REF TO i.   " 참조변수 선언
CREATE DATA dref.          " 메모리 생성
dref->* = 100.             " 역참조로 값 설정
WRITE: dref->*.            " 역참조로 값 읽기

 

1. 구조(structure) 역참조

TYPES: BEGIN OF ty_line,
         name TYPE string,
         age  TYPE i,
       END OF ty_line.

DATA dref TYPE REF TO ty_line.
CREATE DATA dref.
dref->* = VALUE #( name = 'Wonie' age = 25 ).  " 구조에 값 대입
WRITE: dref->name, dref->age.                 " 각 필드 직접 접근 가능

- 구조는 ->* 없이도 필드에 직접 접근이 가능함 

 

 

2. 내부 테이블 참조와 역참조

TYPES: BEGIN OF ty_line,
         id   TYPE i,
         text TYPE string,
       END OF ty_line.

DATA: itab  TYPE STANDARD TABLE OF ty_line,
      dref  TYPE REF TO data,
      <itab> TYPE STANDARD TABLE.

CREATE DATA dref TYPE STANDARD TABLE OF ty_line.
ASSIGN dref->* TO <itab>.

APPEND VALUE #( id = 1 text = 'Hi' ) TO <itab>.

LOOP AT <itab> ASSIGNING FIELD-SYMBOL(<wa>).
  WRITE: / <wa>-id, <wa>-text.
ENDLOOP.

 

- 여기서 dref->*를 통해 참조 대상 테이블 전체를 itab으로 할당

- <itab>에서 다시 한 줄씩 <wa>로 역참조하여 값 출력

->와 ->* 차이 

연산자 용도
-> 클래스 인스턴스의 메서드나 속성 접근 (객체지향용)
->* 데이터 오브젝트(기본형, 구조형 등) 에 대한 일반 

 

TYPES: BEGIN OF t_struct,
         col1 TYPE char15,
         col2 TYPE char15,
       END OF t_struct.

DATA: dref1 TYPE REF TO data,
      dref2 TYPE REF TO data.

FIELD-SYMBOLS: <fs1> TYPE t_struct,
               <fs2> TYPE char15.

CREATE DATA dref1 TYPE t_struct.
ASSIGN dref1->* TO <fs1>.

- t_struct 라는 구조체를 정의함

- dref1, dref2는 어떤 데이터는 가리킬 수 있는 Generic참조변수

- <fs1>은 구조체 타입 필드 심볼(포인터같은 역할)

- <fs2>는 char15필드를 가리킬 수 있는 필드 심볼

<fs1>-col1 = 'Enjoy abap'.
<fs1>-col2 = 'Abap Programming'.

-  생성된 구조체 인스턴스 필드에 값 저장 (dref1이 가르키는 구조체의 co1, col2)

 

dref2 = dref1 => dref2도 이제 같은 구조체 인스턴스를 같이 가리키게 됨(얕은 복사)

ASSIGN dref2->* TO <fs2> CASTING.
WRITE / <fs2>.

- dref2 -> *는 구조체 전체

- <fs2>는 char15 -> 타입이 달라서 casting 덕분에 첫 필드(col1)만 퉁엳

GET REFERENCE OF <fs1>-col2 INTO dref2.

- col2 필드의 참조를 dref2에 저장

- dref2 -> *는 col2 하나만 가리키는 참조

ASSIGN dref2->* TO <fs2>.
WRITE / <fs2>.

- dref2->*는 이제 col2이므로 문제없이 fs2에 연결되고 출력됨

VIEW_뷰

**View(뷰)**는 SAP 데이터베이스에서 하나 이상의 테이블을 조합해서 만든 가상 테이블/ 주로 조회목적으로 사용됨

실제 데이터를 저장하지 않으며, SELECT조회용으로 사용됨

 

 

View의 종류

종류 설명 용도
Database View 실제 DB에서 조인되어 조회되는 뷰 SELECT 가능, SQL View 생성
Projection View 한 개 테이블에서 일부 필드만 보여줌 필드 제한 목적
Help View 검색헬프 (F4 도움말)에서 사용되는 뷰 검색조건 제공용
Maintenance View SM30을 통해 데이터를 유지보수 화면 기반 데이터 입력/수정 가능

 

 

Domain이란?

**데이터 요소(Data Element)**가 사용할 기초적인 데이터 타입, 길이, 허용 값 범위 등을 정의한 객체 => 데이터의 기술적 속성을 모아둔 템플릿

 

테이블 필드  👉  데이터 요소(Data Element) 👉  도메인(Domain)

 

 

구성요소

 

항목 설명
Data Type CHAR, NUMC, DEC, DATS, TIMS
Length 필드 길이 (예: 10)
Decimal Places 소수점 이하 자리수
Output Length 출력 시 보이는 길이
Value Range 허용 값 범위 (예: 1~9999) or 고정값(Value Table)

'SAP' 카테고리의 다른 글

easy abap 39. Report Program - 프로그램 및 데이터 선언  (0) 2025.05.16
easy abap 38. 필드심볼_Field Symbol  (0) 2025.05.16
easy abap 36. strucutre  (0) 2025.05.14
easy abap 35. Table Enhancement  (0) 2025.05.14
easy abap 34. Table  (0) 2025.05.14

 

Structure란?

여러 개의 다른 데이터 타입 필드등을 하나의 논리적인 단위로 묶은 사용자 정의 타입

구조체는 데이터의 그룹을 표현하는데 유용함.

- 내부 테이블의 한줄 _Work Area로 자주 사용됨

- Db테이블의 한 행을 흉내냄

TYPES: BEGIN OF ty_employee,
         emp_id   TYPE i,
         emp_name TYPE string,
         age      TYPE i,
       END OF ty_employee.

DATA: gs_employee TYPE ty_employee.

- ty_employee는 구조체 타입

- gs_employee는 구조체변수(Work area로도 활용가능)

 

항목 설명
✅ 필드 그룹 여러 필드를 한 덩어리로 관리
🧠 이름 접근 gs_emp-emp_name 처럼 필드별 접근 가능
🛠 테이블 행 내부 테이블의 한 행(row) 으로 자주 사용
🔄 재사용 가능 TYPES로 정의해 여러 구조체 변수에서 재사용 가능

 

🔁 구조체 vs 테이블

구분 구조체_Structure 내부테이블_Internal Table
형태 필드들의 묶음 (한 덩어리) 구조체들의 리스트 (여러 행)
용도 한 행 데이터 저장용 여러 개의 행 저장용
DATA: gs_emp TYPE ty_employee. DATA: gt_emp TYPE STANDARD TABLE OF ty_employee.

 

 

'SAP' 카테고리의 다른 글

easy abap 38. 필드심볼_Field Symbol  (0) 2025.05.16
easy abap 37. VIEW_뷰, 도메인  (0) 2025.05.14
easy abap 35. Table Enhancement  (0) 2025.05.14
easy abap 34. Table  (0) 2025.05.14
easy abap 33. Abap Dictionary  (0) 2025.05.14

 

1. Include Structure

 

정의

  • 하나의 **구조(structure)**를 다른 구조나 테이블 안에 포함시킬 때 사용함
  • 재사용 목적이 강함

 

특징

  • 위치 제어 가능 (필드 사이에 끼워넣을 수 있음)
  • 구조 간 코드 중복을 피할 수 있음
  • 데이터베이스 테이블, 구조, 뷰 등 어디든 사용 가능
TYPES: BEGIN OF ty_employee,
         pernr TYPE pernr_d,
         INCLUDE STRUCTURE address. "주소 관련 구조 포함
         name  TYPE string,
       END OF ty_employee.
INCLUDE STRUCTURE 구문은 이 위치에 해당 구조의 필드들을 그대로 끼워 넣는 것과 같음

 

 2. Append Structure

 

정의

  • 기존에 정의된 표준 테이블이나 구조를 확장할 때 사용
  • 하나의 테이블 or Strucure로서 테이블 자체를 수정하지 않고 필드를 추가할 수 있게 해줌
  • = Customer field
  • 하나의 append structure은 하나의 테이블에서만, 개별 테이블은 여러개의 append structure을 사용할 ㅜㅅ 있다.  
  • Pooled와 Cluster테이블은 append structure을 사용할 수 없다.
  • standard 또는 CBO테이블에 신규필드를 추가함 
  • 이미 존재하는 테이블에 Foreign key를 추가 및 정의함
  • 이미 존재하는 테이블에 필드의 탐색 도움말을 추가함

 

항목 Include Structure Append Structure
용도 구조의 재사용 표준 테이블/구조 확장
사용 위치 어디든 가능 (구조/테이블 등) 항상 마지막 필드로만 추가 가능
목적 필드 공통화, 중복 제거 커스터마이징, 사용자 정의 필드 확장
중복 가능성 여러 구조에 포함 가능 한 테이블당 한 append만 가능
위치 제어 원하는 위치에 삽입 가능 항상 끝에만 추가

 

 

Table Enhancement Category란?

- sap 표준 테이블이나 구조체를 확장가능하게 할 지 여부와 방식을 SAP시스템에 알려주는 설정값

 

Enhancement Category 설명
Cannot be enhanced 확장 불가능 (Append Structure 추가 금지)
Can be enhanced (character-type) 문자형(char-type) 필드만 확장 가능
Can be enhanced (any type) 어떤 필드 타입이든 확장 가능
Can be enhanced (deep) 구조체 안에 또 다른 구조체나 테이블이 있는 경우 (Nested 포함) 확장 가능

 

 

 인덱스(Index)란?

데이터베이스 테이블의 특정 컬럼을 기준으로 빠르게 검색할 수 있도록 도와주는 보조테이블 => 검색 속도를 높임

 

인덱스의 종류

 

종류 설명
Primary Index (기본 인덱스) Key Field로 자동 생성됨 (PRIMARY KEY)
Secondary Index (보조 인덱스) 사용자가 필요에 따라 수동으로 추가하는 인덱스
Unique Index 인덱스 조합이 중복되지 않도록 강제하는 인덱스

 

SELECT * FROM sflight
  WHERE carrid = 'AA' AND connid = '0017'.

 

  • sflight 테이블이 carrid + connid 조합에 인덱스를 가지고 있다면 → ✅ 빠르게 검색 가능
  • 없으면 → ❌ 전체 테이블을 풀스캔(Full Table Scan) 하기 때문에 느려짐

=> 자주 사용하는 SELECT 조건 필드를 기준으로 인덱스를 만들 수 있음

 

항목 설명
📉 인덱스 남발 너무 많으면 INSERT/UPDATE 성능이 떨어짐
📌 정렬 기준 인덱스는 정렬된 구조라 정렬 순서가 중요
❗ 조건에 맞는 인덱스 없으면 성능 저하 (Full Scan) 발생

 

-> 인덱스는 DB테이블에서 데이터를 빠르게 찾기 위한 보조도구 => SELECT ... WHRER조건에서 성능향상됨!

- 인덱스는 테이블 접근 시 빠른 속도를 제공해주지만, db를 차지하는 공간이 많이 필요하기 때문에 신중하게 사용해야한다.

- DELETE, UPDATE 구문이 자주 발생하는 테이블의 경우는 인덱스 공간이 굉장히 커질 수 있다.

- 이미 증가해버린 인덱스는 주기적인 REBUILD를 통해 회복할 수 있다.

- SAP에서는 주로 Reorg라는 용어를 사용하며, BC가 OS에서 br*tools라는 SAP툴을 이용해 주기적으로 Reorg를 수행한다.

 

 

'SAP' 카테고리의 다른 글

easy abap 37. VIEW_뷰, 도메인  (0) 2025.05.14
easy abap 36. strucutre  (0) 2025.05.14
easy abap 34. Table  (0) 2025.05.14
easy abap 33. Abap Dictionary  (0) 2025.05.14
easy abap 32. internal table 문제 풀기  (0) 2025.05.14

+ Recent posts