【问题标题】:MS access copying recordset using vbaMS访问使用vba复制记录集
【发布时间】:2019-07-24 18:28:58
【问题描述】:

更新:

我正在尝试设置一个“任务”表单,当您单击一个按钮时,它将获取 [Status] 为 10 的所有记录并复制它们,然后之前的记录将被标记为 [Status] 100。

所以我所拥有的是以下“之前”数据表视图:

运行代码后,它将如下所示:

因此,代码将复制所有 [Status] 为 10(“In Progress”)的记录,将旧记录标记为 [Status] 100(“Completed”),并在 [Date Completed] 字段添加时间戳。

希望这有助于澄清我正在尝试做的事情。

代码如下:

Public Sub Duplicate_Click()
Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblTasks")
rs.MoveFirst

If Not (rs.EOF And rs.BOF) And Me.Status = 10 Then

Do Until rs.EOF = True
'Copy/Paste In Process Tasks
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCopy
    DoCmd.RunCommand acCmdPasteAppend
    [Status].Value = 0
    rs.MoveNext
Loop
Else
    MsgBox ("Nothing Done")
'do nothing
End If

    MsgBox ("Complete")

rs.Close 'Close the recordset
Set rs = Nothing 'Clean up

End Sub

【问题讨论】:

  • 对这样的任务使用追加查询

标签: vba ms-access


【解决方案1】:

您为什么不为此任务使用简单的insert 查询?

例如:

insert into tblTasks
select * from tblTasks where tblTasks.status = 10

【讨论】:

    【解决方案2】:

    您似乎没有对 Recordset 做任何事情。

    这些:

    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCopy
    DoCmd.RunCommand acCmdPasteAppend
    

    只会影响活动表单数据表。不是记录集。他们也不会四处走动做他们所做的事情。这三个命令将选择记录,复制记录,然后将相同的记录粘贴到末尾,然后重复。

    您可以将源和目标作为记录集打开,并在您通过源移动时将它们添加到目标,因为它们具有适当的值 所以像

    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset
    
    Set rs1 = CurrentDb.OpenRecordset("Source")
    Set rs2 = CurrentDb.OpenRecordset("Destination")
    
    rs1.MoveFirst
    
    If Not (rs1.EOF And rs1.BOF) And Me.Status = 10 Then
    
    Do Until rs1.EOF = True
        If(rs1![Field] = 10) Then
           With rs2
                .AddNew
                ![Field]=rs1![Field]
                .Update
           End With
        End If
        rs1.MoveNext
    Loop
    Else
        MsgBox ("Nothing Done")
    'do nothing
    End If
    
        MsgBox ("Complete")
    
    rs1.Close 'Close the recordset
    Set rs1 = Nothing 'Clean up
    rs2.Close 'Close the recordset
    Set rs2 = Nothing 'Clean up
    End Sub
    

    【讨论】:

    • 我试图使用您的代码,但它在![Field]=rs1.[Field] 上挂断了我收到错误“找不到方法或数据成员”如果我绕过它,我会收到一个错误,我有一个循环没有执行命令。
    • 您是否将 [Field] 替换为表中实际字段的名称?哦,我写的有点不对,我认为它应该是![Field]=rs1![Field]
    • 是的,我确实用它应该有的字段替换了“字段”,在这种情况下我使用状态作为字段。随着你的更新,我现在得到了没有错误的循环......
    • 我确实明白了。但仍然收到错误。但是按照您上面的方法重新订购,效果很好!
    【解决方案3】:

    这些

    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCopy
    DoCmd.RunCommand acCmdPasteAppend
    

    处理当前表单中的记录。他们不关心记录集。

    但这可能不是唯一的问题。我建议您更改您的问题或提交一个新问题,以包含您的表格以及您想要通过期望结果的示例来完成什么,因为我很确定即使上述行按照您的想法工作,你仍然不会得到想要的结果。

    【讨论】:

    • 我做了一些编辑,试图澄清我想要做什么。也许使用 Recordset 不是正确的方法??
    • 可能不会。很可能您想要的很简单,只需使用 APPEND 查询,然后是 UPDATE 查询,但您需要提供表结构、示例数据和预期结果示例,以获得任何有意义的帮助。
    • 我现在正在更新我原来的帖子。
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多