3

我在这里有一个非常简单的 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 语句,它应该简单地返回布尔值并标记发票。

4

2 回答 2

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
于 2013-06-27T17:16:46.103 回答
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子句。

于 2013-06-27T17:46:25.610 回答