2011-02-02 4 views
0

У меня возникли проблемы с попыткой экспорта отчета Access в формат PDF. В основном, я работаю над старой (построенной в 2001 году) базой данных Access, которая использует формы в качестве пользовательского интерфейса. В настоящее время вы можете отправлять задания из формы «Вакансии» в форму «Счет-фактура». После того, как все задания есть, вы просто нажмете «Счет всех», укажите дату и количество копий, и это будет напечатано с использованием отчета Access в качестве шаблона.Как сгенерировать PDF-файл из отчета Access?

Мне было поручено добавить сохранение как функцию PDF, но, будучи веб-дизайнером по профессии, у меня очень ограниченные знания Access и VB, но я знаю (очень) небольшое количество ASP. Net и C# (как я получил данную задачу, это история в другой раз ...)

На мой взгляд, я подошел к этому, создав новую кнопку PDF в форме Access, где они печатают счета-фактуры. Мои мысли в том, что я могу просто дублировать код для печати и обновления для вывода в файл 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. Беда в том, что он запускает отчет и создает счет-фактуру для каждого задания в системе, вместо того, чтобы применять отчет к ТОЛЬКО заданиям, отмеченным для выставления счетов.

Я надеюсь, что это происходит потому, что я поставил код в неправильном месте, но у меня есть ощущение, что это сложнее, чем это.

Немного длинный снимок, размещающий его здесь, но я действительно ценю любую помощь на этом этапе. Я также старался сделать это как можно короче, поэтому, если есть какие-то детали, которые не ясны, я помогу.

ответ

4

Это довольно запутанно, поэтому я думаю, что самое простое дело, если вы не хотите погружаться и приводить в порядок, заключается в изменении запроса, на котором основан отчет.

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 

Если у вас нет доступа 2007 с Save as PDF Add-on или 2010, вы можете быть лучше устанавливать скажем, CutePDF, и печать на принтер PDF с использованием DoCmd.PrintOut

+0

Другого варианту PDFCreator, который на самом деле автоматизирован с помощью VBA. У меня есть два клиента, которые используют его, и за исключением апгрейдов обновления, он работает очень хорошо. –

+0

Раньше я использовал автоматизацию PDFCreator и VBA, но столкнулся с несколькими проблемами в разных комбинациях операционной системы/доступа, поэтому в конце концов выбрал более простой CutePDF, который нужно выбрать только как принтер. Возможно, с тех пор стала доступна более стабильная версия PDFCreator. – Fionnuala

+0

Но при использовании драйвера принтера для вывода PDF вы не можете автогенерировать и назначать имя файла для PDF - пользователю нужно вручную его вручную. У меня не было проблем с запуском PDFCreator как на WinXP, так и на Win7 64-bit. Я впервые использовал его в июне 2009 года на WinXP, а затем на Win7 прошлой осенью. Оба работают нормально. Какие проблемы у вас были? –

0

я задал тот же вопрос пару лет назад на UtterAccess ..

Существует бесплатная библиотека делать именно то, что вам нужно здесь: http://www.lebans.com/reporttopdf.htm

Мой исходный поток на UA здесь: http://www.utteraccess.com/forum/Automatically-PDF-send-t1353547.html

Я успешно использовал библиотеку в течение нескольких лет в нескольких проектах, в основном для генерации котировок и счетов-фактур.

Надеется, что это помогает PG

Смежные вопросы