【问题标题】:MS Access VBA Writing to a table from a formMS Access VBA 从表单写入表
【发布时间】:2017-04-27 22:05:12
【问题描述】:
  • 我有一个表单(Purchase Orders)和一个子表单 (采购订单详情)。主窗体包含 编号 PO(文本框)、Supplier(组合框)、Employee(组合框)、 状态(组合框),其中包含 2 条记录(新建和完成)和一个 日期 框(创建采购订单的时间)。子表单(数据表)包含 Product(组合框)、QuantityPrice 字段。

  • 我想做的是在主窗体上添加一个按钮 下一个。

  • 按下按钮时,应执行 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. 代码可以在没有日期的情况下使用,但只会将一个产品添加到 表,第一个。在采购订单中通常有更多 不止一种产品。

因为我是 VBA 的新手,所以请您像对待新手一样对待我,并尽可能详细地解释一下。 (修正了代码,忘记更改语言。我的意思是我粘贴了错误的,现在是正确的但仍然无法正常工作:))

谢谢!

【问题讨论】:

    标签: mysql forms vba ms-access subform


    【解决方案1】:

    1) 如果您只有一个特定领域的问题,我会检查该领域有什么特别之处。可能输入格式为字符串,字段格式为日期/时间。在这种情况下,请尝试使用 CDate()-Function。我可以想象,最后的 .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 尽可能多地解决问题。

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

    【讨论】:

    • 我现在在打电话,需要睡眠,所以我醒来时会测试代码。如何准确链接它们?表单和子表单是从现有的表和查询中创建的,这不是链接吗?或者我可以将它们进一步链接到第三张桌子?感谢您的回答!
    • code Private Sub cmdOrder_Click() Dim strSQL As String strSQL = "" For Each Item In Group strSQL = strSQL & "INSERT INTO StockMovement (ID_Product, Status, Quantity, ID_PurchaseOrder) VALUES (" & Me.frmPurchaseOrderDetails_Subform.Form!comboboxProduct & ", '" & Me!txtStatus & "', " & Me.PurchaseOrderDetails_Subform.Form!txtQuantity & ", " & Me!txtID_PurchaseOrder & ");" Next DoCmd.RunSQL strSQL Me.Requery End Sub code 我收到运行时错误“13”,类型不匹配。当我去调试时,它使“组中的每个项目”变为黄色。
    【解决方案2】:

    日期可以这样插入:

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

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

    【讨论】:

    • 问题是我在 VBA 方面的经验是 0 :/ 你可能有一个例子吗?关于日期,我决定将其省略,并在表中将日期默认值设置为 =Now(),因此它始终将记录添加到表中的日期。
    • 我手头没有这样的代码,抱歉。不过,并不难,也不“聪明”。如果您想记录没有时间的日期,请使用=Date(),而不是=Now()
    猜你喜欢
    • 2012-11-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多