인터널테이블에
필드가 100개가 넘게 있습니다.
알고리즘이 전부 끝난 후에
필드 하나하나를 다 체크해서
initial일 경우 space를 넣어줘야 하는데요..
그 많은 필드들을 일일히 다 체크해주기에는 너무 하드코딩이 될 것 같습니다.
루프를 돌면서 인터널테이블의 필드를 하나씩 가져올수 있는 방법이 있을까요?
댓글 12
-
테라스
2009.09.07 20:10
-
은미짱
2009.09.07 23:54
위에 주신 소스 조금 수정해서 해봤습니다.
하지만 숫자를 넣었을때는 잘 되는데
space 나 ' '를 넣었을때는
안먹는것 같네요. 왜 그럴까요?? -
은미짱
2009.09.08 01:03
itab의 내용을 파일에 쓰는데,
파일의 한 줄이라도 빈 줄이 있으면 그 파일을 읽는 쪽에서 에러가 납니다.
그래서 값이 없는 경우 공백을 주려고 합니다.
if wa = ''.
wa = ' '.
이런식으로 하려는게 제 의도거든요...
-
테라스
2009.09.08 18:37
data: a type c.
a = ''.
if a is initial.
write:/ 'a'.
endif.
a = ' '.
if a is initial.
write:/ 'b'.
endif.
a = space.
if a is initial.
write:/ 'c'.
endif.
clear a.
if a is initial.
write:/ 'd'.
endif.
이 프로그램을 실행하면 a,b,c,d 모두 출력됩니다.
결국 space나 ' ', '' 은 initial 과 같은것으로 처리되어
initial인 필드에 space를 준다고 해도 같은 에러가 발생할 것으로 생각됩니다.
-
정군
2009.09.08 18:55
부연을 하자면, space, '' , ' ' 가 모두 같은 것은 아닙니다.
정확하게는 space = ' ' 이고 '' 는 initial 입니다.
변수의 선언을 char로 하셨기 때문에 ' '가 '' 와 같아진 것 뿐입니다.
그리고, 테이블에 필드를 추가하면서 initial을 해주지 않은 경우를 제외하고는
모든 db에 들어오는 값은 null은 없습니다.
initial이랑 null이랑도 다릅니다.
-
테라스
2009.09.08 19:30
정군님 설명에 감사드립니다.
설명을 읽고 위의 소스에서 데이터 타입을 n, i, p등 으로 변경해서 실험해봤더니 a,b,c,d 모두 출력이 됩니다.
변수의 타입을 어떤것으로 선언하면 space와 initial의 차이를 확인해볼수 있을지 조언 부탁드립니다.
-
은미짱
2009.09.08 21:01
결국 명확하게 space를 넣어줄 수 있는 방법은 없는거군요...
어렵네요 ^^;
답변 주신 분들 감사합니다.
-
MadMax
2009.09.08 21:56
인터널 테이블 field 의 정보를 가지고 오는 다른 방법 입니다.
field 의 이름과 field 속성(type, length 등)을 알 수 있습니다.
참고하세요..
DATA: lt_sydes TYPE sydes_desc,
l_cnt1 TYPE i,
l_cnt2 TYPE i,
l_cnt3 TYPE i,
l_fld(01),
l_names TYPE sydes_nameinfo,
l_types TYPE sydes_typeinfo.
DESCRIBE FIELD gt_result1 INTO lt_sydes.
DELETE : lt_sydes-types INDEX 1,
lt_sydes-names INDEX 1.
* DESCRIBE TABLE lt_sydes-names LINES l_cnt2.
DESCRIBE TABLE lt_sydes-types LINES l_cnt2.
* l_cnt1 = l_cnt1 - l_cnt2.
CLEAR l_cnt1.
DO l_cnt2 TIMES.
ADD 1 TO l_cnt1.
READ TABLE lt_sydes-types INTO l_types INDEX l_cnt1.
l_cnt3 = l_types-idx_name - 1.
READ TABLE lt_sydes-names INTO l_names INDEX l_cnt3.
IF l_cnt1 < 2.
MOVE 'X' TO l_fld.
ELSE.
MOVE ' ' TO l_fld.
ENDIF.
ldf_name : l_fld l_names-name l_names-name
l_types-output_length 'C' ' '.
ENDDO. -
정군
2009.09.08 22:54
테스트 때문에 여러번 썼다 지우게 되네요...
일단, 제가 틀렸습니다. 정확하지 못한 정보 드린점 사과드립니다.
특히 좋은 글 들아주신 테라스님께 죄송하단 말씀 드립니다.
제가 기억하고 있던 결과와 그 당시의 테스트를 제가 정확히 기억하고 있지 못했고, 잘못 알고 있었습니다.
일단, ABAP에서 사용할 때는 타입에 크게 구애받지 않고
initial, ' ', '', '0' 등이 동일하게 적용되는 것으로 판단됩니다.
테스트 코드는 아래의 1번 입니다.
다음으로 테스트한 것은 - 제가 잘못 알고 있게된 근거? 입니다. -
natvie sql을 사용한 것입니다.
별 차이 없지만 fail이 나타납니다.
실데이터는
ZCHAR ZNUM
' ' <- 공백 한개 0000
입니다.
아래는 소스 코드 입니다. 보시고, 잘못 코딩한 것은 짚어 주시면 좋겠습니다.
개인적으로는 다시 잘못된 것을 바로 잡아 좋긴 합니다만...
다른 분들께 틀린 정보를 제공하게 되어서 무척 죄송합니다.
REPORT z_val_type .
START-OF-SELECTION.
DATA: lv_cha(4) TYPE c,
lv_num(4) TYPE i.
CLEAR: lv_cha, lv_num.
IF lv_cha = ' '.
WRITE:/ 'space'.
ENDIF.
IF lv_cha = ' '.
WRITE:/ 'four space'.
ENDIF.
IF lv_cha IS INITIAL.
WRITE:/ 'initial'.
ENDIF.
IF lv_cha = ''.
WRITE:/ 'two quotation'.
ENDIF.
IF lv_cha = space.
WRITE:/ 'SPACE'.
ENDIF.
* BREAK-POINT.
WRITE:/ .
IF lv_num = ' '.
WRITE:/ 'space'.
ENDIF.
IF lv_num = ' '.
WRITE:/ 'four space'.
ENDIF.
IF lv_num IS INITIAL.
WRITE:/ 'initial'.
ENDIF.
IF lv_num = ''.
WRITE:/ 'two quotation'.
ENDIF.
IF lv_num = space.
WRITE:/ 'SPACE'.
ENDIF.
CLEAR: lv_cha, lv_num.
WRITE:/.
WRITE:/'By OPEN SQL'.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE znum = ' '.
IF sy-subrc = 0.
WRITE:/ '[num filed 0] = '' '' => success'.
ELSE.
WRITE:/ '[num filed 0] = '' '' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE znum = ''.
IF sy-subrc = 0.
WRITE:/ '[num filed 0] = '''' => success'.
ELSE.
WRITE:/ '[num filed 0] = '''' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE zchar = ' '.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE zchar = ''.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '''' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '''' => fail'.
ENDIF.
WRITE: /.
WRITE:/'By NATIVE SQL'.
EXEC SQL.
select zchar into :lv_cha
from ztypetest
where zchar = ' '
and ROWNUM <= 1.
ENDEXEC.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF.
WRITE: /.
EXEC SQL.
select zchar into :lv_cha
from ztypetest
where zchar = ' '
and ROWNUM <= 1.
ENDEXEC.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF. -
요요
2009.09.09 01:43
initial 과 space 는 좀 다릅니다. space 는 black character 로 c type 데이터에 대한 초기값을 이야기합니다.
initial 은 data object 즉 일반 변수, 구조, 내부테이블등에 모두 적용되는 내용이구요.
(Predefined ABAP Types 참조)
아밥에서 space 공백 1자리를 얘기하는 것이 아니라 c type 의 초기값이라고 보시면 되요.
아니라면 char 10자리 변수는 공백이 10개가 있어야 하는데 실제로는 없는 것처럼 보이죠.
공백표시를 space 가 아닌 null 로 해보시면 어떨까 하는 생각이 드네요.
방법은 CLEAR variable WITH NULL. 이라고 하시면 됩니다.
해결이 되시길 바랍니다.
-
은미짱
2009.09.09 03:42
CLEAR variable WITH NULL.
을 써보니 변수안에 '#'이 들어가네요.
-
요요
2009.09.09 19:37
null 이 #로 표시되긴 하죠...ㅠ
특수문자 ' ' 를 사용하시면 어떨까요?
ㄱ->한자키->1번
DO.
ASSIGN COMPONENT SY-TABIX OF STRUCTURE "인터널테이블명" TO <WA>.
IF SY-SUBRC = 0.
IF <WA> IS INITIAL.
<WA> = SPACE.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
이렇게 하시면 될듯 합니다.