inserir no detail
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
Esou usando clientdataset e firebird delphi7
Marcio_souzapinto
Curtidas 0
Respostas
Vmlima
03/08/2009
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.
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.
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
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
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
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
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
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
GOSTEI 0
Vmlima
03/08/2009
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
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.
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.
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
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
GOSTEI 0
Vmlima
03/08/2009
é 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.
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.
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
GOSTEI 0
Vmlima
03/08/2009
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???
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???
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
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
GOSTEI 0
Vmlima
03/08/2009
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.
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.
GOSTEI 0
Vmlima
03/08/2009
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.
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.
GOSTEI 0
Marcio_souzapinto
03/08/2009
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
Será que tem outra forma de fazer isto por procedure no banco
GOSTEI 0
Marcio_souzapinto
03/08/2009
Obrigado pela atenção, consegui resolver fazendo um loop no clientdataset aproveitando o id retornado pelo insert na tabela mestre
GOSTEI 0
Vmlima
03/08/2009
ok, coloque resolvido no tópico
abraço
abraço
GOSTEI 0