[firebase-br] Controle de ID sem generator

Fabiano Segal fabianosegal em gmail.com
Sex Out 31 10:04:32 -03 2008


Amigo,

Se voce estiver desenvolvendo aplicação com interface em Delphi,

Dentro da SQL onde voce vai inserir os dados na tabela coloque por exemplo

qConsulta_ID := ' Select genid( ' + tabela + ',1) from RDB$DATABASE ';

qInsert.SQL.Text := ' Insert into tabela (:id,:....... (campos a mais)) '
qInsert.exeqSQL;


Isso resolve o seu problema com generatos CASO voce precise retornar de
imediato o codigo gerado à interface.
Caso nao precise, voce cria o generator dentro do banco e trigueriza o cara,
no afterinsert da tabela. isso resolve pro resto da sua vida e a sua roda
vai rodar legal.


Espero ter ajudado.



*FABIANO SEGAL* – fabiano.almeida em montreal.com.br
Analista de Sistemas | Diretoria Regional MG
+ 55 31 3280-6000 – Ramal 7635
+ 55 31 9851-1119 – Celular

*MONTREAL INFORMÁTICA | MINAS GERAIS*
Integrando Tecnologia aos Negócios
www.montreal.com.br


2008/10/30 HPensador <hpensador em gmail.com>

> Boa tarde Colegas!
>
> Na thread do TClientDataSet + Generator respondi que não utilizava
> generator mais sim um método próprio que gerava a nova chave para mim. O
> colega Sandro levantou a questão de como eu estava fazendo o controle de
> insersões simultâneas. Eu não faço nenhum tratamento e para minha sorte até
> o presente momento não tive nenhum problema. Vou colocar abaixo o código do
> método (procedure) e a idéia por trás da mesma e caso algum colega tenha
> alguma idéia/sugestão de melhoria para o mesmo, manda aí..
>
> Tenho uma tabela (Controle_ID) com a seguinte estrutura:
>
> Controle_ID (
>  Tabela varchar(30),
>  id_atual integer
> )
>
> e a seguinte SP
>
> CREATE PROCEDURE NOVO_CODIGO (
>    tabela varchar(30))
> returns (
>    proximo_codigo integer)
> as
> declare variable codigo_atual integer;
> begin
>  --Recupera o valor atual do código
>  select id_atual from controle_id c
>  where (c.tabela = :tabela)
>  into :codigo_atual;
>
>  --Verifica se o valor do código é nulo
>  if (:codigo_atual is null) then
>  begin
>    proximo_codigo = 1;
>    insert into controle_id (tabela, id_atual)
>    values (:tabela, :proximo_codigo);
>  end
>  else
>  begin
>    proximo_codigo = codigo_atual + 1;
>    update controle_id set id_atual = :proximo_codigo
>    where (tabela = :tabela);
>  end
> suspend;
> end
>
>
> ______________________________________________
> 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://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista