Qual a melhor forma de usar Codigo Autoincremento.
Já ví diversas formas de usar o codigo automatico, mas qual é o modo mais usado e recomendado ?
eu faço pegando o total de registros e adicianando + 1, alguem pode postar o codigo mais recomendado...
desde já... agradeço...
eu faço pegando o total de registros e adicianando + 1, alguem pode postar o codigo mais recomendado...
desde já... agradeço...
Alemaodp
Curtidas 0
Respostas
Dbergkamps
28/02/2004
caro colega,
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:
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
Jose Luiz
28/02/2004
Colega..
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..
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
Tnaires
28/02/2004
Essa questão do auto-incremento, embora não pareça, é bem delicada...
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.
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
Lira
28/02/2004
Com um campo autoincrement, posso fazer a inserção de novos registros sem problema, mas o número sequente só aparece quando o registro é salvo. Existe alguma maneira de número aparecer na inserção do registro?
GOSTEI 0
Paullsoftware
28/02/2004
colegas tentem o seguinte:
//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
//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
Paullsoftware
28/02/2004
colegas tentem o seguinte:
//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
//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
Oscar Candido
28/02/2004
Não sei se é a melhor maneira, ou a mais prática, mas com o banco Interbase eu uso um Generator pra incrementar meus campos quando necessário.
Num componente TIBQuery coloco o seguinte :
E no evento BeforePost do Componente que acessa minha tabala coloco:
Tem funcionado bem até hoje
:lol:
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
Tnaires
28/02/2004
Usando IBDataSet, nem precisa programar para usar o generator: basta criá-lo no banco e selecioná-lo pelo Object Inspector.
GOSTEI 0
Tnaires
28/02/2004
Usando IBDataSet, nem precisa programar para usar o generator: basta criá-lo no banco e selecioná-lo pelo Object Inspector.
GOSTEI 0
Tnaires
28/02/2004
Usando IBDataSet, nem precisa programar para usar o generator: basta criá-lo no banco e selecioná-lo pelo Object Inspector.
GOSTEI 0
Tnaires
28/02/2004
Pessoal, me desculpem as mensagens repetidas, mas foi pq toda vida q eu enviava aparecia uma mensagem d erro, daí eu achava q não tinha mandado...
:oops: :oops: :oops: :oops: :oops: :oops: :oops:
:oops: :oops: :oops: :oops: :oops: :oops: :oops:
GOSTEI 0
Eniorm
28/02/2004
Usando IBDataSet, nem precisa programar para usar o generator: basta criá-lo no banco e selecioná-lo pelo Object Inspector.
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
Cicero
28/02/2004
a questao e e se o outro usuario neste mesmo momento tambem inserir outro Registro. se for Paradox. beleza o que o colega mostrou criar uma Tabela. para cada insersao vai la na tabela e busca o proximo registro. e acrecenta o da tabela mestre, mais se for um Banco de Dados,,,,,,,
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
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
Cicero
28/02/2004
a questao e e se o outro usuario neste mesmo momento tambem inserir outro Registro. se for Paradox. beleza o que o colega mostrou criar uma Tabela. para cada insersao vai la na tabela e busca o proximo registro. e acrecenta o da tabela mestre, mais se for um Banco de Dados,,,,,,,
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
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