Fórum Como impedir exibição de alguns registros num DBGrid #260405

29/11/2004

0

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


Wbb

Wbb

Responder

Posts

29/11/2004

Eliane Dorr

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;



Responder

Gostei + 0

29/11/2004

Wbb

Não é isso.
Eu preciso que os REGISTROS repetidos não apareçam. As colunas continuam sendo mostradas normalmente.

Valeu.
wbb


Responder

Gostei + 0

29/11/2004

Paulo_amorim

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é+


Responder

Gostei + 0

29/11/2004

Wbb

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


Responder

Gostei + 0

29/11/2004

Wbb

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


Responder

Gostei + 0

29/11/2004

Paulo_amorim

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:

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é+


Responder

Gostei + 0

29/11/2004

Wbb

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+


Responder

Gostei + 0

29/11/2004

Wbb

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+


Responder

Gostei + 0

29/11/2004

Paulo_amorim

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
SELECT t1.num FROM tab1 t1 INNER JOIN tab2 t2 ON t1.num = t2.num

Espero que ajude
Até+


Responder

Gostei + 0

29/11/2004

Wbb

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


Responder

Gostei + 0

29/11/2004

Wbb

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;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar