2013-02-15 1 views
0

Where 문에있는 경우에만 데이터 형식이 일치하지 않는 식을 처리하고 있습니다. MS Access 식에서 데이터 형식이 일치하지 않습니다. where 문에서만

Current: IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0, 
IIf(DateAdd("yyyy",CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)) 
,CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))>Now(),True,False),True) 

당신이 볼 수 있듯이

, 나는 모든 기준에 Nz() 기능을 추가, 심지어 전체 명세서에 CBool()를 캐스팅했지만, 여전히 데이터 형식 불일치가 발생했습니다.

이 표현식을 정확히 찾아 냈습니다. 표현식은 정확히 Select에서 예상대로 작동합니다. Where 문에만 True 만 반환하면 오류가 발생합니다.

무엇이 누락 될 수 있습니까?

업데이트 : 관심있는

SELECT Student.TECH_ID, Student.CAPP_LVL, Values.ABBR, Values.SHORT_DESC, Values.LONG_DESC, Values.GROUP_NBR, Values.NBR_YRS_VALID, Student.SEQ_NBR, Student.CAPP_LVL_SCORE, Student.TEST_DATE, IIf(Nz([Values].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy",CInt([Values].[NBR_YRS_VALID]),CVDate(Format([TEST_DATE],"0000-00-00")))>Now(),True,False),True) AS [Current], Values.END_DATE, Student.LOAD_DATE 
FROM Student INNER JOIN Values ON Student.CAPP_LVL = Values.CAPP_LVL 
WHERE (((Values.ABBR)<>"MTHB") AND ((Values.END_DATE) Like "9999*")) 
ORDER BY Student.TECH_ID, Student.CAPP_LVL, Student.SEQ_NBR; 
+0

는 전체 쿼리를 공유하시기 바랍니다 수 있습니까? – Roger

답변

2

TEST_DATE의 데이터 유형 및 형식은 무엇입니까? 날짜/시간 데이터 유형을 만들고 데이터를 false로 평가하면 오류가 발생하지만 실제로 평가되면 오류가 발생합니다. 그 이유는 Select에서 작동하는 것을 볼 수 있습니다. TEST_DATE를 double로 만들고 nz 함수 (19981231)에서 형식을 사용하면 모든 경우에 적용됩니다.

+0

데이터 사전을 파헤쳐 야했습니다. ODBC를 통해 오는 char 데이터 형식입니다. 나는 'TEST_DATE'에 'CDbl()'을 캐스팅하려했지만 행운이 없었습니다. –

+0

그래서 데이터를 자세히 살펴 보겠습니다. TEST_DATE 데이터에 다른 날짜 형식을 사용하여 오류를 복제 할 수 있습니다. 나는 당신의 오류가 CVDate (업데이트 된 VBA 함수는 CDate이지만 생성 된 함수)에서 생성된다는 것을 확신합니다. 형식 명령은 어떻게 든 들어오는 날짜 중 하나를 왜곡하여 변환 할 수 없도록합니다. –

+0

당신 말이 맞아요. 나는 CVDate()를 CDate()로 변경하여 where 문에서 사용하려고 시도하고 오류가 발생했습니다. 이제 문제는 이러한 유형의 문제를 설명하는 방법입니다. 아이디어? –

0

Where 문에 대한 전체 쿼리는 Select 문처럼 보이지 않는다. 액세스는 이 참인지 거짓인지를 테스트 할 수있는 조건식을 기대합니다.

빠른 버전은 전체 문장을 가지고 True에 대한 테스트 될 것이다 :

WHERE (IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0, 
IIf(DateAdd("yyyy",CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)) 
,CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))>Now(),True,False),True)) 
= True 

더 나은 솔루션 AND 또는 OR에 합류 몇 가지 조건문으로 재 작성하는 것입니다. 나는 그것을 파싱하는 데 문제가있어, 그래서 나는 그것에 손을 대볼 생각이 없다.

0

이 나를 위해 작동합니다

NBR_YRS_VALID 및 TEST_DATE 모두
SELECT 
    IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy", 
     CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)), 
     CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00"))) 
     >Now(),True,False),True) 
     AS [Current], 
    ISRS_VAL_ST_CAPP_LVL.NBR_YRS_VALID, 
    ISRS_VAL_ST_CAPP_LVL.TEST_DATE 
FROM ISRS_VAL_ST_CAPP_LVL 
WHERE (((IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy", 
    CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)), 
    CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00"))) 
     >Now(),True,False),True))=true)); 

는 정수 (Long)

관련 문제