Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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;
__________________
:)
Responder Con Cita
  #2  
Antiguo 20-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 20-09-2004
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
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;
Responder Con Cita
  #4  
Antiguo 20-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 20-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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
__________________
:)
Responder Con Cita
  #6  
Antiguo 20-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 20-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 20-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 20-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #10  
Antiguo 20-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #11  
Antiguo 27-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
[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;

__________________
:)
Responder Con Cita
  #12  
Antiguo 27-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Qué? ¿Quieres que le hagamos de compilador?

¡Cierra el paréntesis de VarArrayOf!

// Saludos
Responder Con Cita
  #13  
Antiguo 28-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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.
__________________
:)
Responder Con Cita
  #14  
Antiguo 28-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 28-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Código:
('Nombre;Apellidos', VarArrayOf([UpperCase(Nombre), UpperCase(Apellidos)],[])
1                              2          3      3           4         4    1
// Saludos
Responder Con Cita
  #16  
Antiguo 28-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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
__________________
:)
Responder Con Cita
  #17  
Antiguo 28-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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.
Responder Con Cita
  #18  
Antiguo 28-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #19  
Antiguo 28-09-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Mmmm.... bueno, pues sí, pero yo creía que te referías a crear un Índice Único para el campo
__________________
:)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:07:00.


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
Copyright 1996-2007 Club Delphi