【问题标题】:Access Run-Time error 2465. Can't find the field '1' referred to in your expression. Can't find the Problem访问运行时错误 2465。找不到表达式中引用的字段“1”。找不到问题
【发布时间】:2020-09-24 12:04:44
【问题描述】:

我是 MS Access 的新手,在这里找不到问题。我的代码从一开始就工作,但现在我在尝试删除数据记录时不断收到此错误。这是我的代码:

Private Sub cmdLoeschen_Click()
    If MsgBoxYesNo(CancelOrderConfirmPrompt) Then
        If [Prozessspezifikationen].Delete(Me![Prozessspezifikation ID]) Then
            MsgBoxOKOnly CancelOrderSuccess
            eh.TryToGoToRecord acNewRec
        Else
            MsgBoxOKOnly CancelOrderFailure
        End If
    End If
End Sub

使用的删除功能:

Function Delete(ProzessspezifikationID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Prozessspezifikationen", "[Prozessspezifikation ID] = " & ProzessspezifikationID) Then
        Delete = rsw.Delete
    End If
End Function

地点:

  • [Prozessspezifikation ID] 是基础表中的主键
  • [Prozessspezifikationen] 是一个自增长整数
  • 该表包含多个外键

我使用以下查询来获取公式中所需的数据:

SELECT Prozessspezifikationen.*, Products.Bezeichnung, Products.ZeichnungsNr 
FROM Products
INNER JOIN Prozessspezifikationen 
   ON Products.ArtikelID = Prozessspezifikationen.ArtikelID;

由于我是 MS Access 的新手,而且它似乎不是语法错误,所以我有点迷茫。

RecordsetWrapper(摘录):

Option Compare Database
Option Explicit

Private m_rs As DAO.Recordset2

Public Function GetRecordsetClone(rs As DAO.Recordset2) As DAO.Recordset2
    If Not m_rs Is Nothing Then
        Debug.Assert False
    Else
        Set m_rs = rs.Clone
        Set GetRecordsetClone = m_rs
    End If
End Function

OpenRecordset 函数

Public Function OpenRecordset(Domain As String, _
                              Optional Criteria As String = "1=1", _
                              Optional OrderBy As String, _
                              Optional RecordsetType As DAO.RecordsetTypeEnum = dbOpenDynaset, _
                              Optional RecordsetOptions As DAO.RecordsetOptionEnum _
                              ) As Boolean
    
    
    If Not m_rs Is Nothing Then
        CloseRecordset
    End If
    
    Dim strSQL As String
    strSQL = "SELECT * FROM [" & Domain & "] WHERE " & Criteria
    
    If OrderBy <> "" Then
        strSQL = strSQL & " ORDER BY " & OrderBy
    End If
    
    On Error GoTo ErrorHandler
    Set m_rs = CurrentDb.OpenRecordset(strSQL, RecordsetType, RecordsetOptions)
    OpenRecordset = True

Done:
    Exit Function
ErrorHandler:
    Debug.Assert m_rs Is Nothing
    
    If eh.LogError("RecordsetWrapper.OpenRecordset", "strSQL = " & Chr(34) & strSQL & Chr(34)) Then Resume
End Function

删除函数

Public Function Delete() As Boolean
    On Error GoTo ErrorHandler
    
    m_rs.Delete
    Delete = True
    
Done:
    Exit Function
ErrorHandler:
    If eh.LogError("RecordsetWrapper.Delete") Then Resume
End Function

关闭记录集函数

Public Function CloseRecordset() As Boolean
    On Error GoTo ErrorHandler
    
    m_rs.Close
    CloseRecordset = True
    
Done:
    Set m_rs = Nothing
    Exit Function
ErrorHandler:
    If eh.LogError("RecordsetWrapper.CloseRecordset") Then Resume
End Function


Public Property Get Recordset() As DAO.Recordset2
    Set Recordset = m_rs
End Property


Private Sub Class_Terminate()
    If Not m_rs Is Nothing Then
        m_rs.Close
        Set m_rs = Nothing
    End If
End Sub

我希望你能帮助我。如果需要,我可以为您提供更多信息。

【问题讨论】:

  • 您遇到的错误是什么?
  • 标题中写着:Access Run-Time error-2465。找不到您的表达式中引用的字段“1”。
  • 如此复杂的代码。 :( 您至少应该指定触发错误的确切行,以及导致错误的调用堆栈。
  • @Andre If [Prozessspezifikationen].Delete(Me![Prozessspezifikation ID]) Then 正在触发。调用堆栈中没有其他内容(它甚至不调用删除方法)
  • Debugging VBA Code。尝试为相关对象添加调试监视。目前还不清楚,[Prozessspezifikationen] 实际上是什么对象。您代码中的 Delete() 方法没有参数,但您使用 ID 调用它。

标签: sql vba ms-access


【解决方案1】:

请在此处指定可选参数的默认值:

Public Function OpenRecordset(Domain As String, _
                              Optional Criteria As String = "", _
                              Optional OrderBy As String = "", _
                              Optional RecordsetType As DAO.RecordsetTypeEnum = DAO.RecordsetTypeEnum.dbOpenDynaset, _
                              Optional RecordsetOptions As DAO.RecordsetOptionEnum = DAO.RecordsetOptionEnum.dbConsistent _
                              ) As Boolean
    
    On Error GoTo ErrorHandler
    
    If Not m_rs Is Nothing Then
        CloseRecordset
    End If
    
    Dim strSQL As String
    strSQL = "SELECT * FROM [" & Domain & "]"
    
    If Criteria <> "" Then
        strSQL = strSQL & " WHERE " & Criteria
    End If    

    If OrderBy <> "" Then
        strSQL = strSQL & " ORDER BY " & OrderBy
    End If
    
    Set m_rs = CurrentDb.OpenRecordset(strSQL, RecordsetType, RecordsetOptions)
    OpenRecordset = True

Done:
    Exit Function
ErrorHandler:
    Debug.Assert m_rs Is Nothing
    
    If eh.LogError("RecordsetWrapper.OpenRecordset", "strSQL = " & Chr(34) & strSQL & Chr(34)) Then Resume
End Function

另外,由于你在调用函数时没有传递所有参数,所以显式传递参数名称

Function Delete(ProzessspezifikationID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset(Domain:="Prozessspezifikationen", Criteria:="[Prozessspezifikation ID] = " & ProzessspezifikationID) Then
        Delete = rsw.Delete
    End If
End Function

请参阅https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/understanding-named-arguments-and-optional-arguments 的文档

【讨论】:

  • 我更新了代码,删除了Criteria 的默认值,并引入了一个额外的If 块。让我知道这是否适合您。
  • 仍然不起作用,但似乎甚至没有调用删除功能(见帖子评论)
  • 尝试在导致错误的行添加一个断点,以确保函数确实没有被调用。另外,您为 strSQL 获得的结果值是多少(使用Debug.Print 将其打印到即时窗口?
  • 已经这样做了,确实在抛出错误之前它们没有被调用......因此我不能告诉你 strSQL 的结果值是什么:/
  • 尝试反编译你的项目,然后重新编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多