Como impedir exibição de alguns registros num DBGrid
Pessoal, tenho uma situação de comparação entre duas listas de registros.
O caso é o seguinte: Num DBGrid, que chamei de DBGrid2, exibo os dados de uma tabela, que chamei de Tab2. Estes dados foram criados a partir de uma outra que chamei de Tab1, e que contém uma lista grande de registros e são exibidos no DBGrid1.
[b:09273c85c4]O problema é:[/b:09273c85c4] Eu não quero que os registros se repitam nas duas tabelas, ou seja, teria que haver um recurso que comparasse a Tab1 com a Tab2 de forma que, os registros existentes na Tab2 e que são mostrados no DBGrid2, [u:09273c85c4]não sejam[/u:09273c85c4] mostrados também no DBGrid1. Senão haveria repetição de registros nos dois DBGrids, o que não pode acontecer neste caso.
Alguém sabe como posso fazer este filtro?
wbb
O caso é o seguinte: Num DBGrid, que chamei de DBGrid2, exibo os dados de uma tabela, que chamei de Tab2. Estes dados foram criados a partir de uma outra que chamei de Tab1, e que contém uma lista grande de registros e são exibidos no DBGrid1.
[b:09273c85c4]O problema é:[/b:09273c85c4] Eu não quero que os registros se repitam nas duas tabelas, ou seja, teria que haver um recurso que comparasse a Tab1 com a Tab2 de forma que, os registros existentes na Tab2 e que são mostrados no DBGrid2, [u:09273c85c4]não sejam[/u:09273c85c4] mostrados também no DBGrid1. Senão haveria repetição de registros nos dois DBGrids, o que não pode acontecer neste caso.
Alguém sabe como posso fazer este filtro?
wbb
Wbb
Curtidas 0
Respostas
Eliane Dorr
29/11/2004
Você pode criar uma condição no evento OnCreate do formulário onde se encontra o DbGrid. Por exemplo:
if TabelaCampo=´S´ then DbGrid1.Columns[1].Visible:=True else DbGrid1.Columns[1].Visible:=False; end;
GOSTEI 0
Wbb
29/11/2004
Não é isso.
Eu preciso que os REGISTROS repetidos não apareçam. As colunas continuam sendo mostradas normalmente.
Valeu.
wbb
Eu preciso que os REGISTROS repetidos não apareçam. As colunas continuam sendo mostradas normalmente.
Valeu.
wbb
GOSTEI 0
Paulo_amorim
29/11/2004
Olá
Não seria o caso de fazer uma query que pegasse esses registros? Ou deve-se usar o componente Table mesmo?
Usando query vc faz isso com um join...
Até+
Não seria o caso de fazer uma query que pegasse esses registros? Ou deve-se usar o componente Table mesmo?
Usando query vc faz isso com um join...
Até+
GOSTEI 0
Wbb
29/11/2004
Sim Paulo_Amorim. A idéia é essa mesma. Mas como se faz isso?
Pergunto pois o que acontece é o seguinte: Um Query seleciona todos os registros da Tab1 (que é a tabela principal e tem muitos registros). OK? O outro Query, selecionará registros da Tab2, que tem apenas alguns registros iguais a registros contidos na Tab1 (de onde foram tirados o registros da Tab2, por sinal).
A quantidade de registros da tabela Tab2, pode variar. Já na Tab1 não varia. Então, a pesquisa que pega os registros da Tab1 para exibir em seu respectivo DBGrid, teria que saber antes quais registros deve ignorar. Estes registros a serem ignorados são exatamente os que estão da Tab2. Como fazer isso?
Se não estiver claro, por favor me dê um alô que tento reescrever.
Valeu!
wbb
Pergunto pois o que acontece é o seguinte: Um Query seleciona todos os registros da Tab1 (que é a tabela principal e tem muitos registros). OK? O outro Query, selecionará registros da Tab2, que tem apenas alguns registros iguais a registros contidos na Tab1 (de onde foram tirados o registros da Tab2, por sinal).
A quantidade de registros da tabela Tab2, pode variar. Já na Tab1 não varia. Então, a pesquisa que pega os registros da Tab1 para exibir em seu respectivo DBGrid, teria que saber antes quais registros deve ignorar. Estes registros a serem ignorados são exatamente os que estão da Tab2. Como fazer isso?
Se não estiver claro, por favor me dê um alô que tento reescrever.
Valeu!
wbb
GOSTEI 0
Wbb
29/11/2004
Vou dar um exemplo apenas para complementar.
Suponha que a tabela TAB1 possua um campo NUM que possui registros com o seguintes valores: 1, 2, 3, 4, 5, 6, 7, 8, 9.
Agora suponha que a tabela TAB2, possua também um campo NUM e que possui o seguintes valores: 3, 4, 5.
Então, os registros que devem ser exibidos no DBGrid1 são: 1, 2, 6, 7, 8, 9.
Já no DBGrid2, será exibido: 3, 4, 5.
É isso que preciso.
T+
wbb
Suponha que a tabela TAB1 possua um campo NUM que possui registros com o seguintes valores: 1, 2, 3, 4, 5, 6, 7, 8, 9.
Agora suponha que a tabela TAB2, possua também um campo NUM e que possui o seguintes valores: 3, 4, 5.
Então, os registros que devem ser exibidos no DBGrid1 são: 1, 2, 6, 7, 8, 9.
Já no DBGrid2, será exibido: 3, 4, 5.
É isso que preciso.
T+
wbb
GOSTEI 0
Paulo_amorim
29/11/2004
Olá
Você pode manter as tabelas, só o que você precisa fazer é colocar um componente Query e ao invés de ligar o Grid na Table, ligue à query
Tente colocar essa sintaxe na query:
Nesse grid vão aparecer os registros diferentes.
No outro você pode colocar a tabela2 mesmo, já que será seu conteúdo inteiro.
Espero que funcione
Até+
Você pode manter as tabelas, só o que você precisa fazer é colocar um componente Query e ao invés de ligar o Grid na Table, ligue à query
Tente colocar essa sintaxe na query:
SELECT t1.num FROM tab1 t1 LEFT JOIN tab2 ON t1.num = t2.num WHERE t2.num IS NULL
Nesse grid vão aparecer os registros diferentes.
No outro você pode colocar a tabela2 mesmo, já que será seu conteúdo inteiro.
Espero que funcione
Até+
GOSTEI 0
Wbb
29/11/2004
Paulo, em nenhuma das tabelas aparecem todos os registros.
No exemplo que citei os Grids ficam assim:
DBGrid1 exibe: 1, 2, 6, 7, 8, 9.
DBGrid2 exibe: 3, 4, 5.
É assim que precisa aparecer.
T+
No exemplo que citei os Grids ficam assim:
DBGrid1 exibe: 1, 2, 6, 7, 8, 9.
DBGrid2 exibe: 3, 4, 5.
É assim que precisa aparecer.
T+
GOSTEI 0
Wbb
29/11/2004
Desculpe. Escrevi uma coisinha errada.
O certo é:
Em nenhum dos [b:fc9aebf253]DBGRIDs[/b:fc9aebf253] aparecem todos os registros.
No exemplo que citei os Grids ficam assim:
DBGrid1 exibe: 1, 2, 6, 7, 8, 9.
DBGrid2 exibe: 3, 4, 5.
É assim que precisa aparecer.
T+
O certo é:
Em nenhum dos [b:fc9aebf253]DBGRIDs[/b:fc9aebf253] aparecem todos os registros.
No exemplo que citei os Grids ficam assim:
DBGrid1 exibe: 1, 2, 6, 7, 8, 9.
DBGrid2 exibe: 3, 4, 5.
É assim que precisa aparecer.
T+
GOSTEI 0
Paulo_amorim
29/11/2004
Olá
Pelo exemplo que você me deu, o primeiro DBGrid mostra a diferença entre os conteúdos. Isso é resolvido pela query acima.
Já o segundo DBGrid mostra o que contém em AMBAS as tabelas, certo?
Portanto, faz-se:
dbg1 ligado à Query de diferença
dbg2 ligado à Tab2 , que contém os registros a igualar.
Ou, se preferir, faça outra query para o DBGrid2, com um inner join
Espero que ajude
Até+
Pelo exemplo que você me deu, o primeiro DBGrid mostra a diferença entre os conteúdos. Isso é resolvido pela query acima.
Já o segundo DBGrid mostra o que contém em AMBAS as tabelas, certo?
Portanto, faz-se:
dbg1 ligado à Query de diferença
dbg2 ligado à Tab2 , que contém os registros a igualar.
Ou, se preferir, faça outra query para o DBGrid2, com um inner join
SELECT t1.num FROM tab1 t1 INNER JOIN tab2 t2 ON t1.num = t2.num
Espero que ajude
Até+
GOSTEI 0
Wbb
29/11/2004
Não Paulo.
Repare que na tabela 1, em meu exemplo, existe 9 registros. O campo NUM destes registros são respectivamente: 1, 2, 3, 4, 5, 6, 7, 8 e 9. Porém, no DBGrid1, devem ser exibidos apenas os registros 1, 2, 6, 7, 8 e 9. Por que? Porque na tabela2 existem também os registros 3, 4 e 5. O que implica que no DEGrid dois serão exibidos os registros 3, 4, e 5.
Para que os registros 3, 4 e 5 que existem nas duas tabelas não sejam exibidos nos dois DBGrids, eu preciso que estes registros sejam filtrados da primeira tabela, impedindo que sejam exibidos no DBGrid1 (repare que escrevi acima que no DBGrid1 serão exisbidos apenas os registros 1, 2, 6, 7, 8 e 9. Nesta lista não estão 3, 4 e 5).
Este filtro é que está complicado.
Valeu
wbb
Repare que na tabela 1, em meu exemplo, existe 9 registros. O campo NUM destes registros são respectivamente: 1, 2, 3, 4, 5, 6, 7, 8 e 9. Porém, no DBGrid1, devem ser exibidos apenas os registros 1, 2, 6, 7, 8 e 9. Por que? Porque na tabela2 existem também os registros 3, 4 e 5. O que implica que no DEGrid dois serão exibidos os registros 3, 4, e 5.
Para que os registros 3, 4 e 5 que existem nas duas tabelas não sejam exibidos nos dois DBGrids, eu preciso que estes registros sejam filtrados da primeira tabela, impedindo que sejam exibidos no DBGrid1 (repare que escrevi acima que no DBGrid1 serão exisbidos apenas os registros 1, 2, 6, 7, 8 e 9. Nesta lista não estão 3, 4 e 5).
Este filtro é que está complicado.
Valeu
wbb
GOSTEI 0
Wbb
29/11/2004
Paulo, obrigado pela atenção, mas acabei conseguindo fazer de outra maneira. Na realidade a coisa é um pouco mais complicada do que eu estava postando aqui, mas com base no que eu perguntava já dava pra saber o que eu precisava.
Veja abaixo o Select completo e onde está a sacada da pesquisa como eu precisava, mostrada em vermelho (estou também usando parâmetros na pesquisa)
T+
wbb.
=================================
SELECT *
FROM modelos
[color=red:b954a26a93]WHERE MODELOS.CodigoModelo not in [/color:b954a26a93]
(SELECT PECAS_MARCAS_MODELOS.CodigoModelo
FROM PECAS INNER JOIN
((MARCAS INNER JOIN MODELOS ON
MARCAS.CodigoMarca = MODELOS.CodigoMarca) INNER JOIN
PECAS_MARCAS_MODELOS ON
(MARCAS.CodigoMarca = PECAS_MARCAS_MODELOS.CodigoMarca) AND
(MODELOS.CodigoModelo = PECAS_MARCAS_MODELOS.CodigoModelo))ON
PECAS.CodigoPeca = PECAS_MARCAS_MODELOS.CodigoPeca
GROUP BY PECAS.CodigoPeca, PECAS_MARCAS_MODELOS.CodigoPeca,
PECAS_MARCAS_MODELOS.CodigoAplicacao,
PECAS_MARCAS_MODELOS.CodigoMarca, MARCAS.Descricao,
MODELOS.Descricao, MODELOS.Ano,
PECAS_MARCAS_MODELOS.CodigoModelo
HAVING (((PECAS.CodigoPeca)=:CodPeca) AND
((PECAS_MARCAS_MODELOS.CodigoAplicacao)=:CodAplic) AND
((PECAS_MARCAS_MODELOS.CodigoMarca)=:CodMarca))) and
(Status <> ´X´) and (CodigoMarca =:CodMarca1)
ORDER BY Descricao;
Veja abaixo o Select completo e onde está a sacada da pesquisa como eu precisava, mostrada em vermelho (estou também usando parâmetros na pesquisa)
T+
wbb.
=================================
SELECT *
FROM modelos
[color=red:b954a26a93]WHERE MODELOS.CodigoModelo not in [/color:b954a26a93]
(SELECT PECAS_MARCAS_MODELOS.CodigoModelo
FROM PECAS INNER JOIN
((MARCAS INNER JOIN MODELOS ON
MARCAS.CodigoMarca = MODELOS.CodigoMarca) INNER JOIN
PECAS_MARCAS_MODELOS ON
(MARCAS.CodigoMarca = PECAS_MARCAS_MODELOS.CodigoMarca) AND
(MODELOS.CodigoModelo = PECAS_MARCAS_MODELOS.CodigoModelo))ON
PECAS.CodigoPeca = PECAS_MARCAS_MODELOS.CodigoPeca
GROUP BY PECAS.CodigoPeca, PECAS_MARCAS_MODELOS.CodigoPeca,
PECAS_MARCAS_MODELOS.CodigoAplicacao,
PECAS_MARCAS_MODELOS.CodigoMarca, MARCAS.Descricao,
MODELOS.Descricao, MODELOS.Ano,
PECAS_MARCAS_MODELOS.CodigoModelo
HAVING (((PECAS.CodigoPeca)=:CodPeca) AND
((PECAS_MARCAS_MODELOS.CodigoAplicacao)=:CodAplic) AND
((PECAS_MARCAS_MODELOS.CodigoMarca)=:CodMarca))) and
(Status <> ´X´) and (CodigoMarca =:CodMarca1)
ORDER BY Descricao;
GOSTEI 0