2017-02-15 68 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語句或記錄集,則會刪除其他任何人。 –