INSERT INTO - ошибки, но разрешает ввод в таблицу - PullRequest
0 голосов
/ 26 мая 2020

По причинам, которые я не вижу, я получаю следующее сообщение об ошибке:

Ошибка компиляции: метод или элемент данных не найден

, когда я использую следующее:

Private Sub cmd_Add_Click()

Dim strSQL As String

strSQL = " INSERT INTO BERTHAGE " _
& "(BOAT, LOCATION, BERTH_WEEK, BERTH_YEAR, BERTHED) VALUES " _
    & Me.Add_Boat & "','" _
    & Me.LOCATION & "','" _
    & Me.txt_week & "','" _
    & Me.txt_year & "','" _
    & Me.In_Port & "');"

cmd_Clear_Click

End Sub

Как только я нажимаю ОК и использую кнопку refre sh, запись помещается в базу данных, но каждый раз, когда я делаю запись, мне приходится go выполнять тот же процесс.

Я хотел бы выяснить, какой метод или какие данные отсутствуют?

Я должен добавить, что в этой таблице есть поле первичного ключа, превосходящее количество (Berth_ID), и каждый раз, когда я использую кнопку cmd_Add, для новой записи создается новый идентификационный номер. Это включает создание нового идентификационного номера для новой записи, которая вызывает ошибку.

Вот весь VBA, связанный с этой формой

Private Sub Form_Load()
DoCmd.RunCommand acCmdRecordsGoToLast
End Sub

Private Sub LOCATION_Change()
    Me.txt_Cur_Flo = Me.LOCATION.Column(1)
    Me.txt_Cur_Doc = Me.LOCATION.Column(2)
    Me.txt_Cur_Ori = Me.LOCATION.Column(3)
End Sub

Private Sub cmd_Add_Click()

Dim strSQL As String

strSQL = " INSERT INTO BERTHAGE " _
& "(BOAT, LOCATION, BERTH_WEEK, BERTH_YEAR, BERTHED) VALUES " _
    & Me.Add_Boat & "','" _
    & Me.LOCATION & "','" _
    & Me.txt_week & "','" _
    & Me.txt_year & "','" _
    & Me.In_Port & "');"

cmd_Clear_Click

End Sub

Private Sub cmd_Clear_Click()
Me.Add_Boat = ""
Me.LOCATION = ""
Me.txt_Cur_Flo = ""
Me.txt_Cur_Doc = ""
Me.txt_Cur_Ori = ""  
Me.Add_Boat.SetFocus
End Sub

Private Sub cmd_Close_Click()
DoCmd.Close
End Sub

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

Рассмотрим передовой метод параметризации , а не конкатенации строк SQL, смешанных с переменными VBA. Из-за отсутствия кавычек компилятор пытается ссылаться на имя столбца, а не на его буквальное значение. Вместо этого рассмотрите возможность параметризации с определенными типами, которая поддерживается Access SQL с использованием QueryDefs . Обратите внимание: SQL и VBA являются отдельными.

SQL (сохранить как сохраненный запрос)

PARAMETERS prmBoat TEXT, prmLoc INT, prmBerthed INT;
INSERT INTO BERTHAGE (BOAT, LOCATION, BERTHED)
VALUES(prmBoat, prmLoc, prmBerthed)

VBA

Dim db As Database
Dim qdef As QueryDef
Dim strSQL As String

Set db = CurrentDb
Set qdef = db.QueryDefs("mySavedParamQuery")

' BIND PARAM VALUES
qdef!prmBoat = Me.Add_Boat
qdef!prmLoc = Me.LOCATION
qdef!prmBerthed = Me.In_Port

' EXECUTE ACTION QUERY
qdef.Execute

Set qdef = Nothing
Set db = Nothing

Еще лучше, сохраните свой запрос с неповрежденными элементами управления формы и просто вызовите OpenQuery :

SQL (сохранить как сохраненный запрос)

INSERT INTO BERTHAGE(BOAT, LOCATION, BERTHED)
VALUES(Forms!myForm!Add_Boat, Forms!myForm!LOCATION, Forms!myForm!In_Port)

VBA

Private Sub cmd_Add_Click()
   Dim strSQL As String

   DoCmd.SetWarnings False                   ' TURN OFF APPEND PROMPTS
   DoCmd.OpenQuery "mySavedActionQuery"
   DoCmd.SetWarnings True                    ' RESET WARNINGS

   Call cmd_Clear_Click

End Sub
1 голос
/ 26 мая 2020

Отсутствует открывающая скобка после VALUES. Также отсутствует апостроф перед Me.Add_Boat. Эти специальные символы всегда должны быть парами, четное число при подсчете.

Если Berth_Week и Berth_Year - числовые поля (и должны быть), не используйте разделители апострофов.

Если In_Port - поле Да / Нет, не используйте разделители апострофов.

0 голосов
/ 27 мая 2020

Проблема, похоже, в том, что я удваивал вводимые данные в поля «неделя» и «год». это происходило (я полагаю), потому что эти поля текстового поля уже получали доступ к информации о неделе и году непосредственно из значения по умолчанию в таблице BERTHAGE. По сути, я просматривал каждый ввод и запускал его индивидуально, ожидая появления ошибки. Как только это произошло, я убрал его из оператора INSERT INFO. С удалением недели и года все работает. Это было болезненное упражнение, и оно все еще не завершено, но я вернулся к функции form / DB, поэтому я возьму на себя небольшие победы, когда они произойдут.

Private Sub cmd_Add_Click()

Dim strSQL As String
CurrentDb.Execute " INSERT INTO BERTHAGE " & "(BOAT, LOCATION, BERTHED) VALUES ('" &     Me.Add_Boat & "'," _
    & Me.New_Loc & "," _
    & Me.In_Port & ");"

cmd_Clear_Click

DoCmd.Requery

End Sub`
...