Append Structure란?

- 테이블에 필드를 직접 추가하지 않고, 옆에 붙이는 구조.

장점

1. 테이블 구조를 직접 수정하지 않아도 됨

2. 테이블을 업데이트해도 문제 없음 (특히, 스탠다드 테이블!)

3. 하나의 테이블에 여러 팀이 각각 Append Structure 추가 가능함

 

하지만, 실습을 해도 약간 이해가 안갔다..🚨🚨🚨

뭔소리여

문제를 파악하면서 내가 궁금했던 2가지가 있었다.

첫번째로 append structure를 쓰면 왜 안전하다는 것인가?와,

두번째로는 append structure은 c의 구조체와 비슷한것인가?다. 데이터가 필드화되는 것인지 가 궁금했다.

 

방식 특징 위험 
직접 필드 추가 테이블 안에 직접 추가함 🚨업데이트 충돌 가능
Append Structure 사용 테이블은 그대로, 외부에서 확장함 ✅안전하게 유지 가능

 

 

 스탠다드 테이블

SAP가 기본적으로 제공하는 테이블

- 사용자가 만든 게 아니라, SAP 시스템 안에 기본 내장되어 있는 테이블

- FI, MM, CO모듈은 이 테이블을 사용해서 관리를 한다.

예시로 자재관리 모듈의 대표적 스탠다드 테이블은 아래와 같다

테이블명 설명
MARA 자재의 일반 정보 (General material data)
MARC 자재의 플랜트 단위 정보 (Plant data for material)
MARD 자재의 저장 위치 정보 (Storage location data)
EKKO 구매 오더 헤더 정보 (Purchase Order Header)
EKPO 구매 오더 항목 정보 (Purchase Order Item)

 

☑️ 특징

특징 설명
SAP가 제공 기본적으로 SAP 안에 포함되어 있음
수정 불가 테이블 구조를 직접 수정할 수 없음
확장은 가능 → 그래서 Append Structure를 사용함
클라이언트 구분 필드 있음 대부분 MANDT 필드 포함

 

📦 MARA란?

MARA는 SAP 시스템에서 모든 자재(Material)에 대한 일반 정보를 담고 있는 기본 테이블

  • MATNR: 자재 번호
  • ERSDA: 생성 일자
  • ERNAM: 생성자
  • MTART: 자재 유형
  • MEINS: 기본 단위
  • …등 자재에 대한 공통 정보들이 들어있다.

Mara 테이블에서 필요한 자재의 정보를 회사에 맞춰 쓰면 된다.

 

그런데, Mara테이블에 없는 필드를 추가하려고 할 때, 그냥 필드로 테이블안에 직접 추가한다면,

추후 SAP의 업데이트로 인해 업데이트 충돌 기능이 생겨날 수 있다...!

Append Strucure을 쓰면, SAP에서 테이블을 업데이트하더라도,

-기존 SAP필드만 갱신

-Append Structure는 따로 관리되기에,

추후 업데이트가 있어도 사라지지 않고 유지보수관점에서 안전한다

 

-> 이로써 "왜 appened structure가 안전한가?"에 대한 첫번째 질문 해결.

 

 

Append Structure은 C의 구조체와 비슷한가? 어떤 형식으로 되는지?

비슷한 점 - "필드 묶음"이라는 점

C의 structure처럼 append structure도 여러 개의 필드를 묶어서 테이블에 추가하는 단위

다른 점 - append structure은 테이블에 직접 확장되는 방식 => 테이블에 붙여서 사용하는 용도

 

Append Structure은 하나의 필드가 아니라, 여러개의 필드를 담은 묶음을 테이블에 확장하는 용도이다.

 

Append Structure ZZCUSTOMER_EXTRA
- ZZSALES_REGION    TYPE ZSALES_REGION   " 영업 구역
- ZZBIRTHDATE       TYPE D               " 생년월일
- ZZMEMBERSHIP_LVL  TYPE CHAR2           " 멤버십 등급

 

 

고객번호 (KUNNR)고객명 (NAME1)지역 (ORT01)마케팅코드 (ZZMARKETING_CODE)생일 (ZZBIRTH)포인트 (ZZPOINT)

