Filtrando Tabela Master pela Detalhe

Delphi

27/01/2011

Bom .. tenho 2 tabelas (mestre e detalhe) Tabela 1 = FuncionarioTabela 2 = Cursos do Funcionario
Quando eu pesquisar na tabela detalha pelo curso = 'INGLES' por exemplo eu quero que ele me mostre todo mundo que tem o curso ingles. 
eu já tentei da um DataSet.Filter = 'CURSO = '+QuotedStr('INGLES') porem ele apenas filtra o DataSet detalhe , e não filtra o mestre;
Ronaldo Lanhellas

Ronaldo Lanhellas

Curtidas 0

Respostas

Efraim Santana

Efraim Santana

27/01/2011

num sei se entendi.
carrega os dados em um clientdataset com select abaixo

select   a.curso,  b.funcionariofrom  cursos a  left join funcionarios b on a.codigo = b.codigocurso

ai so filtrar.  
 
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

27/01/2011

Sim amigo, eu sei que da para fazer desta forma, mais eu acho que é um retrabalho. 
Vamos raciocinar: eu tenho 2 ClientDataSet (o master e o detaill), 
o master tem o DataSetField apontando para o detail correto !
No DataSet temos um método chamado Filter que faz a filtragem dos registros dentro do DataSet,então se eu utilizar: 
cds.Filter := 'NOME LIKE '+QuotedStr('RONALDO'); 
ele vai pegar todo mundo que tem o nome RONALDO.
O detail tem informações do Master, vamos supor que o detail  seja os Cursos do Funcionario (master), então quando eu usar o filtro
cdsDetail.Filter := 'CURSO LIKE '+QuotedStr('INGLES');
Aqui que entra a jogada, eu gostaria que ele mostrasse todos os Funcionarios que possuem curso de INGLES, o que ocorre é que ele ta mostrando normalmente os Funcionarios (Sem Filtro nenhum) e está tirando apenas os Cursos que não são de INGLES, ou seja, se eu tiver um Funcionário com um Curso de ESPANHOL ele aparece normal, só não irá aparecer seu Curso de Espanhol pois fiz a filtragem somente para INGLES. Mais não é isso que eu quero, eu gostaria de filtrar automaticamente o Funcionario já que ele não tem curso de INGLES
Acho que deu uma desenrolada agora :D



GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

27/01/2011


Alguem pode me responder essa questão ?
GOSTEI 0
Marco Salles

Marco Salles

27/01/2011

é isto que vc que   http://marcosalles.wordpress.com/2011/01/29/filtrando-tabela-master-pela-detalhe/   calma rapas toainda editando , de um projeto que ja fiz
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

27/01/2011

Bom Marcos, boa a solução porém achei uma rápida e fácil de implementar, o que nós precisamos é apenas de um DataSetProvider com a opção AllowCommandText como TRUE, então passaremos para o ClientDataSet respectivo um "Select in " para selecionar a tabela Mestre pela Detalhe. Pode ter ficado um pouco confuso de inicio, mais vou dar um exemplo bem prático:Vamos supor que tenho um tabela Mestre chamada FUNCIONARIOS com os seguintes campos:
IDFUNCIONARIONOMECPF
E temos uma tabela detalhe chamada CURSOS com os seguintes camposIDCURSOIDFUNCIONARIOCURSO
E agora ? se eu quiser pegar o funcionário com o Curso de INGLÊS ?
Bom, vamos passo a passo:Primeiro faço o select simples na tabela curso que retorna um ou vários IDFUNCIONARIO dependendo de quantos funcionários possuem o Curso de INGLÊSFica assim: Select IDFUNCIONARIO from CURSOS WHERE CURSO LIKE '%'INGLES'%'
Agora já temos todos os IDFUNCIONARIO que possuem o curso de INGLES, a unica coisa que temos que fazer é pegar todos os funcionários com esses ID's retornados pelo primeiro select, e como faço isso ? 
Select * FROM FUNCIONARIOS WHERE IDFUNCIONARIO IN (Select IDFUNCIONARIO from CURSOS WHERE CURSO LIKE '%'INGLES'%') 
Isso mesmo, eu coloco um Select dentro do outro, e irá funcionar corretamente o seu filtro mestre detalhe.
GOSTEI 0
Marco Salles

Marco Salles

27/01/2011

Bom Marcos, boa a solução porém achei uma rápida e fácil de implementar,
  Utilizando Sql é mais fácil a implementação .. Esta escrtito no artigo ... Mas postei a solução porque deu a entender que vc não queria utilizar ou não podia utilizar Sql em um determinado momento . Vejamos o caso de se trabalhar desconectado , uma das principais caracteristica do DataSnap.. Então como fazer este filtro na TAbela Mestre utilizando um filtro na Tabela Detalhe ??? foi ai que entroi o Artigo  
o que nós precisamos é apenas de um DataSetProvider com a opção AllowCommandText como TRUE, então passaremos para o ClientDataSet respectivo um "Select in " para selecionar a tabela Mestre pela Detalhe. 
  Deve-se enfatizar que commandText deve ser utilizado com cautela e não é uma prática das mais bem vistas pelas autoridades delphianas . Que entende que ludar de Sql é na camada do meio e não na camada de apresentação  
Pode ter ficado um pouco confuso de inicio, mais vou dar um exemplo bem prático: Vamos supor que tenho um tabela Mestre chamada FUNCIONARIOS com os seguintes campos:
IDFUNCIONARIO NOME CPF
E temos uma tabela detalhe chamada CURSOS com os seguintes campos IDCURSO IDFUNCIONARIO CURSO  
E agora ? se eu quiser pegar o funcionário com o Curso de INGLÊS ?
Bom, vamos passo a passo: Primeiro faço o select simples na tabela curso que retorna um ou vários IDFUNCIONARIO dependendo de quantos funcionários possuem o Curso de INGLÊS Fica assim: Select IDFUNCIONARIO from CURSOS WHERE CURSO LIKE '%'INGLES'%'
Agora já temos todos os IDFUNCIONARIO que possuem o curso de INGLES, a unica coisa que temos que fazer é pegar todos os funcionários com esses ID's retornados pelo primeiro select, e como faço isso ? 
Select * FROM FUNCIONARIOS WHERE IDFUNCIONARIO IN (Select IDFUNCIONARIO from CURSOS WHERE CURSO LIKE '%'INGLES'%') 
  então , mas esta solução , ja foi lhe apresentada no inicio pelo colega ai em cima qnd sugereiu o uso do JOIN .. Vc obetera a mesma resposta .. Mas a que vc apresentou tb atende a sua necessidade e esta corretíssima   coloque o tópico coo resolvido para melhor organização do forum .Obrigado
Isso mesmo, eu coloco um Select dentro do outro, e irá funcionar corretamente o seu filtro mestre detalhe.
GOSTEI 0
Wilson Junior

Wilson Junior

27/01/2011

De uma olhada nest post do Marco, talvez possa lhe ajudar https://www.devmedia.com.br/post-19204-Filtrando-Tabela-Master-pela-Detalhe.html

Espero ter colaborado.
GOSTEI 0
POSTAR