Código alternativo a DoCmd.GoToRecord en subform

Estoy intentando que un subformulario muestre un registro concreto mediante código, al tratarse de un subform siempre me indica error 2489 de objeto no abierto. He visto en otras respuestas que utilizan primero setfocus, pero aun así no consigo que funcione, las líneas de código que utilizo son:
Forms![frm!]![subfrmX].SetFocus
DoCmd.GoToRecord acDataForm, "subfrmX", acGoTo, var
Les agradecería que me indicaran como hacer este desplazamiento entre registros con vba access.

1 respuesta

Respuesta
1
Pues la verdad, yo no he entendido nada. ¿Dónde esta el problema?, es decir, que un subformulario muestre un registro concreto, en principio, no tiene ningún misterio, pero no se que es lo que realmente pretendes. Concreta un poco más que es lo que haces, que es lo que quieres y cuál es el resultado que obtienes.
Tienes razón, no me he explicado bien.
El formulario principal tiene DOS subformularios, cada uno de ellos tienen un origen de datos común, pero los presentan de forma diferente. Lo que pretendo es que al seleccionar un registro en el subformulario A, haga que el registro mostrado en el subformulario B sea el mismo.
He intentado hacerlo sin vba, utilizando las opciones de vinculación de campos principales y secundarios con un cuadro independiente, etc., pero aunque consigo que funcione en lo básico, de modo que el subformulario B muestra el registro seleccionado en A, luego no es posible recorrer en B todos los registros del origen de datos. Es decir, si la tabla tiene 8 registros, el sub A los tiene todos disponibles y puedes recorrerlos todos, sin embargo en el sub B sólo puedes ver el sincronizado en A. Por eso intento hacerlo con código.
¡No se si ahora se entiende menos!
Gracias.
Pues la verdad, no se sí lo entiendo más. Para empezar no se cómo haces para que el subformulario B te muestre el registro del seleccionado en el formulario A. Pero si lo estas filtrando, Access hace lo que tiene que hacer, te muestra en el subformulario B, sólo el registro que cumple la condición. Solución: (dependiendo de como lo hagas), crear un botón para eliminar el filtro.
De todas las maneras, ¿Podrías explicar para que tienes 2 subformularios dentro de un formulario si ambos "apuntan" a la misma tabla?, la verdad es que no lo entiendo.
Básicamente el subformulario A muestra los datos de forma continua (con menos campos) y el subformulario B los muestra de uno en uno (con más detalles). Es parecido a un formulario dividido. Hay una forma de emular un formulario dividido sin código que es a lo que me refería en la aclaración anterior, pero si no tienes claro cómo se hace mejor no te lio.
Lo que necesito saber es si se te ocurre cual puede ser el código necesario para hacer que al seleccionar un registro del subformulario continuo, se me muestre el mismo registro en el subformulario único. Con GoToRecord no he sido capaz de conseguirlo.
Gracias.
Vale, ahora lo he entendido, cuando has nombrado "formulario dividido". Entiendo que tienes una versión inferior al 2007, ya que a partir de esa se hace con facilidad.
Pero hacerlo con versiones inferiores no requiere ningún esfuerzo.
Tenemos 3 formularios, que llamaremos: form_principal, form1 (continuo) y form2 (que nos mostrara todos los datos del registro seleccionado)
Como comentas "metemos" el form1 y el form2 en el form_principal.
En el form_principal creamos un campo independiente que llamaremos "relacion" y en su origen de datos ponemos:
=[form1].form.[id]
Luego en el form2, en propiedades, en "vincular campos principales" ponemos [relación] y en "vincular campos secundarios" ponemos [id]
Y con eso te debería funcionar.
Ahh! Se me olvido comentar. Una vez que veas que funciona correctamente, el campo "relacion" lo puedes poner en visible=no, para que quede más estético.
Gracias. Esto que me sugieres es lo que había hecho desde un principio.
El problema que me surge con este método y que no consigo solucionar, es que en el subformulario B, el que está vinculado con [relación] y con [id] no tiene disponibles todos los registros, sino sólo el registro concreto relacionado con [relación], me intento explicar mejor. Si en la tabla o consulta origen de datos común hay 8 registros, en el subformulario continuo (A) aparecen los ocho, y en el subformulario único (B) sólo aparece uno (no me he vuelto loco), cuando digo que sólo aparece uno me refiero a que en la barra inferior, el número total de registros que muestra es 1 de 1, no 1 de 8, de tal manera que no puedes desplazarte a ninguno de los otros 8 registros, es como si funcionara como un criterio de selección de una consulta, y esto para lo que yo pretendo tiene una consecuencia más grave, que es que no te permite crear un registro nuevo directamente en ese subformulario B, que es donde quiero crearlos porque es el que presenta los datos detallados. De hecho, si haces la prueba de dejar en blanco el vínculo secundario [id], entonces sí que aparecen los ochos registros en el subformulario B, pero obviamente se ha roto la sincronización con A.
En este punto, es cuando me planteo tratar de sincronizarlos con código, y es cuando me surge el problema de que access parece que no reconoce el subformulario como un formulario abierto, y no te permite hacer algo tan sencillo como DoCmd.GoToRecord, y no tengo claro como hacerlo de otro modo con ADO, porque a partir de ahí estoy algo más perdido.
Para lo que pretendes podría plantearse varios métodos, casi tantos cómo los planteamientos de BD que se nos ocurran.
Lo que comentas de que "access no reconoce el subformulario como un formulario abierto", me suena, aunque lógicamente puedo estar equivocado, a que no estas utilizando la "nomenclatura" adecuada para referirte a un subformulario.
Según el planteamiento que te he propuesto antes es fácil hacerlo con un botón en el formulario principal y que te aplique o quite el filtro al subformulario.
Hola.
Yo entiendo por subformulario un formulario que está dentro de otro. En la ayuda de access los denomina de esa manera. Extracto de la ayuda: "Obtener información sobre los subformularios.Un subformulario es un formulario que se inserta en otro. El formulario primario se denomina formulario principal, y el formulario dentro del formulario se denomina subformulario. Una combinación de formulario y subformulario se denomina a veces formulario jerárquico, formulario principal/detalle o formulario principal/secundario."
En cuanto a los planteamientos, seguramente habrá muchos, pero lo que yo necesito es que el evento que activa la sincronización sea Click sobre cualquier campo de un registro del subformulario A, por tanto, se trata de crear un procedimiento de evento Al hacer click en cada campo del subformulario A que haga que en el subformulario B se desplace el registro mostrado para presentar el mismo sobre el que estás haciendo click en el subformulario A. Es como funciona un subformulario dividido. No es necesario utilizar un botón.
Eso lo tengo claro, para lo que necesito ayuda es para escribir el código vba (ADO) que haga que al hacer click sobre un campo de un registro del subformulario A (subformulario continuo), haga que se muestre el mismo registro en el subformulario B (subformulario individual). Si se te ocurre algún código para hacerlo te agradecería que lo mostraras en las aclaraciones.
No tengo claro que la solución sea quitar el "filtro" porque realmente no es un filtro, opera como tal pero es la vinculación de campos principales y secundarios entre el formulario principal y el subformulario, que creo que no se si se puede modificar en tiempo de ejecución.
Un saludo.
No creo que yo necesite que me muestres la ayuda de access sobre subformularios. Yo te estoy hablando de "NOMENCLATURA DE SUBFORMULARIOS". No se escribe igual para hacer referencia a un campo de un formulario, que para hacer referencia a un subformulario. Y si desde el subformulario quieres hacer referencia al formulario, tampoco es lo mismo. Ya no te cuento si es un subformulario dentro de un subformulario de un formulario.
Lo de usar un botón o un doble click es una decisión tuya, al fin y al cabo son "eventos" y le puedes decir en que "evento" quieres que lo haga.
Lo del "filtro": No podrás prentender que Access "intuya" lo que quieres en cada momento, se lo tendrás que indicar. Es decir, en un evento le tendré que decir que me filtre los resultados (en el doble click por ejemplo), pero en otro le tendré que decir que vuelva a mostrarme todos los registros, porque no creo que Access sepa lo que quiero si no se lo indico.
Y por supuesto se me ocurren muchos códigos para hacer lo que pretendes, pero desde este lado, no tengo la bola "magica" para saber cómo lo tienes, y por lo tanto no se como hacerlo.
De todas maneras, ya siento no haber podido solucionar tu problema, lo mejor es que cierres esta pregunta y vuelvas a formularla de nuevo para que te conteste otro.
Hola
No pretendía ofenderte, realmente aprecio el interés mostrado con independencia de que la solución sea mejor o peor. La ayuda no era para enseñarte, tu eres el experto, era para intentar explicarme, sin duda no entendí la expresión nomenclatura. Por lo demás, está claro que no he conseguido preguntar correctamente lo que necesito, lo cual sinceramente me preocupa. Otra vez será.
Gracias.
Un saludo.
Vale. Mira no se si es lo que quieres, pero al menos es lo que yo he entendido. Si entras en el código verás a lo que me refiero con "nomenclatura del subformulario".
http://solucioneskepasada.blogspot.com/
Hola.
El ejemplo de formularios divididos 2003 es exactamente lo que quería hacer. He visto el código del evento form_current, no se me había ocurrido probar con Find, voy a adaptarlo a mi bd.
Muchas Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas