Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   Resultados de Postgres y Zeos (https://www.clubdelphi.com/foros/showthread.php?t=46198)

ManiacPC 26-07-2007 06:16:06

Resultados de Postgres y Zeos
 
Buenas,


Tengo una consulta
Tengo un formulario de usuario y contraseña que quiero verificar a traves de la base de datos.

Logré conectar a la base de datos sin problemas, y traer datos mediante el ADD y Exec a un DBGRId.


Pero mi problema es el siguiente, quiero localizar al usuario ingresado
(P.ej: Usuario N° 5) de cierto campo de la base de datos, y no se como traer los datos ejecutando los componentes para compararlos... Se llevarlos al DBGrid como dije, pero si quisiera traer los resultados y compararlos con lo que introdujo el usuario como podria hacerlo?
Como trabajar con el resultset? Encuentro bastante pobre la documentacion que existe sobre Zeos :S y lo único que me ha salvado es este milagroso foro.


Gracias

mamaro 26-07-2007 17:08:58

Hola
 
Para empeza te diré que entiendo muy bien tu pregunta, yo utilizo los componentes Zeos con bases de datos Firebird hace bastante tiempo .. y sí es cierto ... la documentación es bastante pobre ...

Creo que lo que quieres hacer es:
1) Guardar los usuarios y contraseñas dentro de la base de datos.
2) Dependiendo del usuario y clave que ingresa el usuario en un formulario darle acceso a cierto lugares.

¿es así?

Si es así, supongamos que tienes:
1) Un formulario con el nombre FLogIn una caja de edición (edUsuario), y una caja de edición con máscara para la clave (edClave).
2) Un DataModule (que podríamos llamarle DM), con un TZConnection (lo llamamos conexion), y un TZReadOnlyQuery (que llamaremos qValida). En connection del qValida se pone Conexion, y en SQL, lo siguiente:

Código SQL [-]
Select *
from Usuarios
where (usuario= :NOMBRE )
and (clave= :PASS )

(suponiendo que tengas una tabla Usuarios, con campos usuario, y clave ... cada uno adaptarlo a sus necesidades)

IMPORTANTE: Los componentes Zeos tienen un BUG con los parámetros, éstos deben tener un espacio adelante y otro atrás para que funcionen bien (ésto no lo leí en ningún lado ... fué más bien a fuerza de darme la cabeza contra la pared). :mad: :( :mad:


En el DataModule:

Código Delphi [-]
...
  public
    function Validar(Usuario,Clave:string):boolean;
  end;

...

function Validar(Usuario,Clave:string):boolean;
begin
  conexion.user:='usuarioadministrador';
  conexion.password:='clavedeadministrador';
  conexion.connect;
  qValida.close; // nos aseguramos que la consult esté cerrada
  qValida.ParamByName('NOMBRE').asstring:=Usuario;
  qValida.ParamByName('PASS').asstring:=Clave;
  qValida.open;

  // aquí van las instrucciones con las que levantás los permisos
  // o lo que sea que quieras hacer

end;

En el FLogIn (por ejemplo):

1) Incluyes el DataModule en la cláusula uses:
Código Delphi [-]
uses ..., DM;

2) En el evento onClick del botón OK:
Código Delphi [-]
procedure TFLogIn.ButtonOKClick(Sender: TObject);
begin
  if (DM.Validar(edUsuario.text,edClave.text)) then 
  begin
    // aquí el usuario está validado, etc....
  end;
end;

Saludos y espero te sirva :)

ManiacPC 27-07-2007 21:22:42

De nuevo probando
 
Hola a todos
Gracias Mamaro por la respuesta,
Creo que me simplificaste horas y dias de busqueda :P
Me has aclarado muxas muxas dudas de todas formas....
He intentado lo que me has dicho, casi le has dado en el clavo a todo....

Pero me arroja un error de que no encuentra:
"ZQuery1 Parameter 'numerovendedor' not found"

Envio el código, a ver si me puedes ayudar a encontrar cual es el error!!!

Código Delphi [-]function TFormPrincipal.Fase1Validar(Usuario,Clave:Integer):boolean; begin DM.ZQuery1.SQL.Clear; DM.ZQuery1.SQL.ADD('SELECT * From vendedores WHERE (numerovendedor= ' + IntToStr(Usuario) + ' ) and (passwordvendedor= ' + IntToStr(Clave) + ' )'); DM.ZQuery1.close; // nos aseguramos que la consult esté cerrada If (DM.ZQuery1.ParamByName('numerovendedor').AsInteger = Usuario) and (DM.ZQuery1.ParamByName('passwordvendedor').AsInteger = Clave) then Application.MessageBox('CORRECTO','Look', MB_OK) Else Application.MessageBox('INCORRECTO','Look', MB_OK); DM.ZQuery1.open; // aquí van las instrucciones con las que levantás los permisos // o lo que sea que quieras hacer end;

En realidad lo que quiero lograr, es queme compruebe el numero del vendedor y la contraseña que seria el mismo numero, para llamarlo lo tengo asi :

Código Delphi [-] Fase1Validar(StrToInt(TxtNumeroVendedor.Text), StrToInt(TxtPasswordvendedor.Text));


Aunque escribiendo esto, me doy cuenta que las conversiones estan de sobra :S

Lo arreglaré para el siguiente post.

En mi tabla VENDEDORES tengo:
numerovendedor
passwordvendedor
nombrevendedor
apellidovendedor

y quiero lograr sacarlos ambos :S
Ojalá no sea mucho el pedir, porque en verdad no se que hacer con este error

Gracias

mamaro 01-08-2007 19:13:40

hola
 
tienes un problema con la consulta, estás tratando de darle valores a un parámetro que no existe ... ésta debería ser la consulta (o algo parecido al menos):

Código Delphi [-]
begin 
  with DM do begin
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.ADD('SELECT * From vendedores WHERE (numerovendedor= :NUM ) and (passwordvendedor= :PASS )'); // linea modificada
  
    ZQuery1.ParamByName('NUM').asinteger:=Usuario; //asignamos el valor para que actúe de filtro
    ZQuery1.ParamByName('PASS').asinteger:=Usuario; //asignamos el valor para que actúe de filtro
    ZQuery1.Open;
  If (ZQuery.RecordCount>0) then     
    // Correcto
  Else
    // Incorrecto
    
    ...

  end;
end;

Los parámetros llevan dos puntos adelante (NUM y PASS), y para saber si los datos que pasaron son correctos debes abrir la consulta (para ver si algún registro concuerda con las variables pasadas).

ahora bien ... :confused: ... ¿los usuarios tienen un número como password?

Saludos

mamaro 01-08-2007 19:20:30

Aclaración
 
Para que el código que publicas quede con un formato correcto puedes utilizar los botones que están arriba a la derecha del texto cuando escribes.

El botón que tiene un dibujo igual al icono de este sitio por ejemplo sirve para poner código Delphi, el de la derecha para poner código SQL, etc.

Cada botón te pone dos etiquetas: una de tipo [ALGO] y otra de tipo [/ALGO] dentro de esas dos etiquetas pones el código ... :cool: y listo.

ManiacPC 02-08-2007 15:35:12

Gracias!
 
Hey mamaro, gracias otra vez.
Soy un completo novato en bases de datos con delphi,
habia programado antes haciendo miles de cosas en delphi, pero nunca trabajado con esto :P
Un novato en esto, pero en bases de datos he trabajado mucho conectando de asp y php, etc.

RecordCount es un comando que me serà de mucha ayuda, pero me imagino que tengo que estudiar lo fundamental de como trabajaba básicamente delphi con el odbc y ole para hacerme familiar a la estructura de zeos (esta basada y acoplada en la forma de trabajo con bd de delphi) y lo estoy haciendo, con un tutorial muy bueno de about.com con el controlador postgresql para odbc (un poco tedioso que tenga que pasar por ado, ole, odbc y recibir respuesta recien), aunque funciona a la perfeccion, diria que es el controlador mas estable de postgresql.

