[firebase-br] Por favor uma ajuda em Reset Automático de Generator

Gladiston Santana gladiston em vidy.com.br
Sex Jan 25 10:07:22 -03 2019


Olá Carlos,

Para usar uma procedure usando um gererator é tranquilo e confiável.
Eu fazia assim:
create or alter procedure SP_FAZ_ALGO (
    P_PARAM1 VARCHAR(30),
    P_PARAM2 VARCHAR(30),
    P_PARAM9 VARCHAR(30)= '')
returns (
    RESULT_VALUE bigint)
as
declare variable NEXT_ID bigint;
BEGIN
  RESULT_VALUE=-1;
  -- PEGA A PROXIMA SEQUENCIA
  SELECT GEN_ID(GEN_OPE_EC,1) AS VALOR FROM RDB$DATABASE  INTO : NEXT_ID ;
  -- (...) FAZ O QUE PRECISA FAZER COM ESSE NEXT_ID E NO FINAL...
  IF SUCESSO THEN
  BEGIN
    RESULT_VALUE=:NEXT_ID;
  END
  SUSPEND;
END

para utilizar no lado cliente:
var
  iNext_id:int64;
begin
(...)
query1.sql.text:='select result_value from sp_faz_algo(:p1,:p2,:p3);'
query1.open;
if (not query1.isemptty) then
begin
   iNext_id  :=query1.fieldbyname('next_id').AsLargeInt;
  // daqui em diante você reutiliza  iNext_id   pelo restante do programa.
end;

Observações:
#1 Generators não serão sequenciais, haverá furos e você deverá aceitar
isso, esses furos acontecerão porque um sequenciamento que já foi
requisitado não volta atraz, daí o programa falhe e você irá repetir a
operação e pegará uma nova sequencia.
#2 Se estiver usando FB3, ao inves de generators recomendo criar campos de
autoincremento porque fica mais facil a manutibilidade do código e
inclusive se precisar dar um "reset" para restabelecer os contadores poderá
fazer por meio de programação usando select(max)+1 com update.

[]´s
G.

Em qui, 24 de jan de 2019 às 18:32, Antonio Carlos <
a.lima.silva em terra.com.br> escreveu:

> Pessoal tenho a seguinte situação, umas 100 maquinas que geram pedidos
> durante o horário comercial em um banco Firebird 2.5 Superclassic rodando
> em Linux.
>
> Esses pedidos recebem um incremento numérico que faz parte da PK da tabela
> de um Generator.
>
> Esse incremento numérico tem que ficar limitado a 9.999.999 e quando
> chegar a esse valor o Generator ser reiniciado.
>
> Como o Generator não tem um evento After ou Before não tenho como
> automatizar ali.
>
> A aplicação desktop recebe o numero ao fazer a gravação do insert nessa
> tabela ou seja isso ocorre na aplicação e não diretamente no banco através
> de um 'SELECT GEN_ID(GEN_OPE_EC,1) AS VALOR FROM RDB$DATABASE'
>
> Verifiquei que mesmo realizando explicitamente um start transaction com um
> commit ou rollback o generatror é incrementado.
>
> Dai que pensei em algo que dá certo em laboratório mas não tenho como
> testar havendo muitas requisições concorrentes.
>
> Criei uma Store Procedure que é chamada dentro de um contexto de transação
> explicita, e ao ser chamada o select no generator e o retorno é retornado a
> aplicação.
>
> Na mesma Stored Procedure o valor retornado é testado e se for o valor
> máximo, através de uma transação autônoma o generator é reiniciado.
>
> Isso em ambiente de teste funciona, mas por absoluta inexperiência não sei
> se em ambiente real vai funcionar.
>
> Esse sistema antes realizada o incremento atraves de uma consulta ao campo
> de uma tabela e através de triggers nesse campo gerava esse controle,
> entretanto AS vezes ocorria violação da KEY e ao mudar para Generator
> deixou de ocorrer.
>
> O que os colegas poderiam me orientar por favor.
>
> Obrigado
>
> Antonio Carlos.
>
>
>
>
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>


-- 
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.

Em março de2018 migramos com sucesso para a nova versão da ISO 9001.

Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.



Mais detalhes sobre a lista de discussão lista