[firebase-br] Aos interessados: Omelhor Autoincrementosequencial

Francisco Thiago jeandeadlucky em yahoo.com.br
Qui Abr 6 13:51:39 -03 2006


Eis a minha solução.

Escrevi este código após assistir a palestra do Lichot do DDD que teve em 
Ribeirão Preto ano passado.

Ele, o Bruno, escreveu um sequenciador também. talvez o código até seja o 
mesmo.. mas enfim. cá está


O código que eu escrevi está ai em baixo...
O único problema é se não cancelarem o número... Algo como a máquina travar 
e etc.
Pra resolver isso, eu escrevi um form, onde o índivíduo controla a númeração 
a ser reaproveitada.


[]'s


Francisco Thiago de Almeida
Enter & Plug Informática
Divisão: Desenvolvimento e Banco de dados
Franca / SP
msn: thiago em enterplug.com.br
http://enterplug.no-ip.com/sistema_ctrc/


//*** SQL de pesquisa em cdsCanceled_Generator

select min(CCLG_GEN_ID) AS CCLG_GEN_ID
     , CCLG_GEN_NAME
from CANCELED_GENERATOR
where CCLG_GEN_NAME = :TableName
  and EMPR_CODIGO = :EMPR_CODIGO
group by CCLG_GEN_NAME

function TDmConnection.GetCanceledGenerator(const Usuario,
  Senha: WideString; GenName: String; Empresa: Integer): Integer;
var
  li_Tmp_Result :Integer;
  li_Apply      :Integer;
begin
  Result := -1;
  li_Tmp_Result := -1;
  li_Apply := 1;
  try
    try
      repeat
        if cdsCanceled_Generator.Active then
          cdsCanceled_Generator.Close;
        cdsCanceled_Generator.Params[0].AsString := UpperCase(GenName); // o 
nome do generator a ser recuperado
        cdsCanceled_Generator.Params[1].AsInteger := Empresa; //para sistema 
multi empresa
        cdsCanceled_Generator.Open;
        if Not cdsCanceled_Generator.Fields[0].IsNull then
        begin
          li_Tmp_Result := cdsCanceled_Generator.Fields[0].AsInteger;
          cdsCanceled_Generator.SetOptionalParam('USUARIO', Usuario, True); 
// questão de autenticacao. O sistema é via soap :D
          cdsCanceled_Generator.SetOptionalParam('SENHA', Senha, True);// 
questão de autenticacao. O sistema é via soap :D
          cdsCanceled_Generator.Delete; //tenta deletar o registro
          li_Apply := cdsCanceled_Generator.ApplyUpdates(0)
{
Se nao conseguir deletar, ou der um erro de DeadLock - o que é mais 
provavel - o Apply
retorna um número diferente de zero
}
        end;
      until (li_Apply = 0) or (cdsCanceled_Generator.Fields[0].IsNull); // 
se houve erro ou não retornou nenhum valor da tabela
      if li_Apply = 0 then
        Result := li_Tmp_Result;
    except
      on e: Exception do
      begin
        Result := -1;
      end;
    end;
  finally
    cdsCanceled_Generator.Close;
  end;
end;


//*** exemplo de uso

      li_Result := GetCanceledGenerator('gen_empr_conh_'+ 
IntToStr(Empresa),i);
      if li_Result < 0 then
        li_Result := GetGeneratorValue('gen_empr_conh_'+ IntToStr(Empresa)); 
//Retorna o valor do generator

//*** Script da tabela de generator cancelados.

CREATE TABLE CANCELED_GENERATOR (
    CCLG_GEN_NAME  D_NOME NOT NULL /* D_NOME = VARCHAR(50) */,
    CCLG_GEN_ID    D_INTEIRO NOT NULL /* D_INTEIRO = INTEGER */,
    EMPR_CODIGO    D_INTEIRO NOT NULL /* D_INTEIRO = INTEGER */
);




/******************************************************************************/
/****                             Foreign Keys 
****/
/******************************************************************************/

ALTER TABLE CANCELED_GENERATOR ADD CONSTRAINT FK_CCLG_EMPR FOREIGN KEY 
(EMPR_CODIGO) REFERENCES CAD_EMPRESA (EMPR_CODIGO)
  USING INDEX IDX_FK_CCLG_EMPR;


//*** O SQL para o cdsCanceled_Generator:

select min(CCLG_GEN_ID) AS CCLG_GEN_ID
     , CCLG_GEN_NAME
from CANCELED_GENERATOR
where CCLG_GEN_NAME = :TableName
  and EMPR_CODIGO = :EMPR_CODIGO
group by CCLG_GEN_NAME


		
_______________________________________________________ 
Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz. 
http://br.info.mail.yahoo.com/





Mais detalhes sobre a lista de discussão lista