FireDac MestreDetalhe Postgre

11/09/2015

0

Olá á Todos!
Caros,Estou á Dias, Tentando Fazer Um Mestre Detalhe Com Postgre e FireDac com CachedUpdates e Não Consigo! Gostaria da Ajuda de vocês Pois Não sei mais o que eu Faço!
Veja abaixo as configurações que Realizei:

São duas Querys:

1-UqInsereLancamento:
*SQL comand: select * from cartao_consumo_lancamento where id = :id
*CachedUpdates:=True;

2-UqInsereItensCartao:
*SQL comand:select * from cartao_consumo_lancamento_itens where id_cabecalho = :id
*ParamInput:ptInput
*DataType:ftInteger
*CachedUpdates:True;
*DetailFiels:id_cabecalho(nome do campo que está na tabela filho)
*IndexFieldNames:id_cabecalho
*MasterFields:ID ( chave primaria na tabela Pai)
*MasTerSource:DsLancamento(nome do DataSource ligado ao UqInsereLancamento)
*SchemaAdapter:fds_principal

No Evento AfterApplyUpdates do SchemaAdapte eu Coloquei:
UqInsereLancamento.CommitUpdates();
UqInsereItensCartao.CommitUpdates();

Para Inserir o Cabeçalho eu Coloquei:
//1-Insere o Cabeçalho Primeiro...
With DM.UqInsereLancamento5 do
Begin

Open();
Append;
DM.UqInsereLancamento5.FieldByName('id_checkin').Value := Dm.UqVerifaCheckin2id.Value;
DM.UqInsereLancamento5.FieldByName('id_atendente').Value := 0;
DM.UqInsereLancamento5.FieldByName('sub_total').Value := 0;
DM.UqInsereLancamento5.FieldByName('hora').Value := 0;
DM.UqInsereLancamento5.FieldByName('desconto').Value := 0;
DM.UqInsereLancamento5.FieldByName('acrescimo').Value := 0;
DM.UqInsereLancamento5.FieldByName('total').Value := 0;
vcabecalhoinserido := True;
End;

Para Inserir os Itens eu Coloquei:

//2-Depois Insere Os Itens Do Cabeçalho
With DM.UqInsereItensCartao do
Begin
Open;
Append;
FieldByName('id_produto').Value := Dm.UqPesquisaProdutoid.Value;
FieldByName('nome_produto').Value := Dm.UqPesquisaProdutodescricao.Value;
FieldByName('quantidade').Value := EdtQuant.Value;
FieldByName('valor_unitario').Value := EdtVlrUnit.Value;
FieldByName('valor_total').Value := EdtVlrTotal.Value;
FieldByName('obs').Value := '';
FieldByName('und').Value := EdtUnd.Text;
Post;
LimpaEditsVenda;
EdtCodProd.SetFocus;

End;

e No Botão Gravar Coloquei:

//executa o applyupdates no schemme adapter para aplicar as alterações nas duas querys
Dm.fds_principal.ApplyUpdates(0);

DM.UqInsereLancamento.Refresh;
DM.UqInsereItensCartao.Refresh;


Porém Ele da esse Erro na hora de inserir o Registro:
Cannot process - no parent row. Constraint

Não sei Mais o que eu Faço Alguém tem uma luz????
Josias Araújo

Josias Araújo

Responder

Post mais votado

17/08/2016

Bom dia, Josias!
Também quebrei a cabeça utilizando FireDAC em modo CachedUpdate ativo.
O que me ajudou bastante foi um vídeo do Alan Gomes:

http://alan-gomes.blogspot.com.br/2013/04/firedac-cadastro-mestredetalhe.html

Mas há um detalhe quando vc estiver construindo sua aplicação: SEMPRE, antes de fazer o Append no DataSet "Filho", faça um POST e depois EDIT no DataSet "Pai". Caso contrário, o erro será sempre o mesmo.
Deve existir uma forma melhor de se fazer isto, mas foi o que consegui até agora.

Luis Paulo Rodrigues

Luis Rodrigues

Luis Rodrigues
Responder

Mais Posts

02/07/2022

Wilson Pereira

Bom dia, Josias!
Também quebrei a cabeça utilizando FireDAC em modo CachedUpdate ativo.
O que me ajudou bastante foi um vídeo do Alan Gomes:

http://alan-gomes.blogspot.com.br/2013/04/firedac-cadastro-mestredetalhe.html

Mas há um detalhe quando vc estiver construindo sua aplicação: SEMPRE, antes de fazer o Append no DataSet "Filho", faça um POST e depois EDIT no DataSet "Pai". Caso contrário, o erro será sempre o mesmo.
Deve existir uma forma melhor de se fazer isto, mas foi o que consegui até agora.

Luis Paulo Rodrigues


Muito obrigado Luís Paulo, por compartilhar. Ajudou de mais. Inclusive, reforcei a solução (obtida a partir dessa sua dica) neste link https://www.devmedia.com.br/forum/firedac-master-detail/613368
Responder

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

Aceitar