Firedac MasterDetail com Join

01/05/2017

0

Olá, estou iniciando o trabalho com Master-Detail com Firedac e Firebird e estou com um problema no SELECT com LEFT JOIN, ou seja, somente atualiza a descrição do produto no grid se eu fechar e abrir novamente o FDQUERY, caso contrário a descrição do produto fica em branco, segue o SELECT que está sendo utilizado.

SELECT
PED.NUMEROPEDIDOCOMPRA,
PED.AUTOMATICO,
PED.CODIGOPRODUTO,
PRO.CODIGODOFORNECEDOR,
PRO.DESCRICAO,
PRO.UNIDADE,
PED.QUANTIDADE,
PED.RECEBIDO,
PED.VALORUNITARIO,
PED.VALORTOTAL,
PED.FINALIZADO,
PRO.LOCALFISICOESTOQUE
FROM PEDIDOCOMPRAITENS PED
LEFT JOIN PRODUTOS PRO ON PED.CODIGOPRODUTO=PRO.CODIGOPRODUTO
WHERE PED.NUMEROPEDIDOCOMPRA=:NUMEROPEDIDOCOMPRA
ORDER BY PED.NUMEROPEDIDOCOMPRA, PED.AUTOMATICO

já tentei alterar algumas propriedades, mas não consegui a solução.

Se alguém puder me ajudar eu agradeço.
Marcelo Belanga

Marcelo Belanga

Responder

Posts

03/05/2017

Roberto Wutke

Tipo, tenta trocar pelo Inner join, pois com o left, não quer dizer que seu produto sempre existirá nas duas tabelas.. fora isso acho que não tem divergência nos dados...

Qualquer coisa tenta esclarecer um pouco mais pra nós, caso não tenha resolvido
Responder

03/05/2017

Marcelo Belanga

Boa tarde Roberto,

Tentei com o INNER JOIN e permanece o problema.

Para você entender melhor, estou usando esse SELECT para trazer os detalhes de um pedido. Uso a mesma instrução para fazer as alterações com cache updates com Firedac, usando append, post, applyupdates, etc. Não utilizo FDUpdateSQL, quando faço uma consulta de um pedido já cadastrado ele traz normalmente as descrições, mas quando incluo um novo pedido, ele apenas mostra a descrição do produto e a unidade quando fecho e abro novamente a query. A única forma que consegui fazer para que me mostre a descrição, foi criar um campo lookup e apontar para o campo, mas ai tenho que trabalhar com uma tabela de produtos com todos os registros carregados, o que não é muito viável.
Qual seria a forma correta? Se é que existe? Estou ainda em busca dessa solução.
Obrigado pelo interesse...
Responder

06/05/2017

Marcelo Belanga

A melhor forma que encontrei até agora para fazer com que os campos contidos na outra tabela (JOIN) antes de aplicar as alterações, fechar e abrir novamente o fdquery foi ao incluir o código do produto trazer manualmente a descrição do produto e outros campos da outra tabela usando fdqpedidoitensdescricao.value := fdqprodutodescricao.value;.

Apenas para isso setei para False o ReadOnly de cada campo do JOIN.

Espero que seja a melhor solução, pelo menos não tive que manter outra tabelas com todos os produtos carregados para poder utilizar campos lookup e carregar a aplicação.

Abraços.
Responder

13/12/2020

Karl Fischer

Olá,

Será que não existe nada padrão do Delphi/Firedac para retornar campos join, durante sua Edição/Inserção ?
Desejo usar dbgrid por exemplo para digitar código do produto e na coluna descrição já carregue automaticamente esta descrição.
Seria perfeito ter efeito Lookup sem ter que anexar um dataset...

JOIN se usarmos refresh ou reabrir tabela, carrega a descrição, por estar no join.

Mas pergunta é:
Como depomos ter preenchimento dos campos JOIN automaticamente sem ter que confirmar gravação?

Na verdade ao sair do campo Código de Produto, ser preenchido a descrição.
Responder

14/12/2020

Marcelo Belanga

Olá,

Será que não existe nada padrão do Delphi/Firedac para retornar campos join, durante sua Edição/Inserção ?
Desejo usar dbgrid por exemplo para digitar código do produto e na coluna descrição já carregue automaticamente esta descrição.
Seria perfeito ter efeito Lookup sem ter que anexar um dataset...

JOIN se usarmos refresh ou reabrir tabela, carrega a descrição, por estar no join.

Mas pergunta é:
Como depomos ter preenchimento dos campos JOIN automaticamente sem ter que confirmar gravação?

Na verdade ao sair do campo Código de Produto, ser preenchido a descrição.


Karl,
Deixe os campos que estão no join com readonly := False e tragaos manualmente.
Foi assim que resolvi.
Responder

14/12/2020

Emerson Nascimento

talvez seja melhor ter um dataset com todos os produtos e criar um campo lookup na tabela de itens fazendo referência ao dataset de produtos.
Responder

14/12/2020

Marcelo Belanga

talvez seja melhor ter um dataset com todos os produtos e criar um campo lookup na tabela de itens fazendo referência ao dataset de produtos.


Talvez sim, talvez não.

Se a base de produtos for muito grande, pode causar alguma lentidão no carregamento.

Sem dúvida nenhuma, fazer um campo lookup é ótimo, mas tem que analisar o cenário.

Por esse motivo, prefiro informar manualmente os campos do join quando estiver incluindo ou alterando.
Responder

14/12/2020

Claudio Andrade

Você tem que fazer uso do FDUpdateSQL para manipular mais de uma tabela na mesma transação.

Abraço.
Responder

14/12/2020

Marcelo Belanga

Você tem que fazer uso do FDUpdateSQL para manipular mais de uma tabela na mesma transação.

Abraço.


Não é necessário não.
Depende muito cada forma de utilizar.
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