Fórum RecordCount do IBQuery #235014
29/05/2004
0
olha meu codigo:
begin base.qry_temp2.Close; base.qry_temp2.sql.Clear; base.qry_temp2.SQL.Add(´select * from ´); base.qry_temp2.SQL.add(´temperaturas2 where datahora >= :inicio and datahora <= :fim order by datahora´); base.qry_temp2.ParamByName(´inicio´).AsDateTime := StrToDateTime(MaskEdit3.Text); base.qry_temp2.ParamByName(´fim´).AsDateTime := StrToDateTime(MaskEdit4.Text); base.qry_temp2.Open; label209.Caption := inttostr(base.qry_temp2.RecordCount); end;
quando eu faço a consulta o SQL m retorna 200 registros mas no label aparece apenas ´23´?????????? oque eh isso
o recordCount nao seria para retornar o numero de registros da que esta na tabela???? e quando eu faço a consulta acima o resultado da consulta nao eh o numero de registros que eu vou ter na tabela???
pq ele devolve 23 em consulta que geram um resultado com mais de 23 registros???????????????
eu tenho um grid no form para ficar fazendo o sql e olhar quantos registros mostraram na consulta...
Zumbi
Curtir tópico
+ 0Posts
29/05/2004
Adilsond
Vá em pesquisar e coloque como consulta: RecordCount IBQuery
Voce verá que as vezes pesquisando receberá a resposta muito mais rápido.
Gostei + 0
29/05/2004
Zumbi
mas por favor eu passo a que souber o pq acontece isso!!!!!!
quando eu dou ´query.last ´ ou seja quando eu vou para o ultimo registro da tabela ele m retornou o numero certo de registros....
e se eu nao der essa linha ele nao faz... ele soh diz que deu 23 registros e tenho mais de 200..
Gostei + 0
29/05/2004
Vinicius2k
Isso ocorre pq a IBQuery é ´inteligente´, digamos, assim... são trazidos (´fetched´) apenas os registros necessários à sua consulta naquele momento, ou seja, apenas os que estão sendo exibidos no grid... pode contar as linhas do grid que são 23...
Por este motivo, não importa o tamanho da base, quando vc exibir os dados na grid, a consulta sempre será bem rápida... os registros serão trazidos à medida em que for necessário...
Quando vc pede um last, vc fará com que ela traga todos os registros para o buffer para poder ir ao último... isso numa base grande, com certeza ficará um pouco lento...
Sugiro, pelo menos é o que eu faço, que quando necessitar do número de registros, use uma instrução ´select count´, é muito mais rápido do que trazer a base toda para o buffer...
Espero ter ajudado...
T+
Gostei + 0
29/05/2004
Zumbi
mas como eu mostraria o resultado dessa consuta em um label?
select count(*) from temperatura2
Gostei + 0
29/05/2004
Xisto
labelSeiLaONomeDaLabel.Caption:= IntToStr( NomeDaQuery.ParamByname(´NomeDoCampoSomado´).asInteger)
voi la.
[]s
Xisto.
Gostei + 0
29/05/2004
Vinicius2k
acho q o colega Xisto se enganou...
veja :
iqr_count.Close; iqr_count.SQL.Clear; iqr_count.SQL.Add(´select count(NOME) from NOMES´); iqr_count.Open; label1.Caption:= IntToStr(iqr_count.FieldByName(´COUNT´).AsInteger);
Quando vc aplica a instrução ´select count´ o retorno é um recordset com uma linha e uma coluna chamada ´COUNT´ do tipo Integer ( TIntegerField )... a leitura dessa linha lhe retornaré o número de registros existentes na tabela...
Espero ter ajudado...
T+
Gostei + 0
31/05/2004
Xisto
A questao é que faco assim por habito e nem me liguei . . .
iqr_count.Close; iqr_count.SQL.Clear; iqr_count.SQL.Add(´select count(NOME) as TotalNome from NOMES´); iqr_count.Open; label1.Caption:= IntToStr(iqr_count.FieldByName(´TotalNome´).AsInteger);
[]s
Xisto
Gostei + 0
31/05/2004
Eniorm
Também tive esse problema, resolvia dessa forma:
IBQuery1.Open; IBQuery1.Last; IBQuery1.First;
Mas logo descobri uma forma mais simples:
IBQuery1.Open; IBQuery1.FetchAll;
Isso resolveu meu problema.
Gostei + 0
31/05/2004
Vinicius2k
Isso acontece... não falei por mal... blz? :wink:
Enio,
Sua solução é a solução, mas discordo dela por não ser a ideal... suponhamos que vc tenha um select que retorne 100.000 registros, por exemplo, caso vc precise do RecordCount e aplicar o FechtAll os 100.000 serão trazidos para o buffer e esta operação levará, cerca de 10 segundos para ser concluída... impraticável...
Abaixo um exemplo do código que utilizo, quando necessito de um RecordCount...
procedure Tform1.Button1Click(Sender: TObject); var iqr_count: TIBQuery; //declarar IBQuery na lista de uses begin with dmd do // dmd é o data module begin IBDatabase1.Connected:= true; // aqui estou executando a query para exibição no grid... // esta query é design time e já com o SQL definido iqr_nomes.Open; // agora vou criar em runtime uma query para contar os registros da // tabela... logicamente, deve ser incluida a mesma clausula where // existente na primeira query... neste caso não tem where... iqr_count:= TIBQuery.Create(Self); iqr_count.Database:= dmd.IBDatabase1; iqr_count.SQL.Add(´select count(NOME) from NOMES´); iqr_count.Open; label1.Caption:= IntToStr(iqr_count.FieldByName(´COUNT´).AsInteger); iqr_count.Close; iqr_count.Free; end; end;
Espero ter ajudado...
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)