[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