DBExpress não atualiza campo Generator!!!!

Delphi

10/11/2003

Olá pessoal!

Tenho uma aplicação que acessa uma tabela, que contém um campo numérico ao qual se agrega um generator. Cada vez, que em minha aplicação delphi, eu gravo um registro, o dado deste campo não aparece se não for fechada a tabela e aberta novamente.

O que pode ser isto?

Obrigado pela compreesão


Goncalves

Goncalves

Curtidas 0

Respostas

Afarias

Afarias

10/11/2003

vc está usando triggers para atualizar o generator certo???

sendo assim, tudo está ocorrendo normalmente. como o valor do generator é atualizado no servidor, não tem como o ´cliente´ saber deste valor sem ´perguntar´ novamente ao servidor (fechando e abrindo a quary).

Esta forma de uso não está de acordo com o q a maioria pretende colocar em suas aplicações (até pq muitos estão vindo de um ambiente baseado em arquivos e não sistemas C/S)

Se vc precisa saber o valor do GENERATOR sem precisar carregar os dados de volta do servidor, faça uma query para buscar este valor antes ou durante a inserção do registro (ex: onNewRecord, beforePost, ...)

uma função útil q vc teria em seu sistema seria algo como::

function GetNewID(AGenerator: string): Integer;
const
SQLText = ´select gen_id(¬s, 1) from rdb$database´;
begin
Result := 0;
with SeuComponenteDeSQL do
try
SQL.Text := Format(SQLText, AGenerator); // ou CommandText
{ abra sua transação }
{ execute sua query }
Result := Fields[0].AsInteger;
finally
{ commit na transação }
end;
end;


e ai vc pode usar para qualquer generator/campo, ex::

MeuDataSet.FieldByName(´meuCampoCodigo´).AsInteger := GetNewID(´meuGenerator´);



T+


GOSTEI 0
Otorquati

Otorquati

10/11/2003

vc está usando triggers para atualizar o generator certo??? sendo assim, tudo está ocorrendo normalmente. como o valor do generator é atualizado no servidor, não tem como o ´cliente´ saber deste valor sem ´perguntar´ novamente ao servidor (fechando e abrindo a quary). Esta forma de uso não está de acordo com o q a maioria pretende colocar em suas aplicações (até pq muitos estão vindo de um ambiente baseado em arquivos e não sistemas C/S) Se vc precisa saber o valor do GENERATOR sem precisar carregar os dados de volta do servidor, faça uma query para buscar este valor antes ou durante a inserção do registro (ex: onNewRecord, beforePost, ...) uma função útil q vc teria em seu sistema seria algo como:: function GetNewID(AGenerator: string): Integer; const SQLText = ´select gen_id(¬s, 1) from rdb$database´; begin Result := 0; with SeuComponenteDeSQL do try SQL.Text := Format(SQLText, AGenerator); // ou CommandText { abra sua transação } { execute sua query } Result := Fields[0].AsInteger; finally { commit na transação } end; end; e ai vc pode usar para qualquer generator/campo, ex:: MeuDataSet.FieldByName(´meuCampoCodigo´).AsInteger := GetNewID(´meuGenerator´); T+


A. Farias, estou usando a função conforme vc descreve acima, porém encontrei um erro quando uso o Delphi para incluir um registro, nos primeiros 9 registros a função retorna uma mensagem de erro dizendo o seguinte ´ = não é um valor de ponto flutuante valido´, depois que o generator atinge o valor 10 ele funciona corretamente.
Você saberia dizer o porquê?
Eu utilizo o Delphi 6 e Firebird 1.5.1 e usando a função apresentada pelo Carlos Cantu na ClubeDelphi n° 47 tambem dá o mesmo erro.


GOSTEI 0
POSTAR