|
| Hvad er den logiske forklaring her Fra : Michael Sørensen |
Dato : 03-03-10 23:14 |
|
Hej.
Findes der en logisk forklaring på dette:
Jeg skal vise, hvor mange poster, der er i min tabel, der matcher et input.
Et simpelt eksempel fra en onClick event på en knap
....
Konto := cdsKontoplan.FieldByName('Konto').asInteger;
ibquery1.sql.clear;
ibquery1.sql.add('SELECT ID, konto FROM tblPosteringer WHERE konto =
:konto');
ibquery1.ParamByName('Konto').Value := Konto;
ibquery1.open;
application.message('Der er ' + inttostr(ibquery1.recordcount) + '
poster');
ibquery1.close;
....
Ovenstående viser 0 eller 1 poster selvom der faktisk er mellem 1 og 4
poster i min faktiske test tabel afhængig af hvilken konto jeg indtaster
som parameter.
Jeg har brugt en IBquery til at forespørge.
Vælger jeg at sætte en datasource på min ibQuery og derefter sætte en
DBGrid til datasourcen, så vises der korrekt 1-4 poster. Så snart jeg
igen fjerner DBGriden fra formen, så vises igen ukorrekt kun 0-1 post.
| |
Michael Haase (06-03-2010)
| Kommentar Fra : Michael Haase |
Dato : 06-03-10 15:00 |
|
Michael Sørensen skrev dette den 03-03-2010 23:14:
> Findes der en logisk forklaring på dette:
>
> Jeg skal vise, hvor mange poster, der er i min tabel, der matcher et input.
>
> Et simpelt eksempel fra en onClick event på en knap
>
> ...
> Konto := cdsKontoplan.FieldByName('Konto').asInteger;
> ibquery1.sql.clear;
> ibquery1.sql.add('SELECT ID, konto FROM tblPosteringer WHERE konto =
> :konto');
> ibquery1.ParamByName('Konto').Value := Konto;
> ibquery1.open;
> application.message('Der er ' + inttostr(ibquery1.recordcount) + '
> poster');
> ibquery1.close;
> ...
>
> Ovenstående viser 0 eller 1 poster selvom der faktisk er mellem 1 og 4
> poster i min faktiske test tabel afhængig af hvilken konto jeg indtaster
> som parameter.
Det er list svært at svare sikkert på uden at kende opbygningen af din
tabel, og en skitse af indholdet.
Har du prøvet at ændre til:
...
ibquery1.sql.add('SELECT count(ID) antal FROM tblPosteringer WHERE
konto =
:konto');
ibquery1.open;
while not ibquery1.eof do
begin
application.message('Der er ' +
inttostr(ibquery1.FieldByName('antal').asInteger) + poster')
next;
end;
...
og se hvad det evt. giver?
--
Michael Haase
| |
Michael Sørensen (06-03-2010)
| Kommentar Fra : Michael Sørensen |
Dato : 06-03-10 15:31 |
|
Michael Haase skrev:
> Michael Sørensen skrev dette den 03-03-2010 23:14:
>
>> Findes der en logisk forklaring på dette:
>>
>> Jeg skal vise, hvor mange poster, der er i min tabel, der matcher et
>> input.
>>
>> Et simpelt eksempel fra en onClick event på en knap
>>
>> ...
>> Konto := cdsKontoplan.FieldByName('Konto').asInteger;
>> ibquery1.sql.clear;
>> ibquery1.sql.add('SELECT ID, konto FROM tblPosteringer WHERE konto =
>> :konto');
>> ibquery1.ParamByName('Konto').Value := Konto;
>> ibquery1.open;
>> application.message('Der er ' + inttostr(ibquery1.recordcount) + '
>> poster');
>> ibquery1.close;
>> ...
>>
>> Ovenstående viser 0 eller 1 poster selvom der faktisk er mellem 1 og 4
>> poster i min faktiske test tabel afhængig af hvilken konto jeg indtaster
>> som parameter.
>
> Det er list svært at svare sikkert på uden at kende opbygningen af din
> tabel, og en skitse af indholdet.
>
> Har du prøvet at ændre til:
>
> ...
> ibquery1.sql.add('SELECT count(ID) antal FROM tblPosteringer WHERE konto =
> :konto');
> ibquery1.open;
> while not ibquery1.eof do
> begin
> application.message('Der er ' +
> inttostr(ibquery1.FieldByName('antal').asInteger) + poster')
> next;
> end;
> ...
>
> og se hvad det evt. giver?
Valget af select count() virker.
Jeg har fundet ud af, at det handler om, at en quer ikke nødvendigvis
henter hele tabellen og giver korrekt visning af recordcount, hvis den
ikke har brug for data.
Først når den får brug får data - eksempelvis ved at være forbundet til
en dbgrid - så henter den hele tabellen og kan vise korrekt antal i
recordcount.
| |
Stig Johansen (06-03-2010)
| Kommentar Fra : Stig Johansen |
Dato : 06-03-10 17:50 |
|
Michael Sørensen wrote:
> Først når den får brug får data - eksempelvis ved at være forbundet til
> en dbgrid - så henter den hele tabellen og kan vise korrekt antal i
> recordcount.
Du kan omformulere det til lidt generelt.
En SQL returnerer aldrig hele resultatsættet, det skal 'hentes'.
Først når den sidste record er hentet kendes antallet.
I dit eksempel er det dbgrid'en, der henter helse resultatsættet.
--
Med venlig hilsen
Stig Johansen
| |
|
|