Añadir Informe a Carpeta de Directorio

Dudas sobre Tablas, Consultas, Formularios, Informes...
Pinkemar
Nivel 2
Mensajes: 23
Registrado: Sab Dic 05, 2015 4:05 pm

Añadir Informe a Carpeta de Directorio

Mensajepor Pinkemar » Mar Jul 10, 2018 9:33 am

Estimados Accessianos:
En primer lugar agradecer la atención prestada.
Mediante un Informe, pretendo generar un recibo a cada uno de los registros de una tabla que llamaremos TCuotaSegunda. Este recibo lo paso a formato pdf y lo inserto en una carpeta de mi directorio. Si la carpeta no existe la creamos.
Toda esta acción la realiza gracias al siguiente código:

Private Sub Comando214_Click()
On Error GoTo Sol_err ' Control de errores para el error 75
' Solicitamos confirmación de la acción a realizar
Dim seguimos As String
seguimos = MsgBox("¡¡ATENCIÓN!! Va a generar todos los Recibos" & vbCrLf & "de la Segunda Cuota para la Campaña actual." & vbCrLf & " Este proceso puede durar varios minutos." & vbCrLf & " ¿DESEA CONTINUAR?", vbInformation + vbYesNo, "GENERADOR DE RECIBOS")
If seguimos = vbNo Then
MsgBox "No se han generado los recibos", vbInformation, "GENERADOR DE RECIBOS"
Exit Sub
End If

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim miNif, strTempArchivo As String

' Recorremos todos los registros de la tabla [TCuotaSegunda] mediante un recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("TCuotaSegunda", dbOpenSnapshot)

rst.MoveFirst ' Nos movemos al primer registro
Do Until rst.EOF ' Recorremos el recordset mediante un bucle

miNif = rst.Fields("SNIFTitular").Value ' Capturamos el número del NIF del titular

strTempArchivo = Dir("C:\Users\Usuario\Desktop\Comunidad Regantes\Regantes\" & miNif & "\", vbNormal)
If strTempArchivo <> "" Then ' Si existe la carpeta de destino
' Abrimos el informe, añadimos el informe a la carpeta y cerramos el informe
DoCmd.OpenReport "CartaPagoS", acViewPreview, , "TCuotaSegunda.SNIFTitular ='" & miNif & "'"
DoCmd.OutputTo acReport, "CartaPagoS", acFormatPDF, "C:\Users\Usuario\Desktop\Comunidad Regantes\Regantes\" & miNif & "\" & miNif & "_CartaPago2019S.PDF"
DoCmd.Close acReport, "CartaPagoS"
Else ' Si no existe la carpeta de destino
' Creamos la carpeta de destino
MkDir "C:\Users\Usuario\Desktop\Comunidad Regantes\Regantes\" & miNif ' Carpeta sin archivo, genera error 75
' Una vez creada la carpeta, abrimos el informe, añadimos el informe a la carpeta y cerramos el informe
DoCmd.OpenReport "CartaPagoS", acViewPreview, , "TCuotaSegunda.SNIFTitular ='" & miNif & "'"
DoCmd.OutputTo acReport, "CartaPagoS", acFormatPDF, "C:\Users\Usuario\Desktop\Comunidad Regantes\Regantes\" & miNif & "\" & miNif & "_CartaPago2019S.PDF"
DoCmd.Close acReport, "CartaPagoS"
End If

rst.MoveNext ‘ Nos movemos al siguiente registro

Loop ‘ Fin del bucle

' Cerramos y liberamos memoria
rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing
Exit Sub

' Gestión de errores, con especial hincapié en el error 75
Sol_err:
If Err.Number = 75 Then
Resume Next ' Ignora el error y continúa en la siguiente línea de programación
Else
MsgBox "Error número " & Err.Number & vbCrLf & vbCrLf & "Descripción: " & Err.Description
End If
End Sub

Hasta aquí la programación que, repito, ejecuta la acción requerida descrita anteriormente.

No obstante, debido a que se ha programado el abrir el informe (ver negrita), insertarlo en la carpeta y cerrar el informe, al ejecutar la pantalla aparece parpadeante con dichas aperturas y cierres para cada uno de los informes a archivar en su respectiva carpeta. Parece ser que es necesario abrir el informe para la la instrucción DoCmd.OutputTo acReport detecte el campo SNIFTitular, campo que es el que discrimina al cliente.

Después de toda esta disertación, mi pregunta es: ¿Se podría realizar la acción requerida sin la necesidad de tener que abrir y cerrar el Informe?

Reitero mi gratitud por la atención prestada.

JTrilloJ
Nivel 3
Reto05
Mensajes: 52
Registrado: Mar Dic 01, 2015 3:27 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor JTrilloJ » Jue Jul 12, 2018 5:00 pm

Prueba lo siguiente:
-Después de Rst.MoveFirst
DoCmd.Echo False
DoCmd.Hourglass True
-A la línea >> DoCmd.OpenReport "CartaPagoS", acViewPreview, , "TCuotaSegunda.SNIFTitular ='" & miNif & "'" la modificas a >>
DoCmd.OpenReport "CartaPagoS", acViewPreview, , "TCuotaSegunda.SNIFTitular ='" & miNif & "'", acHidden

-Después del Loop
DoCmd.Echo True
DoCmd.Hourglass False
Mis saludos >> Jacint

Pinkemar
Nivel 2
Mensajes: 23
Registrado: Sab Dic 05, 2015 4:05 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor Pinkemar » Jue Jul 12, 2018 11:33 pm

Estimado JTrilloJ:
Gracias por tu interés.
Al corregir siguiendo tus indicaciones casi lo hemos conseguido. Y me explico.
Antes de implementar tus indicaciones, aparecían dos pantallazos fugaces por cada registro guardado; uno con el recibo e inmediatamente después un cuadro de diálogo con el título -Impresión- y con el texto siguiente:
Extrayendo
CartaPagoS al
archivo c:\Users\Usuario\Desktop\...
Al corregir siguiendo tus apuntes, se ha anulado el pantallazo del recibo o informe, pero no así el cuadro de diálogo que sigue apareciendo de forma fugaz para cada uno de los registros guardados.
Reiterando mi agradecimiento, sólo me queda preguntar...
¿Se podrá quitar también este cuadro de diálogo?
Saludos a todos los accessianos.

JTrilloJ
Nivel 3
Reto05
Mensajes: 52
Registrado: Mar Dic 01, 2015 3:27 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor JTrilloJ » Vie Jul 13, 2018 2:04 pm

La verdad es que yo convivo con esa situación y dentro del poco tiempo que he dedicado a buscar una solución, no la he encontrado.
Quizá es simple o no, y por ello ya que lo has planteado, esperemos que lean éste post alguno de los maestros y den la solución.
Valdrá para ti, para mi y muchos otros.
Un cordial saludo >> Jacinto

Avatar de Usuario
Neckkito
Moderador
Mensajes: 774
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor Neckkito » Vie Jul 13, 2018 2:53 pm

Hola!

Lamentablemente, el cuadro de diálogo de impresoras derivado del outputto (es decir, el cuadro de mensaje de marras) es un mensaje interno de Access y no puede ser manipulado por código VBA "normal" y, por extensión, no puede ser suprimido.

Recordaba haber leído hace tiempo un apaño manipulando las API's, y dado que acabo de realizar una búsqueda rápida por internete, ahí tenéis el código, del cual no puedo decir mucho porque yo no lo he probado: http://access.mvps.org/access/api/api0037.htm

Saludos.
Access MVP 2017-2019
http://bit.ly/NckAccess

Avatar de Usuario
Neckkito
Moderador
Mensajes: 774
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor Neckkito » Vie Jul 13, 2018 3:12 pm

Consciente de que hago doble post, quisiera aprovechar para hacer un par de recomendaciones a Pinkerman en otro mensaje para no mezclarlo con lo que sería el cuadro de diálogo.

1.- La variable miNif, así declarada, adquiere la tipología de una variable Variant. En VBA hay que declarar explícitamente el tipo de variable puesto que, si no lo hacemos, se toma Variant como tipo por defecto.
2.- Estás repitiendo continuamente las rutas. ¿Por qué no declarar una variable que te recoja la ruta solo una vez?
3.- Si uno de los puntos de inflexión está en saber si existe o no el directorio, y si no está crearlo, ¿por qué no simplificar el If? Con eso también simplificas el outputo

Así que para esa parte del código yo te propondría algo así:

Código: Seleccionar todo

'Código anterior

Dim miNif As String, strTempArchivo As String
Dim ruta As String

' Recorremos todos los registros de la tabla [TCuotaSegunda] mediante un recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("TCuotaSegunda", dbOpenSnapshot)

rst.MoveFirst ' Nos movemos al primer registro
Do Until rst.EOF ' Recorremos el recordset mediante un bucle

miNif = rst.Fields("SNIFTitular").Value ' Capturamos el número del NIF del titular

ruta = "C:\Users\Usuario\Desktop\Comunidad Regantes\Regantes\" & miNif & "\"

strTempArchivo = Dir(ruta, vbNormal)

If strTempArchivo = "" Then ' Si no existe la carpeta de destino
' Creamos la carpeta de destino
MkDir ruta ' Carpeta sin archivo, genera error 75
End If
' Una vez creada la carpeta, abrimos el informe, añadimos el informe a la carpeta y cerramos el informe
DoCmd.OpenReport "CartaPagoS", acViewPreview, , "TCuotaSegunda.SNIFTitular ='" & miNif & "'"
DoCmd.OutputTo acReport, "CartaPagoS", acFormatPDF, ruta & "\" & miNif & "_CartaPago2019S.PDF"
DoCmd.Close acReport, "CartaPagoS"
End If

'Resto de código


Bueno... más o menos creo que se entiende la idea (espero!!! :shock: )

Un saludo
Access MVP 2017-2019
http://bit.ly/NckAccess

JTrilloJ
Nivel 3
Reto05
Mensajes: 52
Registrado: Mar Dic 01, 2015 3:27 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor JTrilloJ » Vie Jul 13, 2018 4:46 pm

Gracias Miquel por el apunte. Lo he ojeado y parece que tiene buena pinta, salvo por lo que a mi me parece que es cargar un proceso que ya de por si no es rápido. Miraré de probarlo.
El otro apunte sobre la simplificación del Código, me parece bueno y me hace pensar que muchas veces olvidamos esa parte de racionalización del código que a lo largo de una Aplicación pueden ser muchas líneas inútiles.
Mis saludos >> Jacinto

Pinkemar
Nivel 2
Mensajes: 23
Registrado: Sab Dic 05, 2015 4:05 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor Pinkemar » Sab Jul 14, 2018 8:40 pm

Gracias Neckkito por tu interés.
Recojo el guante de tus observaciones 1, 2 y 3.
Por lo que al asunto que nos ocupa, he implementado el código al que haces alusión y en principio no he detectado ninguna variación. Sigue saliendo la ventana emergente.
He procedido de la siguiente forma:
1. He creado el formulario oculto “FOculto” al cual en su evento intervalo de cronómetro le he dado el valor 300 y en su evento al cronómetro el código
Call sWatchAccess(Application.hWndAccessApp)
2. En el botón de comando del informe desde el que procedo a la impresión he añadido, inmediatamente después del inicio del bucle Do Until, el código
DoCmd.OpenForm "FOculto", , , , , acHidden
DoEvents: DoEvents: DoEvents
3. Inmediatamente antes de cerrar el bucle con Loop, el código
DoCmd.Close acForm, "FOculto"
Posteriormente he creado un Módulo independiente con todo el código de programación gentileza de Dev Ashish, tal cual, sin modificar una sola coma.
¿Estarán mal ubicados los distintos códigos añadidos?
Saludos.

pitxiku
VIP
Reto01
Mensajes: 200
Registrado: Sab Sep 30, 2017 6:23 pm

Re: Añadir Informe a Carpeta de Directorio

Mensajepor pitxiku » Lun Jul 16, 2018 6:46 pm

En el código que indica Nekkito hay esta línea:

Código: Seleccionar todo

 If strClass = "#32770" And Trim(strCaption) = "Printing" Then


Que viene a decir:

Si la clase de ventana es "#32770" y su título es "Printing" haz...

Supongo que tu Access estará en español, con lo que tienes que cambiar el "Printing" por el título que realmente aparece en la ventana que quieres ocultar.


Volver a “Objetos Access”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados