FIELD만 바뀌고 규칙적인 작업을 할때 각각을 프로그램 LOGIC으로 구성하려면
단순 CODING으로 쓸 데없이 LINE만 길어 질 수 있다.
이때 FIELD-SYMBOL을 사용하면 간단히 해결되면서 프로그램을 분석하기도 한결 수월해
진다.
우선 FIELD-SYMBOL 의 여러가지 변형을 살펴보면
1. ASSIGN f TO <fs>.
단순히 field f의 값을 <fs>가 가리키도록 한다.
2. ASSIGN (f) TO <fs>.
동적 field를 이용한것인데 field f안의 값을 또 field명으로 보고 그 field의 값
을 <fs>가 가리키도록 한다.
3. ASSIGN TABLE FIELD (f) TO <fs>.
2와 같은 경우이나 f 의 값이 table의 field명 일때 그 table field의 값을
<fs>가 가리키도록 한다.
4. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO <fs>.
3와 같은 경우이나 tables로 선언된 main program의 table field값을
<fs>가 가리키는 것이 아니라 값만 복사 하여 사용하기 때문에 변경할 수 없다.
5. ASSIGN COMPONENT idx OF STRUCTURE rec TO <fs>.
structure의 구성요소 순서를 idx에서 읽어 그 순서에 위치한 구성요소의 값을
<fs>에 할당한다.
6. ASSIGN COMPONENT name OF STRUCTURE rec TO <fs>.
structure의 구성요소명(field명)을 name에서 읽어 그 구성요소의 값을
<fs>에 할당한다.
5번을 제외한 모든 경우는 field명을 사용하는 것이라서 field명에 규칙이 없으면
coding line 줄이는데 효과를 보지 못한다.
따라서 여기서는 field명에 규칙이 없더라도 coding line을 획기 적으로 줄일 수 있는
5번경우를 사용한 예제만 소개하겠다.
예제)
FIELD-SYMBOLS : <FS1>, <FS2>.
DATA:IDX1 LIKE SY-INDEX.
DATA: BEGIN OF ITAB1 OCCURS 0,
CCYYMM(8),
WERKS LIKE MARD-WERKS,
MATNR LIKE MARD-MATNR,
LABST LIKE MARD-LABST,
UMLME LIKE MARD-UMLME,
INSME LIKE MARD-INSME,
EINME LIKE MARD-EINME,
SPEME LIKE MARD-SPEME,
RETME LIKE MARD-RETME,
VMLAB LIKE MARD-VMLAB,
VMUML LIKE MARD-VMUML,
VMINS LIKE MARD-VMINS,
VMEIN LIKE MARD-VMEIN,
VMSPE LIKE MARD-VMSPE,
VMRET LIKE MARD-VMRET,
END OF ITAB1.
DATA: ITAB2 LIKE ITAB1 OCCURS 0 WITH HEADER LINE.
경우1) FIELD-SYMBOL 사용하지 않았을 경우
LOOP AT ITAB1.
READ TABLE ITAB2 WITH KEY CCYYMM = ITAB1-PERIOD
WERKS = ITAB1-WERKS
MATNR = ITAB1-MATNR
BINARY SEARCH.
IF SY-SUBRC <> 0.
WRITE : / 'Not found in ITAB2 : ',
ITAB1-CCYYMM,
ITAB1-WERKS,
ITAB1-MATNR.
ELSE.
IF ITAB1-LABST <> ITAB2-LABST.
WRITE : / SY-INDEX,
ITAB2-CCYYMM,
ITAB2-WERKS,
ITAB2-MATNR,
ITAB1-LABST,
ITAB2-LABST.
ENDIF.
IF ITAB1-UMLME <> ITAB2-UMLME.
WRITE : / SY-INDEX,
ITAB2-CCYYMM,
ITAB2-WERKS,
ITAB2-MATNR,
ITAB1-UMLME,
ITAB2-UMLME.
ENDIF.
.............. 12번 반복 ........
ENDIF.
ENDLOOP.
경우2) FIELD-SYMBOL 사용했을 경우
LOOP AT ITAB1.
READ TABLE ITAB2 WITH KEY CCYYMM = ITAB1-PERIOD
WERKS = ITAB1-WERKS
MATNR = ITAB1-MATNR
BINARY SEARCH.
IF SY-SUBRC <> 0.
WRITE : / 'Not found in ITAB2 : ',
ITAB1-CCYYMM,
ITAB1-WERKS,
ITAB1-MATNR.
ELSE.
IDX1 = 3.
DO 12 TIMES.
IDX1 = IDX1 + 1.
ASSIGN COMPONENT IDX1 OF STRUCTURE ITAB1 TO <FS1>.
ASSIGN COMPONENT IDX1 OF STRUCTURE ITAB2 TO <FS2>.
IF <FS1> <> <FS2>.
WRITE : / SY-INDEX,
ITAB2-CCYYMM,
ITAB2-WERKS,
ITAB2-MATNR,
<FS1>,
<FS2>.
ENDIF.
ENDDO.
ENDIF.
ENDLOOP.
위 예제는 field수가 많을 수록 더욱 확실한 효과를 볼수 있다.
댓글 17
-
별이고픈구름
2008.05.30 21:57
-
gauguin
2008.06.02 15:08
좋은 참고 되겠습니다. -
화니
2008.06.03 18:28
좋은 자료 감사합니다. -
카이사르
2008.06.04 03:31
감사합니다.
-
카이사르
2008.06.04 03:43
좋은 자료네요...^.^ -
xcomedy
2008.06.12 09:25
좋은정보 감사합니다. -
보물찾기
2008.09.10 02:33
감사합니다 ~~ -
흙
2008.09.11 23:40
딱 좋은 예재와 설명 감사합니다.
-
그거별거냐
2008.10.18 00:45
잘 활용하겠습니다 .감사합니다.
-
유하
2008.11.12 00:26
감사합니다~~^^ -
sora
2009.01.20 19:19
좋은 예제 같은데요 에러가 뜨느요?
The data object "ITAB1" does not have a component called "PERIOD".
에러가 뜨지 않게끔 소스 올려줄수 없는지요?
감사합니다.
-
박하사탕
2009.02.24 20:05
필드심볼 잘 몰랐는데.. 이해가 쉽게 되네요 감사합니다. -
전도사
2009.12.14 00:53
감사합니다. 쉽게 설명해주셔서... -
ㅆ ㅓ ㄴ ㅣ
2010.04.17 03:06
감사합니다. -
서영아빠
2010.11.23 22:56
좋은내용 감사합니다.
-
초보자
2010.12.01 20:40
좋은 설명 감사합니다. -
사랑천사
2013.05.13 20:43
감사합니다
설명 잘해주셨네요 ^^.
한가지 주의점은 필드심볼을 너무 많이 쓰면 추적(Trace)이 힘들어 진다는 거~