Vba 删除附件字段中的数据

Vba 删除附件字段中的数据,vba,ms-access-2010,Vba,Ms Access 2010,我有一个带有附件字段的本地表。我已尝试使用vba和手动删除,以前的附件会不断返回。在vba中,我用记录集和SQL进行了尝试。 SQL 记录集 Set rst = db.OpenRecordset("SELECT * FROM tblSpecsPics WHERE Not (tblSpecsPics.Pic.FileData) Is Null;", dbOpenDynaset, dbSeeChanges) If Not rst.BOF And Not rst.EOF Then rst.MoveF

我有一个带有附件字段的本地表。我已尝试使用vba和手动删除,以前的附件会不断返回。在vba中,我用记录集和SQL进行了尝试。 SQL

记录集

Set rst = db.OpenRecordset("SELECT * FROM tblSpecsPics WHERE Not (tblSpecsPics.Pic.FileData) Is Null;", dbOpenDynaset, dbSeeChanges)

If Not rst.BOF And Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
    rst.Edit
    Set rsv = rst.Fields(4).Value
    rsv.Delete
    rst.Update
    rst.MoveNext
Loop
如果结束


添加新记录时,旧的附件会重新出现。

因为MS Access附件类型实际上是元数据的链接表(文件名、文件数据、文件标志、文件类型等),所以需要删除这些基础链接记录。因此,考虑在主表的附件字段值上嵌套另一个记录集循环:

strSQL = "SELECT * FROM tblSpecsPics WHERE Not (tblSpecsPics.Pic.FileData) Is Null;"

Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

If Not rst.BOF And Not rst.EOF Then
    rst.MoveFirst
End If

Do Until rst.EOF

    Set childrst = rst.Fields(4).Value
    Do Until childrst.EOF
       childrst.Delete
       childrst.MoveNext
    Loop

    rst.MoveNext
Loop

因为MS Access附件类型实际上是元数据的链接表(filename、filedata、fileflag、filetype等),所以需要删除这些底层链接记录。因此,考虑在主表的附件字段值上嵌套另一个记录集循环:

strSQL = "SELECT * FROM tblSpecsPics WHERE Not (tblSpecsPics.Pic.FileData) Is Null;"

Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)

If Not rst.BOF And Not rst.EOF Then
    rst.MoveFirst
End If

Do Until rst.EOF

    Set childrst = rst.Fields(4).Value
    Do Until childrst.EOF
       childrst.Delete
       childrst.MoveNext
    Loop

    rst.MoveNext
Loop

我发现更新方法没有必要。另外,为了清楚起见,我从附件的末尾开始,并向后移动,因为如果delete/next会跳过每一条记录,这并不明显。

专用子测试此_单击()

关于错误转到错误处理程序 Dim RS1计数为整数 作为DAO.Recordset的Dim rs1 将rs2设置为DAO.Recordset2 作为字符串的Dim strSql dimdb作为数据库 RS1计数=0 设置db=DBEngine(0)(0) strSql=“从供应商投诉中选择供应商投诉[F_VCN_A]、供应商投诉[F_附件[U A],其中供应商投诉[F_VCN_A]=271” Set rs1=db.OpenRecordset(strSql,dbOpenDynaset) rs1.MoveLast MsgBox(“rs1.RecordCount:&rs1.RecordCount&”在供应商投诉单中:&rs1![F\U VCN\U A]) 设置rs2=rs1!F_附件_A.值 如果rs2.RecordCount>0,则 rs2.MoveLast 直到rs2.RecordCount=0为止 rs2.删除 rs2.1 环 如果结束 错误退出: 出口接头

错误处理程序: MsgBox错误号&“:”&错误说明 出口接头

端接头

我发现更新方法没有必要。另外,为了清楚起见,我从附件的末尾开始,并向后移动,因为如果delete/next会跳过每一条记录,这并不明显。

专用子测试此_单击()

关于错误转到错误处理程序 Dim RS1计数为整数 作为DAO.Recordset的Dim rs1 将rs2设置为DAO.Recordset2 作为字符串的Dim strSql dimdb作为数据库 RS1计数=0 设置db=DBEngine(0)(0) strSql=“从供应商投诉中选择供应商投诉[F_VCN_A]、供应商投诉[F_附件[U A],其中供应商投诉[F_VCN_A]=271” Set rs1=db.OpenRecordset(strSql,dbOpenDynaset) rs1.MoveLast MsgBox(“rs1.RecordCount:&rs1.RecordCount&”在供应商投诉单中:&rs1![F\U VCN\U A]) 设置rs2=rs1!F_附件_A.值 如果rs2.RecordCount>0,则 rs2.MoveLast 直到rs2.RecordCount=0为止 rs2.删除 rs2.1 环 如果结束 错误退出: 出口接头

错误处理程序: MsgBox错误号&“:”&错误说明 出口接头

端接头

您不能“删除”记录中的字段,而是将其值设置为null。Delete仅用于完整记录。实际上@TimWilliams,MS Access表中的附件类型实际上是带有指向主表指针的连接表。若要删除所有元数据,必须删除底层链接记录。@Parfait-感谢您的更正:这对我来说是一个新记录。您不“删除”记录中的字段,而是将其值设置为null。Delete仅用于完整记录。实际上@TimWilliams,MS Access表中的附件类型实际上是带有指向主表指针的连接表。若要删除所有元数据,必须删除底层链接记录。@Parfait-感谢您的更正:这对我来说是一个新的记录。我对执行的SQL语句(POST)做了相同的操作,但我尝试了您对记录集的想法。我仍然有附件不删除的问题。我可以删除所有内容,但一旦我尝试加载新附件,旧附件就会重新出现,好像从未删除过一样。旧附件的文件位置与新附件不同。如果我单步执行代码,变量中显示的唯一附件是新附件,但当我查看表时,旧附件已重新出现。这太令人沮丧了。恐怕我无法重现你的问题。当然,我只是重新运行了这段代码。我将两个附件添加到一个附件字段(来自不同的文件夹),跨越三条记录。在此处运行我发布的代码,并删除了所有记录中的所有附件。在添加新附件时,不会出现以前的附件。你怎么装货?从窗体或表格?它正在从文件夹中的文件加载附件。它似乎只与某些已加载的附件一起使用。如果我使用SQL语句或记录集,则会删除任何其他内容。我的问题是如何加载?直接使用表格还是在开发的表格上?有关支持的类型,请参见的底部。附件是使用vba加载到表中的。附件可以在表单上查看,并包含在报告中。支持的类型没有问题。附件按其应有的方式显示在表格和报告上。问题一直在删除,这只发生在某些附件上。我知道什么时候会发生。删除所有附件并进行压缩和修复后,我可以查看access文件的大小。access文件将更大,与本应删除的附件的大小相匹配。我对执行的SQL语句(POST)做了相同的操作,但我尝试了您对记录集的想法。我仍然有附件不删除的问题。我可以删除所有内容,但一旦我尝试加载新附件,旧附件就会重新出现,好像从未删除过一样。旧附件的文件位置与新附件不同。如果我单步执行代码,变量中显示的唯一附件是新附件,但当我查看表时,旧附件已重新出现。这太令人沮丧了。恐怕我无法重现你的真实形象