PDA

Ver la Versión Completa : Ejecutar objeto Tquery


bbjb
17-10-2006, 18:49:55
Buenas a tod@s,

Tengo el siguiente problemilla:

En el modulo1, construyo a través de una variable string el nombre del objeto TQuery que quiero ejecutar.
Una vez construida, lo único que tengo que hacer es:

TQuery(FindComponent(s_query)).Open

Ahora bien, he decidido trasladar esos objetos TQuery a un DataModule donde los reuno a todos.
Creía que lo único que tenía que hacer era añadir al nombre del objeto Tquery que había obtenido anteriormente el prefijo Datamodule, es decir:

s_query := "DataModule1."+Trim(s_query);
TQuery(FindComponent(s_query)).Open

Pero resulta que no es así, porque recibo un error de memoria tal que así:
exception class EAccessViolation with message "Violación de acceso a al dirección....."

He de añadir que tengo incluido en el apartado uses del Modulo1, el DataModule donde recogo la TQuery.

Alguien sabe que estoy haciendo mal???

Enan0
17-10-2006, 19:40:08
mira estaria bueno que dijeras en que linea te da el error. y el codigo de error
porque en mi experienciaa si es 000000 es que algo no esta creado, Fijate de andarlo depuradon paso a paso y por ahi capaz que puedas descular que es.

seoane
17-10-2006, 19:54:30
Vamos por partes, FindComponet es un método del objeto TComponent y lo que hace es buscar un componente que pertenece al primero, es decir, si tu estas usando FindComponent dentro de un formulario solo encontrara componentes que pertenecen a ese formulario, no componentes que estén en otro formulario ni en un Datamodule. Por lo que lo mas probable es que cuando tu haces:

s_query := "DataModule1."+Trim(s_query);
TQuery(FindComponent(s_query)).Open

la función FindComponent este devolviendo nil, como no lo compruebas y haces directamente un TypeCast e intentas acceder a un método de un objeto que no existe, es ahí donde te da el error.

Prueba a hacer algo como esto:

var
Query: TQuery;
begin
Query:= TQuery(DataModule1.FindComponent(Trim(s_query)));
if Query <> nil then
Query.Open;
end;

bbjb
18-10-2006, 09:27:22
Púes he puesto en práctica lo que me ha aconsejado Seoane y he resuelto el problema que tenía.

Muchas gracias por todo

Lepe
18-10-2006, 15:04:13
¿Pues no resultaría más comodo devolver un TQuery?

var q:Tquery;
begin
q := CreaQuery('s_query', 'SELECT * FROM CLIENTES');
q.Open;
end;

Ya en el datamodule:


procedure TDatamodule.CreateQuery(const Name:string; sql: string):TQuery;
begin
Result := TQuery.Create(self); // el datamodule se encarga de destruirlo
Result.Database := // tu objeto Database;
// configurar las demás propiedades;
Result.Name := name;
Result.sql.text := sql;
end;


Tal y como veo la cosa, quizás fuera bueno añadir todas las querys creadas a un TStringList, así los tendrías agrupados, facilitando la destrucción o el acceso a los mismos.

Edito: El problema que veo, es que un datamodule tendrá muchisimas tablas, querys, campos persistentes etc, realizar un bucle con FindComponent por todos ellos hasta encontrar el query deseado puede ser excesivo, con el TStringList, sería como acceder con un IndexOf a un StringList. En el Stringlist, almacenas el nombre del Query (parámetro Name), despues a su objeto asociado, le añades el Query Creado.

Saludos