Fórum Falha na exclusão de linha via Delphi e Zeos #459265
23/10/2013
0
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
Curtir tópico
+ 0Posts
24/10/2013
Marcos Iwazaki
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
24/10/2013
Santos Carvalhais
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
24/10/2013
Marcos Iwazaki
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
24/10/2013
Santos Carvalhais
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
24/10/2013
Marcos Iwazaki
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
24/10/2013
Santos Carvalhais
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)