Tengo dos tablas: principal y responsables. En ambas tengo dos campos combinados, (responsables y grupo). Quiero conseguir que cuando el usuario rellene el campo responsable, se rellene automáticamente el campo grupo en la tabla principal, ya que obviamente se corresponden ambos campos. El formulario está hecho y el origendel control es la principal en la que ya existen ambos campos (pero vacíos) y las tablas ya están relacionadas.
También quiero conseguir que no se puedan añadir registros nuevos en la tabla responsables, para que si hay que añadir alguno tengan que acudir al administrador de la bd. En access. Muchas gracias anticipadas. Si es necesaria alguna aclaración nu dedes en pedírmela.
Si defines las relaciones en un orden lo hará solo, arrastrar el campo que las relacionan de responsables a principal. Lo que además puedes hacer (no sé si te refieres a esto cuando dices campos combinados) en la pestaña Búesqueda del diseño de tabla decirle que en ese campo te muestre un combo en lugar de un textbox (igual que en un formulario, le das el origen de datos y el número de campos y el campo relacionado. Esto lo heredarán los formularios nuevos que crees desde esta tabla. Si ya tienes el formulario hecho, cambia de textbox a combobox, le das las propiedades para tu caso. Si una vez que metes el responsable, quieres que el grupo lo meta directamente en la tabla principal lo puedes hacer de dos maneras a) tocar la tabla y hacer un requery o b) pasarle el grupo al control del grupo.(Supongo que cada responsable pertenece a un sólo grupo, y lo tienes en una tabla) a) puedes hacerlo mediante una consulta de actualización en el evento lost focus del control donde tengas el responsable. Dim strSQL as string strSQL = "UPDATE ..." 'Hazte la consulta en vista diseño y pega aquí el SQL DoCmd.SetWarnings false DoCmd.RunSQL strSQL DoCmd.SetWarnings true b) Para esto utilizo dos funciones que me hice hace años, LeeDeTablaSiHay ([Tabla/Consulta],[Campo]) as variant, lo que hace es abrir la consulta que le indico en los argumentos, recorrer los campos hasta que encuentra el que le indico, y me da el valor que tiene el primer registro (me hice la función basándome en una que encontré en internet para Access 97); y CreaSQL ([Consulta],[cadenaSQL]) básicamente lo que hace es borrar la consulta que le paso por el nombre y crear otra nueva con el SQL como cadena que le paso. Dim strRble as string Dim strGrupo as string Dim strSQL as string 'Esto generalmente lo tengo en global como genérico para toda la BD strRble = me.Responsable strSQL = "SELECT Grupo FROM ... WHERE Resposable = '" & strRble & "';" CreaSQL "QS_Grupo_Rble", strSQL 'Creo la consulta QS_Grupo_Rble con el SQL anterior strGrupo = LeeDeTablaSiHay ("QS_Grupo_Rble","Grupo") Me.grupo = strGrupo Si quieres te echo una mano a desarrollar estas funcionas que uso para que las tengas en tus bases de datos, sin bastante útiles Lo de limitar el añadir registros, de manera directa no se puede hacer (Access está diseñado para trabajar añadiendo registros a una BD en blanco). Tendrás que hacerlo por código, te indico dos maneras. Una más fácil para el administrador y también más fáciil para saltársela, y otra más enrevesada pero más difícil saltárselo. La primera: ¿Conoces las tabla Msys? Las puedes ver activando el ver objetos ocultos y de sistema en las opciones de Access, son las tablas Microsoft System, el núcleo de la base de datos, todo menos los registros de tu base (definición de tablas, consultas, formularios, ...) está ahí. Hay una manera de hacer tablas de sistema del usuario, tan sólo tiene que tener el nombre que empiece por Usys User System. Hazte una tabla UsysResposables, con los registros que tu quieras. Al abrir la base de datos (en el cargar del primer formulario) borra la tabla Responsables y vuelca los valores de la tabla UsysResposable. Dim strSQL as string DoCmd.SetWarning false strSQL = "DELETE * FROM Resposables" DoCmd.RunSQL strSQL strSQL ="INSERT INTO Responsables (.....) SELECT .... FROM UsysResponsables ... DoCmd.RunSQL strSQL DoCmd.SetWarnings true La segunda: es básicamente lo mismo, pero sin la tabla Usys; borrando la tabla Responsable, y metiendo los valores por código a pelo: Dim strSQL as string strSQL = "DELETE * FROM Responsable" DoCmd.SetWarnings false DoCmd.RunSQL strSQL strSQL = "INSERT INTO Responsables ( ... ) VALUES ( ...Responsable1 ) DoCmd.RunSQL strSQL strSQL = "INSERT INTO .... Responsable2 ... etc DoCmd.SetWarnings true Es posible que haya otra manera trabajando los privilegios de usuario, con el Administrador de Usuarios, el archivo mdw, pero si es sólo para esto es matar moscas a cañonazos. Si quieres ponerle seguridad a tu base de datos puede ser una buena opción pero si no lo has hecho nunca te costará un poco. Todo esto es trabajando directamente con los datos en las tablas, si lo haces por un formulario, puedes tocar las propiedades de edición de datos del formulario o bloquear el control. Todo depende de lo que quieras hacer, además de evitar meter más registros, y lo transparente que quieras que sea para el usuario, por ejemplo: Si vas a entregar un mde y lo haces de la segunda manera, cada vez que quieras dar de alta un responsable, tendrá que modificar el código y volver a generar el mde, de la primera no. Puedes hacer más cosas, depende de como quieras evitarlo - Puedes contar/contrastar el número de registros que hay en la tabla Responsables y UsysResponsables, y si no coincide mandar un msgbox y cerrar la base de datos, al abrir algunos o todos los formularios - Puedes dejar esta tabla Resposables en una base de datos fuera, BDSystem, con las tablas generales, vincularlas a tu base de datos y darle a BDSystem atributo de sólo lectura (siempre se podrá quitar y te los podrán añadir) - Puedes hacer lo de Usys, pero en lugar de en esta tabla, en un archivo de texto con los registros de la tabla responsables, la borras, y luego importas el archivo de texto que previamente has escondido en algún lado, C:\Windows\system32\rbls.txt, y lo vuelcas en la tabla responsables; y si quieres complicarlo más puedes encriptar ese archivo y desecnriptar la tabla que importes antes de volcarla. - Lo que yo haría es hacerlo de la primera manera, pero llamar a la tabla UsysZSD300Swap en lugar de UsysResponsables. No hay mucha gente que sepa lo las Msys y Usys, y a un usuario que enrede ese nombre raro le asusta (todo depende del nivel de trasteo que tengan los usuarios a los que les quieres bloquear el añadir datos) Básicamente todos esos procedimientos, menos el del mdw, se basan en lo mismo borrar la tabla y controlar los valores que vuelcas de nuevo en la tabla, escondiendo más o menos esos valores. Hace años jugaba con un compañero de trabajo a protegernos y reventarnos bases de de datos, y se puede llegar a hacer cosas muy enrevesadas.