Voy a probar con el codigo que me has escrito, ahora entiendo porque dentro del select aparece el :NUM :D y no ' + :NUM + '

Tengo el programa guardadito en mis pruebas alternativas con el zeos... y si, bien parece raro que la contraseña sea un nùmero :rolleyes:
Pero es un requisito para trabajar rapido en terminales donde solo funcionará el tpv, y es de exclusiva responsabilidad del usuario no equivocarse porque una venta quedaria registrada a otro nombre y por ende no calzará el cierre de caja al final del turno. En el servidor se harán los procesos mas delicados.
Aunque estuve pensando y tengo el algoritmo testeado para encriptar de forma tradicional una cadena de texto y desencriptarla por crypt32. Si quieres te la envio :D

Gracias mamaro una vez mas, te tengo noticias de nuevo :P
Espero que para la proxima ya esté mas "pulido"
Hey un millon de gracias man
Bye

mamaro 02-08-2007 17:32:30

hola
 
Yo utilizo Zeos hace bastante tiempo y a no ser por ese bug que te comenté .. no tengo quejas, por ahí estube viendo una comparativa de las velocidades de los distintos métodos de acceso a una base de datos, y Zeos (según publican) es una de las alternativas más lentas :eek:

...

tras eso he hecho varias pruebas con distintos componentes (que según ahí publican son algo más rápidos), pero la performance global del sistema no se ha visto afectada .. de hecho algunos me complican más la programación que la diferencia de microsegundos que gano en una instrucción ;)

Creo que al final todo es un tema de los componentes con los que te acostumbres a trabajar. :D

Saludos.

PD: Las pruebas las hice con un motor de datos Firebird (en varias versiones), pero supongo que esto es extrapolable a PostgreSQL.

ManiacPC 04-08-2007 22:20:09

Logre el primer paso
 
Joder Mamaro,
Te debo una botella de vino, son de muy buena calidad por aqui jejeje.
Por fin me desaponché, resulto lo querido, deseaba mostrartelo :

Código:


 
  if (Usuario <> '') AND (Clave <> '') Then
  Begin
  With DM do begin
    Consulta.Close;
    Consulta.SQL.Clear;
    Consulta.SQL.Add('Select * FROM vendedores ');
    Consulta.SQL.Add('WHERE ( numerovendedor = :PUSUARIO ) ');
    Consulta.SQL.Add('AND ( passwordvendedor = :PCLAVE  )');
    Consulta.Parameters.ParamByName('PUSUARIO').Value := Usuario;
    Consulta.Parameters.ParamByName('PCLAVE').Value := Clave;
    Consulta.Open;
    if (DSConsulta.DataSet.RecordCount = 1) Then
    Begin
      with DSConsulta.DataSet do begin
        with BarraVendedor do begin
        Panels[0].Text := 'Vendedor : ' + FieldByName('nombresvendedor').Value + ' ';
        Panels[0].Text := Panels[0].Text + FieldByName('apellidosvendedor').Value;
        Panels[1].Text := 'Numero : ' + IntToStr(FieldByName('numerovendedor').Value);
        end;
      end;
    end;
  end;
  end
  else
  begin
    Application.MessageBox('Debe ingresar un usuario y contraseña','Advertencia', MB_OK);
    TxtNumeroVendedor.Text := '';
    TxtPasswordVendedor.Text := '';
    TxtNumeroVendedor.SetFocus;
  end;

Te has pasado, tu ayuda me sirvio bastante
Gracias!!!!!!!!!:D

mamaro 06-08-2007 15:09:37

Salud!!
 
jaja .. bueno .. te diré que por estos lados lo que es bueno es el asado :D .. cualquier cosa mi correo es maas@montevideo.com.uy.

Saludos.

PD: si me envías un correo ponle Amigo del Club Delphi, o algo así para que no lo elimine.


La franja horaria es GMT +2. Ahora son las 23:06:13.

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