2013-06-27 121 views
3

我在這裏有一個非常簡單的SQL查詢 - 重點是查看發票說明並標記發票,如果它不是有效的狀態。下面是我的代碼和功能:SQL查詢返回查詢中的數據類型不匹配 - 爲什麼?

查詢:

CurrentDb.Execute "UPDATE Processing " & _ 
"SET [Invoice Flag] = True " & _ 
"WHERE isValidState(getState([Inv Description])) = False" 

的getState從發票說明分裂發票的描述字符串

Public Function getState(description As String) As String 
    Dim s() As String 
    s = Split(description, ".") 
    If (UBound(s) > 1) Then 
     getState = s(UBound(s) - 1) 
    Else 
     getState = " " 
    End If 
End Function 

IsValidState。如果一個有效的狀態返回布爾或不

Public Function isValidState(st As String) As Boolean 
    Dim db As Database 
    Dim rs As Recordset 
    Set db = CurrentDb 
    Set rs = db.OpenRecordset("tblStates", dbOpenSnapshot) 
    rs.FindFirst ("StateCode = '" & st & "'") 
    If rs.NoMatch Then 
     isValidState = False 
    Else 
     isValidState = True 
    End If 
    rs.Close 
End Function 

任何線索或幫助表示讚賞。我發現這個錯誤在日期中發生了很多,但這裏並不是這種情況。數據記錄可能有一些行是空的 - 所以這可能與它有關?無論哪種方式,我都無法對這些空洞的描述做任何事情 - 我也不知道應該如何起作用。由於存在IF/ELSE語句,它應該簡單地返回布爾值並標記發票。

回答

2

如果[INV說明]可以Null那麼作爲

Public Function getState(description As String) As String 

你需要將其聲明爲

Public Function getState(description As Variant) As String 

再處理使用類似的空情況下,你不能聲明你的函數

If IsNull(description) Then 
    getState = "" ' or whatever 
Else 
    ' remaining code as before 
+0

太棒了!謝謝!工作出色。 – user2296381

2

通過以開頭對SQL錯誤進行故障診斷3210而不是UPDATE聲明。創建一個新的查詢,切換到SQL視圖,並在此SQL粘貼:

SELECT 
    *, 
    getState(Nz([Inv Description],'')) AS state_code 
FROM Processing 
WHERE 
    isValidState(getState(Nz([Inv Description],''))) = False 

Nz()表達將改變一個空[Inv Description]爲一個字符串,這是你的getState()功能要求。 (空是的字符串。)

如果一切正常,沒有錯誤,修改你的UPDATE查詢使用相同的WHERE條款。

+0

太棒了!謝謝!很高興知道,我總是有這樣的印象:String可能爲空= /因此,如果你Dim x As String,你有一個空字符串?也許我只是一個新手或什麼的。總之,謝謝! – user2296381

+0

一個空字符串(「零長度字符串」)有時被稱爲「空字符串」...實際上甚至有一個名爲常量的VBA,* vbNullString * ...但它與Null不同。這個問題混淆了人們的看法,但是一旦你明白了區別,你就會記得它在一段漫長的時間裏。 :-) – HansUp