【问题标题】:Compile error MS Access SQL编译错误 MS Access SQL
【发布时间】:2015-05-09 03:19:11
【问题描述】:

我收到一个编译错误:“Argument not optional” 基本上在这段代码中,我试图做一个围绕表格样式的自动分配。调用代码时,它从AssignNullProjects() 开始,当我收到错误消息时,GetNextAssignee" & GetNextAssignee & " 部分中突出显示

我不确定如何修复它,下面是我的完整代码:

Public Function AssignNullProjects() As Long

    Dim db As dao.Database
    Dim rs As dao.Recordset
    Dim strSQL As String

    Set db = CurrentDb
    strSQL = "SELECT CFRRRID, [program], [language] FROM CFRRR WHERE assignedto Is Null"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    If Not rs.BOF And Not rs.EOF Then
        While Not rs.EOF
            strSQL = "UPDATE CFRRR SET assignedto = " & GetNextAssignee & ", assignedby = " & [Forms]![CFRRR]![assignedby] & ", Dateassigned = #" & Now & "#, actiondate = #" & Now & "#, Workername = " & _
                              [Forms]![CFRRR]![assignedto] & ", WorkerID = " & [Forms]![CFRRR]![assignedto] & " WHERE CFRRRID = " & rs!CFRRRID

            db.Execute strSQL, dbFailOnError
            rs.MoveNext
        Wend
    End If

    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing

End Function

Public Function GetNextAssignee(program As String, Language As String) As Long
'   Returns UserID as a Long Integer with the lowest [TS] value,
'   and updates same [TS] by incremented with 1.

    Dim db As dao.Database
    Dim rs As dao.Recordset
    Dim strSQL As String

    Set db = CurrentDb
    strSQL = "SELECT TOP 1 WorkerID FROM attendance WHERE [Programs] LIKE '*" & program & "*' AND [Language] = '" & Language & "' AND [Status] = '" & Available & "' ORDER BY TS ASC"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    If Not rs.BOF And Not rs.EOF Then
        'Found next assignee, update date/time stamp
'        strSQL = "UPDATE tblUser SET TS = " & DMax("[TS]", tblUser) + 1 & " WHERE [WorkerID]= " & rs!workerid
        strSQL = "UPDATE attendance SET TS = " & DMax("[TS]", "attendance") + 1 & " WHERE [WorkerID]= " & rs!workerid
        db.Execute strSQL, dbFailOnError
        GetNextAssignee = rs!workerid
    Else
        'Field TS has NO VALUE FOR ALL RECORDS!
        'Code calling this function should check for a return of 0 indicating an error.
        GetNextAssignee = 0
    End If

    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing

End Function

【问题讨论】:

  • GetNextAssignee 显然需要两个参数(programLanguage),如声明所示;您的调用代码都没有为它们提供& GetAssignee &)。你还期望发生什么? “要通过邮政部门投递,您的信件需要两件东西:一个投递地址,以及一张有足够邮资的邮票。您都没有提供。我们无法完成您投递这封信件的请求。”跨度>

标签: sql ms-access vba ms-access-2010


【解决方案1】:

调用此函数时,必须提供 2 个参数(字符串值):

Public Function GetNextAssignee(program As String, Language As String) As Long

但是在构建 UPDATE 语句时,您调用该函数时没有提供所需的参数:

strSQL = "UPDATE CFRRR SET assignedto = " & GetNextAssignee & ", assignedby = "

所以 Access 抱怨那些(字符串)参数不是可选的——你必须提供它们。当您为函数提供 2 个这样的字符串时,您的代码应该可以编译...

strSQL = "UPDATE CFRRR SET assignedto = " & GetNextAssignee("foo", "bar") & ", assignedby = "

虽然代码可以使用这些字符串进行编译,但函数可能不会返回您需要的结果。所以用现实值代替 foobar

【讨论】:

  • 我是否像在函数中那样键入它? " & GetNextAssignee(program As String, Language As String) As Long & " 但我收到一个错误,说列表分隔符或 ) 并且 As 突出显示。
  • 成功了,现在我在下半部分得到一个错误,说参数太少:预期 2。strSQL = "SELECT TOP 1 WorkerID FROM attendance WHERE [Programs] LIKE '*" & program & "*' AND [Language] = '" & Language & "' AND [Status] = " & ("Available") & " ORDER BY TS ASC" Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) 不过我可以问另一个问题。
  • 是的,这是一个不同的问题,所以一个新的问题是要走的路。当您编写该问题时,请在遇到新错误时粘贴来自Debug.Print strSQL 的输出。向我们展示实际失败的语句比只显示创建语句的代码更好。
  • 使用 Debug.Print 输入的问题:stackoverflow.com/questions/30142827/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多