Access - Generar PDF filtrados por un campo de una tabla

 
Vista:
sin imagen de perfil

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 27/10/2017 02:57:36
Hola, antes de cualquier cosa dar las gracias a todos los integrantes de este foro que me ha ayudado bastante en varias ocasiones. Hoy les traigo este problema que me esta dando quebradero de cabeza. La cosa es que tengo un informe llamado contratoPDF en el cual hay campos procedentes de tres tablas : clientes, locales y caja. He implementado este codigo VBA que pondre a continuación en el evento de un boton para poder generar los contratos iniciales de todos mis clientes filtrados segun Id_cliente que es el campo clave de la tabla de clientes.

Código:
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
Private Sub Comando19_Click()
    Dim db As DAO.Database
    Dim rutaSalida As String
    Dim sql As String
    Dim rutaPdf As String
    Dim elId As Long
    Dim rst As DAO.Recordset
    rutaSalida = Application.CurrentProject.Path & "\Contratos_PDF\"
    Set db = CurrentDb
    sql = "SELECT * FROM consulta_contratoPDF;"
    Set rst = db.OpenRecordset(sql)
    If rst.RecordCount = 0 Then GoTo Salida
    Echo False
    With rst
        .MoveFirst
        Do Until .EOF
            elId = .Fields("Id_cliente").Value
            DoCmd.OpenReport "ContratoPDF", acViewPreview, , "Id_cliente=" & elId
            rutaPdf = rutaSalida & elId & "_" & Format(Now(), "yyyy_mmdd_hh_MM_ss ") & ".pdf"
            DoCmd.OutputTo acOutputReport, "contratoPDF", "*.pdf", rutaPdf, False
            DoCmd.Close acReport, "contratoPDF"
            .MoveNext
        Loop
    End With
    Echo True
    MsgBox "Conversión a formato PDF correctamente!", vbInformation, "OK"
Salida:
    rst.Close
    Set rst = Nothing
End Sub

Al pulsar el boton me genera un error y me dice que el campo Id_cliente hace referencia a mas de una tabla.
Id_cliente de la tabla clientes esta relacionado con las demas tablas pero nose como arreglar ese error es decir hacer que el origen de los datos sean varias tablas.

En el ejemplo cambié el origen del filtrado y en vez de la tabla clientes puse una consulta intentando seleccionar en la consulta mas tablas. Y no se que hacer. Algun alma caritativa que me eche una mano pls :)
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 27/10/2017 15:09:42
¿Has intentado 'decirle' de que tabla es ese ID?, si es un campo relacional estará en varias tablas y ello le crea confusión.

Lo ideal seria conocer el verdadero origen de datos del informe (que asumo será una consulta), pero en principio si el ID de referencia pertenece a la tabla 'Clientes', se podría intentar asi:

DoCmd.OpenReport "ContratoPDF", acViewPreview, , "Clientes.Id_cliente=" & elId


Se desperdician recursos en ese código, por ejemplo:
.- Set db = CurrentDb
Prácticamente es una constante y si es una constante se puede aplicar asi:
Set rst = db.OpenRecordset(sql) ==> Set rst = CurrentDb.OpenRecordset(sql)

De la misma forma se puede hacer para todas aquellas variables que 'no van a variar' por tener en toda su vida útil el mismo valor (esto es: se utilizan como constantes)
Quizás pienses que carece de importancia, pero no hay que confundir el potencial de la maquina (memoria, discos, procesador) con el espacio de trabajo que es limitado, 'muy caro' y el mismo para todas las maquinas, un uso inadecuado de ese espacio exigirá mas y mas potencia de procesamiento de la maquina para compensar (y programar bien creo que sale mas barato)
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

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 27/10/2017 20:22:57
Antes de nada muchisimas gracias, me ha servido lo del tema de la constante y tal de esa forma gestionare mejor los recursos del pc.
Respecto a la solucion que me proponias no me ha servido me sigue dando el mismo error no entiendo el porque. Te adjunto la BD para que puedas verlo con mas detalle y asi puedas ayudarme. 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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 27/10/2017 22:11:57
Como suele suceder: Access tiene razón ....

En esa consulta esta repetido el campo ID_Cliente (sobraría el de la tabla 'locales' que como es el de relación, es el mismo):

SELECT clientes.Id_cliente, clientes.Nombre, clientes.Apellidos, clientes.DNI, clientes.Telefono_contacto, clientes.Correo_electronico, Locales.referencia_catastral, Locales.direccion, Locales.Id_locales, Locales.tipo_local, Locales.inicio_contrato, Locales.fin_contrato, Locales.Id_cliente
FROM clientes INNER JOIN Locales ON clientes.Id_cliente = Locales.Id_cliente;



Dejando el método de conversión (que dependerá de varios factores, entre ellos la versión de Access) he retocado un poco ese código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Comando19_Click()
    Const rutaSalida = Application.CurrentProject.Path & "\Contratos_PDF\"
    Dim rutaPdf As String, rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("SELECT Id_cliente FROM clientes")
    If rst.RecordCount = 0 Then Exit Sub
    Echo True
    With rst
        .MoveFirst
        Do Until .EOF
            DoCmd.OpenReport "ContratoPDF", , , "Id_cliente=" & !Id_cliente
            rutaPdf = rutaSalida & !Id_cliente & "_" & Format(Now, "yyyy_mm_dd_hh_MM_ss") & ".pdf"
            DoCmd.OutputTo acOutputReport, "contratoPDF", "*.pdf", rutaPdf, False
            DoCmd.Close acReport, "contratoPDF"
            .MoveNext
        Loop
    End With
    Echo True
    MsgBox "Conversión a formato PDF correctamente!", vbInformation, "Informacion"
    .Close
    Set rst = Nothing
End Sub


.- Apreciaras que si no hay registros (rst.RecordCount = 0) simplemente se sale, pues el recordset se cierra automáticamente al finalizar el SUB y no hay espacio que liberar porque no hubo ocupación de espacio.

.- En el recordset la SQL limita el campo al único que se va a utilizar (traer TODA la tabla para nada es .... innecesario)

.- Como el ID que utilizaremos esta accesible mientras no se cambie de registro ¿para que una variable?, se utiliza directamente y funciona sin perder el tiempo en asignaciones innecesarias
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 28/10/2017 13:55:21
Son las pequeñas variaciones que hacen divertida la programación, al parecer a las constantes no le gustan las variables (exigen que todo sea 'una constante' ) y como la aplicación es reubicable .... se necesita evaluar en tiempo de ejecución y aparece la necesaria variable en su definicion.

No es un problema sin solución, basta utilizar una variable en lugar de la constante y corregir otro pequeño detalle (causado por la reutilización del código original) y es cerrar el recordset antes de eliminar la asignación por defecto.

Adjunto las modificaciones y esperando que el método que aplicas para crear los PDF sea el optimo de/para esa versión (en otras la creación de los PDFs se puede lograr cambiando en el informe 'la impresora por defecto' por la opción que trae de serie Access para crear PDFs).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim rutaPdf As String, rst As DAO.Recordset, rutaSalida As String
    rutaSalida = Application.CurrentProject.Path & "\Contratos_PDF\"
    Set rst = CurrentDb.OpenRecordset("SELECT Id_cliente FROM clientes")
    If rst.RecordCount = 0 Then Exit Sub
    Echo True
    With rst
        .MoveFirst
        Do Until .EOF
            DoCmd.OpenReport "ContratoPDF", , , "Id_cliente=" & !Id_cliente
            rutaPdf = rutaSalida & !Id_cliente & "_" & Format(Now, "yyyy_mm_dd_hh_MM_ss") & ".pdf"
            DoCmd.OutputTo acOutputReport, "contratoPDF", "*.pdf", rutaPdf, False
            DoCmd.Close acReport, "contratoPDF"
            .MoveNext
        Loop
    .Close
    Set rst = Nothing
    End With
    Echo True
    MsgBox "Conversión a formato PDF correctamente!", vbInformation, "Informacion"
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 28/10/2017 16:40:56
Correcto diste en la tecla, problema anterior solucionado. Estoy usando Access 2016 no se que metodo es el mas correcto para esta version. En un principio pienso que el metodo que he utilizado es el mas "practico y sencillo", aunque segun me comentas parece que hay uno mas practico y correcto. Mi pregunta es: ¿Qué crees que es lo mas correcto para esta versión?
c2595fd15a62800905e2a3f131b28b1c
Ahora me salta eso no entiendo el porque si en el codigo especifico donde quiero que lo guarde le asigno su ruta nombre etc...
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 28/10/2017 21:01:12
.... un momento ...
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

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 28/10/2017 21:36:37
No hay problema, cuando tu puedas. Ya me ayudas bastante!
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
Imágen de perfil de Jorge
Val: 1.039
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (304 intervenciones) el 28/10/2017 22:00:37
Hola y el ejemplo que te adjunte carteles y torre no lo has visto es tu base ya reparada ese problema dime ya la descargaste y mirasteb??
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 28/10/2017 22:23:51
Requiere unos ajustes para poder automatizar la exportación filtrando por cliente, desconozco si en la versión A'20 16 este obstáculo esta superado, en la que tengo (A'2010) aun no.

Se podría utilizar un variable temporal, pero como es algo que nació en A'2010 quizás no exista en versiones superiores asi que iremos a lo clásico que debería funcionar en cualquier versión:

(la exportación esta copiada del propio Access: una macro que se tradujo a VBA con la opción que esta en el menú)

Tres pasos
1.- Crear una una variable publica, como no hay nada en la base de muestra se precisara crear un MODULO (se puede añadir a uno ya existente)

El contenido del modulo:

1
2
3
Option Compare Database
Option Explicit
Public Cliente_PDF As Long

2.- Activar el evento al abrir del informe y utilizar este contenido:

1
2
3
Private Sub Report_Open(Cancel As Integer)
If Cliente_PDF <> 0 Then Me.Filter = "Id_cliente =" & Cliente_PDF: Me.FilterOn = True
End Sub

