Avatar billede vint Nybegynder
18. november 2007 - 20:40 Der er 5 kommentarer og
1 løsning

Manuelt indsætte data fra Firebird DB til grid

Hej.

Jeg har en firebird database med data, som jeg gerne vil have indsat i en grid. Jeg bruger ikke en DBGrid og vil have dataene indsat manuelt i en ganske normal grid.

Jeg har forsøgt en del med forskellige fejl til følge eller forsøg uden ønskede effekt.

Jeg har på min form oprettet forbindelse via en IBDatabase til min firebird database.

Jeg bruger så en IBQuery

I min kode for formens onshow har jeg følgende:

var
  I: Integer;
begin
  query1.SQL.Clear;
  query1.SQL.Add('select initialer, navn from PERSONER');
  query1.Open;

  for i:= 1 to query1.RecordCount do
  begin
    grid1.AddRow;
    grid1.Cells[0,grid1.Row+i]:= query1.FieldValues['Initialer'];
    grid1.Cells[1,grid1.Row+i]:= query1.FieldValues['Navn'];
    query1.Next;
  end;

  query1.Close;
end;

Som det ser ud nu, så får jeg rigtignok en post frem i min grid. Men ikke post 2 (Der er nemlig pt 2 poster i tabellen).

Til gengæld har jeg observeret, at hvis jeg indsætter en datasource og en DBGrid, som sættes korret op, så vises begge poster fra min database korrekt - både i min DBGrid og i min alm./manuelle grid.

Mystisk.

Hvad gør jeg forkert?
Avatar billede hrc Mester
19. november 2007 - 10:07 #1
Skal du ikke bare sætte antallet af linjer: Row := query1.RecordCount

Hvad med at droppe TGrid og bruge TListView i stedet (i report mode)?

Alternativt kan du bruge client data sæt sammen med en dbgrid. Du har ingen åbne forbindelser til databasen, men kan stadig bruge komponenterne. Desuden har du muligheden for at bruge "applyupdates" skulle du behøve opdatere værdier?
Avatar billede vint Nybegynder
21. november 2007 - 20:29 #2
Hej.

Tak for dit svar - og beklager mit eget sene svar.

Tjo det giver egentlig lidt det samme at sætte antallet af linier til query1.recordcount, som at oprette en ny linie for hver post i tabellen. Men fælles for begge metoder er, at hvis jeg ikke har oprettet en datasource og en DBgrid, så er det kun den sidste post i tabellen, der bliver indsat i min grid. Og jeg forstår simpelthen ikke hvorfor man ikke kan lave det UDEN at have en datasource og DB aware komponent på formen.

Jeg synes i dette tilfælde, at det er at skyde for højt over målet at bruge en clientdataset, men det er da en løsning i andre tilfælde.

Jeg vil kigge på TListView i stedet for.

Du kan smide et svar alligevel.
Avatar billede hrc Mester
22. november 2007 - 07:25 #3
Det gør jeg her. Synes ikke, når lige man abstraherer fra at der placeres 4 komponenter på formen i stedet for 2, at clientdatasæt forøger kompleksiteten væsentligt.

Hvad med at prøve følgende. Har ikke helt styr på om titellinjen er row 0, men der må du evt. justere med et +1 et eller andet sted:

Query.Open;
i := 0;
Grid1.RowCount := Query.RecordCount; // Evt. + 1
while not Query.Eof do
begin
  inc(i);
  Grid1.Cells[0,i] := Query.query1.FieldValues['Initialer'];
  Grid1.Cells[1,i] := Query.query1.FieldValues['Navn'];
  Query1.Next;
end;
Avatar billede vint Nybegynder
22. november 2007 - 08:32 #4
Hej hrc.

Nah, måske lader jegmig distrahere af, at der er 4 komponenter i stedet for 2 og derved lader mig tro, at det gør det hele - også programafviklingen - mere bøvlet.
Avatar billede vint Nybegynder
22. november 2007 - 08:33 #5
Bortset fra det, så ender mit program af uanede årsager med at hænge og jeg bliver nødt til at slå det ihjel, når jeg anvende while not query.eof do.
Avatar billede hrc Mester
22. november 2007 - 14:59 #6
Det her virker fint hos mig (databasen er Firebird, men det burde altså ikke betyde noget):

procedure TfrmMain.FormShow(Sender: TObject);
var
  i : integer;
begin
  Query.Open;
  i := 0; // Første linje er en overskrift
  StringGrid.RowCount := Query.RecordCount + 1;
  while not Query.Eof do
  begin
    inc(i);
    StringGrid.Cells[0,i] := Query.FieldByName('navn').AsString;
    Query.Next;
  end;
end;
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