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
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
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.
- Compartir respuesta
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
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
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
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.
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
- Compartir respuesta
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.
- Compartir respuesta