2017-02-15 69 views
0

我有一个附件字段的本地表。我尝试用vba删除并手动删除,之前的附件不断回来。在vba中,我用记录集和SQL来试用它。 的SQL删除附件字段中的数据

Let strSQL = "DELETE tblSpecsPics.PicID,tblSpecsPics.SpecID,tblSpecsPics.SpecDetailID,tblSpecsPics.PicNum,tblSpecsPics.Pic.FileData,tblSpecsPics.Pic.FileName,tblSpecsPics.Pic.FileType,tblSpecsPics.ImageDesc FROM tblSpecsPics;" 

db.Execute strSQL, dbSeeChanges 

的记录

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 

结束如果

当我添加新记录的老附件再出现没有失败。

+1

您不要“删除”记录中的字段 - 将其值设置为null。删除仅用于完整记录。 –

+0

实际上@TimWilliams,MS Access表中的附件类型实际上是指向主表的连接表。要删除所有元数据,必须删除底层链接的记录。 – Parfait

+0

@Parfait - 感谢您的纠正:对我来说这是一个新的。 –

回答

1

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

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 
+0

我对我执行的SQL语句(发布)做了同样的事情,但我试图用记录集创建你的想法。我仍然遇到附件不会删除的问题。我可以删除所有内容,它似乎会被删除,但只要我尝试加载新附件,旧附件就会重新出现,就好像它们从未被删除一样。旧附件具有与新附件不同的文件位置。如果我单步执行代码,则变量中显示的唯一附件是新附件,但是当我查看表格时,旧附件再次出现。这令人难以置信的令人沮丧。 –

+0

恐怕我无法重新创建*重现*问题。可以肯定的是,我只是重新运行这段代码。我向三个记录中的附件字段(来自不同文件夹)添加了两个附件。在此处发布我的发布代码,并删除所有记录中的所有附件。当要添加新附件时,以前没有出现过。你好吗*加载*?从形式还是表格? – Parfait

+0

它正在从文件夹中的文件加载附件。它似乎只与某些附件被加载。如果我使用SQL语句或记录集,则会删除其他任何人。 –