我有一个访问表,其中包含100列的产品信息(这是一个已购买的系统,因此不是我创建的系统)。我希望能够复制一行并将其作为新行插入,并更新3个字段。我在访问数据库上使用VBA。
我正在选择要复制的行(选择产品。* FROM .....)并将其放入DAO.Recordset。这很好用。然后,我想将此数据作为新行插回到表中,除了产品ID(密钥)和产品简短描述之外,所有相同的数据。
由于有100列,我试图避免键入所有列名并单独分配值。有没有办法从DAO.Recordset插入所以我可以避免键入所有列?如果没有,是否有另一种方法可以避免输入所有列和所有值?它会为我节省一个非常大的插入声明!
非常感谢
Tony
答案 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 :
答案 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