문제는 RAGES 가 아니라..WHRER 조건이 문제인거같은데요
WHERE a~erdat in r_Date
AND a~auart = i_TYPE
OR a~vbeln = i_NUMBER
OR b~posnr = i_ITEM
OR b~matnr = i_MATErial
OR b~matkl = i_GROUP.
a~erdat in r_Date 이부분만 두고 나머진 주석처리를 하고 실행을 해보면 RANGE 변수에 대한 조건으로
값을 잘 가져옵니다..
근데 주석을 풀면...RANGE 변수에만 값을 줫음에도 불구하고 더 많은 값을 가져옵니다...
아응....해결책좀~~
당연한 결과 겠지요..문장이 OR 로 연결되어 있으니까요..
일자가 필수필드로 되어 있으니까 일자로 자료를 불러와서 필수 필드가 아닌것들의 자료를 지우는 방법이 있게죠(첫째)
그리고 필수 필드가 아닌것들은 IN 명령어로 해결이 가능하니까 RANGES 변경해서 쿼리를 생성할수도 있겠죠(둘째)
소스를 올려놨으니까.. 보시고 해결해 보세요...(같이 공부하시는 분이 물어보셔서 내용을 너무 잘 알죠...ㅎㅎ)
첫째 ranges : r_erdat for vbak-erdat.
r_erdat-sign = 'I'.
r_erdat-option = 'BT'.
r_erdat-high = i_fdate.
r_erdat-low = i_edate.
append r_erdat.
select erdat auart vbeln posnr matnr matkl
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM zvhar001
WHERE erdat in r_erdat.
IF NOT ( I_NUMBER IS INITIAL ).
DELETE GT_ITAB WHERE EBELN <> I_NUMBER.
ENDIF.
IF NOT ( I_TYPE IS INITIAL ).
DELETE GT_ITAB WHERE AUART <> I_TYPE.
ENDIF.
IF NOT ( I_ITEM IS INITIAL ).
DELETE GT_ITAB WHERE POSNR <> I_ITEM.
ENDIF.
IF NOT ( I_NUMBER IS INITIAL ).
DELETE GT_ITAB WHERE MATNR <> I_MUMBER.
ENDIF.
IF NOT ( I_MATKL IS INITIAL ).
DELETE GT_ITAB WHERE MATKL <> I_MATKL.
ENDIF.
둘째 ranges : r_erdat for vbak-erdat,
R_EBELN FOR VBAK-EBELN.
r_erdat-sign = 'I'.
r_erdat-option = 'BT'.
r_erdat-high = i_fdate.
r_erdat-low = i_edate.
append r_erdat.
IF I_NUMBER IS INITIAL.
REFRESh: R_EBELN.
ELSE.
r_EBELN-sign = 'I'.
r_EBELN-option = 'EQ'.
r_EBELN-low = I_NUMBER.
append r_EBELN.
ENDIF.
select erdat auart vbeln posnr matnr matkl
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM zvhar001
WHERE erdat in r_erdat
AND EBELN IN R_EBELN
AND AUART IN R_AUART
AND POSNR IN R_POSNR
AND MATNR IN R_MATNR
AND MATKL IN R_MATKL.
==> R_AUART, R_POSNR, R_MATNR, R_MATKL 도 같이 정의해주고 생성해 줘야 합니다..
즐밥하세요...