PDA

Ver la Versión Completa : Resultados de Postgres y Zeos


ManiacPC
26-07-2007, 06:16:06
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
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:


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:


...
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:

uses ..., DM;


2) En el evento onClick del botón OK:

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
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 [-] (http://www.clubdelphi.com/foros/#)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 [-] (http://www.clubdelphi.com/foros/#) 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
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):


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
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 y otra de tipo dentro de esas dos etiquetas pones el código ... :cool: y listo.

ManiacPC
02-08-2007, 15:35:12
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
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
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 :



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
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.