¿Código para generar documento PDF?

Tengo un formulario con varios cuadros combinados para filtrar y devolverme el resultado en un subformulario; en éste un botón para imprimir, con el siguiente código:

Private Sub Comando291_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport "InformePA", acPreview, , "[Id]=" & Me![Id]
End Sub

Pero necesito un botón para crear un documento PDF con el mismo contenido que me ofrece el botón imprimir que ya tengo.

¿Qué código he de utilizar?.

2 respuestas

Respuesta
1

Rafael: La línea de creación del PDF de forma genérica es>>

DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=NombreInforme, OutputFormat:=acFormatPDF, OutputFile:=RutaYFicheroPDF, AutoStart:=False 'True

Tienes que sustituir lo que teseñalo en Negrita y Cursiva

NombreInforme, veo que tienes >> "InformePA"

Y en la RutaFicheroArchivo >> Pones el directorio donde quieres guardar y el Nombre del Fichero: Ejemplo "C:\MiCarpetaDeArChivos\InformeConvertido.pdf"

Mis saludos>> Jacinto

¡Gracias! 

Hola, he aplicado el código que me pusiste y funciona correctamente.

DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=InformePA, OutputFormat:=acFormatPDF, OutputFile:="C:\SEFI\Informes\InformePA.pdf", AutoStart:=False 'True

Icue ha comentado la posibilidad de que el documento creado adquiera el nombre del valor de uno de los campos, élha utilizado otro código, pero no me funciona. Querría saber si al tuyo se podría incorporar esa posibilidad ya que así podría tener los documentos con un nombre representativo y fácil de localizar; y además (aunque es raro) cuando genero otro informe me sobreescribe el anterior en lugar de indicarme que ya hay un archivo con ese nombre para darme la posibilidad de sobreescribirlo o ponerle otro nombre.

Muchísimas gracias

Rafael: Si es posible, pero por favor dame una pista de como tienes para capturar el Nombre de Cliente o alguno otro que tu quieras. Además siquiera añadirle al Nombre la Fecha compuesta de ddmmaaaahhmmss o sea Fecha con la hora, minutos y segundos del sistema, y te podré proponer el Código adecuado. Saludos >> Jacinto

Hola.

Tengo un cuadro combinado que se llama cUnidadDidactica cuyo contenido representaría perfectamente el documento. Este contenido se muestra a partir del filtro realizado en otros dos cuadros combinados (por si sirve de ayuda).

(Más abajo hay una captura de pantalla del formulario)

Respecto a la información de la fecha sería cojo...., quizás lo de la hora ya sería excesivo.

Muchísimas gracias de nuevo.

Rafael: Antes de rodar el Código, crea una carpeta colgando de la que tiene la BD, que se llame por ejemplo>> InformesPDF. Con éste Nombre escribo el Código
Respetando que tienes un Procedimiento, te pongo las líneas de llamada dentro del mismo.
Private Sub Comando291_Click()
Dim NombreInforme As String
NombreInforme = “InformePA”

DoCmd.RunCommand acCmdSaveRecord ‘A mi modo de ver ésta línea es Opcional
DoCmd.OpenReport NombreInforme, acPreview, , "[Id]=" & Me![Id]

Dim RutaPDF As String
Dim IzqPDF As String
Dim DerPDF As String
Dim NombreInfPDF As String
Dim RutaYFicheroPDF As String
On Error GoTo CreaPdF_TratamientoErrores

'Defino la Ruta donde quiero los Ficheros PDF
RutaPDF = Application.CurrentProject.Path & "\InformesPDF\"

'Pongo parte del Nombre del PDF: Izquierda

If Not IsNull(Me.CUnidadDidactica) And Me.CUnidadDidactica <> “” Then
              IzqPDF = Me.CUnidadDidactica.Value
Else
             IzqPDF = “”
End If

'Defino  la parte derecha del PDF
DerPDF = CStr(FormatDateTime(Now(), vbGeneralDate))
DerPDF = Replace(DerPDF, "/", "")
DerPDF = Replace(DerPDF, " ", "")
DerPDF = Replace(DerPDF, ":", "")
'Defino el Nombre completo del Fichero que se va a guardar
NombreInfPDF = IzqPDF & DerPdf & ".pdf"

'Completo la cadena para guardarlo
RutaYFicheroPDF = RutaPDF & NombreInfPDF
'Aquí exportamos y visualizamos el Informe en PDF. Para visualizar >> AutoStart: = True
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=NombreInforme, OutputFormat:=acFormatPDF, OutputFile:=RutaYFicheroPDF, AutoStart:=False 'True

NombreInforme = ""
End Sub

Ya me comentarás como te va. Saludos >> Jacinto

Hola Jacinto.

Pues si que es complejo el asunto, he metido el código pero me da el siguiente error:

Error de compilación. No se ha definido la etiqueta

Y me resalta en amarillo la siguiente línea del código:

On Error GoTo CreaPdF_TratamientoErrores

Gracias 

Rafael: Esa línea sobra, simplemente la borras y me comentas. Saludos >> Jacinto

Siento ser tan pesado Jacinto, pero una vez borrada la línea me sale error 2497 (La acción o el método requiere un argumento Nombre del informe), y me resalta la línea:

DoCmd.OpenReport NombreInforme, acPreview, , "[Id]=" & Me![Id]

Un saludo y disculpa

Rafael: No te preocupes de pedir información la veces que sea necesario.

Al principio de Procedimiento, verás que te citaba:

Dim NombreInforme As String
NombreInforme = “InformePA”

Asegurate de que el Informe que deseas previsualizar y convertir a PDF se llame así.

Ese código sin declarar la Variable NombreInforme es el que tu ya tenías.

Por lo demás y una vez eliminada la línea no veo que deba de dar error.

Si aún así no te sales, me lo comentas y te preparo un ejemplo. Saludos >> Jacinto

Respuesta
1

Debajo de Docmd.openreport...

Escribe

DoCmd.OutputTo acOutputReport, , acFormatPDF, "c:\users\......\documents\cliente" & ".PDF"

Siendo cliente el nombre del archivo como lo quieres guardar

Hola.

Tal y como decía Jacinto, he pegado el código con los cambios pertinentes, esto es:

DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=InformePA, OutputFormat:=acFormatPDF, OutputFile:="C:\SEFI\Informes\InformePA.pdf", AutoStart:=False 'True

Me sale un cuadro de diálogo error ´2487´en tiempo de ejecución (El argumento Tipo de objeto para la acción o método esta en blanco o no es válido).

Después he leído tu respuesta, pero no he localizado Docmd.openreport... Como no soy, lo que se dice una lumbrera en esto, lo he pegado debajo del código anterior y, claro, me sale el mismo error.

No obstante, si este es un código genérico, ¿el informe PDF que se creará será de todos los registros, o solo del seleccionado en pantalla?. El código del botón imprimir me permite hacerlo sólo de ese registro filtrado y eso es lo que realmente me interesa.

Muchas gracias

Por cierto, si lo quieres guardar con el nombre del cliente suponiendo que en el formulario tengas ese campo ponlo

DoCmd.OutputTo acOutputReport, , acFormatPDF, "c:\users\.......\documents\ " & Cliente & "" & ".PDF"

El docdm. Openreport "informepa", acpreview... lo has puesto tu. Lo que yo decía es que debajo de el, pusieras lo que te mandaba y si lo que querías es que te lo guarde con el nombre del cliente pon lo que te dije antes, Así, si en el registro el cliente se llama Ramón, el informe lo guarda como Ramon.pdf.

Y lo de C:\users.... s la ruta a la carpeta donde lo quieres guardar.

De todas formas, si quieres un ejemplo, mándame un mensaje a [email protected] y te lo envio.

Hola.

Ya entendí lo que me decías y he colocado debajo del código que tenía, la siguiente línea:

DoCmd.OutputTo acOutputReport, , acFormatPDF, "C:\SEFI\Informes\" & UnidadDidactica & "" & ".PDF"

Me sale: error ´2501´La acción outputTo se canceló.

Hay algo que no he contado. Dentro del subformulario (1), tengo otro (2) basado en una consulta (vista de tabla) en el que me aparecen los valores de un campo de texto. 

