Fórum Campos autoincremente com Firebird ? #52749
12/09/2005
0
Estou com um problema, usando Clientdataset e FireBird
Para gerar o campo Código (índice) da tabela uso uma Trigger:
AS BEGIN
IF(NEW.´CD_SAIDA´ IS NULL) THEN NEW.´CD_SAIDA´ = GEN_ID(´GEN_NFVENDAS_CD_SAIDA´,1);
END
e chamo ela usando este comando:
dmvda.CDSOrcamentoCD_ORCAM.AsInteger := dm.NewID(´GEN_NOTAORC_CD_ORCAM´);
uso esta função para evitar aquela mensagem que um campo obrigatório não foi preenchido e para fazer o relacionamento Mestre detalhe .
Só que se duas pessoas adicionar uma venda ao mesmo tempo ele assume o mesmo número dando erro no sistema!
Alguém tem uma solução melhor para usar campos auto increment no Firebird com Clientedataset ?
Desde já agradeço
Hugo Fabrício
[color=green:246588ba21]Movido de Delphi para Interbase/Firebird[/color:246588ba21]
Hugofab
Curtir tópico
+ 0Posts
12/09/2005
Vinicius2k
Qual o código da sua função NewID?
Vc precisa utlizar a GEN_ID(NOME_DO_GENERATOR, [color=red:0e27b1a1e4][b:0e27b1a1e4]1[/b:0e27b1a1e4][/color:0e27b1a1e4]) dentro dela, para que o generator seja incrementado. Isto torna impossível a duplicação de chave. Atenção: Se vc chamar a função em algum local aonde o usuário ainda possa desistir da inserção, o generator será incrementado e o número será ´perdido´.
Usando a função GEN_ID diretamente a trigger perde a utilidade pois o NEW.´CD_SAIDA´ nunca será nulo.
Vc não precisa utilizar isto para a mensagem de campo não preenchido. Basta setar a propriedade [b:0e27b1a1e4]Required[/b:0e27b1a1e4] do TField que recebe o autoincremento para [b:0e27b1a1e4]False[/b:0e27b1a1e4] (no ClientDataSet e no SQLDataSet/SQLQuery). A trigger irá fazer o trabalho dela porque o valor recebido por ´CD_SAIDA´ foi nulo.
Para visualizar o código que foi atribuído ao ´CD_SAIDA´ após a inserção, vc deve dar um refresh no ClientDataSet.
T+
Gostei + 0
13/09/2005
Hugofab
function Tdm.NewID(Generator: String): Integer;
begin
Q_ID.Close;
Q_ID.Sql.Clear;
Q_ID.sql.Add(´Select gen_id(´+Generator+´, 1) from RDB$DATABASE´);
Q_ID.Open;
if Q_ID.fields[0].AsInteger <= 0 then
Result := Q_ID.fields[0].AsInteger + 1
else
Result := Q_ID.fields[0].AsInteger;
end;
A Função é a que você me passou, mas a questão do campo requerido eu já tinha feito desta forma e dava problemas com os relacionamentos quando gravava perdia o Relacionamento, pois não gravava a chave no detalhe.
Interessante e que já aconteceu varias vezes de pegar o mesmo número!
Vou fazer mais alguns testes para tentar detectar o que esta acontecendo
Obrigado pela atenção
Hugo Fabrício
Gostei + 0
13/09/2005
Vinicius2k
Nestes casos setar o Required não resolve.
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)