이제 막 ABAP을 배우고 있는 생초보입니다.
JOIN문 입력시 궁금한점이 있어 문의드립니다.
생초보이니 아시는분들 답변좀 꼭 부탁드립니다.
DATA: gt_itab TYPE TABLE OF spfli,
wa_itab LIKE LINE OF gt_itab.
SELECT a~carrid a~connid b~carrname
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM spfli AS a INNER JOIN scarr AS b
ON a~carrid = b~carrid
WHERE a~carrid = 'AA'.
LOOP AT gt_itab INTO wa_itab.
WRITE:/ wa_itab-carrid, wa_itab-connid. wa_itab-carrname.
ENDLOOP.
질문1) 위와 같이 하고 신텍스 체크를 하면 "wa_itab-carrname의 스펠링을 점검하라고 나옵니다"
스펠링의 문제가 아닌 gt_itabe에서 carrname가 선언되지 않아서 문제가 발생하는건가요?
(당연한거겠지만..ㅡㅡ; SPFLI를 조회해보니 carrname라는 콤포넌트는 존재하지 않더라구요..)
질문2) JOIN을 실행하기 위해서는 gt_itab에 carrname을 포함한 TYPE을 선언해줘야 한다면..
음..질문을 쉽게하자면 TYPES: BEGIN OF....이런식으로 carrname을 포함하는 TYPE을 선언하고
DATA를 선언하는건가요?
TYPE 선언없이 DATA를 바로 선언하여(아밥 딕셔너리를 통해..) 실행하는 방법은 없는지 궁금합니다..
질문3) 저는 아래와 같이 개념이 잡혀있는데..제대로 된 개념 정리좀 쉽게 설명해주셨으면 합니다.
- workarea는 인터널 테이블의 바디를 가공하여 실질적으로 사용한다.
-그러므로 명령문?? 수행시 먼저 인터널테이블을 통해 값이 대입된다.
- LOOP를 돌릴때도 인터널테이블이 돌아가고 WORK AREA의 값이 출력된다.
생초보라서 질문이 제대로 되었는지도 모르겠습니다.
아시는 분은 꼭좀 답변 해주시면 감사하겠습니다~!
* 보나님에 의해서 게시물 이동되었습니다 (2011-01-27 09:46)
댓글 5
-
버미!
2011.01.27 19:52
-
JG
2011.01.27 20:46
1. internal table에 선언되지 않은 필드를 select를 하셔도 corresponding을 쓰면 같은 이름의 필드에만 데이터가 들어가기에 문제없습니다.
에러는 wa_itab-connid 뒤에 ','가 아닌 '.' 이네요.
2. 네 type으로 선언하고 쓰시길 추천해 드립니다.
data로 바로 선언한다면 하기와 같이 하시면 됩니다.
data: begin of gt_itab,
carname like ...
end of gt_itab.
3. 통에 들어있는 걸 사용할려면 꺼내야겠죠.
통에 들어있는 상태가 internal table이라 보시면 되구요.
꺼낸 상태가 workarea라 보시면 됩니다.
workarea는 통에 있는게 한 라인씩 보이는 것이기에 가공이 안된 raw 데이터 입니다.
-
redj
2011.01.27 23:17
ㅋㅋ 저의 무지함이네요..1번질문은 제가 눈씻고 찾아봐도 보이지 않던것이 지금 댓글을 보니 보이네요..
초보라서 그런지 문장들이 눈에 쉽게 들어오지 않네요..역시 내공을 점점더 쌓아야만 되는거군요..ㅎ
댓글 달아주신분들께 감사합니다 ^^
JG님의 3번답변을 보면 workarea는 가공이 안된 row데이터라고 하셨는데..
그렇다면 이론적으로 봤을때 workarea는 꼭 가공을 해야만 출력이던 실행이던간데 수행이 된다는 말씀인가요?
-
오늘도 역시
2011.01.28 02:03
교재를 처음 보실땐 하나하나 이해를 하시고 넘어가시길 추천합니다.
나중에야 필요한 부분를 참조한다지만 저희 같은 초보는 하나하나 중요합니다. 지금은 컴마실수가 난 것이 다행입니다.
만약 나지 않았다면 잘 모르고 넘어갈수도 있으니까요 ^^*
지금 3개의 필드에 들어있는 자료가 필요한 상황인거 같습니다.
문제는 그 자료가 두개의 테이블에 나눠져 있다는 것입니다.
이럴때 join구문을 사용하여 두개의 테이블에 있는 자료를 가져와 인터널 테이블에 담아주는 것입니다.
그래서 아무리 spfil테이블을 뒤져봐도 carrname필드가 없는것입니다. 다른테이블인 scarr에서 가져온 필드니까염.
인제 인터널 테이블에 담긴자료를 어떻게 사용하냐겠죠. 지금보니 루프를 돌려서 워크에리어에 담아서 한라인씩 보셨네염.
참고로 자료는 헤더를 통해 바디로 들어가고 바디에서 헤더를 통해 나갑니다.
그러니까 지금 인터널 테이블 몸통(바디)의 자료가 루프를 통해서 헤더로 간다음 워크에리어로 한라인씩 보여진거죠.
write로 한라인씩 보실려고 해서 그런거지 인터널테이블에 담긴자료는 어떻게 사용하느따라 달라질 수 있습니다.
저도 초보라서 잘못된 부분이 있을수 있으니 이해해 주시기 바랍니다.
-
redj
2011.01.28 04:00
오늘도 역시님~! 답변 감사합니다. 마지막 인터널테이블에 대한 설명 깔끔하게 설명해주셔서 한층 이해하기가 더 쉬어졌습니다~!
감사합니다~!
1. Write문에서 .=>,로 변경
2. scarr 테이블에 carrname이 있는 것으로 알고 있는데 현재 확인불가
3. Itab 선언 방법은 헤더가 있게, 혹은 헤더가 없게 선언할 수 있는데
헤더가 없다면 workarea(itab line type)를 선언하여 itab에 있는 내용을 헤더로 옮긴 후 가공을 해야 한다.