Inicio > Microsoft Access > jpaniagua > Enlazar campos de distintos formularios

Enlazar campos de distintos formularios

Experto:
Usuario:
Fecha: 18/06/2008
Valoración: Categoría: Microsoft Access
17/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Bien, dispongo de dos formularios:

Uno de ellos es un listado con todos los telefonos "Telefonos", y otro denominado "Telefonos/Edificios" donde aparecen los telefonos, con un subformulario con la información del edificio en el que esta situado el telefono. Estos estan relacionados mediante un camp "ID", que relaciona a los Edificios con los Telefonos.

Bien, en Telefonos tengo un botón dentro del formulario de Telefonos que me lleva directamente a Telefonos/Edificios.

Me gustaria poder hacer que cuando yo hiciese Click en el botón, me llevase  al formulario Telefonos/Edificios y me apareciese el mismo telefono que yo estaba consultando en Telefonos, no se si me explico.

Yo estoy en Telefonos y estoy viendo la extension 6088 (es la clave principal). Hago Click en el botón que me lleva hasta Telefonos/Edificios y cuando este se abra, aparezcan los datos del telefono con la extensión 6088 y de su edificio pertinente.
Esto, no tengo ni idea como hacerlo. Se me ocurren ideas, como guardar el valor del campo "extensión (al ser la clave principal, sería el único valor sin repetir, y por tanto único)" de la tabla Telefónos en una variable global (no se como se hace eso en visual basic) y cuando se abra la tabla Telefonos/Edificios, volcar el valor de esa variable sobre el campo "extensión" de ese formulario y asi mostrarme los datos del Telefono i Edificio de la extensión en cuestión.
Quizas piense demasiado mecánicamente, y no sea la solucion mas idónea para esto. Me gustaría que me explicases de que forma lo puedo realizar y si me equivoco en algo, corregirme.
Gracias
Saludos
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Buenas:
Complicas en exceso  el problema, simplemente tienes que poner en el procedimiento de evento del botón Al hacer Click:
DoCmd.OpenForm "NOMBREFORMULARIOPARAABRIR", acNormal,,"[CONTROLFORMULARIO]=Forms![NOMBREFORMULARIOPARAFILTRAR]![NOMBRECONTROL]"
No te asustes según escribas te irá apareciendo un mensaje con lo que es cada parte, pero lo que más me interesa es lo que va despues de acNormal (vista del formulario), ves dos comas, una para separar criterios de la expresión (en VB se utilizan comas mientras que el generador de expresiones utiliza punto y coma) y la otra porque omito el FILTRO y paso directamente a la condición WHERE. La diferencia entre FILTRO y CONDICION WHERE es que con el FILTRO carga toda la información (en tu caso todos los registros de Telefonos/Edificios) mientras que con la condición where sólo carga los registros que cumplan dicha condición, haciendo más rápidas las búsquedas.
Un saludo,
 
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
No te entiendo muy bien. Hablas de un "where" que no se donde esta =S. ¿Es una linea que tengo que añadir?. Estoy un poco perdido, he entendido la explicación pero no he entendido la linea que me has puesto que introdujese. He puesto esto:
Private Sub Comando28_Click()
DoCmd.OpenForm "D_Listado Telefonos-Edificios", acNormal, , C_ConsultaTelefonos.Estensió = Forms![D_Listado Telefonos-Edificios]![C_ConsultaTelefonos.Estensió]
End Sub
 
Explicame que es lo que tengo mal y como solventarlo. Actualmente me da un error que me dice: "Se requiere el objeto"
Saludos
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Perdon, ha sido un error, la linea que he insertado era esta:
Private Sub Comando28_Click()
DoCmd.OpenForm "D_Listado Telefonos-Edificios", acNormal, , C_ConsultaTelefonos.Estensió = Forms![D_Listado Telefonos-Edificios]![D_Listado Telefonos-Edificios.Estensió]
End Sub
Lo siento, ha sido un despiste xDD.
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Buenas:
Veo varios errores,
Estas diciendo que quieres abrir un formulario que se llama D_Listado Telefonos-Edificios, pero a la vez en los criterios le estas diciendo que busque el valor que tiene ese mismo formulario que no está abierto.
Antes de escribir la expresión debes tener en cuenta varias cosas, si eres como yo que no me acuerdo de la mitad de las cosas, es preferible que apuntes lo siguiente:
NOMBRE DEL FORMULARIO QUE QUIERES ABRIR
NOMBRE DEL FORMULARIO QUE CONTIENE EL PROCEDIMIENTO (SE VE ARRIBA EN LA VENTANA PERO POR SI ACASO)
NOMBRE DEL CONTROL DEL FORMULARIO DEL PROCEDIMIENTO
NOMBRE DEL CONTROL DEL FORMULARIO DEL QUIERES ABRIR Y POR EL QUE VAS A FILTRAR
Te pongo un ejemplo siguiendo las indicaciones anteriores:
1º) FRMCURSOSALUMNOS 
2º) FRMALUMNOS
3º) ID_Alumno
4º) Alumno (Lógicamente están relacionados por el ID_Alumno en las Tablas)
Asi tendrás la siguiente expresión:
DoCmd.OpenForm "FRMCURSOSALUMNOS", acNormal,, "[Alumno]=Forms![FRMALUMNOS]![ID_Alumno]"
Como verás tienes mal escrita la última expresión (la más importante)
Un saludo,
 
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Ya me ha salido, pero creo que no lo has entendido bien. No quiero que me plantee una pregunta y yo inserte el valor a mano de la extensió.
Quiero que me coja el valor de la extensión que tiene el formulario que abrira el otro, y cuando se haga click en el boton, el segundo formulario me muestre la información de el telefono con la extensión y su edificio. Por ejemplo:
Telefonos.extension es igual a 3368
Hago click en el botón que me llevara al formulario con el telefono y sus edificios. Cuando este se abra entonces Telefonos/edificios.extension sera igual a 3368 y mostrarme así los datos de la extensión 3368 y su edificio respectivo.

Espero que mi dibujo te deje mas claras las cosas. He intentado explicartelo lo mejor posible, para facilitarte la tarea.
Saludos
Espero tu respuesta, Gracias
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Buenas:
No debería preguntarte, si no que debería recoger el valor que tiene el formulario si sale el mensaje es que no entiende cual es valor de la condición WHERE "[NOMBRECONTROL]= Forms![NOMBREFORMULARIO]![NOMBRECONTROL]"
Como te comente anteriormente comprueba que la expresión está bien escrita, si has cambiado alguna letra fallará.
Un saludo,
 
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Así es como lo tengo ahora:
Private Sub Comando28_Click()
DoCmd.OpenForm "D_Listado Telefonos-Edificios", acNormal, , "[Telefono] = Forms![C_ConsultaTelefonos]![Estensió]"
End Sub
Y cuando le doy al botón me aparece una ventana que pone "Telefono" y aparece un recuadro para rellenar la extensión. Los nombres estan correctos, ya los habia mirado, y ahora los he vuelto a corregir.
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Buenas:
¿El formulario está basado en una consulta que ya tiene criterios?
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
No, tanto el formulario Telefonos, como el formulario Telefonos/Edificios, estan basados en tablas, no tienen ni consultas, ni ningun tipo de criterio. 
Por cierto cuando inserto el número de extensión en el cuadro de mensaje a rellenar, este no me hace ni caso y me reenvia directamente al primer registro que tiene Telefons/Edificis y no a la extensión que yo le he puesto.
Osea, me pone "Telefonos" y yo escribo "4088" y cuando Telefonos/Edificios se abre, me muestra los dato de la extensión 3002, que es la primera del registro y lo que yo he puesto como si no existiese.
Igual esto te ayuda a deducir el error.
 
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Si quieres me mandas un e-mail para revirsalo por que no se dónde está el error
jespaniagua@gmail.com
 
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Te adjunto la BDD??
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
Sin registros, no neceisto la información.
 
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Ya te la he enviado al correo. Espero tu respuesta.
Un saludo
 
18/06/2008
shiro578, experto respondiendo en Microsoft Access
Experto
He encontrado los ORRORES!!!
Como te comentaba [Telefono] no existe como campo en D_Listado Telefonos-Edificios, asi que no entiende el criterio. Tienes un ID relacionado y un campo que llama Extensió asi que utiliza cualquiera de ellos.
Tienes un procedimiento de evento que pone como tipo de RECORDSET del formulario a SNAPSHOT, en cristiano, sólo se puede leer mientras que el tipo Dynaset es de Escritura/Lectura. Con este tipo de recordset no se puede hacer nada es como una "imagen", asi que te recomiendo que te "carges" el procedimiento, por cierto que para no entender de programación orientada a objetos es bastante complicado. El método Docmd.OpenForm tiene sus propios criterios para hacer que sólo sea de lectura (sin tocar el recordset), nos quedaría algo como esto:
DoCmd.OpenForm "D_Listado Telefonos-Edificios", acNormal, "", "[Estensió] = Forms![C_ConsultaTelefonos]![Estensió]", acReadOnly, acNormal
En cuanto al botón bloquear/desbloquear (uso de la propiedad RECORDSET de los formularios) todos los formularios tienen sus propiedades, asi tienes:
Permitir Ediciones, Permitir Eliminaciones, Agregar
Te comento que se pueden modificar mediante código VB así si quieres que al cargar el formulario se impida eliminar registros pondrías
Me.Form.AllowDeletions = False
Un saludo,
18/06/2008
shiro578, usuario preguntando en Microsoft Access
Usuario
Genial respuesta, va a la perfección. Muchas gracias.
Ahora te abriré otra pregunta a causa del "recordset". (Soy un pesado verdad? Jajaja)
Un saludo
Enlaces patrocinados
Respuestas relacionadas