2016-07-04 127 views
0

我在表单设计中工作,我希望用户从组合框中选择购买项目并键入单价和购买数量。用户选择和键入的所有信息将被添加到另一个表中。这里我使用Do Until Loop逐个添加购买记录。我尝试了Do Until Loop。它运作良好。然而,正如我结束,这与循环Insert Into语句我收到一个语法错误。请帮我检查问题出在哪里。谢谢。访问中的SQL插入语句的语法错误

我的代码:

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

我发现了一个错误。 OrderStatus后错误地输入了一个逗号“,”。这是错误信息。令我惊讶的是,Me!cboSupplierCompany和Me.Controls(“cboPurchaseItem”&i)中的数据无法添加到表中空白处。 –

回答

0

考虑使用它避免了引号或数字括值需要QueryDef对象参数化的SQL查询(在现代编程最佳实践)。只需在字符串语句顶部添加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