PDA

Ver la Versión Completa : Donde se almacena el resultado de un Select en un TQuery?


chalao
17-12-2008, 12:22:44
En mi base de datos hay una tabla (usuarios) que contiene una columna nombre y otra conectado. En la columna conectado se guarda un entero 0 o 1 dependiendo si esta o no conectado.

Utilizando TZQuery de los componentes Zeos (similar a TQuery) hago una consulta sencilla:
SELECT nombre FROM usuarios WHERE conectado=1;
Con esta consulta pretendo saber los nombres de los usuarios conectados. Pero realizando un ejemplo donde en mi tabla hay tres usuarios conectados tan sólo me devuelve uno de ellos en la propiedad Query.Fieldvalues['nombre'];

Tambien me he fijado en los valores de Recordcount y Fieldcount siendo los resultados 3 y 1 respectivamente. Por lo que intuyo que el resultado es correcto y que se almacena en 3 records de 1 field cada uno y que lo que yo consulto es el field del primer record. Con lo cual si todas estas suposiciones son correctas mi problema es que no se cambiar de record para obtener los tres resultados.
He estado probando con First, Next, Prior y Last y despues consulto el valor de Fieldvalues y sigue siendo el mismo.

Gracias por adelantado
Un saludo

Caro
17-12-2008, 13:02:37
Hola chalao, si enlazas tu DataSet(ZQuery) a un DBGrid veras el resultado que te ha devuelto, también puedes hacer esta prueba para ver los valores de tu consulta.


//antes debe estar ejecutada tu consulta
ZQuery.First;
While Not ZQuery.Eof Do
begin
Showmessage(ZQuery.FieldByName('nombre').AsString);
ZQuery.Next;
end;


Saluditos

chalao
17-12-2008, 13:27:44
Muchas gracias por tu pronta respuesta.

En realidad el código que tu has puesto era similar a lo que yo estaba probando pero al verlo caí en el error, me explico.
Tengo una función:
function Query( Peticion : string ) : TZQuery;
Que ejecuta la peticion en mi componente ZQuery.
Yo lo que hacía era algo similar a:
Peticion := 'SELECT nombre FROM usuarios WHERE conectado=1';
Query( Peticion ).First;
While Not Query( Peticion ).Eof Do begin
Showmessage( Query( Peticion ).FieldByName('nombre').AsString);
Query( Peticion ).Next;
end;

Con lo cual al hacer la peticion en todas las sentencias siempre obtenia el primer campo.

Ahora lo cambié a:
var
ZQuery : TZQuery;
............
Peticion := 'SELECT nombre FROM usuarios WHERE conectado=1';
ZQuery := Query( Peticion );
ZQuery.First;
While Not ZQuery.Eof Do begin
Showmessage( ZQuery.FieldByName('nombre').AsString);
ZQuery.Next;
end;

Y perfecto, el error no estaba en el mal uso de first y next sino en el mal uso de mi propia function.

Gracias ;)