Sincronizar cuadros combinados

Esta es la situación:
Tabla AUTORES con los siguientes campos:
Cod_edic (Número) (clave princ.)
cod_cambio_autor (Autonumérico) (clave princ.)
Autor (Número)
Fecha (Número)
lugar_nacimiento (Número)
Autor, fecha, lugar_nacimiento son cuadros combinados. Cada uno coge los datos de su correspondiente tabla. El diseño de estas tablas es el mismo en las tres. P. Ej., la de autor tiene los campos cod_nombre (Autonumérico y clave principal) y nombre (texto).
Pregunta:
¿Cómo me las apaño para que, en el formulario en el que trabajo, cuando en el campo (cuadro combinado) autor introduzca PEPITO automáticamente me aparezcan la fecha y el lugar de nacimiento de PEPITO en los otros dos?
Te ruego la mayor claridad y sencillez posible, sobre todo si se trata de manejar código.
Respuesta
1
Lo que debes hacer es basar tus cuadros combinados en 'consultas' y no sobre tablas directamente utilizando criterios. En 'Tipo de Origen de Fila' vas a colocar Tabla/consulta y en 'Origen de fila' vas a crear la consulta haciendo click en el botón que muestra más o menos así [...].
Siguiendo, paso a explicarte lo que harás: supongamos que tienes una tabla 'autores' donde están los datos de autores con campos Id_autor, Autor, Fecha_nacimiento, y Lugar_nacimiento. Las consultas serán sobre tus datos de la tabla con el campo 'fecha' y vas a utilizar también el campo 'id_autor', pero éste campo no vas a Mostrar en tu consulta, éste vas a utilizar para establecer luego en la fila 'Criterios' lo que corresponda, supongamos =Forms! MiFormulario! Id_Autor. Aquí el Id_Autor va ser el cuadro combinado que utilizas y en el que escribes 'PEPITO'.
Luego de esto, vas a crear un evento "después de actualizar" en el cuadro combinado y vas a colocar Me. Id_Autor. Requery para actualizar en función del autor. Y con eso te va mostrar los datos que requieres ver en tu formulario.
En caso de código, podemos utilizar también en un evento 'después de actualizar' de tu cuadro combinado donde escribes Pepito, haciendo un select sobre los datos del autor 'pepito' y que te muestre en los textbox que corresponde. Pero, primero prueba con lo anterior y luego veremos el código.
No me funciona.
De todas maneras hay cosas que no estoy seguro de haber entendido. Cuando dices: "En 'Tipo de Origen de Fila' vas a colocar Tabla/consulta y en 'Origen de fila' vas a crear la consulta", ¿te refieres a que haga eso en los controles (cuadros combinados) de fecha y de nacimiento, o también al del nombre del autor?
Por otra parte, datos, lo que se dice datos, no hay en la tabla AUTORES (como te explicaba en la pregunta), allí sólo hay números. Los datos --de nombre, fecha y lugar-- están en sus correspondientes tablas-diccionario. Te digo esto sin saber si es o no importante.
¿Qué quieres decir con "supongamos" en "supongamos =Forms!MiFormulario!Id_Autor"? Te lo pregunto por si hay que hacer algo más que sustituir ahí MiFormulario por el nombre del formulario en los que están los cuadros combinados y el Id_Autor por lo que tú me dices.
Tal vez me resulte más fácil ese SELECT que me propones sobre el cuadro de nombres. ¿Cómo plantearías tú la consulta en SQL (aunque sea de forma muy general) y qué tendría que hacer luego con ella?
A ver si lo conseguimos.
Cuando me refereria a "En 'Tipo de Origen de Fila' vas a colocar Tabla/consulta y en 'Origen de fila' vas a crear la consulta" me refería a los campos fecha y lugar_nacimiento ya que va tomar en la consulta del valor que le des a 'autor'.
Ahora bien, me parece que el tipo de datos de fecha debe ser Fecha/Hora y no número. Y por último '=Forms! MiFormulario! Autor' se refiere al valor del cuadro combinado donde cargas el nombre de autor, entonces al hacer una actualización en dicho campo va cambiar los demás así como te expliqué (pero basando los otros cuadros combinados en consultas con criterio '=Forms! MiFormulario! Autor').
En cuanto a la consulta SQL, por lo que veo sería mejor que utilices código, más o menos sería así:
'-------------------------- evento despues de actualizar cuadro combinado autor
Private Sub autor_AfterUpdate()
Dim rs As New ADODB.Recordset                'define el recordset
Dim cnn As ADODB.Connection            'define conexion
Dim sql$                                              'definimos el sql como string
Dim codigo                                          'aqui definimos el codigo como variant  para autor
codigo = Me.autor                                     
Set cnn = CurrentProject.Connection 'establecemos la conexion con la bd actual
'escribimos la consulta sql  tomando en cuenta el valor del c.combinado autor
sql = "SELECT fecha FROM Autor_Fecha WHERE cod_autor =" & codigo & ""
Rs. Open sql, cnn, adOpenKeyset, adLockOptimistic 'ejecuta el sql con la conexion activa
Me.fecha = rs(0) 'y al ejecutar todo agrega al campo fecha de tu form, el recordset
End Sub
'--------------------------------- fin del evento
Me = se refiere a tu formulario, en vez de poner Forms! MiFormulario! Fecha
Ten en cuenta que lo que hice es a modo de ejemplo y me ha funcionado en mi bd de pruebas, debes adaptarlo a tu necesidad y de acuerdo a los nombres de tu campo y tablas.
Si con el primer método tenía problemas, no te digo nada con éste. Lo que más me cuesta es saber si los nombres que empleas tú (autor, fecha, etc.) se refieren al código de autor, fecha y lugar de nacimiento de la tabla AUTORES (donde son claves ajenas numéricas procedentes de las tablas-diccionario AUTOR, FECHA y LUGAR DE NACIMIENTO), o si se refieren a alguno de los dos campos de estas tablas-diccionario, que sólo tienen un id (autonumérico) y un campo texto (también el campo fecha de la tabla FECHAS es texto). La relación entre cada una de estas tablas y sus correspondientes campos en la tabla AUTORES es de uno a varios.
Por ejemplo, en la consulta SQL, tras el WHERE me pones cod_autor, pero yo no sé si te refieres al cod_autor (clave ajena) de la tabla AUTORES o al cod_autor (al id.) De la tabla-diccionario AUTOR, de donde cogemos los datos. Tampoco entiendo lo de Me.autor ni Me. Fecha
Si lo ves posible podrías ponerme entre corchetes algo así como Me.[aquí pones el cod_autor de tal tabla], etc., y luego ya sustituyo yo los datos. No sé si será mucha faena.
Por otra parte, y con independencia de que me haya equivocado trasladando los datos, al tratar de compilar el código que me has mandado me da error: "No se ha definido el tipo definido por el usuario" y me subraya en azul la 1.ª línea: dim rs New ADODB Recordset.
Todo lo que he puesto en el código se refiere a los datos de tu formulario. 'Me' es una manera de acelerar la carga de los datos del formulario, y si miras un poco el codigo del sql que dice: "SELECT fecha FROM Autor_Fecha WHERE cod_autor =" & codigo & "", selecciona fecha de la tabla-diccionario FECHA (yo solo puse Autor_fecha para distinguir), cod_autor se refiere al IdAutor de esa tabla que debe ser igual al código o al Id que está en tu cuadro combinado de tu formulario por eso más arriba te coloqué 'codigo=Me.autor'.
En cuanto a lo de la compilación, puede que se deba a alguna referencia faltante, verifica en Herramientas/Referencias las siguientes librerías:
Microsoft Access 11.0 Object library
Microsoft DAO 3.6
Microsoft ActiveX Data Objects 2.1 library
Visual Basic for Applications
OLE Automation
Bueno, Diego, me rindo.
He solucionado el error de compilación, pero ahora me da otro en el 'Me.fecha': "No se encontró el método o el dato miembro". He metido ahí el campo del cuadro combinado y como no me funcionaba he probado a meterle todo lo que se me ha ido ocurriendo y sigue con el error. De manera que no puedo comprobar si esto va o no va.
Por otra parte, la consulta SQL, tal como tú la planteas, no se ajusta a las tablas y campos (y sus relaciones) que tengo yo, y me extrañaría que funcionase.
Me resignaré a seguir metiendo esos datos manualmente.
Decide tú si descartas la pregunta o prefieres que la finalice yo.
Hice todo lo posible por ayudarte, al menos en lo poco que podía. En cuanto a que no se encuentra el método o el dato miembro, es porque no tienes seguramente el textbox o cuadro combinado fecha en tu formulario. Busca el nombre de tu cuadro y colocalo seguido de 'Me. AquiElnombreDeTuCuadroCombinado'. En cuanto al sql, te comenté que era a modo de ejemplo y que tu tenías que adaptarlo a tu necesidad. Realmente trabajar con SQL en vba es un poco complejo.
Agradezco por haberte comunicado conmigo, y prefiero que tu finalices la pregunta si ya no necesitas de mis servicios, y no olvides de puntuar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas