Member 13141488 Ответов: 1

Получение ошибки 3134 при закрытии формы t когда она пуста


Private Sub Form_Close()
        Dim sSQL, stringSQL As String
        Dim rst As DAO.Recordset

    sSQL = "SELECT BarCode, [Goods Name] FROM tblInventory WHERE BarCode='" & Me.ID & "'"
    Set rst = CurrentDb.OpenRecordset(sSQL)
    If rst.EOF Then
        stringSQL = "INSERT INTO tblInventory(BarCode,[Goods Name],Unit,[Unit Price],[Initial Stock],[Current Stock],[Exit Item]) values('" & Me.ID & "','" & Me.Description & "','" & Me.Unit & "'," & Replace(Format(Me.Price, "0.00"), ",", ".") & "," & Me.Amount & "," & Me.Amount & ",0)"
        DoCmd.SetWarnings False
        DoCmd.RunSQL (stringSQL)
        DoCmd.SetWarnings True
    Else
        stringSQL = "UPDATE tblInventory SET [Current Stock]=[Current Stock]+" & Me.Amount & " WHERE BarCode='" & Me.ID & "'"
        DoCmd.SetWarnings False
        DoCmd.RunSQL (stringSQL)   // the error is at this location// 
        DoCmd.SetWarnings True
    End If
    rst.Close
End Sub

Private Sub ID_AfterUpdate()
    Dim sSQL As String
    Dim rst As DAO.Recordset

    sSQL = "SELECT BarCode, [Goods Name], Unit, [Unit Price] FROM tblInventory WHERE BarCode='" & Me.ID & "'"
    Set rst = CurrentDb.OpenRecordset(sSQL)
    If rst.EOF Then
        MsgBox "New Parts"
        Me.Description.SetFocus
    Else
        Me.Description = rst(1).Value
        Me.Unit = rst(2).Value
        Me.Price = rst(3).Value
        Me.Amount.SetFocus
    End If
    rst.Close
End Sub


Что я уже пробовал:

Я также заметил, что если я добавлю только 1 элемент, он работает. но не позволяет вводить другой элемент в таблицу. Я должен закрыть форму, прежде чем она добавит еще один элемент. Это база данных Access, которую я использую в Access 2010, она разрабатывается для отслеживания инвентаря. У меня есть таблица, которая получает входящий инвентарь, jave принимает входящий и перемещает его в таблицу с именем tblinventory, когда я вхожу в новый элемент, он делает то, что должен делать. однако, если я пытаюсь ввести другой элемент, этот элемент не попадает в tblinventory, он отображается на tblincoming. Я также заметил, что если я передумаю и закрою форму ввода для входящих, я получаю сообщение об ошибке 3134, форма на данный момент пуста. Я пытался изменить код, но они получали ошибку после ввода каждого элемента. поэтому вернулся к исходной ошибке. когда я отлаживаю, он показывает в строке DoCmd.RunSql (stringSQL), я прокомментировал строку в коде.

Jochen Arndt

Ошибка 3134 - это "синтаксическая ошибка в операторе INSERT INTO".

Вы сказали нам, что ошибка возникает во время обновления, где я ожидал бы другую ошибку, такую как 3144 ("синтаксическая ошибка в операторе обновления").

В любом случае, вы должны распечатать stringSQL чтобы увидеть, что передается, и проверить его на наличие ошибок.

1 Ответов

Рейтинг:
1

Patrice T

Не ответ на ваш вопрос, но все же проблема в вашем коде.

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]