Firedac MasterDetail com Join

Delphi

Firebird

01/05/2017

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

Curtidas 0

Respostas

Roberto Wutke

Roberto Wutke

01/05/2017

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
GOSTEI 0
Marcelo Belanga

Marcelo Belanga

01/05/2017

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...
GOSTEI 0
Marcelo Belanga

Marcelo Belanga

01/05/2017

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.
GOSTEI 0
Karl Fischer

Karl Fischer

01/05/2017

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.
GOSTEI 0
Marcelo Belanga

Marcelo Belanga

01/05/2017

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.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/05/2017

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.
GOSTEI 0
Marcelo Belanga

Marcelo Belanga

01/05/2017

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.
GOSTEI 0
Claudio Andrade

Claudio Andrade

01/05/2017

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

Abraço.
GOSTEI 0
Marcelo Belanga

Marcelo Belanga

01/05/2017

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.
GOSTEI 0
POSTAR