Como fazer um auto inclemento no delphi.
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
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
Curtidas 0
Respostas
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
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
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
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
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
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!
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
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 UkInsertGOSTEI 0