在Access VBA中复制记录

在Access VBA中复制记录,vba,ms-access,Vba,Ms Access,我正在尝试构建一个流程,在该流程中,单击EndofDay按钮,然后进入子窗体,查找任何状态10(正在进行),然后在自动完成之前复制这些记录。我遇到的问题是我的 DoCmd.DoMenuItem acFormBar,acEditMenu,8,acMenuVer70DoCmd.DoMenuItem acFormBar,acEditMenu,8,acMenuVer70…命令集正常工作。我收到一条错误消息,说“操作或命令“复制”现在不可用” 主窗体是“frmTasks”,子窗体称为“Tasks”,而“T

我正在尝试构建一个流程,在该流程中,单击EndofDay按钮,然后进入子窗体,查找任何状态10(正在进行),然后在自动完成之前复制这些记录。我遇到的问题是我的
DoCmd.DoMenuItem acFormBar,acEditMenu,8,acMenuVer70DoCmd.DoMenuItem acFormBar,acEditMenu,8,acMenuVer70…
命令集正常工作。我收到一条错误消息,说“操作或命令“复制”现在不可用”

主窗体是“frmTasks”,子窗体称为“Tasks”,而“Tasks”使用的表称为“tblTasks”

更新: 我发现,如果我试图在子表单任务中单独运行我的原始代码,代码将在没有“copy is available”(复制不可用)消息的情况下复制。如果我试图从主窗体调用该代码,我得到的副本将再次不可用。我不知道为什么它说函数副本不可用。有什么线索说明原因吗

Private Sub EndofDay_Click()

If Me.Tasks.Form.Status = 10 Then
'Copy In Process Tasks
    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70
'Complete Old In process Tasks
Else
MsgBox ("Nothing Done")
'do nothing
End If

End Sub
更新代码:

Private Sub EndofDay_Click()
Dim rstSource   As DAO.Recordset
Dim rstInsert   As DAO.Recordset
Dim fld         As DAO.Field
Dim lngLoop     As Long
Dim lngCount    As Long

Set rstInsert = Me!Tasks.Form.RecordsetClone
Set rstSource = rstInsert.Clone

With rstSource
  lngCount = .RecordCount
  For lngLoop = 1 To lngCount
    If Nz(!Status.Value, 0) <> 10 Then
      ' Ignore record.
    Else
      With rstInsert
        .AddNew
          For Each fld In rstSource.Fields
            With fld
              If .Attributes And dbAutoIncrField Then
                ' Skip Autonumber or GUID field.
              ElseIf .Name = "Start Date" Then
                ' Skip read-only field.
              ElseIf .Name = "Date Completed" Then
                ' Skip read-only field.
              ElseIf .Name = "Owner" Then
                ' Skip read-only field.
              ElseIf .Name = "Active" Then
                ' Skip read-only field.
              ElseIf .Name = "Status" Then
                ' Insert default value.
                rstInsert.Fields(.Name).Value = 0
              Else
                ' Copy field content.
                rstInsert.Fields(.Name).Value = .Value
              End If
            End With
          Next
        .Update
      End With
      .Edit
        !Status.Value = 100
      .Update
    End If
    .MoveNext
  Next
  rstInsert.Close
  .Close
End With

Set rstInsert = Nothing
Set rstSource = Nothing
End Sub
Private Sub EndofDay_Click()
将rstSource设置为DAO.Recordset
Dim rstInsert作为DAO.Recordset
模糊fld为刀场
昏暗的夜总会
暗计数等于长
设置rstInsert=Me!Tasks.Form.RecordsetClone
设置rstSource=rstInsert.Clone
使用rstSource
lngCount=.RecordCount
对于LNGLOP=1到lngCount
如果Nz(!Status.Value,0)10,则
“忽略记录。
其他的
用rstInsert
.AddNew
对于rstSource.Fields中的每个fld
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
ElseIf.Name=“开始日期”则
'跳过只读字段。
ElseIf.Name=“完成日期”然后
'跳过只读字段。
ElseIf.Name=“Owner”则
'跳过只读字段。
ElseIf.Name=“活动”则
'跳过只读字段。
ElseIf.Name=“Status”则
'插入默认值。
rstInsert.Fields(.Name).Value=0
其他的
'复制字段内容。
rstInsert.Fields(.Name).Value=.Value
如果结束
以
下一个
.更新
以
编辑
!状态值=100
.更新
如果结束
.下一步
下一个
rstInsert.关闭
.结束
以
设置rstInsert=Nothing
设置rstSource=Nothing
端接头

任何帮助都将不胜感激。

在主窗体上的EndOfDay按钮的单击事件中可能会出现以下情况:

