Fórum RecordCount do IBQuery #235014

29/05/2004

0

ola amigos..

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

Zumbi

Responder

Posts

29/05/2004

Adilsond

Faça o seguinte:

Vá em pesquisar e coloque como consulta: RecordCount IBQuery

Voce verá que as vezes pesquisando receberá a resposta muito mais rápido.


Responder

Gostei + 0

29/05/2004

Zumbi

pessoal olha só o que eu descobri...


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..


Responder

Gostei + 0

29/05/2004

Vinicius2k

zumbi,

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+


Responder

Gostei + 0

29/05/2004

Zumbi

blz... explicada minha duvida..


mas como eu mostraria o resultado dessa consuta em um label?


select count(*) from temperatura2


Responder

Gostei + 0

29/05/2004

Xisto

labelSeiLaONomeDaLabel.Caption:=
 IntToStr( NomeDaQuery.ParamByname(´NomeDoCampoSomado´).asInteger)



voi la.

[]s
Xisto.


Responder

Gostei + 0

29/05/2004

Vinicius2k

:shock:
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+


Responder

Gostei + 0

31/05/2004

Xisto

Depois de um puxao de orelha destes (com razao) devo me redimir:

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


Responder

Gostei + 0

31/05/2004

Eniorm

quando eu faço a consulta o SQL m retorna 200 registros mas no label aparece apenas


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.


Responder

Gostei + 0

31/05/2004

Vinicius2k

Xisto,
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+


Responder

Gostei + 0

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

Aceitar