Fórum inserir no detail #373040

03/08/2009

0

Gostaria de inserir dados com insert into master detail, nao estou conseguindo inserir os dados do datail alguem pode me ajudar
Esou usando clientdataset e firebird delphi7


Marcio_souzapinto

Marcio_souzapinto

Responder

Posts

03/08/2009

Vmlima

Caro amigo...
Por favor explique direito o que vc quer fazer...
Você quer inserir na tabela detalhe ou na mestre?
Ja possui a informação da Mestre?
Está querendo rodar isso onde?
Usando quais componentes?


Att.


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

gostaria de inserir no detail
to usando os componentes sqldataset com clientdataset e fazer a transacao gerando id autoincremento, inserindo na master e depois pegando o valor do id e inserir na tabela detail


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

gostaria de inserir no detail
to usando os componentes sqldataset com clientdataset e fazer a transacao gerando id autoincremento, inserindo na master e depois pegando o valor do id e inserir na tabela detail


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

gostaria de inserir no detail
to usando os componentes sqldataset com clientdataset e fazer a transacao gerando id autoincremento, inserindo na master e depois pegando o valor do id e inserir na tabela detail


Responder

Gostei + 0

03/08/2009

Vmlima

Então o seu problema é pegar o ID da tabela mestre...
Realmente isso é complicado (não tanto assim tbm) quando se usa autoincremento...
Se o valor so autoinc aparece no seu Mestre quando vc posta a inserção fica fácil, agora se não aparece vc terá que mudar de estratégia e usar um gerador ou sequencia para pegar esse ID...

Você pode usar uma função do tipo

function TDM_Main.GetCodigo(Generator : string): integer;
begin
   Qry.Close;
   Qry.SQL.Text:=(´SELECT GEN_ID(´+Generator+´,1) as codigo FROM RDB$DATABASE;´);
   Qry.Open;
   result := QryCODIGO.AsInteger;
end;

Utilize esse valor que retorna da função, para o ID do seu mestre e pra FK do seu detalhe...
*Isso é apenas uma ideia, e eu utilizo assim sem problemas...


Att.


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

entao minha duvida é realmente por isso, exemplo:
se eu fizer assim e a passoa desistir da inclusao fica este numero de id gerado por issso queria fazer isert into na tabela master e depois na detalhe (banco de dados firebird) pode ser tbem por stored procedure


Responder

Gostei + 0

03/08/2009

Vmlima

é o seguinte...
Pra não ´pular´ códigos, coloque essa função antes do post (beforepost), ou no botão que está confirmando a inserção...
Mas não vejo problemas em pular os códigos... se for a PK ficará em sequencia no banco e não perderá desempenho com isso...
Mesmo por procedure ou trigger vc não conseguirá pegar essa ID logo após a inserção do mesmo...
Se vc precisa desse id no momento da inserção, acho eu que é a melhor maneira de fazer esse autoincremento... e já vi várias pessoas tbm falando que é a melhor maneira...

Att.


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

estou tentando fazer com insert into e returning, este returning retorna o id quando inserimos na tabela master só na to conseguindo o insert into no detail atraves de procedure


Responder

Gostei + 0

03/08/2009

Vmlima

Voce está colocando o ID nesse insert?

insert into tabela (IDTABELA, CAMPO2) values (Null, VALOR2)...

tente fazer isso sem o ID... e tente tbm com o ID recebendo Null...
´insert into tabela (CAMPO2) values (VALOR2)´

E como funciona esse returning???


Responder

Gostei + 0

03/08/2009

Marcio_souzapinto

eu faco o insert assim

create procedure upd_ins_clientes
( id integer,
nome varchar(50),
nascimento date,
sexo char(1))
as
begin
insert into clientes (
nome,
nascimento,
sexo)
values (
:nome,
:nascimento,
:sexo)
returning into :idgerado;
end

retorna o id ja incrementado dai pra frente que eu gostaria de fazer inserir o detail o idgerado + os dados colocados no clientdataset


Responder

Gostei + 0

04/08/2009

Vmlima

Isso realmente funciona?

Ele retorna o ID gerado?

Se sim é só fazer um insert na tabela detalhe colocando o ID que retornou como ID_CLIENTE no detalhe...

Att.


Responder

Gostei + 0

04/08/2009

Vmlima

Opa... esqueci de algo

Com o ClientDataSet, voce da um CDS.Insert, insere os valores nos campos (não esqueça do ID_CLIENTE) e da um CDS.post, e CDS.ApplyUpdates... e estará no seu detalhe
Você ja fez todas as conexões no CDS? Já ve os campos da tabela no FieldsEditor?

Att.


Responder

Gostei + 0

04/08/2009

Marcio_souzapinto

o returning funciona muito bem nestes casos de retorno do id incrementado, mas quando vou salvar os dados no banco(firebird) os dados do master e o detalhes ja estao no clientdataset, ai que vou salvar com insert into na tabela master depois salvar os dados da tabela detalhe, da pra fazer um loop e inserir os detalhe usando este id retornado pelo banco.
Será que tem outra forma de fazer isto por procedure no banco


Responder

Gostei + 0

05/08/2009

Marcio_souzapinto

Obrigado pela atenção, consegui resolver fazendo um loop no clientdataset aproveitando o id retornado pelo insert na tabela mestre


Responder

Gostei + 0

05/08/2009

Vmlima

ok, coloque resolvido no tópico
abraço


Responder

Gostei + 0

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

Aceitar