Filtrando Tabela Master pela Detalhe
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;
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
Curtidas 0
Respostas
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.
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
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
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
27/01/2011
Alguem pode me responder essa questão ?
GOSTEI 0
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
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.
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
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 .ObrigadoIDFUNCIONARIO 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'%')
Isso mesmo, eu coloco um Select dentro do outro, e irá funcionar corretamente o seu filtro mestre detalhe.
GOSTEI 0
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.
Espero ter colaborado.
GOSTEI 0