Access - Macro bucle

 
Vista:
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Macro bucle

Publicado por Juanjo (37 intervenciones) el 02/12/2020 15:12:45
Hola a todos y gracias de antemano por la ayuda.

Tengo un formulario que filtra un listado de registros, en mi caso, las facturas de un periodo. Al lado de cada registro he puesto un botón para poder generar la propia factura en formato pdf. Hasta aquí bien.

Lo que quiero hacer ahora es poner otro botón en el encabezado del formulario que ejecute una macro. Esa macro debe recorrer todos los registros y generar el pdf de cada uno y guardarlo en una carpeta x del PC. Mi duda es que tipo de bucle utilizar (for each; do loop, ...) y que variable utilizar para recorrer dicho bucle.

Espero haberme explicado correctamente. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Macro bucle

Publicado por Juanjo (37 intervenciones) el 03/12/2020 12:38:42
Actualizo la información a ver si alguien me puede ayudar.

Ya tengo el bucle que recorre los registros del formulario pero hay algo que estoy haciendo mal. Pongo el código donde simplemente muestra un mensaje emergente con el valor de un campo del formulario (NumFactura). Si el formulario tiene 5 registros ejecuta el bucle 5 veces. Perfecto!!, pero el problema es que siempre muestra el valor del primer registro. No "salta" al siguiente registro para mostrar el valor correspondiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Comando73_Click()
Dim rst As DAO.Recordset
 
Set rst = Me.RecordsetClone
While Not rst.EOF
 
MsgBox (Me.NumFactura)
 
rst.MoveNext
Wend
 
rst.Close
Set rst = Nothing
End Sub

¿Alguna ayuda? Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro bucle

Publicado por Anonimo (3319 intervenciones) el 03/12/2020 15:00:52
Es lo normal, estas 'moviendo' una copia del RecordsetClone y aunque fuera el mismo RecordsetClone ocurriría lo mismo, para que se desplace al siguiente del formulario habrá que sincronizarlos (si se desea verlos, porque para cualquier otra cosa no es necesario)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Macro bucle

Publicado por Juanjo (37 intervenciones) el 03/12/2020 16:08:42
Hola y gracias por responder.

Como contaba en mi primer post, lo único que quiero hacer es generar un pdf con los datos de cada registro y guardarlo en una carpeta del PC. Al tratarse de un formulario continuo, en cada registro he puesto un botón para generar el pdf individual, pero si tengo 200 registros lo que me quiero ahorrarme es hacer 200 clicks. De ahí la idea de que con un solo botón generar una macro con un bucle que recorra los 200 registros y genere los 200 pdf.

Te cuento esto porque desconozco que quieres decir con "sincronizarlos". En mi caso, no necesito ver los registros, ni editarlos ... simplemente que la macro haga lo que he contado. ¿Me puedes indicar como plantearías ese bucle?. Ni siquiera se si realmente es necesario utilizar RecordsetClone. Lo probé porque lo vi en una web pero sin saber realmente si es lo que necesito. Lo mismo con un bucle normalito tipo For each es suficiente y estoy liándome más de lo necesario. En resumen, que ando un poco perdido.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro bucle

Publicado por Anonimo (3319 intervenciones) el 03/12/2020 17:04:24
Para lograr lo que deseas lo indispensable es poder definirlos con un dato común (la referencia del registro en el formulario igual a la referencia del registro a imprimir).

Normalmente se suele hacer con un informe que si no se le condiciona imprima todos los registros y con una condición (por ejemplo el ID antes mencionado) solo imprima este.

Logrado lo anterior solo seria preciso recorrer el recordsetClone del formulario con la orden de imprimir ese formulario filtrándolo (esto es condicionándolo) con el dato que lo identifique y que se supone es común.

Si te dejas llevar por el asistente de Access a la hora de imprimir el registro (desde VBA, esto es: dentro del bucle), apreciaras que uno de los parámetros es una condición (justo lo que se necesita)..

Eso si: NO a la vista previa, se consumen recursos innecesarios y bloquea la ejecución, pues para que salga 'el siguiente, hay que cerrar el informe que muestra el actual.

Un clásico seria algo así:

1
DoCmd.OpenReport "tu_informe", , , "ID_en_el_informe = " & Id_en_el_ Formulario / Tabla / Consulta / Bucle

Una nota: cuando se desea recorrer un conjunto de datos, es importante verificar se que se comienza en el primero de ese conjunto.
Un comentario ... no veo una macro, veo una subfunción en VBA ¿es correcto esto? (es fácil que alguien se complique si no se definen bien los objetos).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Macro bucle

Publicado por Juanjo (37 intervenciones) el 03/12/2020 20:29:39
Hola y gracias de nuevo por tomarte la molestia de responderme.

Voy a ser sincero. No te sigo. No acabo de entender lo que quieres decir. En lugar de simplificar el código que puse la primera vez con un msgbox voy a poner el código que utilizo realmente, aunque el problema es el mismo. Tengo un formulario que se alimenta de una consulta en la cual establezco los filtros necesarios. Ejecuto el formulario y me lista por ejemplo las 200 facturas del mes de noviembre. En cada línea tengo el cif, razón social, importe, etc. Quiero crear un botón que genere 200 pdf y los ponga en una carpeta. Este es la macro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Private Sub Comando72_Click()
 
Dim rst As DAO.Recordset
Dim i As Integer
 
Set rst = Me.RecordsetClone
If Not rst.BOF Then
rst.MoveFirst
 
For i = 1 To rst.RecordCount
 
If [Fiscalidad] = 0 Then
        miInforme = "FACTURA POR LISTADO SIN IVA"
 
    ElseIf [FormulaPago] <> 1 Then
        miInforme = "FACTURA POR LISTADO RESUMEN"
 
    Else
        miInforme = "FACTURA POR LISTADO"
 
End If
 
 
miRuta = "C:\Trabajo\"
 
nomArchivo = "Factura " & Me.NumFactura & ".pdf"
 
DoCmd.OutputTo acOutputReport, miInforme, "PDFFormat(*.pdf)" _
, miRuta & nomArchivo, False, "", 0, acExportQualityPrint
 
rst.MoveNext
Next i
End If
rst.Close
Set rst = Nothing
 
End Sub

En la carpeta destino solo me aparece el pdf del primer registro del listado. Faltan los otros 199. En pantalla a toda velocidad se ve como se generan los 200 pdf pero son todos iguales. Repite 200 veces el primer registro pero no "salta" de uno a otro.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro bucle

Publicado por Anonimo (3319 intervenciones) el 03/12/2020 23:05:25
El problema sigue en el mismo punto.

Lo primero, simplificar es utilizar lo mínimo con la máxima eficiencia... no lo cumples cuando creas un clon de un clon ¿para que hacer copia de una copia si con el original se hace lo mismo y no se desperdician recursos ni tiempo?.

Lo segundo...
Observa como te desplazas al siguiente registro:
rst.MoveNext

Y de/como donde tomas la referencia:
Me.NumFactura

Apreciaras que 'algo se mueve' y lo que se ve es como se envía el informe a la impresora (virtual), pero siempre el mismo.... porque la referencia (el formulario del que se toma el dato) NO SE MUEVE, se mueve el clon de un clon del origen de datos de ese objeto.

Hay opciones:
.- Si los datos del informe se 'copian' del formulario, el que se tiene que mover es el propio formulario y para esos no se precisas utilizar un clon, se puede mover al propio formulario como si fuese un recordset (pero es mareante y una perdida de tiempo generando una presentación) ... aunque si se efectúan operaciones en el formulario (que se han de reflejar en el informe), no quedara mas remedio.

Si al informe le basta saber el numero de factura (y se desea utilizar la copia de la copia del origen de datos de ese formulario), referencia la copia (el recordset = RST) y no el formulario.

1
Me.NumFactura ====> rst!NumFactura

Si sigues con la idea de utilizar un clon, utiliza el que tienes por defecto (no hay que declararlo y siempre estará presente, no ocupara mas espacio del que ya ocupa .... etc.)

Tan fácil como utilizar en lugar de rst su origen (Me.RecordsetClone) que es un recordset con todas las de la Ley.

¿Que 'RecordsetClone' es muy largo y pesado de nominar ....?

Se le puede declarar como objeto por defecto y cuando se finaliza se le quita el status, es así de sencillo:

1
2
3
4
5
6
7
8
9
10
11
12
With Me.RecordsetClone ' se le declara como objeto por defecto como sujeto elíptico (oculto)
 
.MoveFirst 'ir al primero
Do until .Eof  ' o el metodo que mas domines
'aqui utlizare lo que ya está es mas cómodo y creo que lo apreciaras mejor (es tu criatura domesticada)
nomArchivo = "Factura " & !NumFactura & ".pdf"
DoCmd.OutputTo acOutputReport, miInforme, "PDFFormat(*.pdf), miRuta & nomArchivo, False, "", 0, acExportQualityPrint
.MoveNext
Loop
End With ' fin de la declaración como sujeto elíptico

Como el RecordsetClone existe mientras el formulario esta abierto, no hace falta declararlo, dimensionarlo, copiarlo .... ni se le abre ni se le cierra, solo se le utiliza (y cada formulario tiene su 'RecordsetClone')

Por si no captas la idea....

Asume que tienes una vivienda y compras otra (un chalet adosado que es copia fiel)

En tu otra casa preparas el almuerzo, pero mandas a tu familia a comer en la casa original (no en la que has cocinado y donde esta el almuerzo).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Macro bucle

Publicado por Juanjo (37 intervenciones) el 04/12/2020 00:24:38
Perfecto. Ha funcionado y se comporta como necesitaba.

Muchas gracias por tu tiempo y las explicaciones que das compartiendo tus conocimientos. Me gustaría decir que me he enterado de todo pero estaría mintiendo. Ha sido una clase avanzada para un alumno novato como yo en vba. Necesitaría muchas clases antes en esta materia para entender y asimilar los conocimientos que has desarrollado.

Un saludo cordial.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar