[firebase-br] Aos interessados: Omelhor Autoincrementosequencial

Kléber Caneva kdcc em terra.com.br
Qui Abr 6 16:35:49 -03 2006


Exemplo simplificado:

CREATE TABLE NF (
    KNF     INTEGER NOT NULL,
    NUMERO  INTEGER
);
ALTER TABLE NF ADD CONSTRAINT PK_NF PRIMARY KEY (KNF);

CREATE GENERATOR NF;
CREATE GENERATOR NUMERO;

SET TERM ^ ;

CREATE TRIGGER NF_AI0 FOR NF
ACTIVE AFTER INSERT POSITION 0
AS
begin
  new.NUMERO = GEN_ID(NUMERO,1);
end
^

SET TERM ; ^


No Evento OnNewRecord do Componente (no meu caso CDS) eu alimento minha PK:

cdsTabelaKNF.AsInteger :=  GenID('NF');

* GenID é uma rotina que simplesmente me retorna o próximo numero do 
Generator passado por parametro.

No Evento OnNewRecord do Componente filhos:

cdsItemKNF.ASinteger := cdsTabelaKNF.AsInteger;

OBS 1: Mesmo em NF eu não uso esse processo. Prefiro criar uma tabela com a 
informação do ultimo numero da NF e qdo imprimir infomrar ao usuario qual o 
próximo numero e deixar ele alterar se necessário. Utilizei apenas em um 
cliente que exigiu um código seuqencial para os clientes, mas foi uma 
exceção.

OBS 2: Por padrão não utilizo Código para clientes, fornecedores, etc.. 
Coloco o campo para pesquisa onde ele informa o nome ou CNPJ. e trago uma 
tela de seleção para que ele confirme qual é o cliente.

[]´s

Kléber Caneva

----- Original Message ----- 
From: "Anticlei Scheid" <cleischeid em yahoo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 3:14 PM
Subject: Re: [firebase-br] Aos interessados: Omelhor 
Autoincrementosequencial



Você pode nos dar um exemplo Kléber?
Seria muito útil.

Obrigado

----- Original Message ----- 
From: "Kléber Caneva" <kdcc em terra.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 2:08 PM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


Generators não são para gerar sequenciais. Generator serve para que nunca
acha conflito entre inclusões concorrentes, cumprindo a regra básica de
Chaves Primarias que devem ser única.

Acredito que o o teste que o Anticlei, montou serve para mostrar que
utilizando MAX essa regra pode não ser cumprida, causando exceções.

Eu trabalho com Generators para PK sem me preocupar com o sequencial
alimentando-os já quando o usuario clica na inclusão, com isso eu já posso
alimentar as tabela filhas se existirem.
Nos casos onde é necessário um código sequencial, eu crio um segundo campo,
e alimento ele via AFTER INSERT mas chamando um segundo generator, assim ele
só será incrementado quando o usuário confirmar a operação após ter certeza
que não ocorrerá algum erro na inclusão.

[]´s

Kléber Caneva



----- Original Message ----- 
From: "Eduardo Jedliczka (TeamFB)" <jedyfb em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 12:24 PM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


hehehe... só por curiosidade, nos seus testes, alguém desistiu, cancelou ou
deu rollback nos valores gerados ???

Pensa comigo, na vida real, as coisas "não são" exatamente como nós
imaginamos... muita coisa acontece entre um "post" dentro de bloco
try...except e um hard-commit no banco de dados....

Não quero dizer que GENERATORS não prestam (longe de mim tal afirmação),
pois eles são a forma mais eficiente de "construir" uma chave única, só que
eles PODEM NÃO SER CONFIÁVEIS para seqüências ininterruptas...
(principalmente quando o usuário PRECISA saber qual o número gerado para
"conferir".

[s]


======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================

----- Original Message ----- 
From: "Anticlei Scheid" <cleischeid em yahoo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 12:06 PM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


Existe sim !!!

    Sempre utilizei os GENERATORS para chaves sequenciais e nunca tive
problemas, mas "fiquei com a pulga atrás da orelha" e decidi fazer um teste.
    Fiz um teste com uma aplicação gerando identificador sequencial
utilizando o GENERATOR no FB 1.5 com código protegido por blocos try..except
e try..finally e com o controle da transação. A aplicação gera registros em
intervalos configuráveis (em milisegundos) utilizando um GENERATOR para a
chave sequencial.
    Rodei 12 instâncias da aplicação ao mesmo tempo e configurei intervalos
variados para cada instância entre 500 e 600 milisegundos para que
ocorressem conflitos.
    Resultado: foram 4321 registros em aproximadamente 8 minutos sem nenhum
conflito de chave, ou seja, funcionou perfeitamente e com segurança.
    Obs: fiz um teste idêntico utilizando o MAX e é lógico que não deu
certo. Somente duas instâncias e já deu conflito conforme já tinha falado
antes.
    Se quiserem os fontes do teste para avaliar basta me pedir.
    E é lógico que se houver alguma falha que invalide meu teste, por favor
gostaria de ser o primeiro a saber.

Abraço a todos.

----- Original Message ----- 
From: "Eduardo Jedliczka (TeamFB)" <jedyfb em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 11:11 AM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


Bom, deixa eu por lenha da fogueira...

NÃO EXISTE SOLUÇÃO MÁGICA PARA NÚMEROS ININTERRUPTOS SEQUENCIAIS EM BANCO DE
DADOS RELACIONAIS.

Se você precisa se preocupar em "Sequencias Reais" em Notas Fiscais,
Cheques, e outros documentos deste porte, não adianda usar um
Sequence/Generator (nem no Oracle!!!), e tem que se ter muito sangue frio
para se utilizar "Select Max" em aplicações com mais que meia-dúzia de
operadores simultâneos.

Há paliativos "universais" para se resolver isto, entre eles uma "tabela de
gabarito" contendo (dependendo do caso) os "furos" e códigos ainda não
utilizados na emissão de documentos. Só vale lembrar, que para isto
funcionar, é necessário que esta tabela esteja numa transação "diferente"
(auto-commit, read-commited, with lock), onde só será consultada e alterada,
após o Commit da transação principal.

Também há soluções "exclusivas" do InterBase/FireBird... pode-se utilizar
"eventos" para capturar qual foi o último número de nota/cheque emitido e
assim criar uma sequencia sem falhas.

(Cantu que tal acrescentar este assunto na temática das palestras do 3º FDD
???)

 ======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================

----- Original Message ----- 
From: "Andrei Luís" <compuvale.software em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 9:17 AM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


Uma solução que se usava bastante na época do Clipper, era de uma tabela a
parte para guardar a sequência. Ex.:

Tabela     Campo   Sequencia
Clientes    ID            1
Produtos  ID            4
Pedidos   ID             10
...

Acho que saiu na Clube Delphi ou na SQL Magazine uns meses atras uma solução
parecida com essa, o título era algo como: "Campos auto-incremento para
qualquer BD". O colunista usou Firebird para mostrar os exemplos.

[]
Andrei


Em 06/04/06, Luis Asensio - Control/P Sistemas <luis em controlp.com.br>
escreveu:
>
> Boa dia a todos!!!
>
>        Essa semana fiz um teste comparando a eficiencia do auto-incremento
> das duas formas descritas. Uma realizando um MAX na tabela e outra usando
> a
> Generator. O teste foi bem simples: Rodei uma aplicatico no qual me inflou
> uma determinada tabela em 100.000 e inserir um cronometro interno para
> poder
> comparar o tempo. O resultado foi uma diferença de 3:00 min, a mais para o
> Trigger com o MAX. O Generator com muitos registros é mais rápido acima de
> 20.000 registros. Concordo que para um sequencial integro o MAX minimiza o
> problema.
>
>
> Abraços
>
>
> Luis Asensio
> Control/P Sistemas
> Setor de Desenvolvimento
> luis em controlp.com.br
> http://www.controlp.com.br
>
> -----Original Message-----
> From: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> On Behalf Of Listas - VirtualComp
> Sent: quarta-feira, 5 de abril de 2006 18:12
> To: Carlos H. Cantu; FireBase
> Subject: Re: [firebase-br] Aos interessados: Omelhor
> Autoincrementosequencial
>
> CREATE TRIGGER GER_COD_CLIENTES FOR CLIENTES ACTIVE BEFORE INSERT POSITION
> 0
> AS declare variable cod integer; begin  select max(codigo_cli)  from
> clientes  where clientes.empresa_cli = new.empresa_cli  into :cod;  if
> (cod
> is null) then
>     cod = 0;
> new.codigo_cli = cod + 1;
> end
>
>
> com essa trigger eu tenho 3..4 empresas cadastradas cada empresa tem uma
> sequencia clientes e nunca da problema...
>
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.385 / Virus Database: 268.3.5/302 - Release Date: 5/4/2006



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/protected_email/imail/imail.cgi?+_u=kdcc&_l=1,1144337179.133631.1110.morondava.terra.com.br,11125,Des15,Des15

Esta mensagem foi verificada pelo E-mail Protegido Terra.
Scan engine: McAfee VirusScan / Atualizado em 05/04/2006 / Versão:
4.4.00/4734
Proteja o seu e-mail Terra: http://mail.terra.com.br/




______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.385 / Virus Database: 268.3.5/302 - Release Date: 5/4/2006



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/protected_email/imail/imail.cgi?+_u=kdcc&_l=1,1144348263.130152.4498.vacoas.hst.terra.com.br,13448,Des15,Des15

Esta mensagem foi verificada pelo E-mail Protegido Terra.
Scan engine: McAfee VirusScan / Atualizado em 05/04/2006 / Versão: 
4.4.00/4734
Proteja o seu e-mail Terra: http://mail.terra.com.br/






Mais detalhes sobre a lista de discussão lista