Ms access 如何从Access报告生成PDF文件?

Ms access 如何从Access报告生成PDF文件?,ms-access,pdf-generation,Ms Access,Pdf Generation,我无法将Access报告导出为PDF格式。基本上,我正在开发一个旧的(建于2001年)Access数据库,它使用表单作为用户界面。目前,您可以将作业从“作业”表单发送到“发票”表单。一旦所有作业都存在,只需单击“全部开票”,指定日期和份数,然后使用Access报告作为模板进行打印 我的任务是添加另存为PDF函数,但作为一名网页设计师,我对Access和VB的知识非常有限,但我对ASP.Net和C#的了解(非常)少(我是如何获得此任务的,这是另一次的故事…) 在我看来,我是通过在访问表单上创建一个

我无法将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文件。问题是,它运行报告并为系统中的每个作业创建发票,而不是将报告仅应用于标记为发票的作业

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


这是一个有点远的拍摄张贴在这里,但我真的很感谢在这一点上的任何帮助。我也尽量简短,所以如果有任何不清楚的细节,我会帮助解决。

这很复杂,所以我认为如果您不想深入研究和整理,最简单的方法是修改报告所基于的查询

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

除非您使用Access 2007或2010,否则最好安装say、cutePDF,并使用DoCmd.PrintOut将其打印到PDF打印机。这非常复杂,因此我认为如果您不想深入和整理,最简单的方法是修改报告所基于的查询

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

除非您使用Access 2007或2010,否则最好安装say、cutePDF,并使用DoCmd.PrintOut打印到PDF打印机。几年前,我在UtterAccess上问过同样的问题

这里有一个免费的图书馆,可以完全满足您的需要:

我在UA的原始思路如下:

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

希望这有帮助
几年前我在UtterAccess上问了同样的问题

这里有一个免费的图书馆,可以完全满足您的需要:

我在UA的原始思路如下:

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

希望这有帮助
PG

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