Pegar valor de generator do firebird com Delphi
15/09/2013
0
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
Posts
15/09/2013
Thiago Porto
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.
15/09/2013
Isaías Silva
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.
17/09/2013
Rafael Brendolan
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.
17/09/2013
Deivison Melo
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;
18/09/2013
Isaías Silva
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!
Clique aqui para fazer login e interagir na Comunidade :)