Вы можете сделать это намного проще. Сначала легче кодировать, а потом легче поддерживать.
Создать таблицу, tblStockItems , с 2 полями: item_id (первичный ключ); и item_name.
item_id item_name
1 Baileys
2 Becks
3 Bulmers
Создать другую таблицу, tblScratchInventory , с 2 числовыми полями: item_id; и количество.
Создайте этот запрос и сохраните его как qryScratchInventory :
SELECT
inv.item_id,
items.item_name,
inv.quantity
FROM
tblScratchInventory AS inv
INNER JOIN tblStockItems AS items
ON inv.item_id = items.item_id
ORDER BY items.item_name;
Создайте непрерывную форму, которая использует qryScratchInventory в качестве источника записи. Установите для свойств формы «Разрешить добавления» и «Разрешить удаление» значение «Нет». Во время открытия формы вы можете «освежить» tblScratchInventory, чтобы подготовить ее к записи нового набора значений инвентаризации.
Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim strSql As String
Set db = CurrentDb
strSql = "DELETE FROM tblScratchInventory;"
db.Execute strSql, dbFailOnError
strSql = "INSERT INTO tblScratchInventory ( item_id )" & vbCrLf & _
"SELECT tblStockItems.item_id" & vbCrLf & _
"FROM tblStockItems;"
db.Execute strSql, dbFailOnError
Set db = Nothing
Me.Requery
End Sub
Вы должны также включить обработчик ошибок для решения любых проблем, которые dbFailOnError появляются.
Добавьте командную кнопку cmdDone в нижний колонтитул формы. Используйте этот код в качестве события клика.
Private Sub cmdDone_Click()
Dim lngNumNulls As Long
Dim strNullItems As String
Dim strMsg As String
If Me.Dirty Then Me.Dirty = False
lngNumNulls = DCount("*", "tblScratchInventory", "quantity Is Null")
Select Case lngNumNulls
Case 0
' do what you need here '
' then close the form: '
DoCmd.Close acForm, Me.name
Case Is <= 6 ' list individual items if not too many of them '
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim strSql As String
strSql = "SELECT item_name" & vbCrLf & _
"FROM qryScratchInventory" & vbCrLf & _
"WHERE quantity Is Null" & vbCrLf & _
"ORDER BY item_name;"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSql)
With rs
Do While Not .EOF
strNullItems = strNullItems & vbCrLf & !item_name
.MoveNext
Loop
.Close
End With
Set rs = Nothing
Set db = Nothing
strMsg = "Please input quantities for these items: " & strNullItems
Case Else
strMsg = "Please input quantities for all items."
End Select
If Len(strMsg) > 0 Then
MsgBox strMsg
End If
End Sub
Я не уверен, что вы хотите сделать со значениями инвентаря после того, как убедитесь, что все элементы запасов имеют ненулевые значения (Случай 0, «делайте то, что вам нужно здесь» в cmdDone_Click). Возможно, вы хотите, чтобы оператор UPDATE переносил количества в другую таблицу (TblStock?). Или, возможно, вы можете основать форму на запросе TblStock вместо использования qryScratchInventory в качестве промежуточного шага.