从DAO.Recordset向表中添加完整的行

时间:2017-04-02 22:57:17

标签: sql vba ms-access access-vba

我有一个访问表,其中包含100列的产品信息(这是一个已购买的系统,因此不是我创建的系统)。我希望能够复制一行并将其作为新行插入,并更新3个字段。我在访问数据库上使用VBA。

我正在选择要复制的行(选择产品。* FROM .....)并将其放入DAO.Recordset。这很好用。然后,我想将此数据作为新行插回到表中,除了产品ID(密钥)和产品简短描述之外,所有相同的数据。

由于有100列,我试图避免键入所有列名并单独分配值。有没有办法从DAO.Recordset插入所以我可以避免键入所有列?如果没有,是否有另一种方法可以避免输入所有列和所有值?它会为我节省一个非常大的插入声明!

非常感谢

Tony

3 个答案:

答案 0 :(得分:2)

您可以循环记录集的Fields集合来执行此操作。

如果表结构不时发生变化,这种方法可能比巨型INSERT语句更易于维护。

如果表是静态的,我宁愿使用带有参数的已保存INSERT查询来修改列。

Sub CopyProductRow()

    Dim rsSrc As DAO.Recordset
    Dim rsTgt As DAO.Recordset
    Dim fld As DAO.Field
    Dim sFld As String

    Set rsSrc = CurrentDb.OpenRecordset("SELECT * FROM Products WHERE ProductID = 4711", dbOpenSnapshot)
    Set rsTgt = CurrentDb.OpenRecordset("Products", dbOpenDynaset, dbAppendOnly)

    rsTgt.AddNew

    For Each fld In rsSrc.Fields
        sFld = fld.Name
        Select Case sFld
            ' special cases
            Case "ProductID": rsTgt(sFld).Value = GetNewProductID()
                              ' or if ProductID is AutoNumber, don't assign anything
            Case "ProductDesc": rsTgt(sFld).Value = "my new description"
            ' all other field values are simply copied
            Case Else: rsTgt(sFld).Value = fld.Value
        End Select
    Next fld

    rsTgt.Update
    rsTgt.Close
    rsSrc.Close

End Sub

答案 1 :(得分:1)

如果您使用选择要复制的记录的表单,还可以使用 RecordsetClone

Copy selected record to new record

答案 2 :(得分:0)

如果您尝试将其重新插入到同一个表中,那么您可以将其完全插入到记录集中。

您只需要编写正确的SQL查询并执行它。

您选择的数据将是您已使用更新值提取的记录集。

例如:

INSERT INTO tableX(field1, productId, productDesc)
SELECT field1, 777 as productId, "NewString" as productDesc
FROM tableX
WHERE productId=7

我在评论中提到的另一种方法是循环遍历每个字段以构建用作SQL命令的字符串,执行此操作将比按记录处理记录快得多。 (例如在订单表中为每个订单插入一个新产品,其中已经订购了另一个产品,可能有1000个订单中的10个)

'Edited the code supplied by another response above'
Sub CopyProductRow()

    Dim sFld, iField, sqlQuery As String

    i= "INSERT INTO products("
    s= "SELECT "
    w= "WHERE ProductID = 7"
    For Each fld In rsSrc.Fields
        Select Case fld.Name 'Check the field name'
            ' special cases'
            Case "ProductID": 'If field is Product ID'
                  iFld = "777 as ProductID" '777 will be the product id returned by the select query (therefore inserted)'
            Case "ProductDesc": 'If field is Product Description '
                         'The description below will be selected / inserted instead.'
                  iFld = "'New Product Description' as ProductDesc"
            Case Else: 
                  iFld = fld.Name 'No change just select the field and insert as is.'
        End Select

        i = i & ", " & fld.Name
        s = s & ", " & iFld 
    Next fld

    'Build complete query (removing the first comma in the select statement)'
    sqlQuery = i & ") " & replace(s, "SELECT ,", "SELECT ") & " " &w

    'Resulting in a string such as the following'
    'INSERT INTO products(field1,field2, productId, productDesc, field5, ...)'
    'SELECT field1, field2, 777 as ProductID, 'New Product Description' as ProductDesc, field5, ...'
    'FROM tableX'
    'WHERE productId=7'

    'Print the query to immediate window
    Debug.print sqlQuery

    'Execute the query'
    currentdb.execute sqlQuery
End Sub