Ошибка времени выполнения Access 2465. Не удается найти поле «1», на которое ссылается ваше выражение. Не удается найти проблему

#sql #vba #ms-access

#sql #vba #ms-access

Вопрос:

Я новичок в 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] = " amp; 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 [" amp; Domain amp; "] WHERE " amp; Criteria
    
    If OrderBy <> "" Then
        strSQL = strSQL amp; " ORDER BY " amp; 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 = " amp; Chr(34) amp; strSQL amp; 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
  

Функция CloseRecordset

 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
  

Надеюсь, вы сможете мне помочь. При необходимости я могу предоставить вам дополнительную информацию.

Комментарии:

1. Какую ошибку вы получаете?

2. В заголовке говорится: ошибка времени выполнения Access-2465. Не удается найти поле «1», на которое ссылается ваше выражение.

3. Такой запутанный код. 🙁 Вы должны хотя бы указать, какая именно строка вызывает ошибку, и стек вызовов, который приводит к ней.

4. @Andre If [Prozessspezifikationen].Delete(Me![Prozessspezifikation ID]) Then запускается. В стеке вызовов больше ничего нет (он даже не вызывает метод удаления)

5. Отладка кода VBA . Попробуйте добавить отладочные часы для соответствующих объектов. Неясно, что такое объект [Prozessspezifikationen] на самом деле. Метод Delete () в вашем коде не имеет параметров, но вы вызываете его с идентификатором.

Ответ №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 [" amp; Domain amp; "]"
    
    If Criteria <> "" Then
        strSQL = strSQL amp; " WHERE " amp; Criteria
    End If    

    If OrderBy <> "" Then
        strSQL = strSQL amp; " ORDER BY " amp; 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 = " amp; Chr(34) amp; strSQL amp; 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] = " amp; ProzessspezifikationID) Then
        Delete = rsw.Delete
    End If
End Function
  

Пожалуйста, ознакомьтесь с документами по адресу https://learn.microsoft.com/en-us/office/vba/language/concepts/getting-started/understanding-named-arguments-and-optional-arguments

Комментарии:

1. Я обновил код, удалив значение по умолчанию Criteria и ввел дополнительный If блок. Дайте мне знать, если это сработает для вас.

2. По-прежнему не работает, но похоже, что функция удаления даже не вызывается (см. Комментарий к сообщению)

3. Попробуйте добавить точку останова в строке, вызывающей ошибку, чтобы убедиться, что функции действительно не вызываются. Также какое результирующее значение вы получаете для strSQL (распечатайте его в немедленном окне, используя Debug.Print ?

4. Уже сделал это, действительно, они не вызываются до возникновения ошибки… Поэтому я не могу сказать вам, каково результирующее значение strSQL :/

5. Попробуйте декомпилировать свой проект, затем перекомпилируйте его