【问题标题】:How to generate a PDF file from Access Report?如何从访问报告生成 PDF 文件?
【发布时间】:2024-04-29 18:00:01
【问题描述】:

我在尝试将 Access 报告导出为 PDF 格式时遇到问题。基本上,我正在研究一个旧的(2001 年构建的)Access 数据库,它使用表单作为用户界面。目前,您可以将工作从“工作”表单发送到“发票”表单。完成所有作业后,您只需单击“全部开票”,指定日期和份数,然后使用 Access 报告作为模板进行打印。

我的任务是添加另存为 PDF 功能,但作为一名网页设计师,我对 Access 和 VB 的了解非常有限,但我确实知之甚少(非常) ASP.Net 和 C# 的数量(我是如何得到这个任务的,这将是另一个故事......)

在我看来,我已经通过在他们打印发票的访问表单上创建一个新的 PDF 按钮来解决这个问题。我的想法是,我可以简单地复制打印代码并更新以输出到 PDF 文件。我可以让这个工作,但不是我想要的。

打印功能代码如下:

Private Sub cmdOpenGroupInvoice_Click()
Dim db As DAO.Database
Dim rsGetCustomerInvoice As DAO.Recordset
Dim rsInvoice As DAO.Recordset
Dim rsInvoiceAll As DAO.Recordset
Dim lngCusID As Long
Dim lngJobNo As Long
Dim iCountInvoice
Dim lngInvoiceNo As Long
Dim iNumberCopies As Integer
Dim sSQLGetInv As String
Dim sSQLInv As String
Dim datInvoiceDate As Date

sSQLGetInv = "SELECT tblJobs.JobNo,tblJobs.NetDespatchRef, tblLoads.Sales, tblLoads.PODName, tblLoads.TotalSales, tblLoads.Cost, tblLoads.Profit, tblJobs.SendToInvoice, tblJobs.Invoiced, tblJobs.MarkForHistory, tblJobs.CustomerID" & vbCrLf _
& "FROM tblJobs INNER JOIN tblLoads ON tblJobs.JobNo = tblLoads.JobNo" & vbCrLf _
& "WHERE (((tblJobs.SendToInvoice)=Yes) AND ((tblJobs.Invoiced)=No) AND ((tblJobs.MarkForHistory)=No));"


Set db = CurrentDb
Set rsGetCustomerInvoice = db.OpenRecordset(sSQLGetInv, dbOpenDynaset)
If rsGetCustomerInvoice.EOF Then
Beep
If MsgBox("There are no jobs to invoice", _
    vbCritical + vbOKOnly, _
    "No Jobs To Invoice") = vbOK Then
    Exit Sub
End If
End If
rsGetCustomerInvoice.MoveLast
Debug.Print rsGetCustomerInvoice.RecordCount
rsGetCustomerInvoice.MoveFirst
Do Until rsGetCustomerInvoice.EOF = True
Set rsGetCustomerInvoice = db.OpenRecordset(sSQLGetInv, dbOpenDynaset)
If rsGetCustomerInvoice.EOF Then
    rsGetCustomerInvoice.Close
    db.Close
Set rsGetCustomerInvoice = Nothing
Set db = Nothing
    DoCmd.Close acForm, "frmInvoiceDate"
Exit Sub
End If
Debug.Print rsGetCustomerInvoice.RecordCount
datInvoiceDate = CVDate(txtInvoiceDate)
lngInvoiceNo = GiveMeAnInvoiceNo()
lngCusID = rsGetCustomerInvoice.Fields!CustomerID
Call AddNewInvoice(lngInvoiceNo, datInvoiceDate, True)

Debug.Print iCountInvoice
lngJobNo = rsGetCustomerInvoice![JobNo]
Call SendThisJobToSageAll(lngCusID, datInvoiceDate, lngInvoiceNo)
Call InvoiceAll(lngCusID, lngInvoiceNo)
Dim strPODName As String
If Not IsNull(rsGetCustomerInvoice!NetDespatchRef) Then
If IsNull(rsGetCustomerInvoice![PODName]) Then
strPODName = " "
Else
strPODName = rsGetCustomerInvoice![PODName]
End If
'Call NetDesTrackingJobCompleate(rsGetCustomerInvoice![NetDespatchRef], rsGetCustomerInvoice![JobNo], strPODName)
End If
iCountInvoice = iCountInvoice - 1
'Debug.Print I
iNumberCopies = txtNumberOfCopies
Do Until iNumberCopies = 0

    DoCmd.OpenReport "rptInvoice2", acViewNormal, , "[Invoice No]= " & lngInvoiceNo
iNumberCopies = iNumberCopies - 1
Loop
Form_frmInvoicing.Requery
rsGetCustomerInvoice.MoveNext
Loop
DoCmd.Close acForm, "frmInvoiceDate"
rsGetCustomerInvoice.Close

db.Close
Set rsGetCustomerInvoice = Nothing

Set db = Nothing


End Sub

根据上面概述的原始计划,我更新了以下部分以输出为 PDF:

Do Until iNumberCopies = 0

        DoCmd.OpenReport "rptInvoice2", acViewNormal, , "[Invoice No]= " & lngInvoiceNo
        DoCmd.OutputTo acOutputReport, "", acFormatPDF, MyPath & MyFilename, True
    iNumberCopies = iNumberCopies - 1
    Loop

现在它可以工作了,它确实会尝试输出 PDF 文件。问题是,它会运行报告并为系统中的每个作业创建发票,而不是仅将报告应用于标记为开票的作业。

我希望这会发生,因为我把代码放在了错误的位置,但我有一种直觉,它比这更复杂。

在这里发布它有点远,但我非常感谢此时的任何帮助。我也尽量保持简短,所以如果有任何不清楚的细节,我会提供帮助。

【问题讨论】:

    标签: ms-access pdf-generation


    【解决方案1】:

    这很复杂,所以我认为最简单的方法是修改报告所基于的查询。

    Dim qdf As QueryDef
    Set qdf = CurrentDb.QueryDefs("MyReportQuery")
    sSQL = "SELECT Whatever FROM MyTable WHERE [Invoice No]= " & lngInvoiceNo
    qdf.SQL = sSQL
    
    DoCmd.OutputTo acOutputReport, "rptInvoice2", acFormatPDF, _
        MyPath & MyFilename, True
    

    除非您拥有带有Save as PDF Add-on 或 2010 的 Access 2007,否则您最好安装 say,cutePDF,然后使用 DoCmd.PrintOut 打印到 PDF 打印机

    【讨论】:

    • 另一个选项是 PDFCreator,它实际上可以通过 VBA 实现自动化。我有两个客户在使用它,除了升级的麻烦,它运行得非常好。
    • 我以前用过PDFCreator和VBA自动化,但是在不同的操作系统/Access版本组合中遇到了几个问题,所以最终选择了更简单的只需要选择作为打印机的CutePDF。此后可能会出现更稳定的 PDFCreator 版本。
    • 但是当使用打印机驱动程序输出 PDF 时,您不能自动生成和分配 PDF 的文件名——用户必须手动输入。我在 WinXP 和 Win7 64 位上运行 PDFCreator 都没有问题。我于 2009 年 6 月在 WinXP 上首次实现了对它的使用,然后在去年秋天在 Win7 上实现了使用。两者都工作正常。你遇到过什么样的问题?
    【解决方案2】:

    几年前我在 UtterAccess 上问过同样的问题。

    这里有一个免费库可以满足您的需求:http://www.lebans.com/reporttopdf.htm

    我在 UA 的原始帖子在这里:http://www.utteraccess.com/forum/Automatically-PDF-send-t1353547.html

    我在几个项目中成功使用该库几年,主要用于生成报价和发票。

    希望这会有所帮助 PG

    【讨论】: