인풋 파라로 3개를 받는데요
1.회사코드 필수
2.고객코드 필수가 아닙니다.
3. 전기일 레인지 변수입니다.
2번째 필드가 문제인데요
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
and kunnr eq pkunnr <- 이 부분이 문젠데요
AND budat IN pbudat.
ENDSELECT.
만약 고객코드에 아무것도 안들어오면 고객코드가 비어져있는것만 찾을려고 하더라고요
전 그것을 원하는게 아닌데 저건 경우 혹
if 고객코드가 없을때.
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
AND budat IN pbudat.
ENDSELECT.
else 고객코드가 있을때
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
and kunnr eq pkunnr
AND budat IN pbudat.
ENDSELECT.
이런식으로 if를 걸어야하는건가요? 쫌 이상한데요
그리고 into사용시에는 endselect가 사용되지 않는것 아닌가요?
댓글 13
-
정군
2009.04.15 19:49
-
woong
2009.04.15 20:03
1. 쓰신 것처럼 if문을 사용해도 되고 parameter로 받은 변수를 select-option을 사용해 받으셔서 in을 사용하셔도 되고
range 를 변수를 선언해서 para로 받은 고개코드를 range에 담아 in으로 처리 해도 될 것같습니다
2. into 사용시 endselect 를 사용 하지 않는것이 아니라 into table '인터널테이블' 처럼 array patch의 경우에는 endselect를 사용하지
않습니다. into wa 처럼 work area 에 데이터를 한건 씩 담을 경우는 endselect를 사용해야 합니다
-
정군
2009.04.15 20:10
woong님...지적 감사합니다.
한참 생각하고 있었네요.
into table을 하면 한번에 들어가니 select ~ endselect하지 않죠. ㅡ.ㅡ;;
잘 안쓰는 문법엔 역시 약해지는 군요.
-
아밥고지를 찾아서
2009.04.15 21:49
아니 제가 묻는것은 eq = 와 같은 의미냐고 묻는것이 아니라
고객코드 필드에 아무런 값이 안들어왔을때의 문제입니다.
즉 고객필드를 레인지 변수로 잡았다고 가정하고
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs eq pbukrs
and kunnr IN pkunnr <-
AND budat IN pbudat.
ENDSELECT.
라면 고객코드가 비워줘있는 필드를 찾아 줄까요? 아니면 고객코드랑 상관없이 셀렉트를 해줄까요?
아니면 if를 써서 조건을 달리해야하고요
if 고객코드가 비워져있을떄
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
" and kunnr eq pkunnr 이 부분을 주석 처리함
AND budat IN pbudat.
ENDSELECT.
else. "고객코드가 있을경우
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
and kunnr eq pkunnr
AND budat IN pbudat.
ENDSELECT.
endif.
뭐 이런식으로 처리 해야하는건가요?
-
無念군
2009.04.15 22:21
고객필드를 레인지 변수로 잡으시고
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs eq pbukrs
and kunnr IN pkunnr
AND budat IN pbudat.
ENDSELECT.
BREAK-POINT . 하셔서 ..
itab_zfitkncitem << table 내역을 디버깅 해보시는걸 추천 드립니다 .. +_+
고객코드가 비워져 있는 값을 찾아 주는지 안찾아 주는지... -
슈퍼맨아들
2009.04.15 22:23
SELECT * INTO itab_zfitkncitem
FROM zfitkncitem
WHERE bukrs = pbukrs
and kunnr IN pkunnr <- 이부분
AND budat IN pbudat.
ENDSELECT.
IF문으로 나눌 필요없이 IN 조건으로 쓰면 되겠네요..
물론 SELECT문 위에 RANGES 선언하고, DATA 넣어주는 부분이 필요하겠죠..
한라인만 찾아야 한다면
SELECT * UP TO 1 ROWS
ENDSELECT.나
SELECT SINGLE * 을 사용하는 낫겠네요..
-
정군
2009.04.15 23:33
IN 안먹는다는게 제 글의 요지였습니다.
In조건에 있는 parameter에 값이 안들어오면, for로 선언한 경우에는 그 where 절을 무시합니다.
그리고 비워져 있다는
where kunner = ' '
이지 조건이 없는건 아니지 않은가요??
-
정군
2009.04.15 23:35
ST05로 open sql이 native로 어떻게 변환되는지 보시면 좋을 겁니다.
-
Bizzard.Chul
2009.04.16 02:05
저의 생각에는 Range를 사용하시거나 IF를 사용하는 방법밖에 없을것 같습니다.
다른 방법 더 있나요??
-
woong
2009.04.16 02:29
정군님....지적이라니요~
제가 누굴 지적할 만한 입장은 아니구요~ㅎㅎ
어떻게 아는게 하나 걸렸네요~^^
-
정군
2009.04.16 03:01
woong님
ㅎㅎ 아닙니다. 지적이란 표현이 좀 거슬리면 죄송합니다.
저는 댓글을 달면서 스스로 공부하는 중이라 생각하기 때문에, 틀린게 틀렸다고 말씀해 주시는게 무척 감사합니다. ^^
댓글이 활성화 되어서, 나는 이렇게 생각한다, 너는 어떻게 생각하느냐 하고 묻고 답하는 장이 되었으면 좋겠습니다.
-
정군
2009.04.16 03:02
Bizzard.Chul 님 의견에 공감합니다. -
woong
2009.04.16 22:39
정군 님
거슬린건 아니고 민망해서...ㅎㅎ
좋은 생각 이시네요...저도 지식이 얕아서 댓을 남길때 망설여지는데
말씀 들으니까 저도 남기면서 배워야 겟어요..ㅎㅎ
1. = 는 EQ 입니다.
위와 같이 IF문을 나눠도 동일한 결과 일듯 합니다. 만약 pkunnr이 range 변수로 선언되었다면, IN 변수와 함꼐 where절에서 사용되면 pkunnr에 아무런 조건이 없을 때, where절에서 조건이 없는 것과 같이 되기 때문에 IF 로 나눠줘야 할 듯 합니다.(아니면 가변 query)
그냥 parameter로 선언하신 거라면 신경 안쓰셔도 될 듯 합니다.
2. into로 사용하면 한 건이기 때문에 select와 endselect 사이에 로직을 넣는게 무의미 할 듯 한데요.
개인적으론 select ~ endselect는 사용하지 않기 때문에 에러가 났는지는 잘 기억이 안나네요.
여튼 무의미하니까 그냥 밖에 쓰시는게 맞을 듯 합니다.
into table일 때에나 데이터를 한건씩 patch한 다음 데이터를 가공할 의미가 있겠지요.