【问题标题】:Looping through a recordset to output Ms-Access report to a pdf file循环遍历记录集以将 Ms-Access 报告输出到 pdf 文件
【发布时间】:2017-11-15 10:11:26
【问题描述】:

我正在尝试使用docmd.outputTo 获取tenant_id 的pdf 文件。不幸的是,这个例程产生的输出 pdf 文件都在同一个 tenant_id 中。如果我删除docmd.outputTo 最后一个参数pathName & fileName,那么它需要通过对话的文件名和由tenant_id 很好过滤的输出文件。任何帮助,将不胜感激。

发票查询如下:SELECT * FROM tblInvoice WHERE tenant_id = CurTenantID()

Public Sub Output()
    Dim MyRs As DAO.Recordset
    Dim rpt As Report
    Dim fileName As String, pathName As String, todayDate As String

    pathName = "C:\Users\abzalali\Dropbox\tenant_db\Invoice\"
    todayDate = Format(Date, "MMDDYYYY")
    Set MyRs = CurrentDb.OpenRecordset("SELECT tenant_id, name, company, email FROM qryEmailClientList")

    DoCmd.OpenReport "Invoice", acPreview, , , acHidden
    Set rpt = Reports("Invoice")

    With MyRs
        .MoveFirst
            Do While Not .EOF
                fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
                rpt.Filter = "[tenant_id] = " & !tenant_id
                rpt.FilterOn = True
                DoCmd.OutputTo acOutputReport, "Invoice", acFormatPDF, pathName & fileName
               .MoveNext
            Loop
    End With

End Sub

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    由于DoCmd.OutputTo 缺少用于过滤的参数,因此最好的选择是将报告基于公共函数以获取当前 ID。

    例如

    ' Function to both set and retrieve the current Tenant ID
    Public Function CurTenantID(Optional SetTenantID As Long = 0) As Long
    
        Static TenantID As Long
    
        If SetTenantID > 0 Then
            TenantID = SetTenantID
        End If
    
        CurTenantID = TenantID
    
    End Function
    

    您的报告在其记录源中使用此函数,例如

    SELECT * FROM tblInvoice WHERE tenant_id = CurTenantID()
    

    在循环中生成 PDF 报告时,您使用 SetTenantID 参数:

    Public Sub Output()
    
        Dim MyRs As DAO.Recordset
        Dim fileName As String, pathName As String, todayDate As String
    
        pathName = "C:\Users\abzalali\Dropbox\tenant_db\Invoice\"
        todayDate = Format(Date, "MMDDYYYY")
        Set MyRs = CurrentDb.OpenRecordset("SELECT tenant_id, name, company, email FROM qryEmailClientList")
    
        With MyRs
            ' .MoveFirst -- unneeded after OpenRecordset()
            Do While Not .EOF
                fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
                Call CurTenantID(!tenant_id)
                DoCmd.OutputTo acOutputReport, "Invoice", acFormatPDF, pathName & fileName
                .MoveNext
            Loop
        End With
    
    End Sub
    

    【讨论】:

    • 还没有过滤,输出报表中的所有页面。
    • 您是否调整了报告“发票”的Record source?如果是,请将其添加到您的问题中。
    • 是的,我添加了Record source
    • 你也删除了DoCmd.OpenReport "Invoice", acPreview, , , acHidden 吗?如果您手动打开报告(在调用 CurTenantID(<an existing ID>) 之后)会发生什么? @MirAbzalAli
    • 哦!对不起,我忘了删除它,它很棒的治疗和完美。非常感谢。
    【解决方案2】:

    只需使用DoCmd.OpenReport 方法过滤报告,然后根据文档将DoCmd.OutputTo 中的报告名称留空:

    ObjectName > Optional > Variant:如果要输出活动对象,请为 ObjectType 参数指定对象的类型并将此参数留空。

    With MyRs
        .MoveFirst
        Do While Not .EOF
            fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
    
            DoCmd.OpenReport "Invoice", acViewReport, , "[tenant_id] = " & !tenant_id, acHidden
            DoCmd.OutputTo acOutputReport, , acFormatPDF, pathName & fileName
            .MoveNext
        Loop
    End With
    

    【讨论】:

    • 通过这种方式它也可以工作,但是在执行过程中会显示报表视图,我想隐藏报表视图。
    • 继续为它的 WindowMode 参数添加 acHidden
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多