2010-02-19 6 views
5

Я хочу добавить функциональность в свой отчет Access 2007, в результате чего PDF-копия отчета создается одним нажатием кнопки. Я знаю, что есть OutputTo макрос, который может сделать это для меня, но это не позволяет мне включать значения полей отчета как часть имени файла в формате PDF, а именно:Как вывести отчет в формате PDF, где имя состоит из значений из полей?

[Client Organisations].Code + "-" + Clients.Code + "-" + Invoices_Code + "-" + Format([Invoice Date],"yyyy") + ".pdf" 

В то время как я видел это MSDN thread и это SO question, я не вижу использования значений полей в любом из ответов.

Я считаю, VBA код путь, так что я (неудачно) попытался следующие:

Private Sub Create_PDF_Click() 
DoCmd.OutputTo acOutputReport, , acFormatPDF, "" + [Client Organisations].Code 
+ "-" + Clients.Code + "-" + Invoices_Code + "-" + Format([Invoice Date],"yyyy") 
+ ".pdf", True 
End Sub 

ошибка времени выполнения '2465':

Microsoft Office Access не может найти поле '|' упомянутый в вашем выражении

Любые идеи?

+0

Эта ошибка «не может найти поле» обычно появляется, когда что-то есть где-то в библиотеках: проблема с версией, нераспознанный параметр и т. Д. Я думаю, что @jonH прав: вам не хватает чего-то вне VBA, чтобы иметь Распечатаны отчеты в формате PDF. –

+0

@Philippe: макрос работает отлично, проблема заключается в получении VBA для распознавания полей. – Zaid

+0

в этом случае попробуйте несколько «debug.print» в ближайшем окне и проверьте каждый из параметров вашего имени файла, чтобы найти, какой из них неисправен: ? debug.print [Организации-клиенты]. Код ? debug.print Клиенты. Код и т. д. –

ответ

12

Я получил его на работу (в конце концов).

Следующая sub сделал трюк:

Private Sub Create_PDF_Click() 

Dim myPath As String 
Dim strReportName As String 

DoCmd.OpenReport "Invoices", acViewPreview 

myPath = "C:\Documents and Settings\" 
strReportName = Report_Invoices.[Client Organisations_Code] + "-" + 
Report_Invoices.Clients_Code + "-" + Report_Invoices.Invoices_Code + "-" + 
Format(Report_Invoices.[Invoice Date], "yyyy") + ".pdf" 

DoCmd.OutputTo acOutputReport, "", acFormatPDF, myPath + strReportName, True 
DoCmd.Close acReport, "Invoices" 

End Sub 

Два Предостережения:

  1. потребности Отчет должен быть открыт перед печатью.
  2. Обратитесь к полям с тем же именем, что и в отчете. То, что [Client Organisations].Code было [Client Organisations_Code] в отчете.
+0

Является ли [Организация-заказчик] управляющим элементом? Если это так, то обычный синтаксис для ссылки на элемент управления или поля в форме, встроенной в элемент управления подчиненной формы, - это Me! [Организации-клиенты] .Form! Code. Было бы гораздо проще предложить вам ответ, если бы вы указали, что [Организации клиентов] являются подчиненными. Если это не так, я не понимаю, почему ваше решение работает. –

+1

@ Давид: Это не так. '[Организации-клиенты] .Code' - это поле, которое отчет видел как' [Client Organisations_Code] 'из-за запроса SELECT, в котором отчет основан на:' SELECT [организации-клиенты] .Code AS [Client Organisations_Code]. ..'. – Zaid

+0

Вам следует избегать подобных вещей в ваших источниках. Я бы сказал. То есть, одно и то же имя поля из нескольких таблиц является ошибкой в ​​инструкции SQL, либо потому, что оно избыточно (это PK/FK, связанное с двумя таблицами), либо потому, что это ошибка проектирования (поля, которые не хранят одни и те же данные, должны не следует указывать одно и то же имя в нескольких таблицах). Кроме того, помещение пробелов в именах таблиц и полей нецелесообразно. Случай с верблюдом без пробелов столь же читабельен и с ним немного легче работать. –

1

Его легче удалить строку и поместить туда все свое выражение, а затем отладить ее, чтобы увидеть, содержит ли оно действительное имя отчета.

Как это:

Dim strReportName as String 

strReportName = [Client Organisations].Code 
+ "-" + Clients.Code + "-" + Invoices_Code + "-" + Format([Invoice Date],"yyyy") 
+ ".pdf" 

//then try to print strReportName before you use DoCmd.OutputTo. 
+0

@JonH: Я внес соответствующие изменения, нажатие на кнопку ничего не делает. Нет ошибок, ничего. – Zaid

+0

Вы отлаживали отображение strReportName? Также вам не нужен PDF-дистиллятор/принтер для печати в формате PDF. Вы не можете ожидать DoCmd.OutputTo действительно создавать PDF без писателя, не так ли? – JonH

+0

Существует загружаемая надстройка для создания PDF в Office 2007. Требуется, чтобы параметр acFormatPDF работал. То есть Access 2007 без установленной надстройки не сможет выводить в PDF через команду DoCmd.OutputTo. –