Imprimir reporte desde formulario al guardar

Tengo un formulario en access con campos independientes y luego un botón de guardar en una tabla los campos insertados.

Private Sub btn_guardar_Click()
        SQL = "INSERT INTO RETALES(NOMBRE,MODELO,METRAJE,TIRAS,UBICACIÓN)" _
            & "VALUES('" & Me.txtNombre & "','" & Me.txtModelo & "','" & Me.txtMetraje & "','" & Me.txtTiras & "','" & Me.txtUbicacion & "') "
        CurrentDb.Execute SQL, dbFailOnError
        DoCmd.SetWarnings False
        Forms![BUSCAR RETALES].[Refresh]
        DoCmd.Close
End Sub

Tengo un informe, que es una "etiqueta" que imprime el METRAJE, NOMBRE Y MODELO. Mi problema es que no sé como pasar dichos datos al informe para que se imprima solo el registro guardado. ¿Me pueden ayudar? ¿Tengo qué añadir el campo Id de la tabla en el formulario para que pueda pasar los datos e identificar que registro imprimir? No sé como hacerlo. Adjunto imagen también del reporte con los campos a imprimir.

No se si los campos tengo que hacerlos también independientes. No se si se puede hacer esto.

3 Respuestas

Respuesta
1

Tras la toma de datos en cuadros de texto independientes, mediante una SQL se añade un registro nuevo con esos datos en la tabla 'Retales', en principio correcto: el registro estará asentado en la tabla y aun presente en el formulario.

Asumo que lo que se regenera (Requery, no Refresh) es el formulario 'retales' (que estará abierto) y se cierra el actual.

Para imprimir la etiqueta hay dos posibilidades:

.- Antes de cerrar el formulario imprimir la etiqueta (que tomara los datos del formulario actual)

.- Cerrar el formulario, localizar el registro en el formulario 'retales' y desde el imprimir la etiqueta (supongo que en el formulario Retales habrá un método para imprimir etiquetas, lo que evitaría crear un informe mas).

En el supuesto de que se crease un informe para imprimir la etiqueta (desde el formulario de toma de datos), los campos tomarían los valores del formulario -que tendría que permanecer abierto y cerrarse tras imprimir la etiqueta-.

Como origen de datos para cada cuadro de texto: su homologo del formulario de toma de datos.

= Formularios.[nombre del formulario toma de datos].txtNombre

= Formularios.[nombre del formulario toma de datos].txtModelo 

= ...

Respuesta
1

Si la tabla Retales tiene un Id es muy sencillo, pero habría que saber exactamente como lo quieres tú, ya que se puede hace de muchas formas. Por ejemplo, si tengo el formulario

Y pulso el botón Guardar, me deja la tabla como

Si pulso el botón Ver Informe, me abre el informe en ese registro

Dejo lo de la puesta a nulo de los cuadros de texto del formulario pues también hay muchas formas de hacerlo. Si rellenara unos nuevos valores y pulsara el botón ver informe

El código del botón Guardar es

Private Sub Guardar_Click()
DoCmd.RunSQL "insert into retales(nombre,modelo,metraje)values(txtnombre,txtmodelo,txtmetraje)"
End Sub

No necesita tanta parafernalia para la instrucción de guardar.

El código del botón Ver informe es

Private Sub Comando7_Click()
DoCmd.OpenReport "retales", acPreview, , "idretal=dlast(""idretal"",""retales"")"
End Sub

Es decir, te abre el informe en el último registro que has añadido, por eso te decía lo del Id.

Si en vez de acpreview lo dejas en blanco te lo imprime directamente( también puedes poner AcNormal)

También puedes abrirlo en vista diálogo y decirle que al cerrarlo deje los controles del formulario en blanco, etc, etc...

También puedes unir las dos instrucciones en un mismo botón.

Respuesta
1

Necesita como mínimo el campo ID si la aplicación no es multiusuario y seguir como le explican, no obstante, se deben validar el contenido de los campos antes de grabar y controlar que si ya se registró no se vuelva a grabar, esto para no borrar los campos al imprimir.

Si la aplicación es multiusuario se requieren 2 campos adicionales:

ID

Idusuario

Con esto puede obtener el último id con base en el idusuario del usuario que está haciendo el registro con una instrucción, por ejemplo:

ultimoID=DLast("id","RETALES","idusuario=" & idusuario)

Y para el reporte:

docmd.OpenReport "rptRETALES",acViewPreview,,"ID=" & ultimoID 

¿Por qué 2 campos?

Porque en un entorno multiusuario no puede tomar el último id, debido a que otro usuario está registrando al mismo tiempo y puede dar a que se tome el último de este usuario.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas