我有一个带附件字段的本地表。我尝试用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
结束如果
当我添加新记录时,旧附件会重新出现。
答案 0 :(得分:1)
由于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
答案 1 :(得分:0)
我发现更新方法是不必要的。此外,为了清楚起见,我从附件的末尾开始并移回,因为如果删除/下一步会跳过所有其他记录,则不太明显。
Private Sub TestThis_Click()
On Error GoTo errHandler
Dim rs1Count As Integer
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset2
Dim strSql As String
Dim db As Database
rs1Count = 0
Set db = DBEngine(0)(0)
strSql = "SELECT T_Vendor_Complaint_A.[F_VCN_A], T_Vendor_Complaint_A.[F_Attachments_A] FROM T_Vendor_Complaint_A WHERE T_Vendor_Complaint_A.[F_VCN_A] = 271"
Set rs1 = db.OpenRecordset(strSql, dbOpenDynaset)
rs1.MoveLast
MsgBox ("rs1.RecordCount:" & rs1.RecordCount & " in T_Vendor_Complaint_A VCN:" & rs1![F_VCN_A])
Set rs2 = rs1!F_Attachments_A.value
If rs2.RecordCount > 0 Then
rs2.MoveLast
Do Until rs2.RecordCount = 0
rs2.Delete
rs2.MovePrevious
Loop
End If
errExit:
Exit Sub
errHandler:
MsgBox Err.Number & ": " & Err.Description
Exit Sub
End Sub