Erro no recordcount ...

Delphi

15/06/2004

Uso Interbase 6.0 ...

No meu aplicativo, faço uma query, no qual me retorna vários registros ...

Uso recordCount, mais o valor dele, é bem inferior dos registros relacionados no DBGrid ...

O que há de errado ???

Leo.


Lbsystems

Lbsystems

Curtidas 0

Respostas

Djjunior

Djjunior

15/06/2004

se não me engano o interbase tem uma propriedade que mostra os registros em páginas (tipo na internet guando vc faz uma pesquisa e o sistema retorna uma página de 30 registros por exemplo. e quando vc quer ver o resto tem que mandar avançar) vc deve estar tendo problemas com isso.


GOSTEI 0
Christ

Christ

15/06/2004

é isso mesmo o interbase faz esse tipo de retorno, também tive problemas com isso, resolvi da seguinte forma:

Query.Open;
Query.Last;
Query.First;

Quant := Query.RecordCount;

Ou seja, fui até o fim e retornei ao início dos resultados antes de usar o RecordCount aí deu certo.


:D :D :D


GOSTEI 0
Vinicius2k

Vinicius2k

15/06/2004

Devo discordar das respostas dos colegas...

Isso nada tem haver com a definição de páginas do banco de dados... a limitação inteligente está na IBQuery: o fetch dos registros para o buffer é efetuado conforme necessário e isto é ótimo para selects que retornam muitos registros...

A solução de aplicação dos métodos Last seguido de First é um ´quebra-galho´, digamos assim, para forçar o fetch de todos os registros... muito mais prático e limpo que ela é aplicar o metodo FetchAll...

Contudo vcs devem analizar o princípio de aplicações Client/Server que é trazer ao cliente apenas os registros necessários, mas caso seja realmente necessário trazer todos os registros, não apliquem nenhum dos métodos acima, pois vão comprometer muito a performance da aplicação.
Talvez vcs discordem do meu ponto de vista, mas quando possuírem tabelas com algumas centenas de milhares de registros vão compreender minha preocupação em lhes mostrar isso... (um FetchAll em 100.000 registros leva 10 segundos local e cerca de 30 segundos na rede, por exemplo)...

Se precisarem de um contador de registros usem uma query auxiliar com a instrução ´SELECT COUNT´ que é instantânea... não há necessidade de comprometer a query principal apenas para ler um contador...

Neste tópico que participei isso tbm foi discutido... http://delphiforum.icft.com.br/forum/viewtopic.php?t=45198

Espero ter ajudado...
T+


GOSTEI 0
Christ

Christ

15/06/2004

Pô kra valew mesmo, eu não sabia disso.

Usei o Last First por acaso e deu certo, realmente foi um quebra-galho que já me quebrou muitas árvores, quanto a paginação inteligente, observei que isso não acontecia quando passei a usar o dbExpress ao invés dos objetos IB...

Gostei da sua colocação, vou procurar mais sobre isso, pois estou desenvolvendo uma aplicação que irá trabalhar com mais ou menos 180 a 200 mil registros e isso pode me trazer problemas de performance.

Valew!!!!!

:D :D :D


GOSTEI 0
Vinicius2k

Vinicius2k

15/06/2004

Christ,

...quanto a paginação inteligente, observei que isso não acontecia quando passei a usar o dbExpress ao invés dos objetos IB...

Felizmente, a arquitetura usando dbExpress também pode ser ajustada para trabalhar com Fetch por pacotes de dados com tamanho reduzido, bastando que para isso você ajuste a propriedade ´PacketRecords´ do TClientDataSet para a quantidade de registros que você deseja que tenha no pacote... por exemplo, 1000 que seria equivalente ao valor default da propriedade ´BufferChunks´ da IBQuery... se a performance estiver ruim, baixe o valor para ganhar mais velocidade...

...estou desenvolvendo uma aplicação que irá trabalhar com mais ou menos 180 a 200 mil registros e isso pode me trazer problemas de performance.

Com certeza lhe traria problemas... fico feliz em ter ajudado...

T+


GOSTEI 0
POSTAR