função sql genérica

08/09/2004

1

Estou querendo criar uma função genérica para uma unit

que recebe dois parâmetros:

- parâmetro 1 : opt
espera receber ´S´para dar um Open na query ,e ´E´ para dar um ExecSql;


- parâmetro 2 : str_sql:
espera receber uma string de um comando sql.



Segue trecho dó código e os respectivos erros:

{
nessa linha dá o erro
[Error] Un_CadTipoProdutos.pas(26):
Unsatisfied forward or external declaration:
´TfrmCadTipoProdutos.PreencheDBGrid´
}

procedure PreencheDBGrid(opt, str_sql: String);



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

var
frmCadTipoProdutos: TfrmCadTipoProdutos;
str_sql, str_select, str_from, str_where, str_order
: String;

implementation

uses DmAuto, Global, Un_CadTipoProdutos2;

{$R *.dfm}


procedure PreencheDBGrid(opt, str_sql: String);
Var Qry : Tquery;
begin
{
Dá erro na p´roxima linha
[Error] Un_CadTipoProdutos.pas(47): Undeclared
identifier: ´self´
}
Qry:=TQuery.Create(self);
Qry.DatabaseName:=´AutoPeças´;
Qry.SQL.Text:= str_sql;
try
if opt <> ´E´ then
Qry.Open
else
Qry.ExecSQL;
frmCadTipoProdutos.ds.DataSet := Qry;
except
on e:exception do
begin
ShowMessage(e.message);
Qry.Free;
end;
end;
end;

procedure
TfrmCadTipoProdutos.ibt_pesquisarClick(Sender:
TObject);
begin
str_select:=´ SELECT *´;
str_from:=´ FROM tb_tipo_produto ´;
if txt_DescTipo.Text <> ´´ then
str_where:=´ WHERE descricao_tipo like
´+#39+txt_DescTipo.text+´¬´39+´´;
str_sql:= str_select+str_from+str_where+str_order;
PreencheDBGrid(´S´,str_sql);
end;



Obrigado pela atenção


Responder

Posts

08/09/2004

Motta

parece legal

tente query.sql.savetofile (...);

para jogar o sql prum arquivo texto e veja o que gerou


Responder

08/09/2004

Angela

Não pude testar, está dando erros de compilação na declaração da função


Responder

08/09/2004

Motta

...
Dá erro na p´roxima linha
[Error] Un_CadTipoProdutos.pas(47): Undeclared
identifier: ´self´
}
Qry:=TQuery.Create(nil); {<<===}
Qry.DatabaseName:=´AutoPeças´;
Qry.SQL.Text:= str_sql;
try
if opt <> ´E´ then
Qry.Open
...


Responder

08/09/2004

Vinicius2k

Angela,

Não analisei a rotina em si, já q vc está tendo erro de compilação...
Como vc declarou a procedure como sendo do formulário (está dentro da definição de type dele), a implementação precisa referenciar o objeto (form), sendo :
procedure TfrmCadTipoProdutos.PreencheDBGrid(opt, str_sql: String);
begin
  { **** Implementação **** }
end;

Isto deve resolver seu problema de compilação..

Espero ter ajudado...
T+


Responder

09/09/2004

Angela

Oi Vinícius,

Era isso mesmo....obrigada

Aproveito para perguntar qual é a diferença entre nil e self?

Grata


Responder

09/09/2004

Vinicius2k

Angela,

No caso da criação de componentes em Runtime, vc pode usar tanto o [b:d5d5629cd2]Self [/b:d5d5629cd2]quanto o [b:d5d5629cd2]nil[/b:d5d5629cd2] como Owner (dono) do componente...
Nil é um ponteiro de memória nulo e pode ser utilizado como referencia a um outro componente, necessário neste caso.
Self (próprio) é o componente ao qual pertence o procedimento em que vc está contruindo a rotina, no caso, o Form...

Se vc faz :
Componente:= TComponente .Create(Nil);

Vc criou um componente ´sem dono´, que não será destruído quando seu form for destruído... a liberação da memória precisa ser manual. Mas isso, neste caso, não é um problema porque vc, após utilizá-lo já o está destruindo (.Free)... o problema vem quando vc não o destrói... executando várias vezes o mesmo procedimento ou abrindo e fechando várias vezes o mesmo form, vc poderá ter um [i:d5d5629cd2]MemoryLeak[/i:d5d5629cd2] com uma mensagem do tipo [i:d5d5629cd2]´Out Of Memory´[/i:d5d5629cd2].

Se vc faz:
Componente:= TComponente.Create(Self);

que seria o mesmo que :
Componente:= TComponente.Create(MeuFormulario);

Vc criou um componente cujo ´dono´, é o seu form e se, por acaso, ele não for liberado da memória manualmente, quando o Form for liberado ele será também...

Espero ter ajudado e não ter falado nenhuma besteira, confesso que não sou muito ´entendido´ nisso... :roll:
T+


Responder

10/09/2004

Angela

Oi Vinicius,

A explicação foi 10, vou até percorrer o resto do programa e verificar sobre isso.

Obrigada pela ajuda...esse forum é muito bom!!!


Responder

10/09/2004

Ipc$

Só uma dica de um erro que aconteceu comigo. Quando vc cria um componentes TWinControl, define seu parente e o parente for destruído antes do componente, ocorre um erro. Então vc tem que deixar seu parent em nil antes de destruí-lo.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira