MS Access VBA从表单写入表

时间:2016-12-12 22:53:21

标签: mysql forms vba ms-access subform

  • 我有一个表单(采购订单)和一个子表单 (采购订单明细)。主窗体包含的编号 PO (文本框),供应商(组合框),员工(组合框), 状态(组合框),其中包含2条记录(新建和完成)和日期框(创建采购订单时)。子表单(数据表)包含产品(组合框),数量价格字段。

  • 我想要做的是在主表单上添加一个按钮 下。

  • 按下按钮时,应执行VBA代码并执行下一步操作。 从主表单中获取数据(采购订单编号,状态和日期) 和子表格(产品,数量和价格)并把所有这些 一张桌子(StockMovements)。

我设法用下一个代码来做到这一点:

Private Sub cmdOrder_Click()
Dim strSQL As String

    strSQL = "INSERT INTO StockMovement (ID_Product, Status, Quantity, ID_PurchaseOrder) VALUES (" & _
               Me.frmPurchaseOrderDetails_Subform.Form!comboboxProduct & ", '" & _
               Me!txtStatus & "', " & _
               Me.frmPurchaseOrderDetails_Subform.Form!txtQuantity & ", " & _
               Me!txtID_PurchaseOrder & ");"
    DoCmd.RunSQL strSQL
    Me.Requery

End Sub

然而,有两个问题:

  1. 正如您所看到的,我没有添加日期字段,因为我收到错误, 不记得它究竟是哪一个,但我想2075年;
  2. 代码在没有日期的情况下工作,但只添加一个产品 表,第一个。在采购订单中通常有更多 比一种产品。
  3. 因为我是VBA的新手,所以如果可能的话,我会请你像新手一样对待我并解释更详细。 (修正了代码,忘了改变语言。我的意思是我粘贴了错误的一个,现在它是正确的,但当然还没有工作:))

    谢谢!

2 个答案:

答案 0 :(得分:0)

1)如果您只对某个特定字段有疑问,我会查看该字段的特殊情况。输入可能格式化为字符串,字段格式为日期/时间。在这种情况下,尝试使用CDate() - 函数。我可以想象,最后一个.Value也可以解决这个问题。

Dim datDate as Date

datDate = CDate(Me!txtDate.Value)

2)您的代码只插入一行是绝对正确的。请记住,例如 Me!txtStatus.Value 是一个只包含一个数据的文本框。数据行保存在表格中,并且根据您使用主表单(=一行)选择的行,相应的值将显示在文本框中。

INSERT INTO table (field1,field2) VALUES (value1,value2) 

INSERT INTO每次执行时都插入一行。因此,您提到的代码中的SQL需要重复。你可以使用循环来完成。

Dim strSQL As String

strSQL = ""

 For Each Item In Group
    strSQL = strSQL & "INSERT INTO table (field1,field2) VALUES (value1,value2)"
 Next

在我看来,以这种方式复制数据对于VBA来说是非常烦人的。您需要创建记录集,修改和合并它们。我会尝试使用Access Non-VBA-Solutions尽可能地解决这个问题。

我的问题:您是否考虑过将表单(和子表单)直接链接到表格?

答案 1 :(得分:0)

日期可以这样插入:

"INSERT INTO StockMovement ([DateField]) " & _
"VALUES (#" & Format(Me!DateField.Value, "yyyy\/mm\/dd") & "#)"

也就是说,您的代码仅插入一条记录。要插入多个记录,您需要一个选择查询,或者 - 更快 - 使用 DAO 将目标表作为记录集打开,然后作为源,循环子表单的 RecordsetClone 并将记录逐个复制到目标表中。