VEJAM ESSE CODIGO E ME DIGAM...

Delphi

07/05/2003

ESSE CÓDIGO FUNCIONA NO BOTÃO DELETAR ITENS DE UMA TABELA,
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

Anjomd

Curtidas 0

Respostas

Marcus

Marcus

07/05/2003

Boa Noite!!

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
Inforservice

Inforservice

07/05/2003

E aí doidão blz... Tem uma série de erros aí em meu...
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
Comodelphi

Comodelphi

07/05/2003

caro amigo, não faça isso, pelo amor de Deus. Deixa a Chave primária em paz, não é uma prática saudavel para banco de dados. Imagine se tivesse meia duzia de tabelas que usem essa chave como chaves estrangeiras, vc vai fazer esse trabalho nas tabelas todas? só pra nao ficar com buraco na numeração?. isso é uma tolice perda de tempo.


GOSTEI 0
Comodelphi

Comodelphi

07/05/2003

caro amigo, não faça isso, pelo amor de Deus. Deixa a Chave primária em paz, não é uma prática saudavel para banco de dados. Imagine se tivesse meia duzia de tabelas que usem essa chave como chaves estrangeiras, vc vai fazer esse trabalho nas tabelas todas? só pra nao ficar com buraco na numeração?. isso é uma tolice perda de tempo.

´Complique e morra´


GOSTEI 0
POSTAR