Fórum Filter do ClientDataSet está lento #403140
15/06/2011
0
Alguma dica ?
Ronaldo Lanhellas
Curtir tópico
+ 0Posts
15/06/2011
Nigro
Gostei + 0
15/06/2011
Ronaldo Lanhellas
Gostei + 0
15/06/2011
Rafael Mattos
filter é uma opçao da query, mesmo com ele, quando vc fazer a pesquisa ele vai trazer todos os registro da tabela, imagina todos os dados trafegando na rede é porisso que é lento, depois que ele traz todos os dados que ele vai aplicar o filtro.
diferente se vc usar o select do commandText como vc citou(ELA VAI PEDIR JA OS DADOS FILTRADO PARA O BANCO DE DADOS), ele traria sómente os registro que vc pedio para o banco diminuindo o trafico na rede, e indo mais rapido
--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
Gostei + 0
15/06/2011
Ronaldo Lanhellas
Gostei + 0
15/06/2011
Marco Salles
filter é uma opçao da query, mesmo com ele, quando vc fazer a pesquisa ele vai trazer todos os registro da tabela, imagina todos os dados trafegando na rede é porisso que é lento, depois que ele traz todos os dados que ele vai aplicar o filtro.
diferente se vc usar o select do commandText como vc citou(ELA VAI PEDIR JA OS DADOS FILTRADO PARA O BANCO DE DADOS), ele traria sómente os registro que vc pedio para o banco diminuindo o trafico na rede, e indo mais rapido
Discordo . O Filtro no clientDataSet é aplicado aos dados que estão na memória . Uma operação muito mais
rápida e indicada do que trafegar dados pela Rede ou acessar BD . Não consome recurso de Rede , pode ate
desconectar o Banco que ira funcionar
Além disso o CommandText para quem esta interressado na arquitetura DataSnap é desaconselhavel. Lugar
de SQl é no Servidor de APlicação
Tem que ver como vc esta aplicando o Filtro .. Vc não esta fechando o CDS ?? Esta ????
Obs .. O PackRecord não tem nada a ver com o Filtro , serve para dados em demanda ( Trazer os Dados por
demanda , diminuir o Tráfego ..)
Gostei + 0
15/06/2011
Ronaldo Lanhellas
BOm Marcos, para utilizar o Filter eu geralmente faço :
With ClientDataSet do
begin
Close;
Filtered := False;
Filter := 'ID = '+QuotedStr('3');
Filtered := true;
open;
end
Gostei + 0
15/06/2011
Marco Salles
With ClientDataSet do
begin
Filtered := False;
Filter := 'ID = '+QuotedStr('3');
Filtered := true;
end
Não precisa do Close e nen do Open .. Pois ai sim vc esta realizando uma nova requisição no Banco
Gostei + 0
15/06/2011
Ronaldo Lanhellas
Gostei + 0
15/06/2011
Marco Salles
O Filtro so deve ser aplicado quando o clientDataSet tiver dados carregados . Vc não pode aplicar um filtro em um
clientDatSet Vazio .. Para carregar o ClientDatSet usa-se Sql ... O próprio Open e Close carrega o ClientDatSet
Gostei + 0
15/06/2011
Ronaldo Lanhellas
Gostei + 0
16/06/2011
Marco Salles
Para que o Refresh ???? O Refresh é quase um open / close com alguma diferença
Quando o Cds esta carregado e vc quer buscar determinado registro basta utilizar o Filtro. Agora se vc tiver
em uma Rede , em uma situação que os dados estão sofrendo constantes variaçoes , o filtro não ira atualizar
os seus dados
Por exemplo , vc quer pesquisar um cliente chamado MARCO na sua base de dados .. O Seu Cds esta carregado
(a dois minutos atrás com todos os clientes (uma operaçõe danosa , mas tudo bem) ...Em um outro Micro conectado
a Rede , é inserido o Cliente MARCO . Quando vc aplicar um Filtro , vc não encontrará o MARCO ... Mas se vc der
um Refresh ou Close/OPen (depedendo do seu Sql...) , ele atualizar a aBAse de Dados e carregara o CDS com os
Novos Registros e ao Utilizar o Filtro voce encontrara o MARCO .
Então não é o Filtro que é lento , mas talves a forma que vc o esta querendo utilizar .. Depedendo será melhor
utilizar um Sql LIKE para encontrar especificamente os clientes chamados "MARCO" do que dá um REfresh ou
open/close seguido de Filtro .. POr isto que seu Filtro esta aparentemente Lento
entendeu ???
Gostei + 0
16/06/2011
Rafael Mattos
Discordo . O Filtro no clientDataSet é aplicado aos dados que estão na memória .
sim é nos dados da memoria mesmo, mas a primeira vez q vc abre a query se o filtro não tiver no select vai trazer todos
exemplo tenho uma tabela cliente com 10000 registro
meu select é
select * from CLIENTE
vou colocar o filter só para trazer o registro 3? certo?
With ClientDataSet do
begin
Filtered := False;
Filter := 'ID = '+QuotedStr('3');
Filtered := true;
Open;
end
no DBGrid ele vai mostrar certinho só o cliente 3( Vai demorar um pouco pq ele vai trazer todos os meu dados para memora só para filtrar o registro 3)
mas quantos dados ele trafego nesse OPEN? TODOS os meus 10000 registro só para mostrar 1 registro.
----------------------------------------------------------------------------------------
agora se vc traz já filtrando no o select
ele só trafega 1 registro
select * from CLIENTE where ID = 3
--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
Gostei + 0
16/06/2011
Marco Salles
O filtro so deve ser aplicado nos dados que estão em memória e são dados locais
Para trazer novos dados utilise o Sql com clausu-la where
Apos isto pode se filtrar novamente as informações
Gostei + 0
16/06/2011
Wilson Junior
Só resumindo o que já foi dito:
- Open: retorna os dados do Banco de dados para a memória do ClientDataSet, ou seja, executa o SQL (demora conforme a quantidade de registros);
- Filter: filtra os dados da memória do ClientDataSet (geralmente rápido).
Portanto, para utilizar o filter, é preciso carregar a memória do ClientDataSet.
Espero ter colaborado.
Gostei + 0
16/06/2011
Ronaldo Lanhellas
Ao inciar a aplicação, são abertos todos os ClientDataSet que estão no DataModule. E dentro da aplicação só utilizo o Filter mesmo, oque fica bem mais rápido. No caso do funcionamento em REDE, basta colocar um botão de Atualizar para que o usuário possa manualmente atualizar os registros daquela tabela.
O que vocês acham ?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)