Fórum SQL de Consulta e Atualizacao #49717
07/03/2005
0
estou com um problema de utilizacao de 2 sql´s para consultar e atualizar.
O meu caso é o seguinte, tenho um relatório de conhecimentos, ele sempre q é impresso deve ser atualizado em seu cadastro como Já Impresso, para nao ser impresso normalmente por acidente, entao na impressao eu faço um select (TSQLQuery) q me retorna todos os dados para impressao de todos os conhecimentos, e em cada final de impressao eu tenho uma outra TSQLQuery q atualiza o status do conhecimento q acabou de ser impresso como já impresso, mas ele me retorna um erro sempre q ele chega nesse ponto:
EDatabaseError: Cannot perform this operation on a open dataset.
Sendo q nesse relatório tenho outra TSQLQuery (de selecao que retorna as notas do conhecimento em questao e funciona normal)
Como faço pra fazer essa atualização ?
Alguem pode me dar uma dica ou uma outra opção?
Abraços
Julio
Tuskinhu
Curtir tópico
+ 0Posts
07/03/2005
Fsflorencio
pelo jeito vc está tentando fazer alguma coisa com o dataset aberto quando ele deveria estar fechado.
Antes de fazer seu update, coloque um breakpoint e veja qual dataset está dando erro e dê um comando pra fechá-lo antes de executar o update.
Gostei + 0
07/03/2005
Tuskinhu
e ao final da impressao de cada um eu abro o outro Query para atualizar o conhecimento q esta na selecao com um novo valor, nao sei se vc entendeu, mas qq coisa eu colo o codigo
Gostei + 0
07/03/2005
Fsflorencio
Gostei + 0
07/03/2005
Tuskinhu
Qry := TSQLQuery.Create(nil);
Qry.SQLConnection := BD.BD;
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Text := ´Select CliRem.UF as ....´; // select principal
QryNF := TSQLQuery.Create(nil);
QryNF.SQLConnection := Bd.BD;
QryNF.Close;
QryNF.SQL.Clear;
QryNF.SQL.Text := ´Select CTONOTAS.NOTAFISCAL... ; // Select q é feito a cada conhecimento para pegar as nf´s digitadas nele
// Query p/ atualizacao do conhecimento impresso
QryAtualiza := TSQLQuery.Create(nil);
QryAtualiza.SQLConnection := BD.BD;
QryAtualiza.Close;
QryAtualiza.SQL.Clear;
QryAtualiza.SQL.Text := ´Update CONHECIMENTOS Set ´ +
´JA_IMPRESSO = ´ + QuotedStr(´S´) + ´ ´ +
´WHERE (SERIE = :SerieCto)´;
try
try
Qry.ParamByName(´Data´).AsDate := edtData.Date;
Qry.ParamByName(´IniCto´).AsInteger := StrToIntDef(Copy(cmbIni.Text, 1, 6), 0);
Qry.ParamByName(´FimCto´).AsInteger := StrToIntDef(Copy(cmbIni.Text, 1, 6), 0);
Qry.Open;
if not Qry.IsEmpty then
begin
// Inicia o Documento
VDODmPrinter1.BeginDoc;
VDODmPrinter1.Font.Size := fsCondensed;
while not Qry.Eof do
begin
with VDODmPrinter1, Qry do
begin
// Detalhes do Conhecimento
SomaQtde := 0;
SomaPesoR := 0.00;
SomaPesoC := 0.00;
SomaCubagem := 0;
SomaNF := 0.00;
TemSecLinha := False;
{-=-} Print(000, ´´, True);
{-=-} Print(000, ´´, True);
Print(100, ´TRANSPORTE DE CARGAS´, True);
Print(100, FieldByName(´COD_TRANSPORTE´).AsString, True);
Print(100, FieldByName(´EMISSAO´).AsString, True);
...
{-=-} Print(000, ´´, True);
// Ini NF (selecao das notas fiscais do conhecimento
QryNF.ParamByName(´SerieCto´).AsInteger := Qry.FieldByName(´SERIE´).AsInteger;
Open;
try
try
while not QryNF.Eof do
begin
// Detalhes da NF
end; // while eof
except
on E:Exception do
begin
MsgError(´Erro na consulta de NF para os Conhecimentos´);
end;
end; // try..except
finally
QryNF.Close;
end; // try..finally
// Fim NF
// Atualiza Cto como já impresso
// O erro quando dá em tempo de execucao pega a exceção deste try
try
try
QryAtualiza.Close;
QryAtualiza.SQL.Clear;
QryAtualiza.SQL.Text := ´Update CONHECIMENTOS Set ´ +
´JA_IMPRESSO = ´ + QuotedStr(´S´) + ´ ´ +
´WHERE (SERIE = :SerieCto)´;
QryAtualiza.ParamByName(´SerieCto´).AsInteger :=
Qry.FieldByName(´SERIE´).AsInteger;
ExecSQL;
except
on E:Exception do
begin
MsgError(´Erro na atualização do Status de impressão.´);
end;
end; // try..except
finally
QryAtualiza.Close;
end; // try..finally
Next; // Vai para o Proximo Conhecimento
end; // VDODmPrinter1, Qry
end; // While Eof
// Finaliza a Impressão
VDODmPrinter1.Font.Size := fsDefault;
VDODmPrinter1.EndDoc(False);
end
else
begin
MsgWarn(´Sem Conhecimentos para imprimir´);
end; // if Qry.IsEmpty
except
on E:Exception do
begin
ShowMessage(´Erro na recuperação dos conhecimento para imprimir.´ + #1313 +
´SQL: ´ + Qry.SQL.Text + 13 +
´Erro Compilador: ´ + E.Message);
end;
end; // try..except
finally
Qry.Close;
QryNF.Close;
FreeAndNil(Qry);
FreeAndNil(QryNF);
end; // try..finally
Gostei + 0
08/03/2005
Fsflorencio
Em qual linha exatamente está ocorrendo o erro?
Gostei + 0
08/03/2005
Afarias
|QryAtualiza.ParamByName(´SerieCto´).AsInteger :=
| Qry.FieldByName(´SERIE´).AsInteger;
|ExecSQL;
deveria estar
QryAtualiza.ExecSQL;
vc está tentando fazer o ExecSQL em Qry (que está no WITH) e não em QryAtualiza
T+
Gostei + 0
08/03/2005
Tuskinhu
Mesmo assim obrigadao pela ajuda !!!
Abraços!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)