Toon posts:

[Delphi, IB] Bug in recordcount??

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik voer een IBQuery uit (dus de IBX componenten) en ik krijg als recordcount 1 bij zowel een tabel die 1 record heeft en bij een tabel die 2 records heeft.

Zit er een bug in?

De query's zijn gewoon goed, ze halen alle records op.
code:
1
2
3
4
5
6
7
8
9
10
11
  with dtModule.IBQueryArtikelVerpakking2.SQL do
  begin
    Clear;
    Add(' SELECT VERPAKKINGID, VERPAKKINGAFKORTING, VERPAKKINGOMSCHRIJVING ' +
      ' FROM   ARTIKELVERPAKKING ');
  end;
  dtModule.IBQueryArtikelVerpakking2.Open;

  //dtModule.IBQueryArtikelVerpakking2.First;

  i := dtModule.IBQueryArtikelVerpakking2.RecordCount;


code:
1
2
3
4
5
6
7
8
9
10
11
  with dtModule.IBQueryArtikelEenheid2.SQL do
  begin
    Clear;
    Add(' SELECT EENHEIDID, EENHEIDAFKORTING, EENHEIDOMSCHRIJVING ' +
      ' FROM   ARTIKELEENHEID ');
  end;
  dtModule.IBQueryArtikelEenheid2.Open;

  //dtModule.IBQueryArtikelEenheid2.First;

  i := dtModule.IBQueryArtikelEenheid2.RecordCount;

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Doe een (TDataSet).Last, daarna zal de recordcount goed moeten zijn. Queries geven vaak geen goede recordcount, last fixt dit.

Forget your fears...
...and want to know more...


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Is niet een bug hoor.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Last
Recordcount opvragen
First


Dit werkt niet. Sterker nog, hierdoor klopt het juist nog minder. Erg vreemd allemaal.

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Die last truk had ik nooit van gehoord. Wat ik altijd deed, als het echt MOEST, ik liep gewoon een keer met Next door tot EOF. Daarna First en dan recordcount. Ik kreeg altijd het idee dat recordcount het aantal "bezochte" records bevatte (natuurlijk niet dat ie een record dubbel telt als je het 2 keer bezoekt...), dus bezocht ik ze gewoon allemaal een keer om het juiste aantal te krijgen. De Last truk is natuurlijk efficienter, als ie zou werken...

He who knows only his own side of the case knows little of that.


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Last truc werkte op de standaard Delphi 5 TQuery typen en de TtaQuery Titan queries...

Forget your fears...
...and want to know more...


  • Paul
  • Registratie: September 2000
  • Laatst online: 13-09 15:27
Op maandag 04 maart 2002 23:26 schreef RickN het volgende:
Die last truk had ik nooit van gehoord. Wat ik altijd deed, als het echt MOEST, ik liep gewoon een keer met Next door tot EOF. Daarna First en dan recordcount. Ik kreeg altijd het idee dat recordcount het aantal "bezochte" records bevatte (natuurlijk niet dat ie een record dubbel telt als je het 2 keer bezoekt...), dus bezocht ik ze gewoon allemaal een keer om het juiste aantal te krijgen. De Last truk is natuurlijk efficienter, als ie zou werken...
Euh... Als je er dan toch al langs loopt, doe dan iedere itteratie ipv alleen een next ook een i++ :o :D
code:
1
2
3
4
5
6
7
8
9
10
11
var i : integer;
begin
  i := 0;
  [..]
  myQuery.First;
  while (not myQuery.EOF()) do
    begin
    inc(i);
    myQuery.Next;
    end;
end;

Recordcount wordt in de Borland help trouwens AFGERADEN op alles wat GEEN DBASE of PARADOX table is, weet zo de precieze reden niet meer.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20:17

Delphi32

Heading for the gates of Eden

Op maandag 04 maart 2002 23:53 schreef Paul Nieuwkamp het volgende:

[..]

Euh... Als je er dan toch al langs loopt, doe dan iedere itteratie ipv alleen een next ook een i++ :o :D
Mmm leuk bedacht... maar Query.Last en dan i := Query.RecordCount doen precies hetzelfde als wat jij schrijft :)
Recordcount wordt in de Borland help trouwens AFGERADEN op alles wat GEEN DBASE of PARADOX table is, weet zo de precieze reden niet meer.
Performance.
Met een Query.Last DWING je je dataset om alle data tot en met het laatste record op te gaan halen. Los van de vraag of je die gegevens ooit in je applicatie wilt zien dus. Als je een IB Query opent, haalt ie alleen de eerste set gegevens op (de hoeveelheid kun je instellen in BufferChunk property); doe je een Last op die query gaat ie dus alles binnenhalen en dat wil je niet.

Voor queries die veel data terug (kunnen) geven en waarvan ik de recordcount per se wil weten, maak ik meestal een losse query die select count( * ) doet over dezelfde query. Performt veel beter.

Verwijderd

Topicstarter
Ik heb het nu opgelost met: while not EOF......


Toch vind ik het vreemd dat het property recordcount aanwezig is en niet werkt, want wat heb je er dan aan :?

  • Wupsje
  • Registratie: Januari 2001
  • Laatst online: 13-11-2024
Snelste is dacht ik even een aparte query te doen met
select COUNT(*D from tabel where blablabla etc

krijg je het aantal records terug.

Wupsje

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20:17

Delphi32

Heading for the gates of Eden

Op dinsdag 05 maart 2002 08:48 schreef Wupsje het volgende:
Snelste is dacht ik even een aparte query te doen met
select COUNT(*D from tabel where blablabla etc

krijg je het aantal records terug.

Wupsje
Let op dat je COUNT-spatie-haakjeopenen-sterretje-spatie-haakjesluiten ( * ) gebruikt op GoT, want anders krijg je zo'n lieve smiley :)

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

code:
1
Count(*)

werkt ook.

Forget your fears...
...and want to know more...


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Op dinsdag 05 maart 2002 08:45 schreef tokkie het volgende:
Ik heb het nu opgelost met: while not EOF......


Toch vind ik het vreemd dat het property recordcount aanwezig is en niet werkt, want wat heb je er dan aan :?
Is een property van TDataSet... is meer bedoeld voor TTable als voor TQuery.

Forget your fears...
...and want to know more...


Verwijderd

Topicstarter
Op dinsdag 05 maart 2002 01:09 schreef Delphi32 het volgende:

Als je een IB Query opent, haalt ie alleen de eerste set gegevens op (de hoeveelheid kun je instellen in BufferChunk property); doe je een Last op die query gaat ie dus alles binnenhalen en dat wil je niet.
Zodra je een query uitvoert dan geeft die toch heel het resultaat terug?

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Op dinsdag 05 maart 2002 12:21 schreef tokkie het volgende:

[..]

Zodra je een query uitvoert dan geeft die toch heel het resultaat terug?
Nee. :)

Forget your fears...
...and want to know more...


  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Typisch, ik heb hier eigenlijk nooit problemen mee gehad.. Niet dat ik veel recordcounts gebruik maar als ik het doe, doe ik het toch echt zo:
code:
1
2
3
4
5
6
7
8
9
var
  Qry : Tadoquery;
begin
  qry := Tadoquery.create(self);
  qry.SQL.clear;
  qry.SQL.Text := 'Select * from Historders';
  qry.open;
  showmessage(inttostr(qry.recordcount));
end;

En dit heeft nog niet een foute melding gegeven?!?

Overigens maak ik nooit een for loop voor een qry als ik wat met de records wil uitvreten. Meestal is dat een:
code:
1
2
3
qry.First;
while not qry.EOF do
  ...;

Gaat nooit fout ;)

"Then there was the man who drowned crossing a stream with an average depth of six inches."


  • agent327
  • Registratie: Oktober 2001
  • Laatst online: 02-10-2022

agent327

^&)^*&^$#@#!)*

Op maandag 04 maart 2002 19:36 schreef jelmervos het volgende:
Is niet een bug hoor.
Feature? :?

Wanbeleid is ook beleid.


Verwijderd

Kan het zo zijn dat een IBQuery-component anders omgaat met de recordcount dan een BDEQuery-component? Ik werk ook wel eens met Interbase en daar kan ik inderdaad ook niet zo 123 de recordcount opvragen, zonder eerst Last aan te roepen.

Wellicht een bug in het component dan?

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Bug/optimalisatie... Query elementen proberen zo min mogelijk info op te halen om tijd te besparen. Overigens, dat met die ADO query gaat ook fout, als die tabel maar groot genoeg is (100.000 entries, of zo). Wat me wel opvalt is dat een SELECT DISTINCT wel de goede count teruggeeft. Zal wel zijn omdat de query dan geforceerd wordt elk record met de voorgaande te vergelijken... (en dus sowieso door de hele mik heenloopt...)

Forget your fears...
...and want to know more...


  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

100.000 entries, is wel ERG veel voor één query, om even te laten zien op het scherm.

"Then there was the man who drowned crossing a stream with an average depth of six inches."


  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Precies. Maar 't gaat hier ook om de recordcount, niet om de inhoud |:(

Forget your fears...
...and want to know more...


  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Hmm tis zowiezo niet slim om een recordcount te doen op zoveel records.

"Then there was the man who drowned crossing a stream with an average depth of six inches."

Pagina: 1