У меня возникли проблемы с попыткой экспорта отчета 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. Беда в том, что он запускает отчет и создает счет-фактуру для каждого задания в системе, вместо того, чтобы применять отчет к ТОЛЬКО заданиям, отмеченным для выставления счетов.
Я надеюсь, что это происходит потому, что я поставил код в неправильном месте, но у меня есть ощущение, что это сложнее, чем это.
Немного длинный снимок, размещающий его здесь, но я действительно ценю любую помощь на этом этапе. Я также старался сделать это как можно короче, поэтому, если есть какие-то детали, которые не ясны, я помогу.
Другого варианту PDFCreator, который на самом деле автоматизирован с помощью VBA. У меня есть два клиента, которые используют его, и за исключением апгрейдов обновления, он работает очень хорошо. –
Раньше я использовал автоматизацию PDFCreator и VBA, но столкнулся с несколькими проблемами в разных комбинациях операционной системы/доступа, поэтому в конце концов выбрал более простой CutePDF, который нужно выбрать только как принтер. Возможно, с тех пор стала доступна более стабильная версия PDFCreator. – Fionnuala
Но при использовании драйвера принтера для вывода PDF вы не можете автогенерировать и назначать имя файла для PDF - пользователю нужно вручную его вручную. У меня не было проблем с запуском PDFCreator как на WinXP, так и на Win7 64-bit. Я впервые использовал его в июне 2009 года на WinXP, а затем на Win7 прошлой осенью. Оба работают нормально. Какие проблемы у вас были? –