Imprimir página | Cerrar ventana

Imprimir Informe en Documentos Separados

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84949
Fecha de impresión: 19/Abril/2024 a las 04:26


Tema: Imprimir Informe en Documentos Separados
Publicado por: Boogaloozgz
Asunto: Imprimir Informe en Documentos Separados
Fecha de publicación: 16/Enero/2020 a las 18:21
Hola a todos y todas,

Estoy echando una mano a una asociación de acogida de niños saharauis durante los veranos, intentando hacerles una pequeña aplicación para gestionar la info de los niños y las familias de acogida; y tengo un problema que no se resolver.

Hay un botón que me muestra un informe basado en una consulta, y lo guarda en una carpeta; en este informe aparece distintas líneas con información sobre los chavales agrupado por familias; necesito que se emita un informe separado por familia automáticamente (no me refiero a hojas separadas -forzar nueva página-) para poder enviar por mail a cada familia únicamente la info del niño que le corresponde. 

Por si no me he explicado bien la información en la consulta es:
  1. Familia 1
    • Dato niño 1
    • Dato niño 1
  2. Familia 2
    • Dato niño 2
    • Dato niño 2
Al actuar sobre el botón se necesitaría que en lugar de guardar un informe en dos hojas separadas, se emitan y guarden dos informes con un nombre p.e. familia1.pdf y familia2.pdf

¿Podéis darme luz sobre como lograr algo así o sabéis de algún ejemplo similar?

Gracias por vuestra atención




Respuestas:
Publicado por: Mihura
Fecha de publicación: 16/Enero/2020 a las 20:10
Créate una consulta que te diga las distintas familias que hay.

Explotando esta consulta te creas un informe por cada registro de la misma (usando un recordset para recorrer la misma).


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Boogaloozgz
Fecha de publicación: 16/Enero/2020 a las 20:48
Muchas gracias,

Voy a intentarlo de ese modo. No controlo mucho lo del recordset, ¿puedo hacerlo con un for each?

Gracias


Publicado por: Mihura
Fecha de publicación: 16/Enero/2020 a las 22:40
Set Rs = Currentdb.Openrecordset("xxxx", dbopenfordwardonly)
Do until Rs.eof
    'Trato mi valor
    Docmd.OpenReport "xxx",,,,, Rs!Familia
    Rs.Movenext
Loop
Rs.Close


má o meno ... Wink.
¡Ojo! escrito al vuelo, la sintaxis está de aquella manera ...


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Boogaloozgz
Fecha de publicación: 21/Enero/2020 a las 08:46
Buenos días a todos,

Gracias a la idea de Mihura he intentado (con casi absoluto desconocimiento del tema) el código que pongo a continuación, pero me salta un error ('3078') diciendo que Access no puede encontrar la tabla o consulta de entrada (La consulta Familias existe en la base de datos y el nombre está escrito correctamente)

Dim dbTemporal As DAO.Database
 Dim rsREGISTROS As DAO.Recordset
 Set dbTemporal = CurrentDb
 

Set rsREGISTROS = dbTemporal.OpenRecordset("Familias", dbOpenDynaset)
    rsREGISTROS.MoveLast
    rsREGISTROS.MoveFirst
Do While Not rsREGISTROS.EOF()
DoCmd.OutputTo acReport, "InfoFamilia", "(*.pdf)", "C:\PROYECTO 976\SAHARA\ZARAGOZA\Familias\Info " & familia & " " & idExpediente &  ".pdf", False, ""
   rsREGISTROS.MoveNext
 DoEvents
    Loop
 
     
    rsREGISTROS.Close
    dbTemporal.Close
    Set rsREGISTROS = Nothing
    Set dbTemporal = Nothing

NOTA: si en lugar de la consulta pongo esos datos en una tabla si la recorre

¿Alguna ayuda? gracias


Publicado por: JuanW
Fecha de publicación: 21/Enero/2020 a las 10:20
Hola:
La instrucción: Set rsREGISTROS = dbTemporal.OpenRecordset("Familias", dbOpenDynaset) es para un objeto query salvado en la BBDD.

Para una tabla sería:
Set rsREGISTROS = dbTemporal.OpenRecordset("Familias", dbOpenTable)

Saludos


Publicado por: Maverick2019
Fecha de publicación: 21/Enero/2020 a las 10:49
Hola Juan.
Depende de lo que quieras hacer. Sí quieres usar el método SEEK, que hace uso de índices y de uso exclusivamente en tablas, sí lo tienes que abrir como tabla. 
Sí lo vas a recorrer solo sín interaccionar, un dbOpenForwardOnly sería lo más indicado. Aunque el origen de datos sea una tabla.

Salu2,




Publicado por: Boogaloozgz
Fecha de publicación: 21/Enero/2020 a las 17:20
Familias es una consulta que tengo guardada en la base de datos, y con eso da el error que comento; con una tabla no.


Publicado por: Maverick2019
Fecha de publicación: 21/Enero/2020 a las 17:27
Hola
La base de datos a la que apunta dbTemporal ¿contiene la consulta? 
Me extraña mucho que no te deje abrirla como DynaSet y si como Table...

Salu2,



Publicado por: Boogaloozgz
Fecha de publicación: 21/Enero/2020 a las 17:37
Si Maverick2019, la consulta esta creada y guardada en la misma base de datos (las tablas están vinculadas a otro archivo access), y salta ese error.

Tengo una consulta que, entre otros datos, me da por ejemplo:

Descripcion        Familia
Dato 1 Familia A
Dato 2 Familia A
Dato 3 Familia B
Dato 4 Familia C

Lo que pretendo es para cada linea de esa consulta (Familias) imprimir un informe por separado con los datos de Descripcion para cada familia, y guardarlo con el nombre Familia A, Familia B, y Familia C.

No se si hay un modo de hacerlo más sencillo que con el Recordset (La verdad es que no toco access desde hace años, y el tema de VBA lo llevo mas que flojito).


Publicado por: Mihura
Fecha de publicación: 21/Enero/2020 a las 17:49
Como te dijo Maverick la primera vez, ábrelo con dbOpenForwardOnly

Set rsREGISTROS = dbTemporal.OpenRecordset("Familias", dbOpenForwardOnly)


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Boogaloozgz
Fecha de publicación: 21/Enero/2020 a las 18:24
Mihura, lo he hecho tal como decía:

Set rsREGISTROS = dbTemporal.OpenRecordset("Familias", dbOpenForwardOnly)

El error que lanza en este caso es:Error 3061 en tiempo de ejecución. Pocos parametros. Se esperaba 1 


Publicado por: xavi
Fecha de publicación: 21/Enero/2020 a las 18:28
Creo que falta una coma...

Set rsREGISTROS = dbTemporal.OpenRecordset("Familias",, dbOpenForwardOnly)


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Mihura
Fecha de publicación: 21/Enero/2020 a las 18:49
No le falta ninguna coma ...  Evil Smile

Otra cosa es que le tire un error en el .Movelast, .MoveFirst con el parámetro dbOpenForwardOnly (que no se porqué está de moda ponerlo).

Copio / Pego una prueba rápida que he hecho:

Private Sub Comando8_Click()
    Set DbExterna = CurrentDb
    Dim Rs As DAO.Recordset
    Set Rs = CurrentDb.OpenRecordset("ConsultaFechas", dbOpenForwardOnly)
    Do Until Rs.EOF
        Debug.Print Rs.Fields(0)
        Rs.MoveNext
    Loop
    Rs.Close
    
End Sub


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Boogaloozgz
Fecha de publicación: 21/Enero/2020 a las 18:51
Gracias por tu aportación Xavi,

Set rsREGISTROS = dbTemporal.OpenRecordset("Fabricacion",, dbOpenForwardOnly)


Salta el mismo error de faltan parámetros.

Ahora si que ando perdido del todo jajajajjaa. ¿Véis alguna otra solución o camino para conseguir lo que necesito? (si es necesario que la asociación recurra a algún desarrollador que solucione este punto creo que lo harían)




Publicado por: xavi
Fecha de publicación: 21/Enero/2020 a las 18:55
Sorry!

Confundí dbOpenForwardOnly (que es un tipo de apertura) con dbForwardOnly (que es una opción)



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: conrrad69
Fecha de publicación: 22/Enero/2020 a las 13:15
Ese error te puede dar porque la consulta tenga parámetros (criterios) que esté leyendo de un formulario. En ese caso no te dejará cargarla en el recordset así como así. Tendrás que escribir la consulta en el mismo VBA y hacer que lea esos parámetros del formulario para poder asignarla al recordset.

Ahora no estoy delante de un equipo desde el que pueda ponerte un ejemplo más claro pero esta tarde puedo verlo con más calma.


Publicado por: Boogaloozgz
Fecha de publicación: 22/Enero/2020 a las 13:48
Hola Conrrad69,

Efectivamente la consulta lee un parámetro del formulario...disculpad todos si es algo que debía haber dicho (es el problema de no controlar esto como vosotros).

Te agradecería que me comentases como introducir entonces la consulta en el código del recordset.

Gracias


Publicado por: Boogaloozgz
Fecha de publicación: 22/Enero/2020 a las 18:56
Hola a todos,
He conseguido lo que pretendía con la ayuda de todos, y de forma poco ortodoxa imagino. Así que os agradezco a todos y cada uno de vosotros vuestra colaboración.

Os cuento lo que he hecho (no os riáis mucho de mi...):
 1- Como el error que comenta Conrrad69 me daba al tener la consulta criterios he creado una tabla mediante una consulta en la que obtengo las Familias.
 2- Recorro con un Recordset esa tabla, y me desplazo por ella con un For i= 1 to rst.Recordcount
 3- Abro el informe filtrado por familia
 4- Finalmente lo exporto a una carpeta determinada con el nombre de la Familia

