[firebase-br] TClientDataSet + Generator

Eduardo Bahiense eduardo em icontroller.com.br
Qua Out 29 08:52:38 -03 2008


Sim. Não há forma segura de se atribuir chave primária sem generator.

Eduardo

Ulisses escreveu:
> Bom dia!
> 
> Esse Trigger pode gerar problema de concorrência?
> 
> CREATE OR ALTER TRIGGER TG_TBEMPRESA FOR TBSUATABELA
> ACTIVE BEFORE INSERT POSITION 0
> AS
> begin
> if (NEW.CHAVEPRIMARIA is Null) then
>  begin
>  Select Coalesce(Max(CHAVEPRIMARIA),0)+1 from TBSUATABELA
>  into NEW.CHAVEPRIMARIA;
>  end
> end
> ^
> 
> Obrigado.
> Ulisses
> 
> ----- Original Message ----- From: "Sandro" 
> <sandro_rebelo em ibest.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Wednesday, October 29, 2008 1:09 AM
> Subject: Re: [firebase-br] TClientDataSet + Generator
> 
> 
> Esse exemplo usa generator. Gostaria de saber como a função do Helio
> (HPensador) funciona.
> 
> Mas valeu mesmo assim.
> 
> Sandro
> 
> ----- Original Message ----- From: "Fausto" 
> <fausto.s.a em uol.com.br>
> To: <lista em firebase.com.br>
> Sent: Tuesday, October 28, 2008 11:25 PM
> Subject: Re: [firebase-br] TClientDataSet + Generator
> 
> 
> Fabrício Fadel Kammer escreveu:
>> Boa tarde à todos,
>>
>> Estou iniciando o desenvolvimento com TClientDataSet e gostaria de uma 
>> dica do pessoal que trabalha com esse componente.
>>
>> Até então só utilizei os componentes IBX para acesso ao firebird e os 
>> cadastros todos eram feitos com componentes TIBDataSet. Nesses 
>> componentes, para fazer a geração das chaves primárias eu utilizava a 
>> propriedade GeneratorField, a qual incrementava um generator no 
>> momento do Post no componente. Com TClientDataSet qual seria a melhor 
>> forma de se fazer essa mesma operação?
> Simples..
> Utilize esta função aqui.. ela também vai servir para múltiplas inserções:
> function RetunId(Tabela: string;DB:TSQLConnection): Integer;
> Var
>   SqlAux:TSQLDataSet;
> begin
>   SqlAux := TSQLDataSet.Create(nil);
>   SqlAux.Connection := DB;
>   SqlAux.CommandText := 'SELECT GEN_ID(GEN_' + Tabela + '_ID, 1) AS
> CODIGO FROM RDB$DATABASE';
>   SqlAux.Open;
>   Result := SqlAux.FieldByName('CODIGO').asInteger;
>   SqlAux.Close;
>   SqlAux.Destroy;
> end;
> Agora você a chama no evento BeforePost do seu ClientDataSet:
> procedure TSeuDM.SeuClientDataSetBeforePost(DataSet: TDataSet);
> begin
>   if SeuClientDataSet.State = dsInsert then
>     SeuClientDataSetSEUCAMPO.AsInteger := ReturnId('SuaTable',SuaConexao);
> end;
> 
> Em tempo, a idéia deste código foi retirada do livro *Firebird Essencial*





Mais detalhes sobre a lista de discussão lista