100001 홍길동 서울 MKT-001 1990-05-12 1200
100002 김영희 부산 MKT-002 1985-11-02 800

 

Append Structure을 쓰면 이런식으로 행에 추가적으로 붙어서 나온다. == 테이블 확장!

 

 

현재 직원관리 table에서 직원의 이름, 나이, 성별, 월급, 통화종류등이 관리되고 있다.

Salary의 월급과 통화를 연결시켜주기 위해서는 외래키 등록이 필요하다.

       +--------------------------+
       |       EMPLOYEE           |
       +--------------------------+
       | EmpID (PK)               |
       | Name                     |
       | Salary                   |
       | CurrencyKey (FK)  <------|--------------------+
       +--------------------------+                    |
                                                       |
                                                       v
       +--------------------------+          +--------------------------+
       |       CURRENCY           |          |   (참조 테이블)          |
       +--------------------------+          +--------------------------+
       | CurrencyKey (PK)         |          | CurrencyKey (PK)         |
       | CurrencyName             |          | CurrencyName             |
       +--------------------------+          +--------------------------+

 

Employee 테이블:

- 직원 정보를 저장하고, Salary급여와 함꼐 CURRENCY KEY 통화키를 보유함

CURRENCY 테이블:

- 통화정보를 저장함

- CurrencyKey는 기본키(PK)이고, Employee 테이블의 currencyKey 외래키가 이 값을 참조함

=> 이렇게 외래키를 설정하면 통화필드에 잘못된 값이 들어가는 것을 방지할 수 있고 드롭다운 목록을 통해 사용자가 미리 정의된 통화갑만 선택할 수 있도록 유도가능

 

 

이제 통화를 선택할 수 있는 드롭다운이 생긴다.

 

 

로제(직원이름)는 USD로 통화를 받는다.

📌 투명테이블 수정

 

 

1️⃣ 기존 테이블 확인 (ZEMPLOYEES)

  • SE11 (ABAP Dictionary) 트랜잭션 실행
  • ZEMPLOYEES 테이블을 조회
  • 테이블에 존재하는 6개의 필드 확인:
  • MANDT, EMPLOYEE, SURNAME, FORENAME, TITLE, DOB

🔹 MANDT는 SAP 시스템이 자동으로 관리하는 클라이언트 필드다.

 

2️⃣ 주의사항: 테이블 수정 시 위험

 

테이블을 수정할 때, 특히 Key 필드를 수정하거나 제거하면 데이터 손실이 발생할 수 있음!

  • SAP 시스템은 가능한 경우 기존 테이블을 수정하지만,
  • 구조가 크게 바뀌면 기존 테이블을 삭제하고 새로 만들기도 함.
  • 중요: 테이블을 바꾸기 전에 반드시 백업 또는 복제!

 

3️⃣ 안전한 방법: 테이블 복사

  • ZEMPLOYEES 테이블을 복사하여 ZEMPLOYEES2 테이블 생성 (Ctrl+F5)
  • 이때 복사되는 건 구조만이며, 데이터는 복사되지 않음
  • 복사 후에는 테이블 활성화 필요
  • ZEMPLOYEES2 테이블에 몇 개의 더미 데이터 입력 (직원 3명)

 

 

4️⃣ 필드 추가: ZINITIALS, ZGENDER, ZSALARY

 

 

5️⃣ 오류 발생: 통화 필드 없음

통화 필드 없이 ZSALARY 필드를 활성화하려고 하면 오류 발생

 

6️⃣ 통화 필드 추가:  ZECURRENCY

  • 필드명: ZECURRENCY
  • 기존에 존재하는 데이터 엘리먼트 CURRENCY(CURCY) 사용
  • 길이: 5자리 문자
  • 이후 ZSALARY 필드의 “통화 필드 참조” 탭에서 다음을 지정:
    • 참조 필드: ZECURRENCY
    • 참조 테이블: 현재 테이블명 (ZEMPLOYEES2)

ZSALARY 필드가 ZECURRENCY 필드를 통화 키로 사용함을 명시

 

 

단계설명

