在 Access 报告中仅查看最近添加的附件

Posted

技术标签:

【中文标题】在 Access 报告中仅查看最近添加的附件【英文标题】:View only most recently added attachment in Access report 【发布时间】:2018-05-16 17:17:09 【问题描述】:

我正在使用访问数据库作为我们游泳池的会员管理应用程序。我使用报告打印出所有带有照片 ID 的季票。该报告使用查询仅打印已拍照的顾客的通行证。

SELECT tblPassHolders.[PASS HOLDER NAME], tblPassHolders.PHOTO.FileData, tblPassHolders.BARCODE, tblPassHolders.[FAMILY PASS], tblFamilyPass.Expires
FROM tblFamilyPass INNER JOIN tblPassHolders ON tblFamilyPass.ID = tblPassHolders.FamilyID
WHERE (((tblPassHolders.PHOTO.FileData) Is Not Null) AND ((tblFamilyPass.Expires)>Now()) AND ((tblPassHolders.Printed)=False));

这是使用该应用程序的第二年,我遇到的问题是,当人们为他们的通行证重新拍照时,我的报告会打印出一张通行证,每个附上照片附件到他们的记录。

我仍然是 Access 的业余爱好者,我正在努力弄清楚如何编辑我的报告/查询,以便报告只会为每个使用最近照片的顾客打印 一个通行证附在他们的记录上。一种解决方案是简单地删除旧照片,因此只有一个附件,但我想弄清楚即使有多个附件如何使它工作。我一直在玩DLast(),但我很确定我做错了。

如何进行只显示最近添加的附件的查询?

【问题讨论】:

请发布您用来提供帮助的查询。可能你应该有一个过滤器 (WHERE) 只拍摄最近的照片 @serakfalcon 查看添加的照片。 为什么要保留多张照片?为什么不换照片?尝试 TOP 1 子查询。评论allenbrowne.com/subquery-01.html#TopN 很难用您发布的设计模式图像找出您的数据和查询。我们在这里主要讨论 SQL。因此,在查询设计器中,点击左上角的SQL View 按钮,复制 SQL 代码并将其粘贴到您的问题中。 以后您可以随时修改上传代码,将当前文件名更改为“000000-latestpic”之类的名称。这会将它带到列表的顶部,后续添加会询问您是否要替换该文件 【参考方案1】:

这是我建议您可以做的一个示例,而不是查找最近添加的附件。

如前所述,除非您实施某种命名约定,将最新文件弹出到顶部,否则这是不可能的,因为 Microsoft 按文件名顺序显示附件字段。

这是一个示例,您可以使用按钮来控制插入附件。 它基于Stack Overflow example

完成测试后,您可以将Cancel=True 添加到Photo_DblClick 事件以完全控制您的照片附件字段

Private Sub cmdAddNewPhoto_Click()

    Dim rsPhotos        As DAO.Recordset2
    Dim rsParent        As DAO.Recordset2

    Dim strImagePath    As String

    If MsgBox("Add New Photo?", vbQuestion + vbOKCancel, "Add Photo?") = vbOK Then

        ' Get New Photo
        ' Note that you need to add a reference to Microsoft Office ##.0 Object Library
        ' using Tools | References... from the VBA interface for the file picker to work
        With Application.FileDialog(msoFileDialogFilePicker)
            ' Prevent multiple selections
            .AllowMultiSelect = False
            ' Set the caption of the dialog box
            .Title = "Please select a photo"
            ' Add filters for common image formats
            .Filters.Clear
            .Filters.Add "JPG Files (JPG)", "*.JPG"
            .Filters.Add "JPEG Files (JPEG)", "*.JPEG"
            .Filters.Add "PNG Files", "*.PNG"
            .Filters.Add "Bitmap Files", "*.BMP"

            If .Show = True Then ' File selected
                strImagePath = .SelectedItems.item(1)
            End If
        End With

        If strImagePath <> "" Then

            ' First clear all old photos if desired
            If Photo.AttachmentCount > 0 Then
                If MsgBox("Clear Previous Photo(s)?", vbQuestion + vbOKCancel, "Remove All Photos?") = vbOK Then
                    ' Clear previous attachments
                    ' (we only want one attachment at a time)
                    Set rsPhotos = Me.Recordset.Fields("Photo").Value
                    With rsPhotos
                        Do While Not .EOF
                            .Delete
                            .MoveNext
                        Loop
                        .Close
                    End With
                    ' Clear last displayed photo
                    Photo.Requery
                End If
            End If

            ' Put parent record in edit mode
            Set rsParent = CurrentDb.OpenRecordset(Me.RecordSource, dbOpenDynaset)
            With rsParent
                ' Get Cureent Matching Record using Primary Key
                .FindFirst "BarCode = " & Me!barcode
                .Edit
                DoEvents
            End With

            ' Next Add the attachment selected by the user
            Set rsPhotos = rsParent.Fields("Photo").Value
            With rsPhotos
                .AddNew
                .Fields("FileData").LoadFromFile strImagePath
                If Photo.AttachmentCount > 0 Then
                    ' Rename so it pops up to first file - and keep extension
                    .Fields("Filename").Value = "00000LatestPic" & Mid$(strImagePath, InStrRev(strImagePath, "."))
                End If
                .Update
                .Close
            End With

            ' Update the parent record
            With rsParent
                .Update
                .Close
            End With

            Set rsPhotos = Nothing
            Set rsParent = Nothing

            ' Refresh Photo Display
            Photo.Requery
        End If
    End If
End Sub

【讨论】:

以上是关于在 Access 报告中仅查看最近添加的附件的主要内容,如果未能解决你的问题,请参考以下文章

现有 Access DB 上的 C# 附件字段更新

使用 Access VBA 从 Outlook 获取附件

在 MS Access 2013 报告上标记超链接

在 Access VBA 中添加附件

Access 报告中的部分文本框格式

使用Excel VBA向Access DB添加附件