Rodney Mathew Ответов: 1

Как я могу вычесть количество из запаса? [VB6]


Мне нужно вычесть количество из таблицы, сопоставив идентификатор продукта. Если я запускаю приведенный ниже код, он вычитает некоторое количество, но проблема, например, заключается в следующем... Я ввожу идентификационный номер как 1 и должен дважды нажать кнопку вычесть, чтобы вычесть. Во второй раз я меняю идентификационный номер на 2 и нажимаю кнопку вычесть... В первый раз он вычитает из самого идентификатора номер 1. Но теперь, если я нажму еще раз, он вычтет из идентификатора номер 2. Как я могу решить эту проблему? Я использую MS Access в качестве базы данных(ADODB).

Option Explicit
Dim con As New ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String

Private Sub Command1_Click()
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset

con.Open (adodc1.ConnectionString)
sql = "UPDATE stock SET QTY = QTY - 1 WHERE ID = '" & IDval.Text & "'"
con.Execute (sql)
Adodc1.Recordset.Update
Adodc1.Refresh
con.Close
End Sub


Заранее спасибо

NewPast

А ты пробовал:
"Обновить набор акций QTY = (QTY - 1) WHERE (ID = '" & IDval.Текст & "')"

Maciej Los

Непонятный. Пожалуйста, будьте более конкретны и предоставьте более подробную информацию (примерные данные).

[no name]

Вы говорите "идентификационный номер", если считаете, что идентификатор-это число, но используете его в своем запросе, как если бы это была строка.

Maciej Los

Хорошая мысль!

Richard Deeming

Ваш код восприимчив к SQL-инъекция[^].

Параметризованные запросы не так просты с ADODB, как с .NET, но они все еще не особенно сложны:
Как вызвать параметризованный запрос ADO с помощью VBA/C++/Java[^]

1 Ответов

Рейтинг:
2

PhilLenoir

Не совсем ясно, что такое adodc1, но похоже, что у вас есть набор данных, открытый как adodc1.Recordset, и вы обновляете запись, используя другое соединение (con). Вызывает проблему блокировки записей/параллелизма.

Если вы используете adodc1.Recordset.Обновление, я должен предположить, что этот набор записей можно обновить. В этом случае не используйте отдельное соединение, просто обновите набор записей, который, вероятно, выглядит следующим образом:

Adodc1.Recordset.Filter = "ID = '" & IDval.Text & "'" 
If Adodc1.Recordset.EOF Then
    msgbox "Product ID " & IDval.Text & " not found"
Else
    Adodc1.Recordset("QTY") = Adodc1.Recordset("QTY")-1
    Adodc1.Recordset.Update
End If


Записи:
Что произойдет, если элемент управления IDval пуст (синтаксическая ошибка в фильтре)?
Если ID-это число, удалите разделители одинарных кавычек и используйте функцию Val () (это имеет дело с пустым элементом управления, так как он затем вернет ноль [предполагая, что ноль недопустим!])
Если приведенный выше код не работает с вашим объектом Adodc1, вам нужно будет предоставить мне точный класс (я предположил, что член набора записей является набором записей ADO).