3.- Modificar el código en el formulario asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Comando19_Click()
    Dim rutaPdf As String, rst As DAO.Recordset, rutaSalida As String
    rutaSalida = Application.CurrentProject.Path & "\Contratos_PDF\"
    Set rst = CurrentDb.OpenRecordset("SELECT Id_cliente FROM clientes")
    If rst.RecordCount = 0 Then Exit Sub
    With rst
        .MoveFirst
        Do Until .EOF
        rutaPdf = rutaSalida & !Id_cliente & "_" & Format(Now, "yyyy_mm_dd_hh_MM_ss") & ".pdf"
        Cliente_PDF = !Id_cliente
        DoCmd.OutputTo acOutputReport, "contratoPDF", "PDFFormat(*.pdf)", rutaPdf, False, "", , acExportQualityPrint
        .MoveNext
        Loop
    .Close
    Cliente_PDF = 0
    Set rst = Nothing
    End With
    MsgBox "Conversión a formato PDF correctamente!", vbInformation, "Informacion"
End Sub


Si se abre mediante el formulario, exporta a PDF cono se espera, si se abre directamente ... hará lo clásico
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
sin imagen de perfil

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 28/10/2017 22:50:35
S i la mire gracias por tu aportacion. Funciona perfectamente pero solo para 1 contrato de un cliente. Yo quiero sacar todos los contratos de todos los clientes en pdf de un solo click.
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
Imágen de perfil de Jorge
Val: 1.039
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (304 intervenciones) el 28/10/2017 23:02:24
Pues si quítale el filtro y yaaa hay porque está filtrado y te exporta el registro actual donde estas pero si quieres todos los clientes quita el filtra y listooo
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 28/10/2017 23:22:38
Para Jorge:

Creo que con o sin filtro: no cumple los requisitos

Quizás no dedicaste el tiempo suficiente a analizar el problema planteado y por ello en aras de recortar y recortar ... no has entendido que se desea que se genere un PDF por cada registro y que ese PDF solo tenga datos de ese registro (tampoco seria valida la opción de tantos PDFs como registros y en cada PDF los datos de todos los registros).
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

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 29/10/2017 00:39:21
Anonimo lo ha clavado. lo ha entendido perefctamente.
He realizado y leido detenidamente todo lo que me decias y creo que realizado todo correctamente.
Te adjunto el proyecto porque asi se hara mas facil que lo edites tu mismo. Porque ahora realiza todo correcto pero no genera el pdf en la carpeta. No da errores ni nada. :(
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

Generar PDF filtrados por un campo de una tabla

Publicado por Anonimo (3316 intervenciones) el 29/10/2017 02:46:11
Que no de errores no significa que no los tenga, pero con esa peculiar forma de trabajar unos enmascaran a otros.


Primer problema:
En la consulta sigue repetido el campo ID_CLIENTE (pero la consulta no llega a ejecutarse)
La solución es sencilla: elimina el campo Id_Cliente de la tabla LOCALES (bueno, yo eliminaría todos los que no se utilizan, pero como es una muestra .........)

Segundo problema (esa curiosa forma de trabajar): los eventos de un objeto son independientes, no pueden estar anidados unos dentro de otros y esto es lo que ha sucedido con el evento del informe:

No se ejecuta el evento 'al abrir' del informe, porque por esas cosas curiosas de la programación esta insertado dentro del evento 'Current' que de producirse lo haría después.

Has creado esto:

1
2
3
4
5
Private Sub Report_Current()
Private Sub Report_Open(Cancel As Integer)
If Cliente_PDF <> 0 Then Me.Filter = "Id_cliente =" & Cliente_PDF: Me.FilterOn = True
End Sub
End Sub


Esto funcionaria:
1
2
3
4
5
6
7
Private Sub Report_Current()
 
End Sub
 
Private Sub Report_Open(Cancel As Integer)
If Cliente_PDF <> 0 Then Me.Filter = "Id_cliente =" & Cliente_PDF: Me.FilterOn = True
End Sub


Pero un evento sin nada que hacer sobra y solo sirve para perder ciclos de reloj, con esto SOBRA y funciona

1
2
3
Private Sub Report_Open(Cancel As Integer)
If Cliente_PDF <> 0 Then Me.Filter = "Id_cliente =" & Cliente_PDF: Me.FilterOn = True
End Sub


Puedes borrar la línea primera y la final y confirmar (en la vista diseño) que solo esta activado el evento 'Al abrir'
Como siempre ... compilar y guardar (para mas seguridad de que todo esta asentado se puede reiniciar al estilo informático)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Generar PDF filtrados por un campo de una tabla

Publicado por Jorge (9 intervenciones) el 29/10/2017 03:47:00
Ya funciona todo correctamente. La verdad es que nose porque he hecho esa gilipollez de anidar los dos eventos. No tengo mucha idea de vba aun estoy aprendiendo, aunque eso ha sido de risa. Me has ayudado y enseñado mucho. Infinitas 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