Como fazer um auto inclemento no delphi.

Delphi

09/02/2008

Boa tarde a todos...
Tenho um programa que utiliza o interbase 6.5.
E quero que quando o usuario der um clique no botão de inserir, o delphi verifica qual o último cod_cliente cadastrado no banco e inclemente mais 1.

Teste: Já utilizei o generator do Interbase e depois o geratorField do IBDataSet, mas se caso vc cancelar o cadastro, ele não desfaz este inclemento.

Tem como esta contornando isto? Tem alguma outra maneira facil que fazer este auto inclemento?

Obrigado.

Uelinton


Uelinton_reis

Uelinton_reis

Curtidas 0

Respostas

Edilcimar

Edilcimar

09/02/2008

existe um comando no interbase/firebird para ´renumerar´, ou até mesmo resgatar um número no do generator que é:
SQL.Add(´Set generator Tabela_Campo_GEN to ´ + NumeroDesejado)
isto vc pode utilizar pegando o número que foi gerado no cancelamento e decrescer 1 unidade


GOSTEI 0
Ulisses.lima

Ulisses.lima

09/02/2008

Boa tarde a todos... Tenho um programa que utiliza o interbase 6.5. E quero que quando o usuario der um clique no botão de inserir, o delphi verifica qual o último cod_cliente cadastrado no banco e inclemente mais 1. Teste: Já utilizei o generator do Interbase e depois o geratorField do IBDataSet, mas se caso vc cancelar o cadastro, ele não desfaz este inclemento. Tem como esta contornando isto? Tem alguma outra maneira facil que fazer este auto inclemento? Obrigado. Uelinton


Bom dia, Cebolinha!

O que você está querendo é um INCREMENTO.

Pode fazer isso, criando um gatilho (trigger) na sua tabela.

Crie um novo Trigger na tabela e adapte o código abaixo:

if (NEW.Seu_Campo is Null) then
begin
Select Coalesce(Max(Seu_Campo ),0)+1 from Sua_Tabela
into NEW.Seu_Campo ;
end

Boa sorte.

Ulisses


GOSTEI 0
Gandalf.nho

Gandalf.nho

09/02/2008

O generator funciona assim mesmo, ele nunca irá voltar ao número anterior, mesmo desfazendo a transação. Isso garante que o número gerado nunca se repita. Mas não se preocupe se houverem buracos na numeração, salvo raros casos (como auditoria), isso não causará nenhum problema.


GOSTEI 0
Edilcimar

Edilcimar

09/02/2008

Mas pode causar problema em numeração de NF eletrônica, a qual não pode haver falha na seqüência!


GOSTEI 0
Fonsecd

Fonsecd

09/02/2008

Amigo eu faço assim, não sei se é a forma mais correta: Coloco uma IbQuery e nela coloco o comando ( Select Max(Cli_Codigo) from Clientes), Coloco uma Ibtable e no evento OnNewRecord coloco o seguinte código:
If DataMod.DsCliente.State = DsInsert Then
Begin
DataMod.QueryContCli.Active := False;
DataMod.QueryContCli.Active := True;
With DataMod.QuerContCli.Fields[0] do
If IsNull Then
TabClientesCli_Codigo.Value:= 1
Else
TabClientesCli_Codigo.Value := AsInteger + 1;
End;

Então toda vez que vou inserir um registro nessa tabela, o código que recebo no campo código do cliente é sempre o maior mais um!

Abraço!


GOSTEI 0
Paullsoftware

Paullsoftware

09/02/2008

Mas pode causar problema em numeração de NF eletrônica, a qual não pode haver falha na seqüência!
Eu creio que a forma mais senssata de gerar o numero sem correr o risco de pular na sequência ou até mesmo gerar sem a nescessidade, é disparar o gerador apenas no evento BeforeUpdateREcord do DSP na condição de UkInsert


GOSTEI 0
POSTAR