Vba 尝试复制记录时出现运行时错误

Vba 尝试复制记录时出现运行时错误,vba,ms-access,Vba,Ms Access,在下面的代码中,我试图创建与单个JobID相关的所有记录的副本。这是为了创建具有新ID的相同作业,以便进行修订。代码是: Public Function CreateRevisions() Dim lngOldID As Long 'change from long if text Dim lngNewID As Long Dim rsS As Recordset 'source recordset Dim rsT As Recordset 'target recordset

在下面的代码中,我试图创建与单个JobID相关的所有记录的副本。这是为了创建具有新ID的相同作业,以便进行修订。代码是:

Public Function CreateRevisions()

Dim lngOldID As Long    'change from long if text
Dim lngNewID As Long
Dim rsS As Recordset    'source recordset
Dim rsT As Recordset    'target recordset
Dim fld As Field

DoCmd.RunCommand acCmdSaveRecord        'Save the record, to make sure all data is saved in table

lngOldID = Forms!JobQuote!JobID

'Copy the main table

Set rsS = CurrentDb.OpenRecordset("Select * From tblJobDetails where JobID=" & lngOldID, dbOpenSnapshot)
Set rsT = CurrentDb.OpenRecordset("tblJobDetails", dbOpenDynaset, dbAppendOnly)

rsT.AddNew
For Each fld In rsS.Fields
    rsT.Fields(fld.Name) = fld
Next
lngNewID = rsT!JobID
rsT.Update

'Copies Drawings

Set rsS = CurrentDb.OpenRecordset("Select * From tblDrawings where JobID=" & lngOldID, dbOpenSnapshot)
Set rsT = CurrentDb.OpenRecordset("tblDrawings", dbOpenDynaset, dbAppendOnly)

rsT.AddNew
rsT!JobID = lngNewID
For Each fld In rsS.Fields
    If fld.Name <> "JobID" Then
        rsT.Fields(fld.Name) = fld
    End If
Next
rsT.Update
公共函数CreateRevisions()
Dim lngOldID As Long从Long if文本更改为Long
暗淡的、漫长的
Dim rsS作为记录集的源记录集
将rsT设置为记录集“目标记录集”
Dim fld As字段
DoCmd.RunCommand acCmdSaveRecord'保存记录,以确保所有数据都保存在表中
lngOldID=表格!工作报价!若比德
'复制主表
设置rsS=CurrentDb.OpenRecordset(“从tblJobDetails中选择*,其中JobID=“&lngOldID,dbOpenSnapshot”)
Set rsT=CurrentDb.OpenRecordset(“tblJobDetails”,dbOpenDynaset,dbAppendOnly)
rsT.AddNew
对于rsS.字段中的每个fld
rsT.字段(fld.名称)=fld
下一个
lngNewID=rsT!若比德
rsT.更新
“复制图纸
设置rsS=CurrentDb.OpenRecordset(“从tblDrawings where JobID=“&lngOldID,dbOpenSnapshot中选择*)
Set rsT=CurrentDb.OpenRecordset(“tblDrawings”、dbOpenDynaset、dbAppendOnly)
rsT.AddNew
rsT!JobID=lngNewID
对于rsS.字段中的每个fld
如果航班名称为“JobID”,则
rsT.字段(fld.名称)=fld
如果结束
下一个
rsT.更新
“复制图形”部分重复多次,但针对不同的表执行。我在
rsT.Fields(fld.Name)=fld
上得到一个运行时错误。这是运行时错误
64224:对象“Field2”的“Value”方法失败


为什么会出现这种错误?

我尝试了您的代码,除非记录集和字段对象变量声明为DAO类型,否则它不会编译或运行

考虑不关心记录集类型且不需要字段变量的替代方案:

Dim x As Integer
For x = 0 To rsS.Fields.Count - 1
    rsT(rsS(i).Name) = rsS(i)
Next

我试过你的代码,除非记录集和字段对象变量声明为DAO类型,否则它不会编译或运行

考虑不关心记录集类型且不需要字段变量的替代方案:

Dim x As Integer
For x = 0 To rsS.Fields.Count - 1
    rsT(rsS(i).Name) = rsS(i)
Next

首先,您可能无法将对象指定为DAO对象,并且在检索新ID之前应该更新记录

其次,使用现有的RecordsetClone可能更简单、更快

这是工作表单和子表单中的实际代码:

Private子复制按钮\u Click()
将rst设置为DAO.Recordset
作为DAO.Recordset的Dim rstAdd
模糊fld为刀场
将计数设置为整数
将项目设置为整数
Dim书签作为变体
暗淡的旧的一样长
暗淡的纽伊德一样长
'复制父记录。
Set rstAdd=Me.RecordsetClone
设置rst=rstAdd.Clone
'移动到当前记录。
rst.Bookmark=Me.Bookmark
OldId=rst!Id.值
与rstAdd
.AddNew
对于每个fld In.字段
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
其他的
.Value=rst.Fields(.Name).Value
如果结束
以
下一个
.更新
'选择新记录的Id。
.最后一个
NewId=!Id.值
以
'存储新记录的位置。
Bookmark=rstAdd.Bookmark
'复制子记录1。
'如果存在子窗体:
'设置rstAdd=我!subChild1.Form.RecordsetClone
'如果子窗体不存在,请从子表中检索记录:
Set rstAdd=CurrentDb.OpenRecordset(“从tblChild1中选择*,其中FK=“&OldId&”)
设置rst=rstAdd.Clone
如果rstAdd.RecordCount>0,则
rstAdd.MoveLast
rstAdd.MoveFirst
如果结束
Count=rstAdd.RecordCount
对于要计数的项目=1
与rstAdd
.AddNew
对于每个fld In.字段
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
ElseIf.Name=“FK”则
'跳过主/子字段。
.Value=NewId
其他的
.Value=rst.Fields(.Name).Value
如果结束
以
下一个
.更新
以
rst.MoveNext
下一个
'复制子记录2。
'如果存在子窗体:
设置rstAdd=Me!subChild2.Form.RecordsetClone
'如果子窗体不存在,请从子表中检索记录:
'Set rstAdd=CurrentDb.OpenRecordset(“从tblChild2中选择*,其中FK=“&OldId&”)
设置rst=rstAdd.Clone
如果rstAdd.RecordCount>0,则
rstAdd.MoveLast
rstAdd.MoveFirst
如果结束
Count=rstAdd.RecordCount
对于要计数的项目=1
与rstAdd
.AddNew
对于每个fld In.字段
与fld
如果.Attributes和dbAutoIncrField,则
'跳过自动编号或GUID字段。
ElseIf.Name=“FK”则
'跳过主/子字段。
.Value=NewId
其他的
.Value=rst.Fields(.Name).Value
如果结束
以
下一个
.更新
以
rst.MoveNext
下一个
rst.关闭
rstAdd,关闭
'移动到新记录副本。
Me.Bookmark=书签
设置fld=无
设置rstAdd=Nothing
设置rst=无
端接头

首先,您可能无法将对象指定为DAO对象,在检索新ID之前,应该更新记录

其次,使用现有的RecordsetClone可能更简单、更快

这是工作表单和子表单中的实际代码:

Private子复制按钮\u Click()
将rst设置为DAO.Recordset
作为DAO.Recordset的Dim rstAdd
模糊fld为刀场
将计数设置为整数
将项目设置为整数
D