Execução de SqlQuery Dinâmica
Camaradas
estou tendo problemas durante a execução de uma SqlQuery Dinâmica. eu crio esta query em tempo de execução no OnExite de um DBEdit. Os códigos estão abaixo para serem analisados, mas infelizmente não está dando certo.
-----
procedure TFClasse.DBEdit1Exit(Sender: TObject);
var QVerifica:TSQLQuery;
begin
QVerifica:=TSQLQuery.Create(Self);
QVerifica.SQLConnection:=dm.SQLConnec;
QVerifica.Active:=True;
with QVerifica do
begin
close;
SQL.Clear;
SQL.Add(´select cod_classe from classe where cod_classe= :cod´);
ParamByName(´cod´).AsString:=dm.CDSClasseCOD_CLASSE.AsString;
PrepareStatement;
open;
if recordcount>0
then begin
MessageBeep(MB_ICONASTERISK);
Application.MessageBox(´Código para classe já cadastrado!´,´Informação do Sistema´,MB_OK);
DBEdit1.SetFocus;
DBEdit1.Clear;
end;
end;
QVerifica.Destroy();
inherited;
end;
----------
Erro apresentado durante a execução, ao sair do DBEdit.:
´Missing Query,Table name or procedure name´.
-------------------
Este erro diz que falta na Query o nome da tabela ou da procedure, mas eu não consegui descobrir qual proprie-
dade que deve ser configura, o porjeto compila normalmente, o erro ocorre durante a execução. Para fazer uma analogia e verificar se apresentava o mesmo erro, eu coloquei no
DataModule uma SQLQuery,um DataSetProvider e um ClientDataSet, um vinculado ao outro da forma que deve ser, pa-
ra que eu pudesse utulizar esta query para as verificações de rotina, como verificar se já há um determinado
código gravado, por exemplo, haja vista a query principal estar em modo de inserção e não poder fazer este
papel, mas infelizmente, apresentou também o mesmo erro.Se alguém souber onde está o erro na criação desta
Query em tempo de execução por favor me responda, pois estou precisando urgentemente de uma resposta
estou tendo problemas durante a execução de uma SqlQuery Dinâmica. eu crio esta query em tempo de execução no OnExite de um DBEdit. Os códigos estão abaixo para serem analisados, mas infelizmente não está dando certo.
-----
procedure TFClasse.DBEdit1Exit(Sender: TObject);
var QVerifica:TSQLQuery;
begin
QVerifica:=TSQLQuery.Create(Self);
QVerifica.SQLConnection:=dm.SQLConnec;
QVerifica.Active:=True;
with QVerifica do
begin
close;
SQL.Clear;
SQL.Add(´select cod_classe from classe where cod_classe= :cod´);
ParamByName(´cod´).AsString:=dm.CDSClasseCOD_CLASSE.AsString;
PrepareStatement;
open;
if recordcount>0
then begin
MessageBeep(MB_ICONASTERISK);
Application.MessageBox(´Código para classe já cadastrado!´,´Informação do Sistema´,MB_OK);
DBEdit1.SetFocus;
DBEdit1.Clear;
end;
end;
QVerifica.Destroy();
inherited;
end;
----------
Erro apresentado durante a execução, ao sair do DBEdit.:
´Missing Query,Table name or procedure name´.
-------------------
Este erro diz que falta na Query o nome da tabela ou da procedure, mas eu não consegui descobrir qual proprie-
dade que deve ser configura, o porjeto compila normalmente, o erro ocorre durante a execução. Para fazer uma analogia e verificar se apresentava o mesmo erro, eu coloquei no
DataModule uma SQLQuery,um DataSetProvider e um ClientDataSet, um vinculado ao outro da forma que deve ser, pa-
ra que eu pudesse utulizar esta query para as verificações de rotina, como verificar se já há um determinado
código gravado, por exemplo, haja vista a query principal estar em modo de inserção e não poder fazer este
papel, mas infelizmente, apresentou também o mesmo erro.Se alguém souber onde está o erro na criação desta
Query em tempo de execução por favor me responda, pois estou precisando urgentemente de uma resposta
Ricardo Giordano
Curtidas 0
Respostas
Fabio.hc
21/04/2004
Neste caso é melhor vc colocar um edit no lugar do dbedit, pq vc esta atualizando a query que já esta em modo de inserção/edição no qual o dbedit está apontado.
Vc colocando um edit, vc altere esta linha.
...
ParamByName(´cod´).AsString:=edit1.text;
...
Vc colocando um edit, vc altere esta linha.
...
ParamByName(´cod´).AsString:=edit1.text;
...
GOSTEI 0
Ricardo Giordano
21/04/2004
o problema é que não está nem executando a query. Eu marquei desde o with QVerifica do e o erro dá logo no início, nem entra na query para executar. Esse problema é que deve ser resolvido. Obrigado.
GOSTEI 0
Vinicius2k
21/04/2004
Ricardo,
Existe um erro principal que está causando seu problema...
Vc estah ativando a query sem uma instrução SQL... lembre-se Active:= True eh equivalente ao método Open...
Mas tbm existem 2 outros problemas q mesmo após retirar esta linha vc vai encontrar... PrepareStatement e RecordCount...
Estes dois métodos não podem ser usados... abaixo as razões :
Seu código seria então (um pouco otimizado tbm) :
Espero ter ajudado...
Existe um erro principal que está causando seu problema...
QVerifica.Active:=True;
Vc estah ativando a query sem uma instrução SQL... lembre-se Active:= True eh equivalente ao método Open...
Mas tbm existem 2 outros problemas q mesmo após retirar esta linha vc vai encontrar... PrepareStatement e RecordCount...
Estes dois métodos não podem ser usados... abaixo as razões :
PrepareStatement performs most of the necessary tasks for preparing a query to be executed on the server. It ensures the dbExpress and the database server have allocated any resources they need for executing the query and binding its parameters. Any named parameters are temporarily converted to unnamed parameters because dbExpress does not support named parameters.
[color=red:8681668bc1]Do not call PrepareStatement when preparing a query for execution. Instead, set the Prepared property to True[/color:8681668bc1]. When you use the Prepared property instead, the query keeps track of the fact that it has already been prepared and need not repeat the process every time it executes the query. In addition, when you set the Prepared property, the query initializes internal properties that keep track of the number of rows affected by the query.
Read RecordCount to determine the total number of records in the dataset. An application can read RecordCount even if the dataset is not active.
Reading RecordCount will generate an exception if the dataset can’t determine the number of records. [color=red:8681668bc1]Do not read RecordCount if[/color:8681668bc1]
The dataset represents stored procedure.
[color=red:8681668bc1]The dataset represents a query that contains parameters[/color:8681668bc1].
The dataset represents a multi-table join.
Seu código seria então (um pouco otimizado tbm) :
procedure TForm1.DBEdit1Exit(Sender: TObject); var QVerifica: TSQLQuery; begin QVerifica:=TSQLQuery.Create(Self); QVerifica.SQLConnection:= SQLConnection1; with QVerifica do begin SQL.Add(´select COD_CLASSE from CLASSE where COD_CLASSE = :cod´); ParamByName(´cod´).AsString:=dm.CDSClasseCOD_CLASSE.AsString; Prepared:= True; Open; if QVerifica.FieldByName(´COD_CLASSE´).AsString = dm.CDSClasseCOD_CLASSE.AsString then begin MessageBeep(MB_ICONASTERISK); Application.MessageBox(´Código para classe já cadastrado!´,´Informação do Sistema´,MB_OK); DBEdit1.SetFocus; DBEdit1.Clear; end; end; QVerifica.Free; end;
Espero ter ajudado...
GOSTEI 0
Vinicius2k
21/04/2004
Perdão...
Leia-se :
Esqueci de adaptar este trecho do exemplo que montei para o seu código... :oops:
QVerifica.SQLConnection:= SQLConnection1;
Leia-se :
QVerifica.SQLConnection:=dm.SQLConnec;
Esqueci de adaptar este trecho do exemplo que montei para o seu código... :oops:
GOSTEI 0
Ricardo Giordano
21/04/2004
Obrigado Camarada, irei testar agora!!!
GOSTEI 0
Ricardo Giordano
21/04/2004
Vinicius Camarada!!
Valeu mesmo pela dica. Apenas tive que fazer uma alteração nos códigos que vc me enviou. A alteração foi a seguinte:
onde se lê:
if QVerifica.FieldByName(´COD_CLASSE´).AsString = dm.CDSClasseCOD_CLASSE.AsString
then begin
.
.
.
end;
Leia-se:
if Fields[0].AsString<>´´
then begin
.
.
.
end;
Esta alteração foi necessária pelo fato da confição (if) não estar sendo executada, mesmo quando existir algum registro com já cadastrado com um código que estamos tentando inserir novamente.
Obrigado camarada!!
Valeu mesmo pela dica. Apenas tive que fazer uma alteração nos códigos que vc me enviou. A alteração foi a seguinte:
onde se lê:
if QVerifica.FieldByName(´COD_CLASSE´).AsString = dm.CDSClasseCOD_CLASSE.AsString
then begin
.
.
.
end;
Leia-se:
if Fields[0].AsString<>´´
then begin
.
.
.
end;
Esta alteração foi necessária pelo fato da confição (if) não estar sendo executada, mesmo quando existir algum registro com já cadastrado com um código que estamos tentando inserir novamente.
Obrigado camarada!!
GOSTEI 0
Vinicius2k
21/04/2004
Engraçado... eu testei e funcionou...
Mas o que importa eh q vc solucionou... na verdade acho q a condição é a parte menos importante da rotina visto que a query ou retorna 1 registro ou retorna vazia... inclusive, sua solução ficou melhor...
T+
Mas o que importa eh q vc solucionou... na verdade acho q a condição é a parte menos importante da rotina visto que a query ou retorna 1 registro ou retorna vazia... inclusive, sua solução ficou melhor...
T+
GOSTEI 0