Fórum Como impedir exibição de alguns registros num DBGrid #260405
29/11/2004
0
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
Curtir tópico
+ 0Posts
29/11/2004
Eliane Dorr
if TabelaCampo=´S´ then DbGrid1.Columns[1].Visible:=True else DbGrid1.Columns[1].Visible:=False; end;
Gostei + 0
29/11/2004
Wbb
Eu preciso que os REGISTROS repetidos não apareçam. As colunas continuam sendo mostradas normalmente.
Valeu.
wbb
Gostei + 0
29/11/2004
Paulo_amorim
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
29/11/2004
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
29/11/2004
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
29/11/2004
Paulo_amorim
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
29/11/2004
Wbb
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
29/11/2004
Wbb
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
29/11/2004
Paulo_amorim
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
29/11/2004
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
29/11/2004
Wbb
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
Clique aqui para fazer login e interagir na Comunidade :)