Public Sub CopyRecords()

    Dim rstSource   As DAO.Recordset
    Dim rstInsert   As DAO.Recordset
    Dim fld         As DAO.Field
    Dim lngLoop     As Long
    Dim lngCount    As Long

    Set rstInsert = Me!NameOfSubformControl.Form.RecordsetClone
    Set rstSource = rstInsert.Clone

    With rstSource
      lngCount = .RecordCount
      For lngLoop = 1 To lngCount
        If Nz(!Status.Value, 0) <> 10 Then
          ' Ignore record.
        Else
          With rstInsert
            .AddNew
              For Each fld In rstSource.Fields
                With fld
                  If .Attributes And dbAutoIncrField Then
                    ' Skip Autonumber or GUID field.
                  ElseIf .Name = "SomeReadOnlyField" Then
                    ' Skip read-only field.
                  ElseIf .Name = "Status" Then
                    ' Insert default value.
                    rstInsert.Fields(.Name).Value = 0
                  Else
                    ' Copy field content.
                    rstInsert.Fields(.Name).Value = .Value
                  End If
                End With
              Next
            .Update
          End With
          .Edit
            !Status.Value = 100
          .Update
        End If
        .MoveNext
      Next
      rstInsert.Close
      .Close
    End With

    Set rstInsert = Nothing
    Set rstSource = Nothing

End Sub
公共子副本记录()
将rstSource设置为DAO.Recordset
Dim rstInsert作为DAO.Recordset
模糊fld为刀场
昏暗的夜总会
暗计数等于长
设置rstInsert=Me!SubformControl.Form.RecordsetClone的名称
设置rstSource=rstInsert.Clone
使用rstSource
lngCount=.RecordCount
对于LNGLOP=1到lngCount
如果Nz(!Status.Value,0)10,则
“忽略记录。
其他的
用rstInsert
.AddNew
对于rstSource.Fields中的每个fld
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
ElseIf.Name=“SomeReadOnlyField”然后
'跳过只读字段。
ElseIf.Name=“Status”则
'插入默认值。
rstInsert.Fields(.Name).Value=0
其他的
'复制字段内容。
rstInsert.Fields(.Name).Value=.Value
如果结束
以
下一个
.更新
以
编辑
!状态值=100
.更新
如果结束
.下一步
下一个
rstInsert.关闭
.结束
以
设置rstInsert=Nothing
设置rstSource=Nothing
端接头

在主窗体上的EndOfDay按钮的单击事件中可能类似于此:

Public Sub CopyRecords()

    Dim rstSource   As DAO.Recordset
    Dim rstInsert   As DAO.Recordset
    Dim fld         As DAO.Field
    Dim lngLoop     As Long
    Dim lngCount    As Long

    Set rstInsert = Me!NameOfSubformControl.Form.RecordsetClone
    Set rstSource = rstInsert.Clone

    With rstSource
      lngCount = .RecordCount
      For lngLoop = 1 To lngCount
        If Nz(!Status.Value, 0) <> 10 Then
          ' Ignore record.
        Else
          With rstInsert
            .AddNew
              For Each fld In rstSource.Fields
                With fld
                  If .Attributes And dbAutoIncrField Then
                    ' Skip Autonumber or GUID field.
                  ElseIf .Name = "SomeReadOnlyField" Then
                    ' Skip read-only field.
                  ElseIf .Name = "Status" Then
                    ' Insert default value.
                    rstInsert.Fields(.Name).Value = 0
                  Else
                    ' Copy field content.
                    rstInsert.Fields(.Name).Value = .Value
                  End If
                End With
              Next
            .Update
          End With
          .Edit
            !Status.Value = 100
          .Update
        End If
        .MoveNext
      Next
      rstInsert.Close
      .Close
    End With

    Set rstInsert = Nothing
    Set rstSource = Nothing

End Sub
公共子副本记录()
将rstSource设置为DAO.Recordset
Dim rstInsert作为DAO.Recordset
模糊fld为刀场
昏暗的夜总会
暗计数等于长
设置rstInsert=Me!SubformControl.Form.RecordsetClone的名称
设置rstSource=rstInsert.Clone
使用rstSource
lngCount=.RecordCount
对于LNGLOP=1到lngCount
如果Nz(!Status.Value,0)10,则
“忽略记录。
其他的
用rstInsert
.AddNew
对于rstSource.Fields中的每个fld
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
ElseIf.Name=“SomeReadOnlyField”然后
'跳过只读字段。
ElseIf.Name=“Status”则
'插入默认值。
rstInsert.Fields(.Name).Value=0
其他的
'复制字段内容。
rstInsert.Fields(.Name).Value=.Value
如果结束
以
下一个
.更新
以
编辑
!状态值=100
.更新
如果结束
.下一步
下一个
rstInsert.关闭
.结束
以
设置rstInsert=Nothing
设置rstSource=Nothing
端接头

请问“自动完成”是什么意思?自动完成只是将状态字段设置为100(或完成)。因此,它将复制状态为10(正在处理中)的所有记录,然后将这些记录状态字段设置为100(已完成),新记录应默认为0(未启动)。这与相同吗?然后至少链接它们。请问“自动完成”是什么意思?自动完成只是将状态字段设置为100(或完成)。因此,它将复制状态为10(正在处理)的所有记录,然后设置这些记录