Problemas com Auto-Incremento......
Amigos o problema é seguinte. Eu esou fazendo uma aplicação no Delphi 6 com BD Firebird 1.0, criei algumas tabelas com chaves primárias (not null) e auto-incrementáveis (via triggers, generations e procedures). Sei que o código só vai se auto-incrementar ao eu salvar o registro em edição, mas como não vou colocar nada no campo de código pois ele mesmo é incrementável ele fica em branco, e o problema está aí... não posso salvar o registro pra ele poder incrementar porque o campo está nulo !!! Certo, ae eu tinha um código que eu usei no Paradox que ´criava´ um valor pra jogar no DBEdit do código pra ele ter algum valor e assim poder salvar, mas eu estou tendo problemas em fazer ele funcionar com o Firebird... vou lhes mostrar o código que usei:
[i:d21e4c2f77]
var
Cod:Integer;
begin
TbDepto.Active:=True;
IF TbDepto.IsEmpty
then Cod:=1
else
begin
TbDepto.IndexName:=´RDB$PRIMARY10´;
TbDepto.Last;
Cod:=TbDeptoCod_Depto.AsInteger+1;
while Cod <3 Do
Cod:=0+Cod;
end;
TbDepto.Append;
TbDeptoCod_Depto.Value:=Cod;
DBEdit2.SetFocus;
[/i:d21e4c2f77]
Esclarecendo: o meu campo código é do tipo [b:d21e4c2f77]Integer[/b:d21e4c2f77]
Então, acontece o seguinte, quando a tabela está vazia ele consegue criar o 1º registro, mas o segundo não... ele não dá nenhuma mensagem de erro mas o programa trava e não faz nada. Se alguém tiver algum outro código que faça o que eu estou precisando pode me enviar por e-mail ou colocar aqui mesmo, ou indicar algum erro que esteja acontecendo que até agora eu ainda não percebi.
Desde já grato a todos que se dispuserem a me ajudar.
[i:d21e4c2f77]
var
Cod:Integer;
begin
TbDepto.Active:=True;
IF TbDepto.IsEmpty
then Cod:=1
else
begin
TbDepto.IndexName:=´RDB$PRIMARY10´;
TbDepto.Last;
Cod:=TbDeptoCod_Depto.AsInteger+1;
while Cod <3 Do
Cod:=0+Cod;
end;
TbDepto.Append;
TbDeptoCod_Depto.Value:=Cod;
DBEdit2.SetFocus;
[/i:d21e4c2f77]
Esclarecendo: o meu campo código é do tipo [b:d21e4c2f77]Integer[/b:d21e4c2f77]
Então, acontece o seguinte, quando a tabela está vazia ele consegue criar o 1º registro, mas o segundo não... ele não dá nenhuma mensagem de erro mas o programa trava e não faz nada. Se alguém tiver algum outro código que faça o que eu estou precisando pode me enviar por e-mail ou colocar aqui mesmo, ou indicar algum erro que esteja acontecendo que até agora eu ainda não percebi.
Desde já grato a todos que se dispuserem a me ajudar.
Marshall Mathers
Curtidas 0
Respostas
Pedro Bugim
15/12/2003
Cara, acho que tenho um material que se adequa ao seu caso, mas não estou com ele em mãos. Só à noite, quando eu for pra casa. Te envio no máximo até amanhã à tarde, blz?
obs. Não sei se vai servir muito, mas de repente já ajuda um pouco.
Abraços,
obs. Não sei se vai servir muito, mas de repente já ajuda um pouco.
Abraços,
GOSTEI 0
Marshall Mathers
15/12/2003
Ae Pedro, qualquer ajuda é bem vinda... vou esperar seu material, mas vc poderia me adiantar do que se trata??? E se alguma outra pessoa tiver algum outro material que possa me ajudar ainda estou a espera.
Pedro, [b:176d435084]muito obrigado mesmo pelo interesse em ajudar[/b:176d435084]
E a todos os outros, desde já agradeço.
Pedro, [b:176d435084]muito obrigado mesmo pelo interesse em ajudar[/b:176d435084]
E a todos os outros, desde já agradeço.
GOSTEI 0
Marshall Mathers
15/12/2003
De repente me veio essa outra pergunta... eu queria saber se tem como fazer com que o código de um campo já salvo possa pegar o nº anterior caso o registro anterior seja deletado??? Tipo assim:
Dae quando eu apagasse o registrro ´CPD´ que tem código = 2 a SECRETARIA que tem código = 3 passasse a ter código = 2 e SUPERVISÃO com código = 3 e assim sucessivamente, pq aí sim refletiria realmente o nº de registros salvos.... será que tem como fazer isso?
Se alguém puder me ajudar eu fico muito grato!
________________________________________ | Código | Departamento | ----------------------------------------- | 1 | ADMINISTRAÇÃO | ----------------------------------------- | 2 | CPD | ---------------------------------------- | 3 | SECRETARIA | ---------------------------------------- | 4 | SUPERVISÃO | ----------------------------------------
Dae quando eu apagasse o registrro ´CPD´ que tem código = 2 a SECRETARIA que tem código = 3 passasse a ter código = 2 e SUPERVISÃO com código = 3 e assim sucessivamente, pq aí sim refletiria realmente o nº de registros salvos.... será que tem como fazer isso?
Se alguém puder me ajudar eu fico muito grato!
GOSTEI 0
Fred
15/12/2003
Eu tambem tenho o mesmo problema e por enquanto estou utilizando da seguinte maneira:
*Na trigger eu apago o IF ficando + - assim
new.cod := gen_id(gerador,1);
end;
e no programa o valor cod := 0
quando chega no banco ele troca o 0 pelo gerador.
mas na revista clube delphi(acho que a ultima ou penultima edicao) o carlos cantu faz um exemplo de como pegar o valor do generator e jogar no campo na de inserir(so que estou sem a revista agora
*Na trigger eu apago o IF ficando + - assim
new.cod := gen_id(gerador,1);
end;
e no programa o valor cod := 0
quando chega no banco ele troca o 0 pelo gerador.
mas na revista clube delphi(acho que a ultima ou penultima edicao) o carlos cantu faz um exemplo de como pegar o valor do generator e jogar no campo na de inserir(so que estou sem a revista agora
GOSTEI 0
Marshall Mathers
15/12/2003
Ae Fred, obrigado pela dica vou testar ainda... mas sobre a revista, vê se vc lembra qual edição era pra eu poder correr atrás desse artigo... vê se vc se lembra do que estava na capa que assim fica mais fácil de achar...
obrigado pela ajuda!
obrigado pela ajuda!
GOSTEI 0
Pedro Bugim
15/12/2003
Cara,peguei um código bem simples de auto-incremento. Tomara que dê uma ajudada...
primeiramente, vc tem que criar uma query (aki, como query1), que realizará este trabalho. O edit onde aparecerá o registro, nomeei de Edit1.
espero q dê uma ajuda! Abraços,[/code]
primeiramente, vc tem que criar uma query (aki, como query1), que realizará este trabalho. O edit onde aparecerá o registro, nomeei de Edit1.
Procedure TForm1.FormShow(Sender: TObject); var k: integer; begin With Query1 do begin Close; Sql.Clear; //Posiciona na query o último registro Sql.Add(´Select CODIGO from TABELA order by CODIGIO desc´); Open; end; //adiciona 1 ao último registro da tabela Edit1.Text:=Query1.FieldByName(´CODIGO´).Asstring; K:=StrToInt(Edit1.text); K:=K+1; Edit1.text:=IntToStr(K); end;[code]
GOSTEI 0