delphi com auto incremento
Mais um problema que me aparece e eu nao consegui resolver. Tenho uma tabela no access com um campo auto incremente. No delphi uso o ado. Como tratar o campo auto incremente, pois se no delphi eu mandar gravar no banco sem preencher o campo auto incremente, o banco deixa o campo em branco.
O que eu consegui ate agora foi fazer um select para achar o ultimo registro do banco:
inclusao. select last(codigo) from clientes;
isso seleciona o codigo do ultimo registro. Como faço para colocar o resultado desse select no campo referente ao codigo??
tem alguma outra forma de fazer o que eu quero?
O que eu consegui ate agora foi fazer um select para achar o ultimo registro do banco:
inclusao. select last(codigo) from clientes;
isso seleciona o codigo do ultimo registro. Como faço para colocar o resultado desse select no campo referente ao codigo??
tem alguma outra forma de fazer o que eu quero?
Danikenji
Curtidas 0
Respostas
Leonardo_age
17/10/2008
Olá amigo,
No seu caso eu verificaria se o banco realmente esta como Autoincrement, mas caso queira tentar de outra forma, ao invés de
use
Pois pode haver uma exclusão na tabela e por algum motivo o ultimo registro não ter o maior código.
Seguindo... após isso quando vc for montar a o sql de insert passe o código obtido desta query incrementando 1.
Caso você use esse código muitas vezes, sugiro que monte uma função de busque o número de sequencia, mais ou memos assim:
Espero ter ajudado!
No seu caso eu verificaria se o banco realmente esta como Autoincrement, mas caso queira tentar de outra forma, ao invés de
inclusao. select last(codigo) from clientes;
use
inclusao. select max(codigo) from clientes;
Pois pode haver uma exclusão na tabela e por algum motivo o ultimo registro não ter o maior código.
Seguindo... após isso quando vc for montar a o sql de insert passe o código obtido desta query incrementando 1.
Caso você use esse código muitas vezes, sugiro que monte uma função de busque o número de sequencia, mais ou memos assim:
function SEQ(tabela,campo : String) : String; begin SQLInclusao.Active := False;; SQLInclusao.SQL.Text:= select max(codigo) as cod from clientes; SQLInclusao.Active := True; ; if SQLInclusao.Isempty then Result := ´1´ else Result := InttoStr(SQLInclusao.fieldbyName(´cod´).asInteger + 1); end;
Espero ter ajudado!
GOSTEI 0
Danikenji
17/10/2008
entao, ate consegui incrementar no novo registro, mas agora o problema esta ocorrendo quando eu deleto o ultimo registro.
quando deleto o ultimo registro, na hora que eu vou inserir um novo ele pega o mesmo codigo que estava no registro que foi excluido.
Sera que tem como nao fazer ele pegar o codigo do registro que foi excuido?
Pois no meu sistema, os registros excluidos sao gravados em outra tabela para uma possivel consulta de exclusoes do sistema.
quando deleto o ultimo registro, na hora que eu vou inserir um novo ele pega o mesmo codigo que estava no registro que foi excluido.
Sera que tem como nao fazer ele pegar o codigo do registro que foi excuido?
Pois no meu sistema, os registros excluidos sao gravados em outra tabela para uma possivel consulta de exclusoes do sistema.
GOSTEI 0
Leonardo_age
17/10/2008
No IB /Firebird existe um recurso chamado Generators, que são utilizados para fazer o que você quer, mas no Access infelizmente não conheço.
Mas deixe-me entender melhor, quer dizer então que ao excluir um registro ele é transferido para outra tabela na mesma base de dados (.mdb)? Por que se for, não seria o caso de você criar um flag na tabela do tipo fl_Deletado podendo conter as opções N e S? Assim ao invés de deletar de uma tabela, inserir em outra, apenas será dado um update na tabela de clientes.
Quando quiser filtrar por clientes ativos seu select teria mais essa clausula [b:dd2ab81b67]fl_Deletado = ´N´[/b:dd2ab81b67], qdo quisesse consultar clientes inativos [b:dd2ab81b67]fl_Deletado = ´S´[/b:dd2ab81b67]
Abraços
Mas deixe-me entender melhor, quer dizer então que ao excluir um registro ele é transferido para outra tabela na mesma base de dados (.mdb)? Por que se for, não seria o caso de você criar um flag na tabela do tipo fl_Deletado podendo conter as opções N e S? Assim ao invés de deletar de uma tabela, inserir em outra, apenas será dado um update na tabela de clientes.
Quando quiser filtrar por clientes ativos seu select teria mais essa clausula [b:dd2ab81b67]fl_Deletado = ´N´[/b:dd2ab81b67], qdo quisesse consultar clientes inativos [b:dd2ab81b67]fl_Deletado = ´S´[/b:dd2ab81b67]
Abraços
GOSTEI 0