Pegar valor de generator do firebird com Delphi

15/09/2013

0

Bom dia a todos,
bem, estou criando uma aplicação e estou com um pequeno probleminha. Vou simplificar aqui para ficar mais fácil o entedimento. Vou postar só o escopo mais breve possível. Tenho duas tabelas:
+Aluno
-ID (Intger, autoincrementa com um trigger before insert com um generator)
-Nome (Varchar )

e outra tabela:
+Contatos
-ID (Integer, chave estrageira com a ID da tabela aluno)
-Nome_contato (Varchar)

O problema é o seguinte; Quando eu mando cadastrar o aluno pelo Delphi, eu preciso que estas duas tabelas sejam populadas. Primeiramente eu populo a tabela "Aluno", e logo em seguida tenho que popular a tabela "Contatos".. Mas para povoar a tabela "Contatos" eu preciso do ID que o triigger acabou de gerar. Pesquisei pela internet e vi exemplos de fazer um select, mas vejo que pode dar problema caso haja um alto fluxo de dados no sistema. A questão é: Como eu pego o valor do campo Id que acabou de ser gerado?

Desde já agradeço, Abraço a todos.
Isaías Silva

Isaías Silva

Responder

Posts

15/09/2013

Thiago Porto

você pode usar um componente qualquer para executar o seguinte sql:
select gen_id(nome_generator,1) from rdb$database


o gen_id(nome_generator,1) ele quer o nome do generator que você precisa do valor e o 1 é o valor a ser incrementado.
Responder

15/09/2013

Isaías Silva

Olá Tiago, tenho só uma dúvida:
Você sugeriu que fosse mais ou menos assim: Povoa tabela Aluno > Faz o select (que você postou) > Povoa tabela Contato com a ID que o select retornou...Perfeito, isso mesmo que preciso..
Mas Suponha a seguinte situação:2 secretarias estão cadastrando 2 alunos distintos...
Secretaria 1 Povoou Tabela "aluno" (ID =1)
Secretaria 2 Povoou Tabela "aluno" (ID=2)
Secretaria 1 fez o select ( Aqui irá retornar o valor 2 ou 1?) o certo seria o valor 1
Secretaria 2 fez o select ( Aqui irá retornar o valor 2 ou 1?) o certo seria o valor 2
Secretaria 1 povoa tabela Contato
Secretaria 2 povoa tabela Contato

Abraço.
Responder

17/09/2013

Rafael Brendolan

Isaías, esta questão o Banco FireBird que resolve. O que você tem que fazer é na hora de gerar o ID, é disparar o Select no DataSetProvider no evento BeforeUpdateRecord e guardar ele em uma variável para usar nas outras tabelas, porque cada vez que disparar o SELECT ele irá gerar outro ID.
Questão de ter 2, 3 ou mais computadores não importa, como é Cadastro cada conexão ao banco irá gerar um ID diferente, mesmo executando na mesma hora.
Responder

17/09/2013

Deivison Melo

function GeneratorID (aName: string; Connection: TSQLConnection; Incrementa: Boolean): integer;


function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
else
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;
Responder

18/09/2013

Isaías Silva

Pessoal é isso mesmo.. Consegui resolver...
No Before UpdateRecord do meu DataSetProvider eu executei esse select >> select gen_id(nome_generator,1) from rdb$database

Isso mesmo que precisava.. Obrigado a todos!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar