[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