No importa que tengas un subformulario porque lo que envía es el informe. Lo único que puedo pensar es que parece raro que la ruta sea esa, te lo digo porque hoy en día la mayoría de ordenadores tienen c:\users. Mira, al clic con el botón derecho del ratón en algún archivo que tengas en la carpeta donde vayas a guardar los PDF y comprueba la ruta.

Otra cosa puede ser que el cuadro combinado no se llame a sí. Mira en sus propiedades-Otras-Nombre

Por último haz una cosa, no es necesario, pero sirve para comprobar. Suponiendo que el combinado se llame Unidaddidactica

Antes de cmd.output... pon

dim cliente as string

cliente=me.unidaddidactica.value

Y sustituye

Docmd.output... por

DoCmd.OutputTo acOutputReport, , acFormatPDF, "C:\SEFI\Informes\" & cliente & "" & ".PDF"

De todas formas, mi ofrecimiento sigue en pie

Arreglado con:

DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=InformePA, OutputFormat:=acFormatPDF, OutputFile:="C:\SEFI\Informes\InformePA.pdf", AutoStart:=False 'True

Te he mandado dos veces un ejemplo a tu correo pero me lo devuelve

Hola Icue, igual lo escribí mal.

[email protected]

[email protected]

No debe haber problema con ninguno de los dos.

Gracias

Buenas de nuevo, he visto tu ejemplo y he intentado trasladarlo a mi bd, pero necesito ciertas aclaraciones:

ACLARACIONES

Dim Hayquever As String

Hayquever = Me.Cliente.Value

DoCmd.OpenReport "cliente", acViewPreview, , "cliente=forms!cliente!cliente"

DoCmd.OutputTo acOutputReport, , acFormatPDF, "c:\SEFI\InformesPDF\ " & Hayquever & "" & ".PDF"

En Hayquever = Me.Cliente.Value ¿Cliente es el nombre del subformulario, es decir, para mi sería SubformConsultaPA?

En DoCmd.OpenReport "cliente" ¿cliente es el nombre del informe: InformePA?

En "cliente=forms!cliente!cliente" ¿A qué corresponde cada uno de los tres “cliente”?

c:\SEFI\InformesPDF\  (Esta es la ruta que he puesto para guarder el informe)

Gracias

En la instrucción mía se refiere a un cuadro de texto del formulario. En la tuya si es que está en un subformulario y el botón de comando en el formulario tendría que ser

hayquever=subformconsultaPA.form!nombredelcuadrodetexto

Pero quisiera hacerte la salvedad, de que te cogería el valor del cuadro de texto del registro activo del subformulario, que normalmente es el primero

2º Si, en el ejemplo que te mandé mi informe se llama Cliente, y tiene un cuadro de texto también llamado Cliente y en el formulario que se llama Cliente, el cuadro de texto también se llama Cliente( simple, verdad). En tu caso sería

DoCmd. OpenReport "InformePA", acPreview,, "la condición que le hayas puesto"

Por la ruta que pones supongo que la carpeta donde los vas a guardar está en el directorio raíz C:

Te lo decía porque normalmente se suele poner en Mis documentos, etc. y entonces su ruta, sería c:\users\....

Ok!

El botón está en el subformulario por lo que quedaría, creo yo:

Hayquever = Me.cUnidadDidactica.Value (cUnidadDidactica es un cuadro combinado)

DoCmd.OpenReport "InformePA", acViewPreview, , "InformePA=forms!SubformConsultaPA!cUnidadDidactica"
DoCmd.OutputTo acOutputReport, , acFormatPDF, "c:\SEFI\InformesPDF\ " & Hayquever & "" & ".PDF"

Donde:

InformePA = Informe

SubformConsultaPA = Subformulario donde se encuentra el botón

cUnidadDidactica = Cuadro combinado donde se encuentra el valor que dará nombre al archivo PDF

El resultado es que me pide el valor de InformePA y de Formularios !SubformConsultaPA!cUnidadDidactica

y después me manda al generador de código y me señala en amarillo:

DoCmd.OutputTo acOutputReport, , acFormatPDF, "c:\SEFI\InformesPDF\ " & Hayquever & "" & ".PDF"

¿Qué estoy haciendo mal?, he comprobado todas las comas, comillas, etc... por si me hubiera dejado alguna de más o de menos, y todo parece estar bien.

Gracias y disculpa la pesadez

Las instrucciones están mal

1º Le estás diciendo que abra el informe InformePA, en vista previa,,¡Donde informe= a un valor que eliges en el subformulario!. Tiene que ser donde un campo del informe sea igual a un valor que elijas del subformulario. Pero me dá que el informe está basado en una tabla al igual que el formulario. La instrucción sería(lo digo sin saber como lo tienes hecho) si el botón está en el subformulario

Docmd.openreport"InformePa",acpreview,,"Id=forms!nombredelformulario!nombredelsubformulario.form!id"

Al menos eso del Id es lo que tu decías al principio.

Si lo que hay en el informe es un cuadro de texto CUnidadDidactica, que identifique a UN SÓLO registro entonces ponlo como criterio

docmd.openreport...................................."CUnidadDidactica=forms!nombredelformulario!SubFormconsultaA.form!cunidaddidactica"

Observa que entre subformconsultaA y form hay UN PUNTO, no un signo de admiración

2º Forms! SubformsconsultaPA! CUnidadDidactica no quiere decir nada. Los subformularios como su nombre indica son Objetos de un formulario lo mismo que un cuadro de texto, una etiqueta, un botón de comando, etc., por eso hay que referirse a ellos como Objetos del formulario.

3º Te manda al código porque no encuentra Objeto que enviar.

Y, no sé porque, me dá que el cuadro de texto CunidadDidactica del informe está en un subinforme. Si es así no te serviría de nada todo lo anterior porque podría haber otro registro que también tuviera esa unidad didáctica. En el criterio tienes que ponerle algo que IDENTIFIQUE a un(unos) registro(s) deterinados.

Hola.

Me da que el problema viene porque  dentro del subformulario (SubformularioConsultaPA), tengo otro (tabla sesiones) basado en una consulta (vista de tabla) en el que me aparecen los valores de un campo de texto, de distintos registros que tienen en común el valor del cuadro combinado cUnidadDidactica.

Llegados a este punto, como te decía anteriormente, funciona con:

Private Sub Comando134_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport "InformePA", acPreview, , "[Id]=" & Me![Id]
DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=InformePA, OutputFormat:=acFormatPDF, OutputFile:="C:\SEFI\InformesPDF\InformePA.pdf", AutoStart:=False 'True
End Sub

Me genera el informe PDF, el único inconveniente es que cada vez que genero uno se machaca el que ya existía. La opción sería, una vez generado, ir a la carpeta donde esta contenido y ponerle el nombre que yo quiera, antes de proceder a generar otro PDF.

Creo que esta va a ser la solución, porque (supongo que como tu) estoy poniéndome ya un poco nervioso con este tema.

Muchísimas gracias por tu tiempo e interés, de verdad.

PD. Respecto a la otra pregunta que te hice sobre copiar registros, te dejo un código en ella por si le puedes echar un vistazo.

Vamos a ver, el código que dices que te funciona es exactamente el mismo que te puse yo, con la diferencia que el mío, no te "machaca" el anterior, sino que te guarda cada informe con el valor que hubiera en ese momento en un cuadro de texto.

Si no quieres que te lo machaque, sino que se te abra "un explorador" para que elijas el sitio y el nombre conque guardarlo borra lo de

DoCmd.OutputTo ObjectType:=acOutputReport, ObjectName:=InformePA, OutputFormat:=acFormatPDF, OutputFile:="C:\SEFI\InformesPDF\InformePA.pdf", AutoStart:=False 'True

Y déjalo simplemente así

DoCmd. OutputTo acOutputReport,, acFormatPDF, ""

Verás, lo objectype no sirve para nada, es un indicador de que tipo de objeto tienes que enviar, pero ya se lo estás diciendo con acoutputreport. Lo de Objectname solo sirve para indicar que es un informe, pero ya le estás poniendo InformePA. Lo de outputformat solo sirve para indicar que ahí va el formato de salido, pero ya se lo estás diciendo con acformatpdf. Lo de aoutputfile tampoco sirve para nada porque con c:\sefi... ya le estas diciendo que lo guarde ahí. Lo de autostart no es necesario, porque por defecto si no lo pones lo considera true y por tanto inmediatamente te lo guarda.

Prueba como te lo he puesto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas