Abrir informe pasando un parámetro desde código Access

Tengo un informe llamado "Orden de Servicio" que esta basado en una consulta. Siempre que se abre dicha consulta, se solicita un parámetro que es el "Nº de Orden de Servicio", de esta forma el usuario ingresa un numero de OS y aparece en pantalla dicha orden.

Ahora bien, necesito un botón que me permita grabar dicho informe en disco duro (una ruta especifica) con el nombre que el usuario asigne, esto debe estar en PDF.

El siguiente código (tomado de expertos ) ejecuta sin problema esto

Private Sub btnGuardarOS_Click()

Dim PDFfilename As String
Dim  StrPath As String
PDFfilename = InputBox("Con que nombre desea guardar el archivo?")
strPath = "C:\OS en PDF\" & PDFfilename & ".PDF"
DoCmd.OutputTo acOutputReport, "Informe de OS", acFormatPDF, StrPath, True

End Sub

Pero el problema se presenta cuando el Inputbox solicita el nombre, allí el usuario ingresa por ejemplo Orden de Servicio-21,(este sera el nombre con el que se grabara el informe), pero luego aparece otro cuadro que es el que solicita el parámetro de la consulta, allí el usuario solo debe ingresar "21" por que los números de orden de servicio son numéricos.

Cómo puedo hacer para que el nombre del archivo sea la frase : "¿Orden de Servicio-" +"El numero que ingreso el usuario"?

¿En otras palabras como capturo el valor del parámetro y lo concateno al nombre final del archivo que deseo?

Alguna idea.

2 Respuestas

Respuesta
1

Te digo lo que yo haría. En la consulta quitaría el criterio. Supongo que el informe se llama CopiaClientesestá hecho con la consulta. Vamos a suponer que el campo donde ponías el criterio se llama Ordenservicio. La instrucción la pondría

Dim a As String, b As String, c As String
a = InputBox("Escriba un nombre")
b = Mid("" & a & "", InStr("" & a & "", "-") + 1)
c = "" & a & "" & ".pdf"
DoCmd.OpenReport "copiaclientes", acPreview, , "ordenservicio=""" & b & """"
DoCmd.OutputTo acOutputReport, "copiaclientes", "PDFFormat(*.pdf)", "c:\users\.....\documents\borrar\" & c & ""

Me explico, al pulsar el botón te aparece el inputbox. Escribes el nombre, en este caso Orden de servicio-21

Entonces te abre el informe con aquellos clientes en que ordenservicio sean los dígitos a la derecha del guión, en este caso 21(para eso está la b) y te guarda el informe en la carpeta que le digas en la ruta con el nombre que has escrito en el inputbox.

Y así te evitas tener que escribir dos veces los nombres y nada de criterios en la consulta, ya se lo das en la instrucción.

Se podría abreviar la instrucción pero así me parece más didáctica.

¡Gracias! Tus explicaciones además de didácticas son geniales, pondré en practica tu sugerencia y te comento al respecto, te agradezco siempre por tu buena disposición !

Icue, Buenas tardes realice los cambios que propusiste y quedo perfecto, los botones [Abrir], [Imprimir], [Guardar en PDF] funcionan perfecto con tu propuesta

Solo un ligero detalle

Tengo un ultimo botón que llamado [Enviar por MAIL], que no he podido ajustar de la forma como lo hice para los botones anteriores.

Tu rutina adaptada quedo así:

Private Sub btnImprimirOS_Click()
Dim a As String, b As String, c As String
a = InputBox("Que Orden de Servicio desea imprimir ?")
b = Mid("" & a & "", InStr("" & a & "", "-") + 1)
c = "" & a & "" & ".pdf"
DoCmd.OpenReport "Informe de OS", acViewNormal, "'nOSERVICIO = b'", acDialog
End Sub

Como podría hacer eso para enviar por mail dicho informe, este es mi código y genera error

Private Sub btnOSxMail_Click()
Dim nombreInforme As String
Dim destinatario As String
Dim asunto As String
Dim cuerpo As String
Dim a As String, b As String, c As String
nombreInforme = InputBox("Que Orden de Servicio desea enviar por e-mail?")
b = Mid("" & a & "", InStr("" & nombreInforme & "", "-") + 1)
c = "" & nombreInforme & "" & ".pdf"

destinatario = InputBox("Ingrese la dirección e-mail del destinatario")
asunto = "Envio de Orden de Servicio - " & "'c'"
cuerpo = "Señores" & _
"Adjunto a la presente se envía la Orden de servicio de la referencia para su atención" & _
"solicitamos confirmación de recepción." & _
"Atentamente,"
DoCmd.SendObject acSendReport, "Informe de OS", "PDF", destinatario, , , asunto, cuerpo, "'nOSERVICIO = b'", True
'DoCmd.SendObject acSendReport, nombreInforme, "PDF", destinatario, , , asunto, cuerpo, True


End Sub

Agradezco tu apoyo. !

Primero te respondo, luego te hago unas consideraciones. Ya que has declarado variables, prueba a ponerlo así

Dim nombreInforme As String
Dim destinatario As String
Dim asunto As String
Dim cuerpo As String
Dim c As String
nombreInforme = InputBox("Que Orden de Servicio desea enviar por e-mail?")
b = Mid("" & a & "", InStr("" & nombreInforme & "", "-") + 1)
c = "" & nombreInforme & "" & ".pdf"

destinatario = InputBox("Ingrese la dirección e-mail del destinatario")
asunto = "Envio de Orden de Servicio - " & "" & nombreInforme & ""
cuerpo = "Señores" & _
"Adjunto a la presente se envía la Orden de servicio de la referencia para su atención" & _
" solicitamos confirmación de recepción." & _
"Atentamente,"
DoCmd.SendObject acSendReport, "" & nombreInforme & "", "PDFFormat(*.pdf)", "" & destinatario & "", , , "" & asunto & "", "" & cuerpo & "", , True

Te quedará mas o menos como en la imagen

1º.- Verás, tal como lo tenías primero le dices que meta como variable NombredelInforme un nombre, pero luego abajo le dices que envíe el informe Informe de OS. Surge la pregunta ¿entonces para que sirve la variable Nombre del informe?

2º Si el informe contiene información que a ese destinatario no le interesa, a veces es conveniente ponerlo como, por ejemplo,

docmd.openreport"clientes-23",acpreview,,"pais=""Alemania"""

Docmd.sendobject...

Así, te abre el informe sólo con los clientes de Alemania y ese es el que se le envía al destinatario

¡Gracias! Por tu rápida respuesta, revisare tus observaciones, mil gracias y pasa buena noche !

Hola, acondicione el código pero no me adjunta el archivo, te comento algo:

El informe se llama "Orden de Servicio", basado en una consulta llamada "sql Informe Orden de Servicio", elimine la solicitud del parámetro en el campo de la consulta llamado [nOSERVICIO], en este campo había colocado la instrucción " como [Ingrese numero de OS]".

Entonces usaba la instrucción "'nOSERVICIO = b'", para pasar dicho parámetro

Y esto funciona perfectamente, solo que en la instrucción que propones, no logro que la maquina abra el archivo con ese valor como parámetro, ¿qué estoy haciendo mal?

DoCmd.SendObject acSendReport, "" & nombreInforme & "", "PDFFormat(*.pdf)", "" & destinatario & "", , , "" & asunto & "", "" & cuerpo & "", , True

Me sale este error:, ¿puedes ayudarme con esto? ¿Me dejo entender con la explicación? Gracias !

Un adicional, sobre el informe

Nombre: Informe OS

Basado en la consulta : sql Informe Orden de Servicio

Esta consulta tenia un campo llamado : nOSERVICIO

Que tenia el parámetro : como [Ingrese numero de OS], el usuario solo podía ingresar un numero entero. Por eso que te pedí ayuda para cambiar el nombre del archivo ya que por defecto se guardaba como Orden de Servicio. Y precisaba darle yo un nombre. Lo que ma falta es enviarlo por correo y no se como pasarle el valor numérico... Gracias y disculpa por tantos pedidos

Como te decía en la respuesta anterior, en caso de usar criterios, es mejor abrir antes el informe. En este caso algo así como

docmd.openreport "Orden de servicio",acpreview,,"noservicio="" & b & """

Eso lo que hace es abrirte ese informe sólo con aquellos registros en que noservicio sea igual a la parte derecha que hayas escrito en el inputbox

Y en la línea de abajo el resto, o sea,

Docmd.sendobject...

Pero sigo sin tenerlo claro. Para intentar aclararme. Si cuando se abre el input box, yo escribo

Orden de servicio-21

¿Qué informe tiene que mandar? Uno que existe y se llama Orden de servicio-21 o uno que se llama Orden de servicio nada más, y que al enviarlo por correo, ¿le ponga el nombre orden de servicio-21?

Ahora veo la otra pregunta. Para cambiarle el nombre a un objeto es más sencillo poner

Dim a As Integer
a = InputBox("Escribe un numero")
DoCmd. Rename "orden de servicio " & a, acReport, "orden de servicio"

Si en el inputbox escribes 450, le cambia el nombre al informe y lo deja como Orden de servicio 450

Pero, esto te lo cambia de todas todas, es decir, en la ventana de navegación ya lo verás como Orden de servicio 450, por lo que para otro "envío" tendrías que cambiar el código.

Respuesta
1

Yo te recomiendo crear un campo cuadro combinado en el formulario con base en la tabla que tenga los números de orden y haría que la consulta tomara el parámetro de este campo así no tendría que tomar todas las ordenes en el reporte para después fitrar, limitando los valores a la lista. Si el nombre "Orden de Servicio" es constante no habría necesidad de crear otro campo en el formulario, en caso contrario necesitarías otro campo para registrar el nombre que se va a dar al archivo. El nombre del archivo lo tomas concatenando el nombre "Orden de Sercivio-" & me.cbo_nro_orden (suponiendo que el cuadro combinado lo llames cbo_nro_orden).

No te recomiendo el InputBox(), ¿Qué pasaría sin el usuario en lugar de Orden de Servicio-21 escribe Orden de Servicio*21?. Pruébalo. Sería necesario mas validaciones.

Ya en el botón de imprimir haría la validación del campo o campos antes de continuar.

Amigo, agradezco tu aporte, revisare tus comentarios y de hecho ponde en practica las 02 sugerencias recibidas, muchas gracias por tu apoyo !!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas