我正在进行表单设计,我希望用户从组合框中选择购买项目并输入单价和购买数量。用户选择和输入的所有信息都将添加到另一个表中。在这里,我使用Do Until Loop逐个添加购买记录。我尝试了Do Until Loop。它运作良好。但是,当我结束时,这个循环使用Insert Into语句我收到了语法错误。请帮我查一下问题所在。谢谢。
我的代码:
Private Sub Command133_Click()
Dim i As Integer
i = 1
Do Until IsNull(Me.Controls("cboPurchaseItem" & i))
Dim StrSql As String
StrSql = "Insert Into test2 (PurchaseID,
PurchaseDate,
ExpectedDeliveryDate,
Supplier,
PurchaseItem,
Unit,
PurchaseQuantity,
UnitCost,
OrderStatus,)" & _
" VALUES('" & Me!txtOrderID & "',
#" & Format(Me!txtOrderDate, "yyyy/mm/dd") & "#,
#" & Format(Me!txtDeliveryDate, "yyyy/mm/dd") & "#,
'" & Me!cboSupplierCompany & "',
'" & Me.Controls("cboPurchaseItem" & i) & "',
'" & Me.Controls("txtUnit" & i) & "',
" & CStr(Me.Controls("TxtQty" & i)) & ",
" & CStr(Me.Controls("TxtPrice" & i)) & ",
'Ordered')"
CurrentDb.Execute (StrSql)
MsgBox " You have successfully added " & i & " records to the PurchaseOrderDetail table."
i = i + 1
Loop
End Sub
答案 0 :(得分:0)
使用querydef对象考虑参数化SQL查询(现代编程中的最佳实践),避免使用引号或数字来包含值。只需在string语句顶部添加PARAMETERS
子句,然后在循环中迭代绑定值。
对于空白时失败的组合框,可能是由于VBA nullstring无法在查询中作为字符串文字传递。要解决此问题,请尝试使用Nz()函数在组合框为空时返回零长度字符串值。
Dim qdef As Querydef
Dim i As Integer: i = 1
Dim StrSql As String
' PREPARE SQL STATEMENT '
StrSql = "PARAMETERS [PIDParam] Integer, [PDateParam] Datetime," _
& " [EDDateParam] Datetime, [SupplierParam] Text(255)," _
& " [PItemParam] Text(255), [UnitParam] Text(255), [PQtyParam] Long," _
& " [UnitCostParam] Double, [OrderStatusParam] Text(255);" _
& " INSERT INTO test2 (PurchaseID, PurchaseDate," _
& " ExpectedDeliveryDate, Supplier, PurchaseItem, Unit," _
& " PurchaseQuantity, UnitCost, OrderStatus)" _
& " VALUES ([PIDParam], [PDateParam], [EDDateParam]," _
& " [SupplierParam], [PItemParam], [UnitParam], [PQtyParam]," _
& " [UnitCostParam], [OrderStatus]);"
Do Until IsNull(Me.Controls("cboPurchaseItem" & i))
' INITIALIZE QDEF '
Set qdef = CurrentDb.CreateQyerydef("", StrSqL)
' BIND PARAMETERS TO STATEMENT '
qdef!PIDParam = Me!txtOrderID
qdef!PDateParam = Me!txtOrderDate
qdef!EDDatePram = Me!txtDeliveryDate
qdef!SuppierPram = Nz(Me!cboSupplierCompany)
qdef!PItemParam = Nz(Me.Controls("cboPurchaseItem" & i))
qdef!UnitParam = Me.Controls("txtUnit" & i)
qdef!PQtyParam = CStr(Me.Controls("TxtQty" & i))
qdef!UnitCostParam = CStr(Me.Controls("TxtPrice" & i))
qdef!OrderStatusParam = "Ordered"
' EXECUTE APPEND QUERY '
qdef!Execute dbFailOnError
i = i + 1
Loop
MsgBox "You have successfully added " & i _
& " records to the PurchaseOrderDetail table.", vbInformation, "APPEND SUCCESS"
Set qdef = Nothing