Я работаю над отчетом, чтобы вытащить сотрудников с датами окончания между двумя несвязанными текстовыми полями в форме. Отчет сгруппирован по супервизору. Моя цель - сохранить каждую группу отчетов в виде уникальных PDF-файлов с именем PDF под именем [Supervisor] - John Smith.PDF, Jill Smith.pdf et c. Этот отчет прилагается к электронному письму, которое открывается и ожидает корректировки перед отправкой.
В настоящее время это работает, за исключением пары проблем, которые я пытаюсь решить:
-
Я получаю всплывающее окно параметров, запрашивающее StartDate и EndDate (мои параметры установлены в текстовые поля формы) перед каждым открытием отчета. Я должен вручную вводить эту дату для каждого параметра перед каждым отчетом, он не заполняется из формы.
Я получаю несколько электронных писем, открытых для каждого руководителя. У некоторых есть пустые отчеты. Похоже, что я получаю по одному для каждой записи каждого отчета, с всплывающим параметром для каждого.
После нажатия кнопки я ввожу даты во всплывающие окна параметров. Мои отчеты открываются, сохраняются, закрываются, и электронная почта генерируется правильно. Вместо того, чтобы автоматически переходить к следующему отчету / электронной почте, мне нужно снова вручную вводить дату во всплывающие окна параметров.
Моя форма имеет два поля Text0 и Text2 и кнопку, которая будет печатать отчет на основе запроса ниже с использованием VBA.
Запрос SQL:
SELECT DISTINCT [Active and Expired Badges].Supervisor_Clean, [Active and Expired Badges].FIRSTNAME, [Active and Expired Badges].LASTNAME, [Active and Expired Badges].[Premera ID], [Active and Expired Badges].Company, [Active and Expired Badges].Title, [Active and Expired Badges].[End Date], [FIRSTNAME] & " " & [LASTNAME] AS Name
FROM [Active and Expired Badges]
WHERE ((([Active and Expired Badges].Title) Like "*" & "outsource" & "*" Or ([Active and Expired Badges].Title) Like "*" & "Contingent" & "*") AND (([Active and Expired Badges].[End Date]) Between [StartDate:] And [StopDate:]));
Кнопка VBA:
Private Sub Command5_Click()
'split report into PDFs named after supervisor and open a separate email with each report attached
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim MyFileName As String
Dim mypath As String
Dim temp As String
Dim qry As QueryDef
Dim StartDate As DAO.Parameter
Dim StopDate As DAO.Parameter
Set db = CurrentDb()
Set qry = db.QueryDefs("30-Day query")
mypath = "C:\Users\cw52450\Desktop\Test Exports\"
qry.Parameters("StartDate").Value = [Forms]![EndDate]![Text0]
qry.Parameters("StopDate").Value = [Forms]![EndDate]![Text2]
Set rs = qry.OpenRecordset(dbOpenSnapshot)
If Not (rs.EOF And rs.BOF) Then
'populate rs
rs.MoveLast
rs.MoveFirst
'start report generation loop
Do While Not rs.EOF
temp = rs("Supervisor_Clean")
MyFileName = rs("Supervisor_Clean") & Format(Date, ", mmm yyyy") & ".PDF"
DoCmd.OpenReport "End Date Report", acViewReport, , "[Supervisor_Clean]='" & temp & "'"
DoCmd.OutputTo acOutputReport, "", acFormatPDF, mypath & MyFileName
DoCmd.Close acReport, "End Date Report"
DoEvents
'start mail section
open Outlook, attach zip folder or file, send e-mail
Dim appOutLook As Outlook.Application
Dim MailOutLook As Outlook.MailItem
Set appOutLook = CreateObject("Outlook.Application")
Set MailOutLook = appOutLook.CreateItem(olMailItem)
With MailOutLook
.SendUsingAccount = appOutLook.Session.Accounts.Item(2)
.BodyFormat = olFormatRichText
'.To = ""
''.cc = ""
''.bcc = ""
.Subject = "Non-Employees with Expiring Building Access"
.HTMLBody = "<html><body><p>Hello,</p><p>The attached report... </p></body></html>"
.Attachments.Add (mypath & MyFileName)
'.DeleteAfterSubmit = True 'This would let Outlook send the note without storing it in your sent bin
.Display
End With
'end mail section
rs.MoveNext
Loop
Else
MsgBox "There are no records in the recordset."
End If
MsgBox "Report generation complete."
Set rs = Nothing
Set db = Nothing
Set qry = Nothing
End Sub