função sql genérica - Fórum DevMedia
função sql genérica
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);
frmCadTipoProdutos: TfrmCadTipoProdutos;
str_sql, str_select, str_from, str_where, str_order
uses DmAuto, Global, Un_CadTipoProdutos2;
Var Qry : Tquery;
Dá erro na p´roxima linha
[Error] Un_CadTipoProdutos.pas(47): Undeclared
identifier: ´self´
Qry.DatabaseName:=´AutoPeças´;
Qry.SQL.Text:= str_sql;
if opt <> ´E´ then
frmCadTipoProdutos.ds.DataSet := Qry;
TfrmCadTipoProdutos.ibt_pesquisarClick(Sender:
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);
tente query.sql.savetofile (...);
para jogar o sql prum arquivo texto e veja o que gerou
Não pude testar, está dando erros de compilação na declaração da função
Qry:=TQuery.Create(nil); {<<===}
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);
{ **** Implementação **** }
Isto deve resolver seu problema de compilação..
Era isso mesmo....obrigada
Aproveito para perguntar qual é a diferença entre nil e self?
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:
A explicação foi 10, vou até percorrer o resto do programa e verificar sobre isso.
Obrigada pela ajuda...esse forum é muito bom!!!
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.