#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. Попробуйте декомпилировать свой проект, затем перекомпилируйте его