Con total seguridad es una "ñapa" o chapuza tremenda, pero me funciona. De todos modos me encantaría aprender a hacerlo como se debe con vuestra ayuda, así que... soy todo ojos y oídos.


Publicado por: Mihura
Fecha de publicación: 22/Enero/2020 a las 19:02
¿Leíste mi anterior mensaje? ...   creo que es la primera vez que veo un For i= 1 to rst.Recordcount para recorrer los registros de una tabla ... Ouch

Publicado originalmente por Mihura Mihura escribió:

Otra cosa es que le tire un error en el .Movelast, .MoveFirst con el parámetro dbOpenForwardOnly (que no se porqué está de moda ponerlo).

Copio / Pego una prueba rápida que he hecho:

Private Sub Comando8_Click()
    Set DbExterna = CurrentDb
    Dim Rs As DAO.Recordset
    Set Rs = CurrentDb.OpenRecordset("ConsultaFechas", dbOpenForwardOnly)
    Do Until Rs.EOF
        Debug.Print Rs.Fields(0)
        Rs.MoveNext
    Loop
    Rs.Close
    
End Sub


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Boogaloozgz
Fecha de publicación: 23/Enero/2020 a las 17:47
Hola Mihura,

Si perdona, leí tu mensaje, y lógicamente hice la prueba.

Set DbExterna = CurrentDb
    Dim Rs As DAO.Recordset
    Set Rs = CurrentDb.OpenRecordset("Familia", dbOpenForwardOnly)
    Do Until Rs.EOF
        ' para la prueba abro aquí un msgbox
        Rs.MoveNext
    Loop
    Rs.Close

Me sigue saltando el error de pocos parametros se esperaba 1  (no se si es por el tema de que la consulta filtra por un parámetro del formulario)


Publicado por: main
Fecha de publicación: 23/Enero/2020 a las 17:57
Hola:
No lo he probado, pero si en lugar de un recordest, referencias una querydef y le asignas los parametros no funcionaria??.
Saludos


Publicado por: conrrad69
Fecha de publicación: 23/Enero/2020 a las 19:04
Hola, perdona que no te contestara antes. Voy liado con el curro. Como ves el problema viene de los parámetros. 
En mi caso cuando me encuentro estas historias suelo escribir la consulta en el VBA, algo así:

Dim sql as String

sql = "SELECT ..........." 

Lo que hago es poner la consulta que tienes como objeto en vista SQL y copiar el código, luego lo pego en VBA y lo adapto. Los parámetros de la consulta los leo desde de aquí directamente del formulario:

sql= "SELECT............FROM...........WHERE IdCliente=" & Me.IdCliente

Simplificándolo mucho claro.
Y luego en el recordset cargo esta sql

Es mucho más complicado pero te salva ese inconveniente.


Publicado por: Boogaloozgz
Fecha de publicación: 23/Enero/2020 a las 20:45
Hola Main, 

No he hecho nunca lo del Querydef... ¿pero sería algo asi?

Dim dbTemporal As DAO.Database
Set dbTemporal = CurrentDb
Dim Consulta as QueryDef

    Set Consulta = MiBaseDatos.CreateQueryDef ("Familia","SELECT.......;")

Do While Not Consulta.EOF()
DoCmd.OutputTo acReport, "InfoFamilia", "(*.pdf)", "C:\PROYECTO 976\SAHARA\ZARAGOZA\Familias\Info " & familia & " " & idExpediente &  ".pdf", False, ""
   rsREGISTROS.MoveNext
 DoEvents
    Loop
 
     
    rsREGISTROS.Close
    dbTemporal.Close
    Set rsREGISTROS = Nothing
    Set dbTemporal = Nothing


Publicado por: main
Fecha de publicación: 24/Enero/2020 a las 14:30
HOLA
Este ejemplo es sobre una consulta ya existente
Dim rv As Recordset,qs As QueryDef
Set qs = CurrentDb().QueryDefs("Prueba")
qs.Parameters("[Forms]![GeneraReci]![RecIni]") = RecIni
qs.Parameters("[Forms]![GeneraReci]![RecFin]") = RecFin
qs.Parameters("[Forms]![GeneraReci]![Prop]") = Me.Prop
Set rv = qs.OpenRecordset()
y ya dispondras de todos los campos de la consulta en rv
saludos


Publicado por: Maverick2019
Fecha de publicación: 24/Enero/2020 a las 14:49
Hola
Según la documentación que encontrás aquí  https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao" rel="nofollow - https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao ) debería ser

Set rsREGISTROS = dbTemporal.OpenRecordset("Fabricacion", dbOpenForwardOnly)

Prueba a ver ahora...



Imprimir página | Cerrar ventana