Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Averiguar si la combinación de dos campos está en uso (https://www.clubdelphi.com/foros/showthread.php?t=14401)

DarkByte 20-09-2004 08:29:54

Averiguar si la combinación de dos campos está en uso
 
¡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:
Código Delphi [-]
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í
Código Delphi [-]
 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

Cita:

Empezado por marcoszorrilla
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
Código Delphi [-]
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

Cita:

Empezado por roman
¿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

Cita:

Empezado por DarkByte
[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:

Código Delphi [-]
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

Código:

('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[])
1                              2          3      3          4        4    1

// Saludos

DarkByte 28-09-2004 15:27:18

Cita:

Empezado por roman
Código:

('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

Cita:

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


La franja horaria es GMT +2. Ahora son las 08:23:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi