Cerrar un formulario con un registro determinado y que en otro formulario se abra por ese registro

Estoy seguro que esa pregunta ya esta planteada, en resumen desde un formulario 1 abro un formulario 2 para rectificar 1 registro, pues bien quiero que cuando se cierre el formulario 2 se actualice el formulario 1 y quede el cursor en el registro modificado.

3 Respuestas

Respuesta
2

Su pregunta es clara si dice que regrese al registro modificado asumo que existe una relación entre los campos de los formularios. Le preparé este ejemplo.

Formularios empleados

Selecciono el idempleado 4 y hago clic sobre el botón Abrir Form Extras, obtengo:

Formulario frmextras

Observe queme abre el empleado idempleado=4, el mismo del primer formulario. Ahora en el formulario principal me desplazo a otro empleado, por ejemplo, idempleado=27

Ahora, cierro el formulario frmExtras y el selector de registro del formulario principal se ubica en idempleado=4 como muestra la siguiente imagen.

Explico el código.

CODIGO FORMULARIO PRINCIPAL BOTON ABRIR FORM EXTRAS

Evento al hacer clic

Private Sub btnExtras_Click()
  DoCmd.OpenForm "frmExtras", , , "idempleado=" & Me.idempleado
End Sub

Este código abre el formulario frmExtras y muestra solo el empleado idempleado correspondiente al que esté en la selección.

CÓDIGO DEL FORMULARIO FRMEXTRAS

Evento Al Descargar

Private Sub Form_Unload(Cancel As Integer)
  If CurrentProject.AllForms("frmEmpleados").IsLoaded Then
     Dim rs As Object
      Set rs = Forms!frmEmpleados.Form.Recordset.Clone
      rs.FindFirst "[idempleado] = " & Me.idempleado
       Forms!frmEmpleados.Form.Bookmark = rs.Bookmark
  End If
End Sub

Este código clona el formulario principal frmEmpleados  y utiliza FinFirst para buscar el idempleado. utilizo la propiedad Bookmark del recordset para ubicarme sobre el registro.

Le aclaro si hace alguna edición que afecte la información del primer formulario, es necesario hacer un Requery, en este caso el evento Al descargar cambia a:

Private Sub Form_Unload(Cancel As Integer)
  If CurrentProject.AllForms("frmEmpleados").IsLoaded Then
     Dim rs As Object
      Set rs = Forms!frmEmpleados.Form.Recordset.Clone
      rs.FindFirst "[idempleado] = " & Me.idempleado
       Forms!frmEmpleados.Form.Bookmark = rs.Bookmark
       Forms!frmEmpleados.Form.Requery
  End If
End Sub

¡Gracias! 

Eres muy amable, muchas gracias esto yo lo tengo que asimilar despacio. un saludo

Amigo Eduardo Muchas gracias por todo y por tu paciencia, lo primero es referirme que me trates de tú, porque seguramente yo sea mayor y prefiero me tuteen.

Y comprobado el código que me mandas y no me funciona, por lo que no veo donde puede estar el error. Lo siento muchísimo pero soy muy paleto con todo esto. Muchas gracias espero algún otro consejo que pueda revisar. Un saludo Javier García

También observo que si abro por un registro el formulario 2, y lo cierro sin modificar, el cursor se va al primer registro del formulario 1, y no como me comentas en tu ejemplo. Un saludo

La edad no importa y no creo que ses mayor. Si quiere envíeme la base de datos a [email protected] y miro que puedo hacer.

Respuesta
1

Habría que saber como abres el formulario 2 desde el 1. Por ejemplo, si lo abres en un evento Al no estar en lista en un combinado, ya que podrías usar algo como

AcDataErrAdded

O, si el formulario2 está abierto sobre el 1, ya que podrías usar

If currentproject.allforms("formulario1").isloaded then

Por eso, sería conveniente que concretaras algo más o pusieras alguna imagen.

¡Gracias! perdona pero soy muy inutil y lo primero es que no se hacer captura de pantalla para poderte mandar, es un formulario modal y emergente y sobre ese abro formulario 2 para modificar un registro determinado, y lo que intento es cerrar formulario 2 y que el cursos se quede en formulario 1 sobre el registro modificado, puesto que este formulario 1 va a contener mucha informacion.  muchas gracias por tu paciencia.

Cuando quieras incorporar una imagen, basta con que pulses el icono señalado con una flecha

Se abrirá un "explorador" para que la localices

¡Gracias! 

Por favor no encuentro ese icono, ¿dónde está en access 2016? Perdona mi torpeza, un saludo

Es en la propia pregunta o respuesta de Todoexpertos. Cuando pones el cursor, en el espacio para preguntar o responder te aparece esa "barra" de menús.

Y una vez que pulsas el icono te aparece

¡Gracias! ok muy amable 

voy a probar, lo siento no sé hacer pantallazo con la base datos, muchas gracias por todo

ya lo he conseguido, muchas gracias, te mando copia de la base datos

Javier, personalmente creo que te complicas un poco la vida, usando dos formularios, porque supongo que el formulario de modificar también tiene como origen la tabla Autores.

Mira, si tengo el formulario Autores, más o menos como el tuyo y selecciono un registro

Cuando pulso el botón Modificar Registro, se abre en vista diálogo el formulario Modificar

Ahora le modifico, por ejemplo la nacionalidad

Cuando cierro ese formulario Modificar

En el evento Al cerrar del formulario Modificar le pongo

Private Sub Form_Close()
If CurrentProject.AllForms("autores").IsLoaded Then
Forms!autores.Requery
End If
End Sub

Es decir, que cuando se cierre el formulario Autores "reconsulte" su origen de registros.

Lo de If current... te lo pongo, por si abrieras directamente de la ventana de navegación el formulario Modificar que no te aparezca eso de que no encuentra...

¡Gracias! muchas gracias pero veo que el cursor se marcha del registro activo al primero del formulario, cuando se tendría que quedar en el registro modificado, ya que esta tabla va a tener 2000 registros. muchas gracias por tu interés.

Si lo que quieres es que el cursor se quede en el registro "modificado", si tengo el formulario

Pulso el botón y modifico la nacionalidad

Cuando cierro el formulario Modificar

El registro "activo" es el modificado. En este caso basta con

Private Sub Form_Close()
DoCmd.RunSQL "Update autores set autor='" & Me.Autor & "', nacionalidad='" & Me.Nacionalidad & "' where idautor=" & Me.IdAutor & ""
Forms!autores.Refresh
End Sub

¡Gracias! Muchas gracias Julián, creo funciona pero no refresca el formulario Autor, un saludo

Creo que en Forms!autores.refresh, se puede poner requery?, muchas gracias por tu atención y un saludo

Amigo Julián, ante todo muchas gracias por tu interés, veo que sí funciona esta última rutina, pero es a medias porque cuando me hace la pregunta de si quiero modificar si le digo que sí, efectivamente actualiza y cierra el formulario y el cursor se sitúa en el formulario principal en el registro modificado, pero si le digo a la pregunta que no, entonces cierra y se sitúa el cursor en el primer registro y no en el registro que tenía seleccionado, y por otra parte si directamente al formulario modificar le digo que no, lo cierra y también se sitúa en el primer registro y no en el registro activado. Un abrazo Javier García

Vamos a ver si me explico. Cada vez entiendo menos. Si estás en un formulario que depende de una tabla, ¿qué mejor sitio para modificar algo que en el propio formulario?

Pero en caso de que quieras usar otro formulario, cuando se pulsa el botón, es porque se está convencido de querer modificarlo, por tanto sobraría lo de preguntar( luego te explico porque sale eso).

Además, da la impresión de que el formulario Modificar también tiene como origen de registros la propia tabla Autores ( no tendría sentido crear un formulario independiente y tener que insertar los valores que ya están en el formulario Autores). Por tanto, si ese es el caso

Tengo el formulario Autores

Si pulso el botón Modificar, me abre el formulario de ese nombre

Ahora voy a modificar el nombre del autor

Cuando cierro el formulario Modificar, como ya me modifica la tabla Autores

Y el cursor sigue en él, y me ha modificado el nombre Y lo único que le he puesto en el botón es

Private Sub Comando5_Click()
DoCmd.OpenForm "modificar", , , "idautor=" & Me.IdAutor & "", acFormEdit, acDialog
End Sub

Lo del aviso es porque en las propiedades de la base de datos tienes

Para evitar eso, cuando vayas a escribir líneas de código que inserten, actualicen, modifiquen,... ponle primero esta línea

Docmd.setwarnings false

Estimado Sr. Julián, te comento lo que he pensado sobre la base de datos. El formulario Autor se basa en una tabla también llamada Autor con los 3 campos que conoces, IdAutor, Autor y Nacionalidad.

Ese formulario va a ser un poco la base de toda la base de datos porque sobre cada autor va a contener todos los demás datos como genero de la obra, si pertenece a alguna colección, año publicación, etc, entonces parto de la idea del primer formulario autor que tenga los campos bloqueados para que por error no se modifiquen esos datos  porque va a contener un par de miles de registros,  por lo que con el formulario Modificar tenga esa posibilidad.

Por otra parte he podido cambiar las propiedades de la base de datos por lo que creo no me va a hacer falta esa rutina.

Espero haber aclarado un poco tus dudas y sobre todo muchas gracias por tu interes.

Pd. Por otra parte de agradecería si te mando la  BD y opinaras sobre como la podría confeccionar.

Creo que será lo mejor. Mi correo es [email protected]

En el asunto del mensaje pon tu alias Javier García ya que si no sé quien me escribe ni los abro.

¡Gracias! un saludo

Estimado Sr:Julián, no sé si abra recibido el correo enviado creo el 9 de noviembre y si ha tenido tiempo de echarle un vistazo, me interesa mucho su opinión si fuese posible, Un saludo Javi García

Pues la verdad es que no he recibido nada, y mi correo es efectivamente el que he puesto. ¿Puedes mandarla otra vez?

Hoy 16/11 te he devuelto tu base acompañada de un ejemplo

Estimado Julián: Muchas gracias por todo y sobre todo por tu interés, me has mandado una lección de access muy completa, lo cual te agradezco enormemente. Ahora me toca a mi desgranar toda esa información. Muchas gracias y un saludo Javier García

Respuesta
1

Si el formulario-1 fue abierto en modo modal y emergente, el formulario-2 también estará en modo modal y emergente, al cerrarse, el foco se lo devolverá al formulario-1 y (normalmente en el mismo punto en el que estaba).

Desde el formulario-2 y antes de cerrarlo, se puede actualizar al formulario uno y tras ello poner como registro activo el que se quiera.
El método consiste en localizar en el RecordsetClone del formulario -1 el que se desee (puede ser útil FindRecord), una vez localizado se igualan sus propiedades Bookmark para que se convierta en el activo.

Al regresar al formulario-1 estará en registro deseado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas