Enlazar campos de distintos formularios

Bien, dispongo de dos formularios:
Uno de ellos es un listado con todos los teléfonos "Telefonos", y otro denominado "Telefonos/Edificios" donde aparecen los teléfonos, con un subformulario con la información del edificio en el que esta situado el teléfono. Estos están relacionados mediante un camp "ID", que relaciona a los Edificios con los Teléfonos.
Bien, en Teléfonos tengo un botón dentro del formulario de Teléfonos que me lleva directamente a Telefonos/Edificios.
Me gustaría poder hacer que cuando yo hiciese Click en el botón, me llevase al formulario Telefonos/Edificios y me apareciese el mismo teléfono que yo estaba consultando en Teléfonos, no se si me explico.
Yo estoy en Teléfonos y estoy viendo la extensión 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 teléfono 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 así mostrarme los datos del Teléfono i Edificio de la extensión en cuestión.
Quizás piense demasiado mecánicamente, y no sea la solución más idónea para esto. Me gustaría que me explicases de que forma lo puedo realizar y si me equivoco en algo, corregirme.

1 respuesta

Respuesta
1
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 después 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 CONDICIÓN 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.
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
Perdón, 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.
Veo varios errores,
Estas diciendo que quieres abrir un formulario que se llama D_Listado Teléfonos-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)
Así 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)
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 abrirá el otro, y cuando se haga click en el botón, el segundo formulario me muestre la información de el teléfono con la extensión y su edificio. Por ejemplo:
Teléfonos. Extensión es igual a 3368
Hago click en el botón que me llevara al formulario con el teléfono 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.
C:\Documents and Settings\juandav\Escritorio\Dibujo.JPG
Espero que mi dibujo te deje más claras las cosas. He intentado explicártelo lo mejor posible, para facilitarte la tarea.
Saludos
Espero tu respuesta, Gracias
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á.
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 están correctos, ya los había mirado, y ahora los he vuelto a corregir.
¿El formulario está basado en una consulta que ya tiene criterios?
No, tanto el formulario Teléfonos, como el formulario Telefonos/Edificios, están basados en tablas, no tienen ni consultas, ni ningún 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 reenvía 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.
Si quieres me mandas un e-mail para revirsalo por que no se dónde está el error
[email protected]
¿Te adjunto la BDD?
Sin registros, no necesito la información.
Ya te la he enviado al correo. Espero tu respuesta.
Un saludo
He encontrado los HORRORES!
Como te comentaba [Telefono] no existe como campo en D_Listado Teléfonos-Edificios, así que no entiende el criterio. Tienes un ID relacionado y un campo que llama Extensió así 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", así 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, así 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
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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas