Relacionar registro de formulario con 4 registros de subformulario obligatoriamente

Tengo tres tablas: CLIENTES - PROVEEDORES - CUENTAS

La tabla Cuentas tiene 3 campos: Tipo, Nombre y Clase

En el campo Tipo elijo: "Clientes", Proveerdores" u "Otros". Luego según lo que elijo en ese campo, se actualiza la información que tiene el cuadro combinado "Nombre" y toma los datos de la tabla que corresponda según si es Clientes (Tabla clientes), Proveedores (Tabla proveedores) y otros: Es libre.

En el Formulario de la tabla Clientes lo relaciono con el subformulario de la tabla Cuentas. Para que al ver a un cliente puedo ver que cuentas tiene relacionadas. Vinculando el campo Cliente con el Nombre de la cuenta. Que deben coincidir.

Lo que necesito es que cada cliente nuevo que creo, se le creen si o si por obligación 4 cuentas en las cuales el nombre de la cuenta sea el mismo nombre del cliente, y cada cuenta sea una clase distinta indicada en el campo CLASE de la tabla CUENTAS: "Tema A", "Tema B", "Tema C","Tema D".
Pero necesito que esto sea obligatorio, que no pueda existir ningún cliente que no tenga relacionado en el subformulario de la tabla CUENTAS. 4 cuentas, con ID autonumero, Nombre: su nombre y TEMA: Cada uno de los 4. (Cuatro registros dentro de la tabla CUENTAS).
Como puedo lograr de forma ordenada esa idea, si existe otro método más prolijo para hacerlo aunque sea distinto también lo escucho.
Recuerden que en la tabla CUENTAS, también se pueden crear registros libres de otras cuentas, además de las cuentas de los clientes o proveedores, pero si o si necesito que estos, tengan cada uno sus 4 cuentas obligatorias y vinculadas.

1 respuesta

Respuesta
1

Puedes hacerlo fácilmente con una SQL de datos anexados. La idea sería la siguiente:

1º/ Compruebas que no existen registros de ese cliente en "Cuentas", por ejemplo con un DCount(). Si esta función te devuelve 0, es que no existen, y ejecutas el paso 2.

2º/ Ejecutas 4 SQLs para insertar los datos en la tabla, una para cada tipo de clase.

Algo así (que tendrás que ajustar a tus nombres y tener en cuenta el tipo de los datos, yo supongo que Cliente y Nombre son de tipo texto):

If DCount("Nombre","Cuentas","Nombre='" & me.Cliente & "'")=0 Then

CurrentDb.Execute "INSERT INTO Cuentas Values('Clientes','" & Me.Cliente & "','Tema A')"

CurrentDb.Execute "INSERT INTO Cuentas Values('Clientes','" & Me.Cliente & "','Tema B')"

CurrentDb.Execute "INSERT INTO Cuentas Values('Clientes','" & Me.Cliente & "','Tema C')"

CurrentDb.Execute "INSERT INTO Cuentas Values('Clientes','" & Me.Cliente & "','Tema D')"

End If

Este código tendrás que ver en qué parte de lo que tienes hecho encaja mejor. Opciones serían al guardar el registro, después de actualizar el campo Cliente...


Un saludo,

Sveinbjorn

Visita la web de Access de Neckkito & Sveinbjorn: http://nksvaccessolutions.com/ 

Gracias pero sigo con dudas por lo siguiente.

Supongamos que un cliente modifica su nombre. Como queda relacionado con la tabla Cuentas.Nombre.

Recordemos que en tabla Cuentas se ingresan registros de Clientes, Proveedores o varios (nombre libre). Los Proveedores son de otra tabla distinta. 
Como mantengo una relacion de un solo campo con tantas tablas y que si modifico el nombre de un proveedor, se modique en nombre de la cuenta del mismo que esta en la tabla cuentas. O modifico un cliente de la tabla Clientes y suceda lo mismo. 
Espero me entiendas. Saludos!

Lo que preguntas me lleva a pensar que tienes tu BD mal estructurada... Lo ideal sería que tuvieses un campo clave, único e irrepetible, para cada cliente, y que las relaciones entre las tablas se hagan por medio de ese campo clave. Así, aunque cambie el nombre, la clave seguiría siendo siempre la misma y problema resuelto.

