Yo digo que si, lo he probado, podemos manejar casi de manera completamente automática las relaciones muchos a muchos, lo único que haremos es ayudarnos con comandos sql para producir el resultado esperado.
Para empezar pensemos una situación de relación muchos a muchos, propongo la siguiente, didáctica y bien sencilla
Creo se sobreentiende un usuario tiene muchos permisos y un permiso puede estar en muchos usuarios.
Para plantear esto como un maestro detalle o mejor dicho como un maestro y doble detalle pongamos a cada elemento en su posición
Usuario->Maestro
Permisos asignados->Detalle 1
Permisos no asignados->Detalle 2
¿Como quedan las consultas?
sqlUsuario
select *
from Usuario
sqlPermisosAsignados
select *
from UsuarioPermiso
Where Login=:Login
sqlPermisosDisponibles
select *
from Permiso as p
Where p.IdPermiso not in
(Select IdPermiso
from UsuarioPermiso as up
Where up.Login=:Login)
Bueno ahí esta la primera aproximación, luego veremos si es suficiente o tenemos que mejorar algún aspecto,
sqlUsuario no merece explicación, sqlPermisoAsignados casi que tampoco, son los permisos que le usuario ya tiene asignado y podemos considerarlo como un detalle del usuario, sqlPermisosDisponibles son todos los permisos que no tiene el usuario tema resuelto con un "Not In" el lector puede usar un Exists si prefiere y también lo podemos considerar un detalle del usuario, de hecho como esta planteado el único parámetros de las consultas a las que consideramos detalle es el login del usuario, dato presente en el maestro, condición necesaria y suficiente para armar nuestros master-details en DBExpress
Así quedaría la cosa, recordar enlazar los dataset detalle por su propiedad DataSource al DataSource llamado en este caso "datUsuario"
Llegado este punto terminamos con el servidor, llega la hora del cliente.
Siguiente lo mostrado en la entrada http://pablosoligo.blogspot.com/2011/07/dbexpressmaster-detail.html la cosa quedaría así, tanto los permisos disponibles como los permisos asignados son detalles del usuario
Relaciono las grillas los datasources etc, pongo algunos datos y abro solo el clientedataset maestro al abrir la ventana
procedure TFrmUsuario.FormCreate(Sender: TObject);
begin
cdsUsuario.Open;
end;
y lo pruebo a ver que tal funciona.
Perfecto, me muevo entre usuarios y sus permisos disponibles y asignados se actualizan automáticamente.
Claro, la critica acá puede ser de que debo mostrar las descripciones de los permisos en permisos asignados, es un tema que dejamos para mas adelante ya que no hace a la diferencia en cuanto a programación, lo importante es entender la idea. Con esto tenemos el 70% del problema resuelto y solo escribimos una linea de código.
En la próxima entrada vemos la actualización de los permisos con este mismo esquema.