✅ 테이블 복사 구조만 복사되고, 데이터는 복사되지 않음
⚠️ 수정 전 주의 키 필드 변경 시 데이터 손실 가능성 있음
➕ 필드 추가 데이터 엘리먼트/도메인과 함께 추가
💰 화폐 필드 CURR 타입은 반드시 CURRENCY 키 필드가 필요
✔️ 참조 설정 화폐 필드에는 반드시 참조 필드/테이블 지정 필요

 

디버깅 버튼(shift+f5)를 누르면, 프로그램의 첫줄부터 디버거가 실행된다.

- 코드내에서 BreakPoint를 설정할 수도 있다.

- Place the cursor on the line and click the stop icon.

=> 멈추고 싶은 코드 줄에 커서를 두고 정지 아이콘(🛑) 을 클릭한다.

- When we execute the program, it will stop at that line and enter the debugger.

프로그램을 실행하면 해당 줄에서 자동으로 멈추며 디버깅 모드로 진입한다.

=✅ 이 방법이 가장 많이 사용됨: 처음부터 디버깅할 필요 없이, 문제가 의심되는 위치부터 추적 가능

 


 

✅ 디버깅 단축키 & 기능

 

F5 Single Step 한 줄씩 실행 (함수 안으로 들어감)
F6 Execute 함수/폼 등 블록 단위 실행 (들어가지 않음)
F7 Return 현재 함수/폼 나머지 실행 후 복귀
F8 Continue 전체 프로그램 실행 또는 커서 위치까지 

Sub-Fields : 필드안의 특정 문자위치를 지정해서 사용

DATA : int_tel_num(17) TYPE c,
country_code(3) TYPE c,
telephone_num(14) TYPE c.

int_tel_num = '+82-(0)207-123456'.
WRITE int_tel_num.
SKIP.

country_code = int_tel_num(3).
telphone_num = int_telphone_num+4(13).
WRITE / country_code.
WRITE / telephone_num.

country_code+1(2) = '01'.
WRITE / country_code.

 

 

 

int_tel_num+4(13)은 4번째 인덱스부터 13개의 문자열을 쓰겠다는 의미!

SPLIT 함수  : 여러 필드로 문자열을 구분자를 기준으로 나누는 문

: 하나의 문자열을 여러개의 필드로 분리하고 싶을 때 사용


DATA: mystring(30),
      a1(10),
      a2(10),
      a3(10),
      sep2(2) VALUE '**'.

 

- mystring: 전체 문자열 (30자)

- a1, a2, a3: 나눠 담을 각 필드 (10자씩)

- sep2: 구분자로 사용할 문자열, '**'

 

예제 - 기본 나누기

mystring = ' 01234**ABCD**6789'.
SPLIT mystring AT sep2 INTO a1 a2 a3.

 

변수 내용

a1 ' 01234'
a2 'ABCD'
a3 '6789'

모든 필드의 길이는 10이기 때문에 남은 공간은 자동으로 공백으로 채워짐

 

 

만약 필드 수보다 많은 분할을 한다면?

 

mystring = ' 01234**ABCD**6789**XYZ'.
SPLIT mystring AT sep2 INTO a1 a2 a3.

- **가 3번 등장하기 때문에 4개로 나뉘어야 하지만, a1, a2, a3 3개의 필드만 선언되어있음

 

  • 분리할 항목 수 > 필드 수인 경우 → 마지막 필드에 나머지 전부가 저장됨
  • 마지막 필드의 크기를 초과할 경우 → 잘림(Truncated)

💡 SHIFT : 문자열을 왼쪽 or 오른쪽으로 이동시키는 함수

문자열 앞의 0을 제거하거나, 문자들을 한 글자씩 회전시킬 수 있음 

 


1. 왼쪽으로 이동하면서 0 제거 : LEFT DELETING LEADING '0';

DATA: employee_num(10).
SHIFT employee_num LEFT DELETING LEADING '0'.
=> "654321"

 

2. 기본 SHIFT 

SHIFT empl_num .
WRITE empl_num .
=> 000654321

 

3. CIRCULAR 옵션

SHIFT empl_num CIRCULAR.
WRITE empl_num .
=> 0006543210