Tal como tienes tu BD, o creo que la tienes, una posibilidad (que no estoy seguro que te funcione al 100%) es que si en las relaciones entre las tablas le marcas las casillas de exigir "integridad referencial" y "actualizar en cascada los campos relacionados", es posible que los camios en el nombre del cliente en la tabla principal se transmitan a la secundaria. Haz la prueba en una copia de tu BD, por si acaso.

Tengo tabla CLIENTES: CLIENTE (Campo clave, es el nombre del mismo), PAÍS, DIRECCIÓN, ETC
Tengo tabla PROVEEDORES: PROVEEDOR (Campo clave, es el nombre del mismo), PAÍS, DIRECCIÓN, ETC
Luego tengo la tabla Cuentas, que en ella tengo cuentas de clientes, de proveedores y
Tengo tabla CUENTAS: ID (Campo clave), Cuenta, Tipo (Cliente, proveedor, Otros), Subcuenta (Nombre de la cuenta, que si es "Otros" es libre, y si es cliente o proveedor debe proveenir de la tabla CLIENTES O PROVEEDORES y estar relacionado o ser siempre igual)
Entonces a su vez en la tabla cuentas tengo muchas, pero cuando creo un CLIENTE o UN PROVEEDOR NUEVO necesito que de forma obligatoria tenga 2 cuentas con un nombre especifico si o si, y que se relacione con el nombre que tenga el cliente o el proveedor en su tabla.
Creo al cliente "Pedro" en tabla CLIENTES: CLIENTE: Pedro (Campo clave), País: México.
Y necesito que pedro tenga 2 cuentas en la TABLA CUENTAS que se una de "Facturacion" y otra de "Prestamos". Quedaría así la tabla CUENTAS con dos registros nuevos:

ID: x, CUENTA: "Facturacion", TIPO: Clientes, Subcuenta: "Pedro"

ID: x, CUENTA: "Prestamos", TIPO: Clientes, Subcuenta: "Pedro"
La idea es que yo tengo varias cuentas de distintas índoles, pero cuando observo a los clientes necesito que si o si tengan esas dos y poder relacionar la información para saber que deben por ejemplo, para hacer informes, etc
Espero se haya entendido mejor con esta explicación! Gracias!

Te vuelvo repetir el código de antes (modificado con los nombres de los campos que ahora me dices, y el ejemplo de los 2 registros facturación y préstamos), que es el que necesitas:

If DCount("*","Cuentas","Subcuenta='" & Me.Cliente & "'")=0 Then

CurrentDb. Execute "INSERT INTO Cuentas(Cuenta, Tipo, Subcuenta) Values('Facturacion','Clientes','" & Me.Cliente & ')"

CurrentDb. Execute "INSERT INTO Cuentas(Cuenta, Tipo, Subcuenta) Values('Préstamos','Clientes','" & Me.Cliente & ')"

End If

Este código lo pondrías en "después de actualizar del campo Cliente, o en el botón que tengas para guardar el registro.

Gracias! Eso lo entiendo! ¿Pero esta es la mejor forma?

Es decir, que sucede si en algún momento se borra una de las cuentas desde la tabla CUENTAS. La de Prestamos por ejemplo. Yo necesito que el cliente tenga las dos si o si.
Lo mismo si se modifica el nombre de la Cuenta desde la tabla CUENTAS. Y se le cambia una letra al cliente o se le cambia por otro cliente desde ahí. Se pierde la vinculación.
Sera mejor que las CUENTAS sean libres y tengan un campo opcional de relación una cuenta con algún CLIENTE de la tabla clientes, otro campo igual para relación opcionalmente con algún PROVEEDOR. Por si es un proveedor.
O poner en la tabla clientes dos campos: CUENTA FACTURACIÓN y CUENTA PRESTAMOS para obligar a relación el campo con un registro de la tabla cuentas. Ninguna me cierra del todo, siento que no es prolijo. ¿Qué recomiendas?

No sé si es la mejor forma o no, pero es la única que se me ocurre...

Si es posible borrar registros de la tabla cuentas, cada vez que borres uno debes comprobar que ese cliente tiene las cuentas "obligatorias" y si no crear la que te falta (con un código similar al anterior)

Si tienes las tablas relacionadas (y me refiero a una relación por medio de la ventana de relaciones), no podrás modificar el cliente desde la tabla de cuentas (la secundaria en la relación).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas