我在这里有一个非常简单的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语句,它应该只返回布尔值并标记发票。
答案 0 :(得分:2)
如果[Inv Description]可以是Null
,那么您不能将您的函数声明为
Public Function getState(description As String) As String
您需要将其声明为
Public Function getState(description As Variant) As String
然后使用
之类的东西处理Null案例If IsNull(description) Then
getState = "" ' or whatever
Else
' remaining code as before
答案 1 :(得分:2)
以SELECT
而不是UPDATE
语句开头,对SQL错误进行故障排除。创建一个新查询,切换到SQL视图,然后粘贴到此SQL:
SELECT
*,
getState(Nz([Inv Description],'')) AS state_code
FROM Processing
WHERE
isValidState(getState(Nz([Inv Description],''))) = False
Nz()
表达式会将Null [Inv Description]
转换为字符串,这是getState()
函数所要求的。 (Null 不一个字符串。)
如果它没有错误,请修改您的UPDATE
查询以使用相同的WHERE
子句。