PDA

Ver la Versión Completa : Averiguar si la combinación de dos campos está en uso


DarkByte
20-09-2004, 08:29:54
¡Hola!. Estoy corrigiendo fallos en una aplicación de bases de datos que he hecho, en la cual, al intentar dar un usuario de alta, comprueba si el usuario ya existe o no, y si existe devuelve error y aborta.
El problema es que he usado Locate en los dos campos, por lo tanto si introduzco PEPE GONZALEZ, al escribir GONZALEZ PEPE me suelta también error... ¿Cómo podría evitar eso?. Pongo aquí el código que uso:
function EstaEnUso(Nombre:string;Apellidos:string):boolean;
begin
Result := False;
If frmDataModule.TblUsuarios.Locate('Nombre',UpperCase(Nombre),[]) Then
begin
If frmDataModule.TblUsuarios.Locate('Apellidos',UpperCase(Apellidos),[]) Then
begin
Result := True;
end;
end;
end;

Neftali [Germán.Estévez]
20-09-2004, 09:32:59
Puesto que quieres que funcione con los parámetros cambiados, sólo se me ocurre que hagas la llamada dos veces consecutivas (la segunda sólo si la primera ha fallado) para comprobar ambas posibilidades.

basti
20-09-2004, 11:40:41
El problema es que estás buscando en toda la tabla en las dos búsquedas, me explico, primero buscas si existe algún PEPE, y después si existe algún GONZALEZ, entonces si existe algún PEPE MARTINEZ y ANTONIO GONZALEZ, te va a dar error.

La función locate puede encontrar un registro con varios campos de búsqueda, algo así

if frmDataModule.TblUsuarios.Locate('Nombre;Apellidos',
VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[]) Then
Result := True;

marcoszorrilla
20-09-2004, 15:15:13
Mejor solución sería dejar que trabaje el motor de la base de datos, creando un indice único por los dos campos.

Un Saludo.

DarkByte
20-09-2004, 16:55:57
Bueno, el programa ya está terminado y ya solo queda arreglar bugs... Basti, me encantaría que me explicaras más a fondo tu planteamiento... por favor

marcoszorrilla
20-09-2004, 17:02:12
Lo que quiere decirte Basti es que una cosa es buscar por dos campos a la vez, justo el ejemplo que él presenta y que ha de funcionarte y otra lo que haces tú.

Primero buscas un campo y despues el otro ambos en toda la tabla, por lo que la única garantía que tienes es que se apellida igual, pero no sabes si el nombre es el tecleado o no.

Un Saludo.

roman
20-09-2004, 17:54:42
Mejor solución sería dejar que trabaje el motor de la base de datos, creando un indice único por los dos campos.


Y quizá mejor aún ;) sería utilizar un campo más adecuado para verificar la existencia previa de un usuario. Verificar por medios de los nombres y/o apellidos, además de hacer más lento el sistema es poco confiable ya que la probabilidad de insertar dos veces a un usuario debido a una errata en la captura del nombre es alta.

// Saludos

marcoszorrilla
20-09-2004, 17:59:18
Yo utilizo un nombre de usuario con clave única y además los usuarios solamente los da de alta el administrador, que también puede modificar el nombre y algunas veces también permito que los mismos usuarios se cambien su nombre y su clave, pero nunca que den de alta a nuevos usuarios esto solamente lo hace el administrador.

Como utilizo un solo campo para identificarlo y este es clave única, no se pueden repetir.

Un Saludo.

roman
20-09-2004, 18:03:53
Pero si te entiendo bien Marcos, de la manera que tú dices evitas, desde luego, que dos usuarios tengan la misma clave pero si esta clave la asigna tu sistema (o dicho de otra forma, si esta clave es "artificial") aún tienes muchas posibilidades de ingresar al mismo usuario con dos claves distintas. Yo más bien tenía en mente usar (aunque no como llave primaria, sí como clave única) un campo del estilo del SSN gringo (no sé en España cúal usen pero seguro que hay uno identificador único ¿no?).

// Saludos

marcoszorrilla
20-09-2004, 18:11:53
De acuerdo, pero referente a la clave yo me estoy refiriendo a la clave de acceso, y puede haber 2 usuarios que por un casual tengan la misma clave.

Un usuario solamente puede darse de alta una vez pero su clave de acceso es la que el elija.


Campo Usuario Texto 20 por ejemplo, este es el que yo pongo clave única.
Clave de accesso, la que el quiera pero la codifico.

Los usuarios los da de alta el administrador, por lo tanto no hay ni claves ni usuarios que los dé de alta el sistema automáticamente.

Luego al usuario se le permite cambiar su nombre si no le gusta, siempre y cuando que el que elija no exista, en cuanto a la clave de acceso, como dije anteriormente es la que el crea oportuna exista o no.

Un Saludo.

DarkByte
27-09-2004, 21:38:46
[Error] uNuevoMiembro.pas(54): Too many actual parameters

function EstaEnUso(Nombre:string;Apellidos:string):boolean;
begin
Result := False;
if frmDataModule.TblUsuarios.Locate('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[]) Then Result := True; //¡¡AQUÍ!!
end;


:( :( :(

roman
27-09-2004, 21:47:00
¿Qué? ¿Quieres que le hagamos de compilador?

¡Cierra el paréntesis de VarArrayOf!

// Saludos

DarkByte
28-09-2004, 15:13:54
¿Qué? ¿Quieres que le hagamos de compilador?

¡Cierra el paréntesis de VarArrayOf!
Creo que no es de eso, el error me lo da en [], entre ambos corchetes.

Neftali [Germán.Estévez]
28-09-2004, 15:22:42
[Error] uNuevoMiembro.pas(54): Too many actual parameters

Si le añades el paréntesis que está en ROJO debería compilar y funcionar perfectamente:

if Self.TblUsuarios.Locate('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)]),[]) Then Result := True;

El hecho de que el compilador te de el error entre los corchetes simplemente es pq se piensa que son un argumento de VarArrayOf (debido a que te falta el paréntesis).

roman
28-09-2004, 15:22:46
('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[])
1 2 3 3 4 4 1


// Saludos

DarkByte
28-09-2004, 15:27:18
('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[])
1 2 3 3 4 4 1


// Saludos
Que cachondo, yo estaba poniendo otro 1.

Muchísimas gracias Román, por tener la paciencia suficiente y de paso enseñarme a contar :o :D :D :D

DarkByte
28-09-2004, 16:40:41
Y a Neftali también!!, que se me pasaba, jeje ;) .

Marcos, tu solución no me valía, pues Nombre y Apellidos son campos separados, y no me importa que Nombre o Apellidos estén repetidos mientras no sea juntos ;) , aún así, gracias por la sugerencia.

marcoszorrilla
28-09-2004, 16:56:24
Marcos, tu solución no me valía, pues Nombre y Apellidos son campos separados, y no me importa que Nombre o Apellidos estén repetidos mientras no sea juntos
Pues entonces si te valía, si creas como te dije una clave compuesta por nombre + apellidos, no tejará repetirlos dándote una excepción.

Un Saludo.

DarkByte
28-09-2004, 16:59:04
Mmmm.... bueno, pues sí, pero yo creía que te referías a crear un Índice Único para el campo :p