exclusão de itens com while
Não estou conseguindo excluir todos os itens de uma tabela de uma vez, estou fazendo assim:
With TbItens do
begin
First;
while not Eof do
begin
Delete;
Next;
end;
end;
mas ele só exclui um item, o resto continua na tabela, alguém tem alguma solução pra isso?
With TbItens do
begin
First;
while not Eof do
begin
Delete;
Next;
end;
end;
mas ele só exclui um item, o resto continua na tabela, alguém tem alguma solução pra isso?
Janete
Curtidas 0
Respostas
Emerson Nascimento
17/06/2004
pelo jeito vc está utilizando Paradox, certo?
(vc pode utilizar queries para essa tarefa)
não precisa do [b:08271aea43]with[/b:08271aea43]. são apenas duas linhas.
TbItens.First;
while not TbItens.Eof do TbItens.Delete;
(vc pode utilizar queries para essa tarefa)
não precisa do [b:08271aea43]with[/b:08271aea43]. são apenas duas linhas.
TbItens.First;
while not TbItens.Eof do TbItens.Delete;
GOSTEI 0
Gandalf.nho
17/06/2004
Se for TTable, pode usar só uma linha:
TbItens.EmptyTable;
TbItens.EmptyTable;
GOSTEI 0
Janete
17/06/2004
pelo jeito vc está utilizando Paradox, certo?
(vc pode utilizar queries para essa tarefa)
não precisa do [b:c523cb740f]with[/b:c523cb740f]. são apenas duas linhas.
TbItens.First;
while not TbItens.Eof do TbItens.Delete;
Assim tb não deu certo, ele exclui um só
GOSTEI 0
Janete
17/06/2004
Se for TTable, pode usar só uma linha:
TbItens.EmptyTable;
tb não deu e dá um erro: traduzindo: tabela não pode ser aberta para uso exclusivo
essa tabela de itens q quero q exclua os itens está vinculada a tabela de pedidos q seria os itens da venda, e até hoje não consegui achar a solução para esse problema de não excluir e tenho q ficar verificando toda vez q o cliente quer cancelar ou excluir um pedido, se existe itens na tabela se existir fico dando uma mensagem para e ele exclua um a um até q exclua todos e só depois disso eu excluo o pedido e tá muito ruim dessa forma, então deve ter alguma forma de fazer um while ou algo parecido para q exclua todos de uma vez :?:
GOSTEI 0
Marcelino
17/06/2004
Prezada Janete
1) Pela leitura das respostas, assumo que esta sendo usado um componente TTable e o banco de dados Paradox.
2) 1a pergunta : Vc está com algum Filter ativado na tabela ?
Razão da minha pergunta : Não sei o comportamento que o comando First assume quando o Filter esta ativado, mas ja tive algumas surpresas usando o Filter.
Resumo da opera : Debuge a aplicação para ver onde o ´pointer´ esta sendo posicionado na tabela.
3) 2a pergunta : Existe algum indice associado a tabela pelo Numero de Pedido ?
Se não houver , vc vai ter que varrer a tabela inteira para ver quais registros tem aquele numero de pedido e excluir o que tiver o numero de pedido em questão ( Muito embora, aconselhe vc a criar o tal do indice por questões de performance ).
TbItens.First;
while (not TbItens.Eof) do
begin
if TbItens.FieldByName(´NUMERO_PEDIDO´).AsInteger = NUM_PEDIDO then
TbItens.Delete
else
TbItens.Next;
end;
Se houver o indice, vc deve indicar que o indice usado é o proprio e posicionar no NUMERO_PEDIDO e excluir enquanto for NUMERO_PEDIDO
TbItens.Locate(´NUM_PEDIDO´,NUM_PEDIDO,[])
while (not TbItens.Eof) and TbItens.FieldByName(´NUMERO_PEDIDO´).AsInteger = NUM_PEDIDO do
TbItens.Delete;
4) Não sei se vc reparou nas respostas anteriores, mas quando vc executa o comando Delete, automaticamente o ´pointer´ ja vai para o próximo registro, sendo que o comando Next ´não deve´ ser executado.
[]s,
1) Pela leitura das respostas, assumo que esta sendo usado um componente TTable e o banco de dados Paradox.
2) 1a pergunta : Vc está com algum Filter ativado na tabela ?
Razão da minha pergunta : Não sei o comportamento que o comando First assume quando o Filter esta ativado, mas ja tive algumas surpresas usando o Filter.
Resumo da opera : Debuge a aplicação para ver onde o ´pointer´ esta sendo posicionado na tabela.
3) 2a pergunta : Existe algum indice associado a tabela pelo Numero de Pedido ?
Se não houver , vc vai ter que varrer a tabela inteira para ver quais registros tem aquele numero de pedido e excluir o que tiver o numero de pedido em questão ( Muito embora, aconselhe vc a criar o tal do indice por questões de performance ).
TbItens.First;
while (not TbItens.Eof) do
begin
if TbItens.FieldByName(´NUMERO_PEDIDO´).AsInteger = NUM_PEDIDO then
TbItens.Delete
else
TbItens.Next;
end;
Se houver o indice, vc deve indicar que o indice usado é o proprio e posicionar no NUMERO_PEDIDO e excluir enquanto for NUMERO_PEDIDO
TbItens.Locate(´NUM_PEDIDO´,NUM_PEDIDO,[])
while (not TbItens.Eof) and TbItens.FieldByName(´NUMERO_PEDIDO´).AsInteger = NUM_PEDIDO do
TbItens.Delete;
4) Não sei se vc reparou nas respostas anteriores, mas quando vc executa o comando Delete, automaticamente o ´pointer´ ja vai para o próximo registro, sendo que o comando Next ´não deve´ ser executado.
[]s,
GOSTEI 0
Marcelino
17/06/2004
Vc fala em ´então deve ter alguma forma de fazer um while ou algo parecido para q exclua todos de uma vez´
O que vc pode fazer é incluir um componente TQuery na sua aplicação com a seguinte instrução SQL ( Ex : Query_Exclui ) .
´delete from TBITENS where NUMERO_PEDIDO = :NUMERO_PEDIDO´
Ao excluir use a rotina abaixo
with Query_Exclui do
begin
Close;
Params.ParamByName(´NUMERO_PEDIDO´).AsInteger := NUM_PEDIDO;
ExecSQL;
end;
O que vc pode fazer é incluir um componente TQuery na sua aplicação com a seguinte instrução SQL ( Ex : Query_Exclui ) .
´delete from TBITENS where NUMERO_PEDIDO = :NUMERO_PEDIDO´
Ao excluir use a rotina abaixo
with Query_Exclui do
begin
Close;
Params.ParamByName(´NUMERO_PEDIDO´).AsInteger := NUM_PEDIDO;
ExecSQL;
end;
GOSTEI 0