vba - tabla - Looping a través de un conjunto de registros para generar el informe de Ms-Access en un archivo pdf
mostrar consulta en formulario access (2)
Simplemente use el método DoCmd.OpenReport para filtrar el informe y luego deje el nombre del informe en blanco en DoCmd.OutputTo según los documentos:
ObjectName> Opcional> Variant: si desea generar el objeto activo, especifique el tipo del objeto para el argumento ObjectType y deje este argumento en blanco.
With MyRs
.MoveFirst
Do While Not .EOF
fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
DoCmd.OpenReport "Invoice", acViewReport, , "[tenant_id] = " & !tenant_id, acHidden
DoCmd.OutputTo acOutputReport, , acFormatPDF, pathName & fileName
.MoveNext
Loop
End With
Estoy intentando obtener el archivo pdf por tenant_id
usando docmd.outputTo
. Desafortunadamente, esta rutina produce un archivo PDF de salida que todos están en un mismo tenant_id
. Si docmd.outputTo
último parámetro pathName & fileName
entonces es necesario el nombre del archivo a través del diálogo y el archivo de salida filtrados por tenant_id
. Cualquier ayuda sería apreciada.
Aquí está la consulta de la factura: SELECT * FROM tblInvoice WHERE tenant_id = CurTenantID()
Public Sub Output()
Dim MyRs As DAO.Recordset
Dim rpt As Report
Dim fileName As String, pathName As String, todayDate As String
pathName = "C:/Users/abzalali/Dropbox/tenant_db/Invoice/"
todayDate = Format(Date, "MMDDYYYY")
Set MyRs = CurrentDb.OpenRecordset("SELECT tenant_id, name, company, email FROM qryEmailClientList")
DoCmd.OpenReport "Invoice", acPreview, , , acHidden
Set rpt = Reports("Invoice")
With MyRs
.MoveFirst
Do While Not .EOF
fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
rpt.Filter = "[tenant_id] = " & !tenant_id
rpt.FilterOn = True
DoCmd.OutputTo acOutputReport, "Invoice", acFormatPDF, pathName & fileName
.MoveNext
Loop
End With
End Sub
Como DoCmd.OutputTo
carece de parámetros para el filtrado, la mejor opción es basar el informe en una función pública para obtener el ID actual.
P.ej
'' Function to both set and retrieve the current Tenant ID
Public Function CurTenantID(Optional SetTenantID As Long = 0) As Long
Static TenantID As Long
If SetTenantID > 0 Then
TenantID = SetTenantID
End If
CurTenantID = TenantID
End Function
Su informe utiliza esta función en su fuente de registro, por ejemplo
SELECT * FROM tblInvoice WHERE tenant_id = CurTenantID()
Y al generar los informes PDF en el ciclo, usa el parámetro SetTenantID
:
Public Sub Output()
Dim MyRs As DAO.Recordset
Dim fileName As String, pathName As String, todayDate As String
pathName = "C:/Users/abzalali/Dropbox/tenant_db/Invoice/"
todayDate = Format(Date, "MMDDYYYY")
Set MyRs = CurrentDb.OpenRecordset("SELECT tenant_id, name, company, email FROM qryEmailClientList")
With MyRs
'' .MoveFirst -- unneeded after OpenRecordset()
Do While Not .EOF
fileName = "Invoice_" & todayDate & !tenant_id & ".pdf"
Call CurTenantID(!tenant_id)
DoCmd.OutputTo acOutputReport, "Invoice", acFormatPDF, pathName & fileName
.MoveNext
Loop
End With
End Sub