💡 Search함수 : 문자열 필드 안에서 특정 문자열 검색하는 방법 


SEARCH <field> FOR <string>.
SEARCH surname2 FOR 'Joe'.

 

- Search 문은 결과를 변수에 저장하지 않음

- 결과는 ABAP 시스템 필드를 통해 확인함

  • sy-subrc: 검색 성공 여부
  • sy-fdpos: 문자열이 시작되는 위치(인덱스)

필드명 의미

sy-subrc 0: 검색 성공 / 4: 검색 실패
sy-fdpos 검색된 문자열의 오프셋(시작 위치) 값 (0부터 시작)

예: sy-fdpos = 3이면, 해당 단어는 4번째 글자부터 시작됨 (인덱스 0 기준)

 

예제1 기본검색(공백무시)

surname2 = 'Mr. Joe Smith'.
SEARCH surname2 FOR 'Joe'.
This should be successful. sy-subrc = 0, and sy-fdpos = 3.
'Joe'는 존재하므로 성공,
Mr. 다음에 있는 'J'는 4번째 문자이므로 오프셋 3

 

예제2 공백포함검색

SEARCH surname2 FOR 'Joe    '.  " 공백 포함
실제 문자열에는 'Joe '만 있고 공백이 부족하므로 검색 실패
sy-subrc = 4 (실패)
sy-fdpos = 0

 

예제3 와일드카드 검색: *ith

SEARCH surname2 FOR '*ith'.  " ith로 끝나는 단어
‘Smith’가 ith로 끝나므로 검색 성공
sy-subrc = 0, sy-fdpos = 7 (공백 다음 단어 시작)

 

예제4 와일드카드 검색: smi*

SEARCH surname2 FOR 'Smi*'.  " Smi로 시작하는 단어
Smith에서 일치
sy-subrc = 0, sy-fdpos = 7

 

 

📌 오프셋 위치 해석

surname2 = 'Mr. Joe Smith'

→ 인덱스 기준:

0 1 2 3 4 5 6 7 8 9 ...
M r .   J o e   S m ...
  • Joe는 인덱스 3부터 시작
  • Smith는 인덱스 7부터 시작
  • (Joe 뒤 공백이 인덱스 6 → 그 다음인 7에서 시작)

구문 예시 /설명 /결과

smi*가 아니라 joe다!

SEARCH field FOR 'Joe'. 단어 ‘Joe’ 검색 sy-subrc = 0, sy-fdpos = 3
SEARCH field FOR 'Joe    '. 공백 포함 → 실패 sy-subrc = 4, sy-fdpos = 0
SEARCH field FOR '*ith'. ith로 끝나는 단어 sy-subrc = 0, sy-fdpos = 7
SEARCH field FOR 'Smi*'. Smi로 시작하는 단어 sy-subrc = 0, sy-fdpos = 7

💡 Replace: 문자열 내 특정 문자를 다른 문자로 바꾸는 함수


surname2 = 'Mr, Joe Smith . '.
replace ',' with '.' into surname2.
WRITE : surname2.
ULINE.

결과 : Mr. Joe Smith

,가 .로 변환되는 것을 볼 수 있다 

주의 ) 기본 REPLACE 는 첫 번째 항목만 바꿈

 

 

While sy-subrc = 0.
Endwhile.

 

 sy-subrc란?

  • sy-subrcABAP 시스템 필드
  • 어떤 문장(statement)의 실행 결과를 숫자로 반환해주는 역할을 함
  • 흔히 READ, SELECT, REPLACE, SEARCH 등과 함께 사용됨

 

🔢 sy-subrc 값 의미

0 성공 (작업이 잘 됨)
4 실패 (예: 원하는 항목 못 찾음)
그 외 문장에 따라 다양한 에러 코드 가능

 

🔁  WHILE sy-subrc = 0. 의미

"이전 문장이 성공했을 때만 계속 반복" => 항상 직전 문장에만 영향을 받음

 

💡 STRLEN : 문자열 길이 구하기 


len = strlen( surname ) .
WRITE : 'The length of the Surname field is', len.
ULINE.

결과: 5

+ Recent posts