PDA

Ver la Versión Completa : Funcion Locate


laukri
25-07-2008, 13:50:22
Hola a todos!

Tengo que hacer la administracion de usuarios de mi sistema. Y quiero asignarle distintos permisos a cada uno, el problema es el siguiente:
Cuando el usuario todavia no esta cargado en la tabla permisos, lo agrega y le carga los permisos correspondiente. Ahora, cuando el usuario ya tiene permisos asignados y se los quiero modificar me da error de clave repetida. Lacuestion es que yo uso el locate para posicionarme en el registro del usuario, pero siempre me da "Falso" como si no existiera, pero existe...
pongo el codigo:

var
auxUser: String;
begin
inherited;
auxUser:= Trim(ds.DataSet.FieldByName('nombre').AsString);
if TClientDataSet(dsPermisos.DataSet).Locate('IDUSUARIO',auxUser, [loCaseInsensitive]) then
dsPermisos.DataSet.edit
else dsPermisos.DataSet.Insert;
dsPermisos.DataSet.FieldByName('idUsuario').AsString:= auxUser;
guardarCheck;
aceptarCambios;
end;

Espero que me puedan ayudar...Gracias

Caro
25-07-2008, 14:10:22
Hola laukri


auxUser:= Trim(ds.DataSet.FieldByName('nombre').AsString);


Tu campo nombre no debería ser idUsuario, o es que en la otra tabla el IdUsuario es el nombre de la primera.

Saluditos

laukri
25-07-2008, 15:10:58
gracias por tu pronta respuesta.
Tengo 2 tablas: usuarios y premisos. en la primera tengo los campos "nombre" y "clave" y en la segunda "idUsuario" y todos los permisos.
Saludos

Caro
25-07-2008, 16:07:46
Tengo 2 tablas: usuarios y premisos. en la primera tengo los campos "nombre" y "clave" y en la segunda "idUsuario" y todos los permisos.


Entonces mas o menos tus datos estan así:


Tabla usuarios
nombre | clave
----------------
Maria | xxxx
Jose | xxxx

Tabla permisos
idUsuario | DemasCampos
----------------------
Maria | xxxxxxxxxxx
Jose | xxxxxxxxxxx


Si es así como estan tus datos, cuando recuperes el nombre de la tabla usuarios en tu variable auxUser y eso le pasas al locate que busca en la tabla permisos, si te debería encontrar al registro. Pero como que no es muy logico que este de esa forma, no tienes un codigo o IdUsuario en tu tabla usuarios??.

Ahora también has la prueba de trabajar directamente con el DataSet que esta asociado a tu DataSource (Tu query o tu table), en vez de hacer ds.DataSet.FieldByName, si fuera un Query entonces haces Query1.FieldByName.

Con que componentes estas trabajando??


if TClientDataSet(dsPermisos.DataSet).Locate('IDUSUARIO',auxUser, [loCaseInsensitive]) then


porque haces el Cast a un TClientDataSet??

Saluditos

delphidec
28-07-2008, 07:43:58
Hola laukri.

Yo en tu lugar no usaria el campo nombre como clave en la tabla de permisos por la simple razon que puede haber varias peronas de nombre "Juan" por ejemplo. Es ahi donde surge el error de "clave duplicada".
Yo asociaria ambas tablas con campo numerico autoincrement para asegurarme que cada nuevo usuario tienen una clave nueva y distinta al anterior.

Por otro lado el problema del Locate que no te devuleve nada puede venir del Cast que haces cuando realizas la consulta ya que aunque tuvireas 100 usuarios con nombre (y clave) "Juan" deveria traerte el primero que encuentra.

Saludos !

laukri
28-07-2008, 11:45:19
GRacias por sus respuesta voy a probar lo que me han marcdo y despues les cuento.
Trabajo con los componentes dbexpress

laukri
28-07-2008, 13:54:05
Le agregue un campo a la tabla usuarios y quedo:

tabla usuarios
idUser | nombre | clave


y anda perfecto....
GRacias a Todos por su ayuda


begin
inherited;
user:= trim(ds.DataSet.FieldByName('idUser').AsString);
if dsPermisos.DataSet.Locate('idUsuario',user,[loCaseInsensitive]) then
begin
activarCheck;
end;
end;