본문 바로가기
Study/SAP

[SAP] 정리4 - 다양한 프로그래밍 방법

by J_Kkikki 2026. 1. 7.

목차

internal table 종류

Subroutine

work area

FAE 1:1

FAE 1:N

Function

Trace

Transaction Code

Batch job

Smartforms

+)field symbol에 대한 이해

 

 


 

 

 

internal table 종류

  Standard Table

(=Table)

: 평범한 리스트

: 순차 탐색

 

  Sorted Table

: 키 기준 자동 정렬

: 이진 탐색(빠르다!)

 

  Hashed Table

: 키 기준 정렬x (인덱스도 없음 = 순서x)

: 가장 빠름!

 

 


 

 

 

Subroutine (서브 루틴)

: 프로그램 내에서 자주 쓰는 로직을 묶어서 따로 빼 둠

(원하는 프로그램을 재사용, 수정을 쉽게 할 수 있다!)

LOOP AT gt_itab INTO gs_itab.
  PERFORM get_weight  CHANGING  gs_itab.      "서브루틴 호출
. . .
FORM get_weight CHANGING ps_itab LIKE LINE OF gt_itab.
  "~weight를 구한다~

 

 

✧ 서브루틴 : Changing - Using

- CHANGING : 수정용 (값을 바꾸겠다!0

- USING : 참조해서 다른 걸 찾다 (값을 바꾸지 X)

- TABLE : 바꾸고, 참조하고 다 됨 (테이블을 넘겨서 서브루틴에서 조작하겠다) <권장X

 

 


 

 

Work Area 를 LOOP에서 사용하는 3가지 방법

: 프로그램 내에서 자주 쓰는 로직을 묶어서 따로 빼 둠

 

1. 헤더라인을 만들어 사용한다.

DATA : gt_itab TYPE TABLE OF gty_itab WITH HEADER LINE.  "같은 이름(gt_itab)의 인터널테이블, work area가 동시에 생성!
LOOP AT gt_itab.
  PERFORM get_matnr_name CHANGING gt_itab.  "work area 역할을 한다(헤더라인 수정)
  MODIFY gt_itab.

ENDLOOP.

 

 

2. gs_itab을 만들어 사용한다. (하던 방식)

DATA : gt_itab TYPE TABLE OF gty_itab.    "인터널 테이블
DATA : gs_itab TYPE gty_itab.                     "work area
LOOP AT gt_itab INTO gs_itab.
  PERFORM get_matnr_name CHANGING gs_itab.
  MODIFY gt_itab FROM gs_itab.
  CLEAR gs_itab.
ENDLOOP.

 

 

3. Field Symbol을 사용한다.

DATA : gt_itab TYPE TABLE OF gty_itab.    "인터널 테이블
LOOP AT gt_itab IASSIGNING FIELD-SYMBOL(<gs_itab>).
  PERFORM get_matnr_name CHANGING <gs_itab>.
ENDLOOP.

 

 

 


 

 

 

FAE 1:1, 1:N

FAE(For All Entries): FAE 쿼리 한번으로 10번의 SQL호출을 대신한다.

 

  EX) 자재번호(matnr)을 기준으로 SQL을 호출하려면??

 

1. 자재번호(matnr) 기준으로 정렬한다.(2번의 중복 제거를 위해 필요한 선작업)

gt_maktv gt_itab.
SORT gt_maktv BY matnr.       "matnr 기준으로 정렬(m-01, m-02, . . .)

 

2. 자재번호(matnr) 중복 값을 제거한다.

DELETE ADJACENT DUPLICATES FROM gt_maktv COMPARING matnr.

 

3. FAE로 gt_makt에 자재번호(matnr) 와 자재내역(maktx)을 저장한다.

: gt_maktv에 들어 있는 자재번호(matnr, 중복x)을 기반으로, makt에서 matnr, maktx를 찾아 gt_makt에 넣는다

: 이러면 matnr이 똑같아서 여러 번 select하지 않게 된다!

SELECT matnr, maktx
  INTO CORRESPONDING FIELDS OF TABLE gt_makt
  FROM makt FOR ALL ENTRIES IN gt_maktv                             "FAE!
  WHERE matnr = gt_maktv-matnr AND spras = sy-langu.

 

4. gt_makt를 gt_itab에 다시 매핑한다.

4-1. matnr(자재번호) : maktx(자재명)  = 1 : 1관계일 때

(m-01=배터리, m-02=스크린 이런 식으로)

SORT gt_makt BY matnr.

LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<gs_itab>).

*gt_makt에서 matnr(gt_itab의) = <gs_itab>-matnr을 만족하는 첫 번째 레코드를 찾고, 그 결과를 <ls_makt>에 할당한다
  READ TABLE gt_makt ASSIGNING FIELD-SYMBOL(<ls_makt>).
    WITH KEY matnr = <gs_itab>-matnr
    BINARY SEARCH.

  IF sy-subrc = 0.
    <gs_itab>-maktx = <ls_makt>-maktx.
  ENDIF.

ENDLOOP.

 

4-2. matnr(자재번호) : maktx(자재명 등... 설명일수도 있고...)  = 1 : N관계일 때

(m-01=배터리,battery,バッテリー,   m-02=스크린,screen,がめん 이런 식으로 다국어로 표현해야 할 때)

SORT gt_makt BY matnr.

LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<gs_itab>).

*gt_makt에서 matnr(gt_itab의) = <gs_itab>-matnr을 만족하는 첫 번째 레코드를 찾고, 그 결과를 <ls_makt>에 할당한다
  READ TABLE gt_makt ASSIGNING FIELD-SYMBOL(<ls_makt>).
    WITH KEY matnr = <gs_itab>-matnr
    BINARY SEARCH.

  IF sy-subrc = 0.
*1:N은 여기가 추가!
    LOOP AT gt_makt ASSIGNING FIELD-SYMBOL(<gs_makt>) FROM sy-tabix.
      IF <gs_makt>-matnr = <gs_itab>-matnr.
        <gs_itab>-maktx = <ls_makt>-maktx.
      ELSE.
        EXIT.
      ENDIF.
    ENDLOOP.

  ENDIF.

ENDLOOP.

 

 

 


 

 

 

 

Function

function : 외부에서 기능을 호출해서 사용

 

CALL FUNCTION 'GET_MATNR_NAME'

EXPORTING  "gt_itab에 담아진 값을 내보낸다.(function group에서는 받아야되니까 import)
  iv_matnr    = ps_itab-matnr
IMPORTING  "function groups에서 select(소스코드)한 값을 받아온다.(fuction group에서는 여기로 줘야하니까 export)
  ev_maktx     = ps_itab-maktx.

 

Function Groups 폴더 안에 GET_MATNR_NAME이라는 Function Module을 만든다

 

Import : call한 코드에서 -> Function module로 들어오는 것!

- optional : 입력 필수인지

-값 자체를 복사할지, 참조해서 넘길지

 

 

✧ Export : function module에서 -> call한 코드로 보내주는 것!

 

 

✧ Source code : 여기에 구현할 소스 코드를 적는다

 

 

 

 

 


 

 

 

 

Trace

t-code: ST05로 진입해서 Trace 가능하다!(성능, 문제 체크)

 

 

 


 

 

 

 

트랜잭션(t-code)

SE80, SE11 = 개발자용 T-code

사용자는 제한된 결과 인터페이스만 지정해준 특정 T-code를 이용해 볼 수 있게 해야 한다!

 

예: 사용자는 ZR1900050을 입력하면 결과 테이블을 조회할 수 있다.

 

 

 


 

 

 

 

Batch job

(=백그라운드 잡)

batch job : 자동으로 실행되는 시스템

 

t-code: SM36 (생성하기)

 t-code: SM37 (결과보기)

 

Start condition으로 설정하고 실행할 수 있다!

 

 

 

 


 

 

 

 

Field Symbol에 대한 이해

  field-symbol(< >) : 메모리를 안먹음. 그냥 주소만 가지고 있는 껍데기(인터널 테이블의 거울 같은 것)

  -그래서 따로 modify, append를 안해도됨

  -루프 돌때마다 필드 심볼의 주소가 바뀐다.

  -인터널 테이블 -> field symbol에 할당해줌.

  -필드심볼 104주소에 ‘1000’이 할당되면 append로 104와 연결된 인터널 테이블의 필드에 거울처럼 1000이 할당된다.

  -필드 심볼은 메모리 할당 자체가 안되어있어서 그냥 주소만 담는 껍데기 역할이다.