Fórum VEJAM ESSE CODIGO E ME DIGAM... #158538
07/05/2003
0
ELE SERVIRIA COMO UM ALTO INCREMENT, QUANDO EU DELETO ALGUM ITEM DO MEU BANCO DE DADOS (paradox), ESSE CÓDIGO DEVERIA COLOCAR OS ITENS NO LUGAR CERTO
EX. EU TENHO UMA TABELA COM 5 ITENS
ITEM QUAN. DESCRIÇÃO
1 5 VASO SANITÁRIO
2 20 SACOS DE CIMENTO
3 30 PARAFUSO
4 200 TELHAS
5 150 MT FIO
SERIA O SEGUINTE, QUANDO EU DELETAR O ITEM 3 A CONTAGEM DOS ITENS SERIA
ITEM QUAN. DESCRIÇÃO
1 5 VASO SANITÁRIO
2 20 SACOS DE CIMENTO
3 200 TELHAS
4 150 MT FIO
MAS ESSE CÓDIGO NÃO ESTÁ FUNCIONADO. O QUE ELE TEM DE ERRADO?
procedure TForm_Orcamento.tfXPButton4Click(Sender: TObject);
begin
TB_orcamento.First;
while not TB_orcamento.Eof do
begin
TB_orcamento.Edit;
TB_orcamentoITEM.AsString:=´´;
TB_orcamento.Post;
TB_orcamento.Next;
end;
begin
TB_orcamento.First;
TB_orcamento.Edit;
TB_orcamentoITEM.AsString:=´1´;
TB_orcamento.Post;
begin
while not TB_orcamento.Eof do
TB_orcamento.Edit;
TB_orcamentoITEM.AsString:=floattostr(TB_orcamentoITEM.AsFloat+1);
TB_orcamento.Next;
TB_orcamento.Post;
end;
end;
end;
Anjomd
Curtir tópico
+ 0Posts
07/05/2003
Marcus
Pode ser bem mais simples.
var
NrItem: LongInt;
begin
NrItem := 0;
WITH tbOrcamentos
DO BEGIN
IF NOT Active THEN Open;
First;
WHILE NOT Eof
DO BEGIN
Edit;
tbOrcamentosITEM.AsString := IntToStr(NrItem);
Post;
NrItem := NrItem + 1;
Next;
END;
END;
OBS.: Se quiser manter o seu codigo, sera preciso dar FindKey na chave ao mover 1 para o Item.
Gostei + 0
07/05/2003
Inforservice
Vamos lá...
1º vc tá usando um campo String como chave de uma tabela... (Isso não é legal, mas tudo bem).
2º vc tá apagando a chave primaria da tabela e salvando os registros sem chave.(provavelmente aí está seu principal erro.)
TB_orcamento.First;
while not TB_orcamento.Eof do
begin
TB_orcamento.Edit;
[b:c43d5ed431] TB_orcamentoITEM.AsString:=´´;[/b:c43d5ed431]
TB_orcamento.Post;
TB_orcamento.Next;
end;
3º quando vc for utilizar campos auto incremento manualmente, use Integer e não float (as variáveis ponto flutuante utilizam muito mais memória livre do que os inteiros e vc precisa de intervalos inteiros [1,2,3,4,5,...])
begin
TB_orcamento.First;
TB_orcamento.Edit;
TB_orcamentoITEM.AsString:=´1´;
TB_orcamento.Post;
begin
while not TB_orcamento.Eof do
TB_orcamento.Edit;
[b:c43d5ed431] TB_orcamentoITEM.AsString:=floattostr(TB_orcamentoITEM.AsFloat+1);[/b:c43d5ed431]
TB_orcamento.Next;
TB_orcamento.Post;
end;
4º Porque vc coloca esses blocos (begin end) no meio do seu código sem função nenhuma???
Tente alterar sua chave primaria (ITEM) prá inteiro em primeiro lugar.
Depois antes de apagar o registro (Evento BEFOREDELETE) Salve em uma variável private o código do Item deletado.(Dica: Limpe essa variavel antes de salvar o item...)
Depois de Deletar (Evento AFTER DELETE) tente localizar o registro anterior ao que foi deletado (Dica: Use o comando Locate se ele existir em Table: em query existe.
Query1.Locate(´ITEM´,CodigoDeletado+1,[LoPartialKey])) Isso serve prá vc não percorrer toda a tabela inteira.Agora ela esta posicionada no registro da frente do que foi deletado.
Vc concorda que somente os registros que estão depois do que foi deletado estarão fora do lugar né.
Depois percorra do registro corrente até o ultimo acertando com a variavel CodigoDeletado sendo incrementada
´3´ no exemplo
Locate (´Item´,CodigoDeletado +1,[LoPartialKey]);
//estamos no reg de codigo 4
while not tabela EOF do
begin
edit;
Item:= CodigoDeletado; //esse era o registro 4 se o tres foi deletado
post;
Inc(CodigoDeletado);
Next;
end;
resolvido seu problema cara....
T+
Gostei + 0
08/05/2003
Comodelphi
Gostei + 0
08/05/2003
Comodelphi
´Complique e morra´
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)