Imprimir o exportar informes de forma masiva con recordset

Gracias antes de mi pregunta por dedicarme su tiempo, la cuestión que que tengo la necesidad de imprimir/exportar y enviar por correo una serie de informes que tengo en una tabla y esto se debe hacer por separado y por el campo [CÓDIGO] pero como no se hacerlo bien escribo una sentencia por cada CÓDIGO como el siguiente ejemplo.

Para imprimir:

DoCmd.OpenReport "MAYORES-J", acViewNormal, "", "[CODIGO]=""0097""", acDialog
DoCmd.OpenReport "MAYORES-J", acViewNormal, "", "[CODIGO]=""0098""", acDialog

Para exportar:

DoCmd.OpenReport "MAYORES-J", acViewPreview, "", "[CODIGO]=""0098""", acHidden
DoCmd.OutputTo acOutputReport, "MAYORES-J", "PDFFormat(*.pdf)", "C:\INF\CALLE OLMOS.PDF", False, "", , acExportQualityPrint
DoCmd. Close acReport, "MAYORES-J"

La Pregunta es si es posible que realice estas operaciones por cada uno de los informes que coincidan el [CÓDIGO] si el campo [IMPRIMIR] esta activo.

Respuesta
1

Si tengo un formulario con clientes, que sería el tuyo con los registros de esa tabla

Tengo una carpeta llamada Informes donde voy a guardar el PDF con el nombre del cliente. Si pulso el botón

Yo no tengo instalado el Adobe, pero te lo guarda en formato PDF.

Lo que hace es ir recorriendo los registros, abre su informe, lo guarda, lo cierra y se va al siguiente registro, hasta el último. El código del botón es

Private Sub Comando13_Click()
Dim p As Integer
DoCmd.GoToRecord , , acFirst
For p = 1 To Me.Recordset.RecordCount
DoCmd.OpenReport "CLIENTES", acPreview, , "IDCLIENTE=" & Me.IdCliente & "", acHidden
DoCmd.OutputTo acOutputReport, "clientes", "PDFFormat(*.pdf)", "C:\users\gonza\documentos\borrar\informes\" & "" & Me.Cliente & "" & ".pdf", , , , acExportQualityPrint
DoCmd.Close acReport, "clientes"
DoCmd.GoToRecord , , acNext
Next
End Sub

Se podrías usar Do..until, Do while,... pero me gusta ver como va recorriendo los registros.

Gracias Julián, pero como le añado a esa instrucción que solo realice el recordset en aquellos registros que tiene el campo IMPRIMIR activado(Sí/No)

Creía que en la tabla sólo tenías aquellos registros que tenían Imprimir=Si

Si hay algunos que no lo tengan basta conque en el evento Al cargar del formulario crees un procedimiento de evento y pongas

me.recordsource="select * from mitabla where imprimir=True"

Donde yo pongo Idcliente tu tienes que poner tu Codigo, que como es texto tendría que ser

DoCmd.OpenReport "CLIENTES", acPreview, , "codigo="' & Me.IdCliente & "'", acHidden

Y por cierto, para Eperezfer. Inteligente, de vez en cuando convendría que leyeras bien las preguntas. Cuando lo guardes como PDF, a menos que le dés como nombre una variable, sólo te guardará el informe una vez, aunque haya 20 registros.

Excelente Julián por tu respuesta, he puesto el siguiente evento

Private Sub Comando9_Click()
Dim P As Integer
DoCmd.GoToRecord , , acFirst
For P = 1 To Me.Recordset.RecordCount
DoCmd.OpenReport "I_MAYOR", acPreview, , "CODIGO='" & Me.CODIGO & "'", acHidden
DoCmd.OutputTo acOutputReport, "I_MAYOR", "PDFFormat(*.pdf)", "C:\INF2\" & "" & Me.NPdf & "" & ".pdf", False, "", , acExportQualityPrint
DoCmd.Close acReport, "I_MAYOR"
DoCmd.GoToRecord , , acNext
Next
End Sub

Pero me da error cuando ha exportado todos los informes y llega al ultimo registro y me marca de amarillo la siguiente línea

DoCmd.GoToRecord , , acNext

el error que da es el siguiente

El sistema entiende que el último registro, aunque esté en blanco es

Entonces, si en el origen de registros del formulario usas una consulta de datos agrupados como en la imagen,

el, por así decir, el último registro "desaparece"

Por lo que cuando en la instrucción le dices que vaya al último registro no lo encuentra. Para subsanar eso lo puedes poner como

for p=1 to me.recordset.recordcount-1

1 respuesta más de otro experto

Respuesta
1

No necesita un formulario para imprimir, lo puede hacer desde cualquier botón u otro. Además, como le explican se imprimirán todos los registros y según su pregunta solo son los que tengan marcado IMPRIMIR, asumo que es un campo Booleano.

Adicione este código a un evento

  Dim rs As DAO.Recordset
  Set rs = CurrentDb.OpenRecordset("SELECT * FROM mitabla WHERE imprimir=-1")
  Do Until rs.EOF
    DoCmd.OpenReport "MAYORES-J", acViewPreview, "", "[CODIGO]='" & rs!idcodigo, acHidden
    DoCmd.OutputTo acOutputReport, "MAYORES-J", "PDFFormat(*.pdf)", "C:\INF\CALLE OLMOS.PDF", False, "",, acExportQualityPrint
    DoCmd.Close acReport, "MAYORES-J"
    rs.MoveNext
  Loop
  rs.Close
  Set rs = Nothing

Perdón se me olvidó cambiar esta línea

DoCmd.OutputTo acOutputReport, "MAYORES-J", "PDFFormat(*.pdf)", "C:\INF\CALLE OLMOS.PDF", False, "", , acExportQualityPrint

Cámbiela por

DoCmd.OutputTo acOutputReport, "MAYORES-J", "PDFFormat(*.pdf)", "C:\INF\" & rs! Idcodigo & ".PDF", False, "",, acExportQualityPrint

Cambie "mitabla" por el nombre de la tabla y rs! Idcodigo por en nombre del campo clave.

Gracias por enseñarme Julián usted es un cerebro de nada

Buenos días Eduardo, entonces es posible hacer su ejemplo sin estar en el formulario donde se encuentra los registros, la tabla se llama T_Mayores y no tiene un campo clave y cada informe MAYORES-J  puede tener 30, 40, 50... etc paginas, en conclusión necesitaría exportar cada informe con su código de obra, es posible con su ejemplo y que me guarde automáticamente con el nombre del campo que contiene el campo "NPdf", gracias.

Si claro no veo problema, toda vez, que en la instrucción SELECT * FROM T_Mayores con el * se está indicando que son todos los campos de la tabla y lógicamente NPdf es uno de ellos.

Entonces algo estoy haciendo mal ya que me da error, tengo el siguiente código:

Private Sub Comando358_Click()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T_MAYORES")
Do Until rs.EOF
DoCmd.OpenReport "I_MAYOR", acViewPreview, "", "[CODIGO]='" & rs!CODIGO, acHidden
DoCmd.OutputTo acOutputReport, "I_MAYOR", "PDFFormat(*.pdf)", "C:\INF2\" & rs!NPdf & ".PDF", False, "", , acExportQualityPrint
DoCmd.Close acReport, "I_MAYOR"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub

La tabla donde coge los datos el informe I_Mayor se llama T_Mayores y debo exportar el informe a pdf en la ruta "C:\INF2\" guardando cada informe con el nombre del campo NPdf, este informe esta basado en el campo CÓDIGO que es un campo alfanumérico donde se registra el código de la obra, pero me da error en la línea

DoCmd.OpenReport "I_MAYOR", acViewPreview, "", "[CODIGO]='" & rs!CODIGO, acHidden

Que estoy haciendo mal

Hola Eduardo con el siguiente evento me funciona

Private Sub Comando358_Click()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T_MAYORES")
Do Until rs.EOF
DoCmd.OpenReport "I_MAYOR", acViewPreview, "", "[CODIGO]='" & rs!CODIGO & "'", acHidden
DoCmd.OutputTo acOutputReport, "I_MAYOR", "PDFFormat(*.pdf)", "C:\INF2\" & rs!NPdf & ".PDF", False, "", , acExportQualityPrint
DoCmd.Close acReport, "I_MAYOR"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub

Pero como bien dice julián me guarda todos los informes con el mismo nombre, tienes alguna solución para ello, gracias.

Indica que el contenido del campo NPdf es igual en la tabla para todos los registros, porque el recordset avanza bien, en ese caso debe utilizar otro campo, ahora si prefiere envíeme únicamente la tabla a [email protected] y la reviso.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas