Exportar informe con origen de datos de una consulta en formato pdf, separados por cada registro que arroje la consulta

Acudo a su amable ayuda, tengo un formulario que me permite agregar unos registros a una tabla y en el mismo formulario un botón que me permite abrir un informe de acuerdo a una consulta con criterios y exportarlo en formato pdf, el problema es que me genera un solo informe con todos los registros separado por hojas pero en un solo informe, dado que es para realizar un carne requiero que al ejecutar el código me creara un informe por cada registro que traiga la consulta, he encontrado muchos ejemplos para hacer el recorset pero trayendo los registros desde una tabla.

No he logrado convertir el código para que realice los informes a partir de los registros de la consulta.

El informe que tengo creado tiene como origen de datos la consulta,

La verdad llevo dos meses tratando de sacarlo pero no lo logro ademas debo incluir el envió automático por correo de cada informe

Respuesta
2

Hacer un recordset sobre una consulta es exactamente igual que hacerlo sobre una tabla, con una salvedad, que tenga algún criterio que se pida al usuario.

Si puedes concretar un poco más cómo es tu consulta, el código que tratas de usar... te intento ayudar a resolverlo.

En general el código sería de este estilo:

Dim rst As DAO.Recordset
Set rst=CurrentDb.OpenRecordset("NombreConsulta")
Do Util rst. EOF
DoCmd.OutputTo acOutputReport, "NombreInforme", "PDFFormat(*.pdf)", "Ruta\NombreArchivo.pdf"
Rst. MoveNext
Loop

Un saludo.


http://nksvaccessolutions.com/academy/ 

2 respuestas más de otros expertos

Respuesta
2

Fabián: Esta pregunta me sale sugerida, y me cuesta bastante rechazar las que recibo así, aunque veo que Sveinbjorn (mis saludos Maestro), ya te contesta de forma adecuada.

Dado que hace muy poco he contestado una pregunta similar, si quieres darle una mirada y te ayuda, puedes verla en:

Bajar archivos en PDF desde una tabla

Mis saludos >> Jacinto

Respuesta
1

La estructura que te muestra Sveinbjorn es la adecuada, pero no se puede dejar el nombre del archivo de salida estático, toda vez, que la va a reemplazar con el siguiente registro. Debes concatenar el nombre del archivo de salida con algo como:

Dim strFile AS String

Dim rst As DAO.Recordset

Set rst=CurrentDb.OpenRecordset("NombreConsulta")

Do Util rst. EOF

strFile="C:\" & "NombreArchivo_" & id & ".pdf" 

DoCmd. OutputTo acOutputReport, "NombreInforme", "PDFFormat(*.pdf)", strFile

Rst. MoveNext

Loop

Observe que utilizo el id para concatenar el nombre del archivo de salida, de tal forma que va cambiando por cada RecordSet, puede utilizar en lugar del ID otro campo de la consulta.

Buena tarde muchas gracias a todos por su pronta ayuda, de todos tome parte he intente realizar el código a punta de ensayo y error, el cual ya lo organice y logre imprimir el informe, sin embargo no logro que cada registro que trae la consulta sea un pdf separado.

voy a tratar de explicar mejor el desarrollo que intento hacer:

Tengo un formulario que trae ID programa y el ID de grupo esto los trae de tablas diferentes, en el mismo formulario tengo otros campos que alimentan una tabla diferente y almacena los campos anteriormente mencionados "ID prog... ID Gru...".

Hasta ahi, no hay problema luego cree una consulta que me une todos los datos incluso hace un campo calculado y  por ultimo, cree el informe gracias a los aportes de la madrugada logre que los traiga desde la consulta. el problema es que la consulta esta filtrando por ID de la tabla que recoge todos los campos y eso esta bien pero si la consulta me trae 5 registros genera todos los informes en uno solo, lo cual no me sirve por que esta solución es para crear un carne para cada participante y poder enviárselo por correo de una vez, este es el la parte del código que he podido programar:

Private Sub btnasignarhoras_Click()
Dim rutaSalida As String
Dim rutaPdf As String
Dim idhoras As Long
Dim idprograma As Long
Dim idgrupo As Long
Dim rst As DAO.Recordset
rutaSalida = Application.CurrentProject.Path & "\InformesPDF\"
Set rst = CurrentDb.OpenRecordset("ConsuCarne", dbOpenSnapshot)
'If idprograma.Value > 0 And idgrupo.Value > 0 Then
If horaslunes.Value > 0 Or horasmartes.Value > 0 Or horasmiercoles.Value > 0 Or horasjueves.Value > 0 Or horasviernes.Value > 0 Or horassabado.Value > 0 Or horasdomingo.Value > 0 Then
'Comando que actualiza los datos
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
'DoCmd.RunCommand acCmdSaveRecord
If rst.RecordCount = 0 Then GoTo Salida
Echo False
With rst
.MoveFirst
Do Until .EOF
idhoras = .Fields("id").Value
DoCmd.OpenReport "Generar_Carnes", acViewPreview, , "id=" & idhoras
rutaPdf = rutaSalida & "Programa " & Me.idprograma & "_" & Id & ".pdf"
DoCmd.OutputTo acOutputReport, "Generar_Carnes", "*.pdf", rutaPdf, False
DoCmd.Close acReport, "Generar_Carnes"
.MoveNext
Loop
End With
Echo True
MsgBox "Impresión realizada correctamente", vbInformation, "OK"
Salida:
rst.Close
Set rst = Nothing
Else
MsgBox "Debe completar los datos", vbInformation, "ADVERTENCIA"
End If
'End If
DoCmd.Close acForm, "FcreacionCarnes"
End Sub

Te he preparado este ejemplo con base en una consulta.

Para el ejemplo utilizo 5 registros pero no utilizo acViewPreview en su lugar acViewReport. El resultado sería 5 archivos PDF algo como:

prueba_1.pdf

prueba_2.pdf

prueba_3.pdf

prueba_4.pdf

prueba_5.pdf

En ejemplo falta cerrar el recordeset y liberar memoria con Nothing.

Buen día eperezfer, nuevamente gracias por la ayuda, no he querido ser muy molesto con el tema por eso e tratado de dar con la solución a pesar de desvelarme un poco, pero no he podido lograr realizar los informes individualmente, creo que el problema radica en que la consulta que trae la información la filtro con tres criterios los cuales se toman del formulario que ejecuta el comando para abrir el informe, en los ejemplos que han brindado me doy cuenta que solo se utiliza un filtro como podría agregar dos filtros más?

Sencillo concatena con AND, por ejemplo;

"idciudad=" & rs!idciudad & " AND otrocampo1=" & rs!otrocampo1 & " AND otrocampo2=" & rs!otrocampo2.

Si no puedes enviame tu base de datos a [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas