Fórum Qual a melhor forma de usar Codigo Autoincremento. #217146
28/02/2004
0
eu faço pegando o total de registros e adicianando + 1, alguem pode postar o codigo mais recomendado...
desde já... agradeço...
Alemaodp
Curtir tópico
+ 0Posts
28/02/2004
Dbergkamps
nao sei qual e o seu banco de dados, mas se estiver usando paradox 7, defina como o campo como autoincrement(+-)que ele ja adiciona automaticamente.valeu :wink:
Gostei + 0
28/02/2004
Jose Luiz
Eu uso assim, e funciona blz...
var proxnum:integer;
begin
tabela.last;
proxnum:=tabela.fieldbyname(´codigo´).asinteger+1;
tabela.append;
tabela.fieldbyname(´codigo´).asinteger:=proxnum;
end;
valeu..
Gostei + 0
28/02/2004
Tnaires
Muitas tabelas simples podemos colocar a chave como auto-incremento, q fica td blz.
Mas às vezes desejamos controlar o incremento manualmente. Aí existem diversas maneiras d fazer isso. O método mostrado pelo José Luiz é perfeito, desde q o sistema não esteja em rede. Mas bastam dois computadores gravando num banco d dados cliente/servidor para dar problema, pois se o primeiro gravar os dados no banco milésimos d segundo antes do segundo, dá conflito d integridade (o segundo tenta gravar um registro num valor d chave já existente, armazenado na variável).
Uma maneira q aprendi foi criar uma tabela extra no banco, q armazene somente os identificadores d cada tabela (os nomes das chaves primárias) e o valor atual. A cada post, o valor é recuperado no banco, gravado na respectiva tabela e imediatamente incrementado.
É isso, sucesso.
Gostei + 0
07/06/2004
Lira
Gostei + 0
28/08/2004
Paullsoftware
//procedimento usado para autoinserção dos códigos das tabelas
procedure Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var
Qry:TadoDataSet;
begin
if Chave_Primaria.DataSet.State<>dsInsert then Exit;
Qry := TADODataSet.Create(nil);
Try
Qry.Connection := Banco_Dados.conexao;
Qry.CommandText := ´Select Max(´+chave_primaria.FieldName+´) From ´+nome_tabela;
Qry.Open;
if Qry.Fields[0].IsNull then chave_primaria.AsInteger := 1
else
chave_primaria.AsInteger := Qry.Fields[0].AsInteger+1;
finally
FreeAndNil(Qry);
end
end;
sempre usei e nunca deu erro e mesmo se o usuário quiser editar o código manualmente basta ele digitar e se o próximo ele preferir que seja gerado automaticamente ele será gerado baseando-se no maior valor já digitado :D
Gostei + 0
28/08/2004
Paullsoftware
//procedimento usado para autoinserção dos códigos das tabelas
procedure Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var
Qry:TadoDataSet;
begin
if Chave_Primaria.DataSet.State<>dsInsert then Exit;
Qry := TADODataSet.Create(nil);
Try
Qry.Connection := Banco_Dados.conexao;
Qry.CommandText := ´Select Max(´+chave_primaria.FieldName+´) From ´+nome_tabela;
Qry.Open;
if Qry.Fields[0].IsNull then chave_primaria.AsInteger := 1
else
chave_primaria.AsInteger := Qry.Fields[0].AsInteger+1;
finally
FreeAndNil(Qry);
end
end;
sempre usei e nunca deu erro e mesmo se o usuário quiser editar o código manualmente basta ele digitar e se o próximo ele preferir que seja gerado automaticamente ele será gerado baseando-se no maior valor já digitado :D
Gostei + 0
28/08/2004
Oscar Candido
Num componente TIBQuery coloco o seguinte :
Select GEN_ID(MEUGENERATOR,1) as Seq from RDB$DATABASE
E no evento BeforePost do Componente que acessa minha tabala coloco:
If MeuCampo.IsNull then begin Query.close; Query.Open; MeuCampo.Value := QuerySeq.Value; end;
Tem funcionado bem até hoje
:lol:
Gostei + 0
30/08/2004
Tnaires
Gostei + 0
30/08/2004
Tnaires
Gostei + 0
30/08/2004
Tnaires
Gostei + 0
30/08/2004
Tnaires
:oops: :oops: :oops: :oops: :oops: :oops: :oops:
Gostei + 0
30/08/2004
Eniorm
Exato! Basta para isso configurar a propriedade [b:dc164eee39]GeneratorField[/b:dc164eee39] do IBDataSet, sendo necessário ter um generator para cada tabela.
T+
Gostei + 0
30/08/2004
Cicero
voces queren ver como vai dar no na cabeca de todos. os programador.
Exemplo... tenho um sistema que trabalha com clientedaset e meu cliente
quer que quando for inserir um registro. ele mostra o numero do registro
no caso o codigo, do cliente, ate aqui beleza poderia usar uma instrucao
no evento Beforepost do clientedaset ele inseri um numero.....mais o cliente resolveu. que nao vai gravar este registro.... ele com serteza ja criou um novo registro la sua tabela.... ai voce vai falar sim mais eu vou colocar somente um instrucao so pra buscar o registro e quando ele da um Aplyupdate a ai sim ele grava. no banco... a principio parece ser o mais certo. mais tambem e complicado, porque imagina um sistema trabalhando com 5 terminal nao vou falar 30.40, 60 so 5 terminal
o usuario 1 vai inserir e apareceu o numero 30 pra ele,e neste mesmo momento o usuario 2 tambem vai inserir outro registro tambem vai aparecer o numero 30, e ai sempre voce vai ter que antens de gravar no banco, vereficar se ja tem este numero e acrecentar mais um,,,,,
Resumindo... e esta questao teria que se falar mais sobre ela.....
quando eu usava o Paradox,, beleza tinha uma tabela com todos meus registro, o Paradox da um look do registro..... e agora,,,,, com Banco
questao se voce dar Aplyupadate ja vai almentar o registro, la na sua tabela
momento da inclusao, se voce dar um Select max(codigo) +1
todos os usuario vai ver os mesmo Registro...porque voce a ainda nao atualizou seu banco... a mais a e facil,, eu chomo o registro logo em seguida dou um Aplyupadate,, no meu banco. se outro usuario iserir ele ja vai esta com a tabela, atualizada...esta e a forma que acho mais certa mais mesmo assim. nao muinto correta.. porque sempre vai estar salvado. um registro que talvez o cliente.. possa cancelar.. e meu numero ja vai estar gravado........
um genertor tambem e complicado, porque e seu cancelar.. ele ja gravou
outro detalhes pensen a questao do estoque. e nao esqueca que voce esta trabalhando com isto em cache local. depois que vai pra o banco
cicerojosecruz@bol.com.br
Gostei + 0
30/08/2004
Cicero
voces queren ver como vai dar no na cabeca de todos. os programador.
Exemplo... tenho um sistema que trabalha com clientedaset e meu cliente
quer que quando for inserir um registro. ele mostra o numero do registro
no caso o codigo, do cliente, ate aqui beleza poderia usar uma instrucao
no evento Beforepost do clientedaset ele inseri um numero.....mais o cliente resolveu. que nao vai gravar este registro.... ele com serteza ja criou um novo registro la sua tabela.... ai voce vai falar sim mais eu vou colocar somente um instrucao so pra buscar o registro e quando ele da um Aplyupdate a ai sim ele grava. no banco... a principio parece ser o mais certo. mais tambem e complicado, porque imagina um sistema trabalhando com 5 terminal nao vou falar 30.40, 60 so 5 terminal
o usuario 1 vai inserir e apareceu o numero 30 pra ele,e neste mesmo momento o usuario 2 tambem vai inserir outro registro tambem vai aparecer o numero 30, e ai sempre voce vai ter que antens de gravar no banco, vereficar se ja tem este numero e acrecentar mais um,,,,,
Resumindo... e esta questao teria que se falar mais sobre ela.....
quando eu usava o Paradox,, beleza tinha uma tabela com todos meus registro, o Paradox da um look do registro..... e agora,,,,, com Banco
questao se voce dar Aplyupadate ja vai almentar o registro, la na sua tabela
momento da inclusao, se voce dar um Select max(codigo) +1
todos os usuario vai ver os mesmo Registro...porque voce a ainda nao atualizou seu banco... a mais a e facil,, eu chomo o registro logo em seguida dou um Aplyupadate,, no meu banco. se outro usuario iserir ele ja vai esta com a tabela, atualizada...esta e a forma que acho mais certa mais mesmo assim. nao muinto correta.. porque sempre vai estar salvado. um registro que talvez o cliente.. possa cancelar.. e meu numero ja vai estar gravado........
um genertor tambem e complicado, porque e seu cancelar.. ele ja gravou
outro detalhes pensen a questao do estoque. e nao esqueca que voce esta trabalhando com isto em cache local. depois que vai pra o banco
cicerojosecruz@bol.com.br
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)