PDA

Ver la Versión Completa : TQuery dentro de una funcion Function


jorgito
25-09-2005, 17:15:41
Hola, estoy realizando una aplicacion para una base de datos, lo que deseo es llamar solamente a la funcion(dentro de esta denomino a q TQuery) con la consulta(sql) y la base de datos(db).
el codigo es el sgte.

function consulta(db:String;sql:String):String;
var
q:TQuery;
begin
TQuery.Create(nil);
q.DataBaseName:=db;
q.close;
q.sql.clear;
q.sql.add(sql);
q.open;
end;


No me quiere aceptar me sale un error, esta algo mal o me falta completar algo.

Gracias...

marcoszorrilla
25-09-2005, 18:03:35
Aquí te pongo un ejemplo que he probado con una rejilla para visualizar los datos y ver que funciona correctamente.
Necesitas:
Un TdataSet
Una Rejilla conectada al anterior.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DbTables, Db, Grids, DBGrids;

function consulta(db:String;Misql:String):String;

type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function consulta(db:String;Misql:String):String;
var
q:TQuery;
begin
q:=Tquery.Create(Nil);
q.close;
q.sql.clear;
q.DataBaseName:=db;
q.sql.add(Misql);
Form1.DataSource1.dataset:=q;
q.open;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
cSql:String;
begin
cSql:='Select * From Employee';
Consulta('DbDemos',cSql);
end;

end.


Un Saludo.

defcon1_es
26-09-2005, 13:24:36
Hola compañeros, tengo unas preguntas sobre el código expuesto:

Marcos, ¿Qué pasa con el objeto TQuery si pulsas varias veces el botón?,
¿Cuando se libera la memoria asignada a la variable q?

jorjito, ¿Realmente hace falta que sea una función?
Creo que lo que quieres es cambiar el SQL de la consulta y lanzarla, ¿no?
Yo pondría un componente TQuery en el formulario y definiría un método para
inicializar y lanzar la consulta:


type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Query1: TQuery;
procedure Button1Click(Sender: TObject);

private
procedure Consulta(db:String;sql:String); //Ponlo donde te interese...
public
{ Public declarations }
end;

...
...

procedure TForm1.Consulta(db:String;sql:String);
begin
Query1.close;
Query1.DataBaseName:=db;
Query1.sql.clear;
Query1.sql.add(sql);
Query1.open;
end;


Salu2.

marcoszorrilla
26-09-2005, 14:53:54
Bueno, lo primero decir que yo también soy partidario de utilizar un componente Tquery estático y pasarle el SQL en tiempo de ejecución, pero como la pregunta era esa respondí a la que se preguntaba.

Se supone que en el formulario hemos puesto en el evento OnClose:
Action:=CaFree;

Con lo cual cuando se cierre el mismo se destruirá todo su contenido.

En cuanto a pulsar repetidas veces el botón no le veo ningún problema más que la constante reasignación de la variable q.

Se puede hacer que dicho botón una vez pulsado quede como no disponible así evitaríamos las repetidas pulsaciones y el rearme de la consulta.


procedure TForm1.Button1Click(Sender: TObject);
var
cSql:String;
begin
cSql:='Select * From Employee';
Consulta('DbDemos',cSql);
Button1.Enabled:=False
end;


Un Saludo.

rastafarey
26-09-2005, 15:44:57
Sin leer mas codigo sino el inicial.

Veo que no hay problemas si no que de que te sirve lo que hacer si no puedes acceder a el resultado ya que se esta quedando dentro de la funcion esto es valido para consulta d eaccion como insert , delete o update para un select deves devolver los resultados y para eso tienes dos opcion una que la function devuelva un tibquiery y la otra es pasarle el ib query y que este sea devuelto por referecia la primera opcion tiene el problema que el objeto se crea dentro y debes liberarlo fuera y la otra es que el objeto debe ser creado antes de ser padao tu decides.