Falha na exclusão de linha via Delphi e Zeos
Boa tarde, amigos!
Criei uma rotina para limpar dados de uma tabela. Porém, apesar de não apresentar falha, não está deletando as linhas na tabela. quando executo o mesmo comando diretamente no banco de dados, funciona perfeitamente.
A rotina é:
with DM_OS do
begin
ZTTemp.First;
while not (ZTTemp.Eof) do
begin
if (ZTTemp.FieldByName('cnpj').AsString = FGerarLote.MaskEditCNPJ.Text) and (ZTTemp.FieldByName('estado').AsBoolean = False) then
begin
PesquisaOS.Active := false;
PesquisaOS.SQL.Clear;
PesquisaOS.SQL.Add('DELETE FROM ONLY temp WHERE chassi = ''' + ZTTemp.FieldByName('chassi').AsString + '''');
PesquisaOS.Active := true;
ZTTemp.ApplyUpdates;
end;
ZTTemp.Next;
end;
end;
Já verifiquei, através de mensagens na tela, que está entrando na rotina, está selecionando corretamente a linhas a serem deletadas, e o comando SQL está correto. Mais uma vez, informo que não há qualquer mensagem de erro nem travamento do sistema.
Alguma alma caridosa poderia me ajudar?
Criei uma rotina para limpar dados de uma tabela. Porém, apesar de não apresentar falha, não está deletando as linhas na tabela. quando executo o mesmo comando diretamente no banco de dados, funciona perfeitamente.
A rotina é:
with DM_OS do
begin
ZTTemp.First;
while not (ZTTemp.Eof) do
begin
if (ZTTemp.FieldByName('cnpj').AsString = FGerarLote.MaskEditCNPJ.Text) and (ZTTemp.FieldByName('estado').AsBoolean = False) then
begin
PesquisaOS.Active := false;
PesquisaOS.SQL.Clear;
PesquisaOS.SQL.Add('DELETE FROM ONLY temp WHERE chassi = ''' + ZTTemp.FieldByName('chassi').AsString + '''');
PesquisaOS.Active := true;
ZTTemp.ApplyUpdates;
end;
ZTTemp.Next;
end;
end;
Já verifiquei, através de mensagens na tela, que está entrando na rotina, está selecionando corretamente a linhas a serem deletadas, e o comando SQL está correto. Mais uma vez, informo que não há qualquer mensagem de erro nem travamento do sistema.
Alguma alma caridosa poderia me ajudar?
Santos Carvalhais
Curtidas 0
Respostas
Marcos Iwazaki
23/10/2013
olha amigo não uso o Zeos.. uso do dbexpress
Talvez seja algo parecido. P executar comando que não necessita retorno como um delete, insert, update vc não usa o Active ou .Open. Procure por um comando tipo Exec ExecComand algo do tipo.
Talvez seja algo parecido. P executar comando que não necessita retorno como um delete, insert, update vc não usa o Active ou .Open. Procure por um comando tipo Exec ExecComand algo do tipo.
GOSTEI 0
Santos Carvalhais
23/10/2013
olha amigo não uso o Zeos.. uso do dbexpress
Talvez seja algo parecido. P executar comando que não necessita retorno como um delete, insert, update vc não usa o Active ou .Open. Procure por um comando tipo Exec ExecComand algo do tipo.
Talvez seja algo parecido. P executar comando que não necessita retorno como um delete, insert, update vc não usa o Active ou .Open. Procure por um comando tipo Exec ExecComand algo do tipo.
Como sou iniciante, não posso dizer se isto é válido para o Zeos. Porém, posso garantir que o INSERT e o UPDATE funcionam perfeitamente da maneira que fiz. Só estou tendo problemas com o DELETE. De qualquer maneira, agradeço a resposta.
Em tempo, informo que o banco de dados usado é o Postgres, caso essa informação seja necessária para que alguém me ajude a solucionar o problema.
GOSTEI 0
Marcos Iwazaki
23/10/2013
certo, certo....
bom... como não conheço o Zeos.. fica mais complicado.
tenta verificar essas coisas
var
sql :string;
sql:='DELETE FROM ONLY temp WHERE chassi = ''' + ZTTemp.FieldByName('chassi').AsString + '''';
PesquisaOS.SQL.Add(sql);
tenta debugar este codigo, eu apenas joguei o sql p uma variavel p ficar facil de pegar o result dela no debug.
E depois testa direto no banco p ver se não tem nenhum erro de sintaxe.
PesquisaOS.Active := true;
ZTTemp.ApplyUpdates;
este applyUpdate eu não entendi o pq vc usa. Pois vc não executou nada nele. Esta apenas percorrendo no while.
bom... como não conheço o Zeos.. fica mais complicado.
tenta verificar essas coisas
var
sql :string;
sql:='DELETE FROM ONLY temp WHERE chassi = ''' + ZTTemp.FieldByName('chassi').AsString + '''';
PesquisaOS.SQL.Add(sql);
tenta debugar este codigo, eu apenas joguei o sql p uma variavel p ficar facil de pegar o result dela no debug.
E depois testa direto no banco p ver se não tem nenhum erro de sintaxe.
PesquisaOS.Active := true;
ZTTemp.ApplyUpdates;
este applyUpdate eu não entendi o pq vc usa. Pois vc não executou nada nele. Esta apenas percorrendo no while.
GOSTEI 0
Santos Carvalhais
23/10/2013
Resolvido
O problema foi solucionado com a inclusão do comando ExecSQL, conforme sugerido.
O código ficou assim:
begin
if (ZTTemp.FieldByName('cnpj').AsString = FGerarLote.MaskEditCNPJ.Text) and (ZTTemp.FieldByName('estado').AsBoolean = False) then
begin
PesquisaOS.Active := false;
PesquisaOS.SQL.Clear;
PesquisaOS.SQL.Add('DELETE FROM ONLY temp WHERE chassi = ''' + ZTTemp.FieldByName('chassi').AsString + '''');
PesquisaOS.Active := true;
PesquisaOS.ExecSQL;
ZTTemp.ApplyUpdates;
end;
ZTTemp.Next;
end;
Obrigado pela ajuda!!!
P.S.: Como faço para mudar este tópico para resolvido?
GOSTEI 0
Marcos Iwazaki
23/10/2013
blz então.
olha eu acho que aparece a opcao de resolvido qdo o ultimo post foi outra pessoa diferente de quem abriu o post..
nesse caso.. veja se c este meu post aparece a opcao p vc.
e mto bom ter resolvido seu problema.
T+
olha eu acho que aparece a opcao de resolvido qdo o ultimo post foi outra pessoa diferente de quem abriu o post..
nesse caso.. veja se c este meu post aparece a opcao p vc.
e mto bom ter resolvido seu problema.
T+
GOSTEI 0
Santos Carvalhais
23/10/2013
As opções que aparecem aqui são Enviar, Code, Quote e URL.
GOSTEI 0