Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сохранение отчета из Access в pdf

1.8K
14 января 2009 года
rSolanov
106 / / 04.05.2005
Здравствуйте!
Я столкнулся с проблемой сохранения отчета в MS Access'е в формат pdf. Думаю, что данный вопрос заинтересует многих. С сайта Microsoft я скачал приложение SaveAsPDFandXPS, после установки которого в диалоге сохранения отчета появляется опция "Сохранить отчет в pdf или xps". Таким образом необходимый отчет можно вручную сохранить в формат pdf. Все хорошо, когда отчет один или несколько.
А если таких отчетов, которые необходимо сохранить несколько сотен? Может быть где-то в инете уже выложен такой макрос, который сможет сохранять отчет в pdf, но такого макроса я не нашел.
Вообще мысль такая:
Написать код в Access'е, который собой реализует следующий алгоритм:
по sql-запросу в цикле, данные из каждой записи запроса подтягиваются в шаблон для отчета (шаблон один и тот-же, только разные данные), открыть отчет, сохрать в pdf, отправить по почте адресату, перейти к следующей записи, опять открыть отчет, сохранить в pdf и отослать, и так далее до конца цикла.
Думаю, что наверняка уже кто-то сталкивался с подобной проблемой.
Пожалуйста, кто знает, подскажите
1.8K
16 января 2009 года
rSolanov
106 / / 04.05.2005
Ну наконец я разобрался. Вот код, который реализует эту задачу:
Код:
Option Compare Database
Private Sub ExportReportToPDF(AFileName As String)
    'Сохранение отчета в файл
    DoCmd.OutputTo acOutputReport, "reportClients", acFormatPDF, AFileName, False
End Sub
Private Sub ElementSendMail(Adr As String, AFileName As String)
    Dim MSG As Object
    Dim Config As Object
    Dim CFields As Object
    Dim strBody As String
    'создаем объект Message это наше письмо
    Set MSG = CreateObject("CDO.Message")
    'создаем объект Configuration это настройки соединения
    Set Config = CreateObject("CDO.Configuration")
    Set CFields = Config.Fields
    Set MSG.Configuration = Config
    CFields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    CFields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.0.4" 'адрес SMTP сервера192.168.0.4
    CFields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    CFields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "rsolanov@fexer.ru" 'Login
    CFields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = " " 'пароль
    CFields("urn:schemas:mailheader:content-language") = "windows-1251" ' кодировка письма чтобы писать по русски
    CFields.Update
    MSG.To = Adr 'адрес получателя
    MSG.FROM = "rsolanov@fexer.ru" 'адрес отправителя
    MSG.Subject = "Отчеты клиентам" ' тема письма

    MSG.BodyPart.Charset = "windows-1251" ' кодировка письма чтобы писать по русски
    'формируем текст который будет телом письма
    strBody = "Отчет находится во вложении"

    MSG.HTMLBody = strBody 'тело письма
    MSG.AddAttachment AFileName
    MSG.Send 'отправляем
    'обнуляем переменные
    Set CFields = Nothing
    Set Config = Nothing
    Set MSG = Nothing
End Sub
Public Sub SendMail()
    Dim DB As Database
    Set DB = CurrentDb
   
    Dim RS As Recordset
    Dim StrSQL As String
   
    StrSQL = "SELECT Contacts.CompanyName, Contacts.Account, Contacts.Mail, Trades.TradeDate " _
           & "FROM Contacts INNER JOIN (Client INNER JOIN Trades ON Client.BrokerRef = Trades.BROKERREF) ON Contacts.ClientID = Client.ClientID " _
           & "WHERE (((Trades.BUYSELL) = 'покупка')) " _
           & "GROUP BY Contacts.CompanyName, Contacts.Account, Contacts.Mail, Trades.TradeDate;"
   
    Set RS = DB.OpenRecordset(StrSQL, dbOpenDynaset)
    RS.MoveFirst
    While Not RS.EOF
     CurrentDb.QueryDefs("qryTrades").SQL = "SELECT Trades.TradeDate, Trades.TRADENO, Trades.TRADETIME, Trades.PRICE, Trades.QUANTITY, Trades.VALUE, Trades.BUYSELL, Trades.SecCode, Contacts.ClientID, Contacts.Account, Contacts.Company, Agents.Company AS Agent, Security.ShortName, Security.LotSize " _
          & "FROM ((SELECT Contacts.Company, Trades.TradeDate, Trades.TRADENO " _
          & "FROM Contacts INNER JOIN (Client INNER JOIN Trades ON Client.BrokerRef = Trades.BROKERREF) ON Contacts.ClientID = Client.ClientID " _
          & "WHERE (((Trades.BUYSELL)='продажа')))  AS Agents INNER JOIN (Contacts INNER JOIN (Client INNER JOIN Trades ON Client.BrokerRef = Trades.BROKERREF) ON Contacts.ClientID = Client.ClientID) ON (Agents.TradeDate = Trades.TradeDate) AND (Agents.TRADENO = Trades.TRADENO)) INNER JOIN Security ON Trades.SECCODE = Security.SecCode " _
          & "WHERE (((Trades.BUYSELL)='покупка')AND((Contacts.Account)=""" & RS.Fields("Account") & """));"
       
        FileName = "C:\" + "Отчет_" + RS.Fields("Account") + "_" + RS.Fields("CompanyName") + "_" + Format(RS.Fields("TradeDate"), "mm/dd") + ".pdf"
       
        ExportReportToPDF (FileName)
        ElementSendMail(RS.Fields("Mail"), FileName)
       
        RS.MoveNext
    Wend
    RS.Close
End Sub

Если кому-нибудь это поможет, то отлично.
Процедура ExportReportToPDF сохраняет отчет в файл pdf, ElementSendMail отправляет отчет в формате pdf адресату. Проверял, работает. Но есть одно но:
В процедуре SendMail если убрать вызов процедуры ElementSendMail(RS.Fields("Mail"), FileName) (5-я строка кода снизу) все работает как надо. Но если добавить вызов полученного pdf-файла на отправку по почте, возникает такая ошибка:
Compile error:
Expected: =

Если кто знает, пожалуйста, помогите
1.8K
20 января 2009 года
rSolanov
106 / / 04.05.2005
А вот ответ и на этот вопрос:
 
Код:
Private Sub ElementSendMail(ByVal Adr As String, ByVal AFileName As String)
Call ElementSendMail(RS.Fields("Mail"), FileName)
1.8K
20 января 2009 года
rSolanov
106 / / 04.05.2005
Похоже форум находится в состоянии "ни жив, ни мертв". Кризис :-)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог