PDA

Ver la Versión Completa : Resultado tquery


johurgi
17-06-2008, 18:17:37
Hola a todos,

¿Como puedo coger los datos que me devuelve una query?tengo en mi programa una tquery que consulta un numero variable de columnas, estas columnas tengo que leerlas despues una a una.

Mis datos en la tabla los tengo de la siguiente forma.

COD TEXTO
--------------
...
1.1 HOLA
1.2 MUNDO
1.3 .
...



Y el codigo que habia escrito y no me funciona es el siguiente



filtro:='select * from tabla where cod like '1.*';
consulta.sql.text:=filtro;
consulta.execsql;
consulta.open;
if consulta.recordcount <> 0 then
begin
//RECOGO LOS DATOS
end;


gracias por vuestra ayuda.

poliburro
17-06-2008, 19:28:32
filtro:=consulta.sql.text:='select * from tabla where cod like '1.*';
consulta.open;
While Not Consulta.Eof do
begin
showMessage(Consulta.fields[0].AsString);
Consulta.Next;
end;

santiago14
17-06-2008, 19:41:54
Hola a todos,

¿Como puedo coger los datos que me devuelve una query?tengo en mi programa una tquery que consulta un numero variable de columnas, estas columnas tengo que leerlas despues una a una.

Mis datos en la tabla los tengo de la siguiente forma.

COD TEXTO
--------------
...
1.1 HOLA
1.2 MUNDO
1.3 .
...



Y el codigo que habia escrito y no me funciona es el siguiente



filtro:='select * from tabla where cod like '1.*';
consulta.sql.text:=filtro;
consulta.execsql;
consulta.open;
if consulta.recordcount <> 0 then
begin
//RECOGO LOS DATOS
end;


gracias por vuestra ayuda.


Creo que una buena forma sería a través de un array dinámico:


procedure cargarArrayDinamico(...);
var
A : array of array of string;
I, J : Integer;
begin
SetLength(A, consulta.fieldCount); //Cantidad de columnas que te devolvió la consulta
consulta.first;
for I := 0 to consulta.recordCount do //Cant. de registros que devolvió la consulta
begin
//Recorremos todas las columnas
for J := Low(A[I]) to High(A[I]) do
begin
SetLength(A[I], consulta.recordCount); //Le agregamos las filas a la segunda dimensión, para cada A[I]
end;
end; //del primer for...
//a esta altura ya tengo el array del mismo tamaño que la consulta y puedo hacer lo que quiera con ellas.


No se si esto es lo que pides.

No he probado aún este código pero la idea está. No conozco una función que te levante directamente los valores de la consulta y los mande a un array pero supongo que con esto se arregla la cosa...

johurgi
19-06-2008, 08:52:42
Gracias por vuestra ayuda.

Al final hice lo que me digiste poliburro, y me funciono, lo unico que al ser un tabla con mas de 150000 registro acaba el pc por quedarse sin memoria.

Y he cambiado la forma de hacerlo, lo he echo con un ttable utilizando la propiedad de filter, pero me vuelve a dar problemas en la segunda pasada del bucle que se encarga de dar la condicion de filtrado me da un error cuando intento establecer el nuevo filtro:


while not tabla1.eof do
begin
tabla2.filter:='codigo='''+tabla1Cod.asstring'''';
tabla2.filtered:=true;
if tabla2.recordcount <> 0 then
begin
while not tabla2.eof do
begin
res:=res + tabla2Texto.asstring;
tabla2.next;
end
tabla2.filtered:=false;
{Inserto en otra tabla}
end
tabla1.next;
end


El error que me da cuando intento volverla a filtrar es el de "Operation not aplicable".

si alguien me pudiera echar una mano se lo agradeceria

Un saludo

eduarcol
19-06-2008, 14:14:44
Estas planteando una situacion master detail, ubica informacion sobre eso en el foro que se ha tratado varias veces.

En resumen la tabla1 seria la maestra y la tabla2 la detalle, cada vez que se mueva la tabla1 automaticamente se filtran los registros en la 2

johurgi
19-06-2008, 15:03:35
voy a probar lo que me dices de maestro detalle, haber que tal, me acabas de dar una idea.

gracias