Avatar billede smolle Nybegynder
18. marts 2004 - 09:38 Der er 4 kommentarer og
1 løsning

Tæl poster i Access

Jeg ønsker at tælle hvor mange poster der er i min database, for at kunne sætte antallet af rækker lig med dette antal. Min kode ser således ud:

procedure TForm1.edithentClick(Sender: TObject);
var
i: integer;
antal: integer;
begin
i:=0;
antal:=0;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='SELECT COUNT(adressebogid) AS antal FROM adressebog';
showmessage(inttostr(antal));//for at kontrollere 'antal'.
Stringgrid1.RowCount:=antal;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM adressebog');
ADOQuery1.Active := True;
ADOquery1.First;
while not adoquery1.EOF do
begin
StringGrid1.Cells[0,i]:=(AdoQuery1.FieldbyName('fornavn').AsString + ' ' + AdoQuery1.FieldbyName('efternavn').AsString + ',' + ' ' + AdoQuery1.FieldbyName('adresse').AsString);
adoquery1.Next;
inc(i);
end;
end;

Problemet er, at der ikke bliver indsat nogle værdier i 'antal'. Som det ses sætter jeg 'antal' lig med 0 i starten og det bliver den ved med at være efter den har talt posterne i databasen. Jeg har også prøvet at skrive:

ADOQuery1.SQL.Add('SELECT COUNT(adressebogid) AS antal FROM adressebog');

men det virker heller ikke. Sætter jeg ikke selv antal lig med 0, kommer den med en værdi på 1243534 (eller sådan noget) og der er altså kun 2 poster i databasen!
Avatar billede stoney Nybegynder
18. marts 2004 - 09:52 #1
mangler du ikke en OPEN

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='SELECT COUNT(adressebogid) AS antal FROM adressebog';
adoquery1.open

Stoney
Avatar billede hrc Mester
18. marts 2004 - 10:40 #2
Min tabel hedder names og feltet jeg tæller er id, men ellers så er det analogt smolles kode:

var
  i: integer;
  Antal: integer;
begin
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT COUNT(id) AS Antal FROM names');
    ADOQuery1.Open;

    Antal := ADOQuery1.FieldByName('Antal').AsInteger;
    showmessage(inttostr(antal));//for at kontrollere 'antal'.

    // Det er bare unødvendigt arbejde idet du har recordcount propertien
    // Se nedenfor

    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM names');
    ADOQuery1.Open;
    Stringgrid1.RowCount := ADOQuery1.RecordCount;

    i:=0;
    while not ADOQuery1.EOF do begin
      StringGrid1.Cells[0,i] := AdoQuery1.FieldbyName('Name').AsString;
      ADOQuery1.Next;
      inc(i);
    end;
  finally
    ADOQuery1.Close;
  end; // try
Avatar billede hrc Mester
18. marts 2004 - 10:41 #3
Den optimerede procedure ser sådan her ud:

var
  i: integer;
begin
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM names');
    ADOQuery1.Open;

    Stringgrid1.RowCount := ADOQuery1.RecordCount;

    i:=0;
    while not ADOQuery1.EOF do begin
      StringGrid1.Cells[0,i] := AdoQuery1.FieldbyName('Name').AsString;
      ADOQuery1.Next;
      inc(i);
    end;
  finally
    ADOQuery1.Close;
  end; // try
Avatar billede hrc Mester
18. marts 2004 - 11:00 #4
Måske burde du også ændre cursoren:

Screen.Cursor := crHourglass;
try
  // ADOQuery ...
finally
  Screen.Cursor := crDefault;
end;
Avatar billede smolle Nybegynder
18. marts 2004 - 16:46 #5
Tak for svaret hrc. Det virkede fint, så du får pointene.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester