[firebase-br] AutoIncremento

Josauro S.J. josauro em casasoft.inf.br
Ter Out 5 09:09:01 -03 2004


Ë nos meus casos (formas que padronizo os cadastros) todo código é gerado no inicio do processo, não é nada complicado com o processo já descrito, é um modelo só para todas as operações, por enquanto é o que tenho mais me acertado, mas tudo pode ser aperfeiçoado.

Abraços.
Josauro S.J.
Diretor
josauro em casasoft.inf.br
----- Original Message ----- 
From: Nilton Souza 
To: FireBase 
Sent: Monday, October 04, 2004 6:19 PM
Subject: Re: [firebase-br] AutoIncremento


Olá Josauro,

Exato !!!

Eu estou falando do momento em que o registro é efetivado no banco de dados.
Enquanto você estiver INCLUINDO (inserindo os dados em uma telinha qualquer)
você não tem o código definitivo e nem precisa dele até então.

Em situações onde você precisa fazer um master-detail vc pode criar uma
chave temporária, eu geralmente uso um número negativo para evitar conflitos
com os demais registros. No evento BeforePost você pode trocar essa chave
temporária pela chave definitiva através do modelo que apresentei
anteriormente. PORÉM ISSO SÓ FUNCIONARÁ se vc estiver usando transações
EXPLÍCITAS e não ímplicitas, ou seja, a opção AutoCommit deve estar
desabilitada e vc deve fazer Commit ou Rollback de seus cadastros.

[]'s
Nilton Souza

----- Original Message -----
From: "Josauro S.J." <josauro em casasoft.inf.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 04, 2004 5:52 PM
Subject: Re: [firebase-br] AutoIncremento


Bom no teu caso deve ser porque voce pega o proximo e ja inclui o registro
do cliente, e nao no inicio do cadastro, ou seja o cliente so sabe o proximo
apos salvar o registro..
Josauro S.J.
Diretor
josauro em casasoft.inf.br
----- Original Message -----
From: Nilton Souza
To: FireBase
Sent: Monday, October 04, 2004 4:27 PM
Subject: Re: [firebase-br] AutoIncremento


Olá Josauro,

Não existe como outro usuário pegar o mesmo número a não ser que você esteje
usando o modelo de isolamento transacional DirtyRead ao invés do
ReadCommited que é mais comum e aconselhável para a maioria das aplicações.

Pode fazer assim que eu garanto, uso isso à mais de quatro anos e não só no
FB como também no Informix, SQL Server, etc...

[]'s
Nilton Souza

----- Original Message -----
From: "Josauro S.J." <josauro em casasoft.inf.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 04, 2004 4:15 PM
Subject: Re: [firebase-br] AutoIncremento


Nilton o problema sera que outro usuario pegara o mesmo ID pois ainda nao
houve o commite, sugiro que faça um commite logo apos pegar o ID e caso seja
dado um rolbak na transação faça um procedimento para devolver o
codigo...voce tera menos codigos perdidos..

Josauro S.J.
Diretor
josauro em casasoft.inf.br
----- Original Message -----
From: Nilton Souza
To: FireBase
Sent: Monday, October 04, 2004 4:05 PM
Subject: Re: [firebase-br] AutoIncremento


Olá Evandro,

Eu uso os generators em tabelas onde não existe nenhum problema em perder a
numeração e quando existe a necessidade de manter a sequência da numeração
eu utilizo uma tabela de controle a qual submeto ao contexto transacional,
assim ela irá ficar em "lock" até que seja efetuado um commit ou rollback
evitando que outro usuário pegue o mesmo número. Porém tome cuidado com isso
pois você pode facilmente gerar queda de performance ou até deadlock's,
sugiro que você reduza ao máximo o tempo de vida de suas transações.

A estrutura da minha tabela de controle é mais ou menos assim:

CREATE TABLE Tabelas (
    Nome VARCHAR(30) NOT NULL,
    ProximoId INT DEFAULT 1 NOT NULL
);

ALTER TABLE Tabelas ADD Primary Key PK_Tabelas (Nome);


Então eu tenho uma SP chamada sp_proximo_id com essa estrutura:

set term !! ;
create or alter procedure sp_proximo_id(TabNome varchar(30))
returns(Id integer)
as
begin
  select ProximoId
  from TABELAS
  where upper(Nome) = upper(:TabNome)
  into :Id ;

  if (:Id is not null and :Id > 0) then
  begin
    update TABELAS
    set ProximoId = ProximoId + 1
    where upper(Nome) = upper(:TabNome);
  end
  else
    Id = -1;

  suspend; /* USE O SUSPEND SE VC QUISER PEGAR O ID ATRAVÉS DE SELECT's */
end !!
set term ; !!

Exemplo de utilização:

SQLConnection.StartTransaction(TransDesc);

     >> Executa SP sp_proximo_id e pega o ID
          (observe que a chamada é feita dentro do escopo transacional)

     >> Inclui o cliente

SQLConnection.Commit(TransDesc);

[]'s
Nilton Souza



----- Original Message -----
From: "Evandro Bastiani" <evandrobastiani2 em hotmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 04, 2004 3:38 PM
Subject: [firebase-br] AutoIncremento


Até agora, depois de ver tantas opiniões não cheguei a uma conclusão de qual
forma melhor de se fazer um numero autoincremental.
Gerar manualmente acrescentando mais 1 a variavel não me agradou pelo fato
de correr um grande risco de 2 usuarios inserir na mesma hora.

Trigger no After insert tem um problema, que é a perda do Numero caso
desfaça a operação de inclusão.

O correto seria um generator Before Post, só que como vou conseguir
gerenciar o gatilho no Post somente quando for Inclusão, e não para
alteração?
Idéias serão bem-vindas!!!
______________________________________________
FireBase-BR (www.firebase.com.br)
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br



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

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



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

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



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



Mais detalhes sobre a lista de discussão lista