18. november 2007 - 20:40Der 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.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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?
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.
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;
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.
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;
Synes godt om
Ny brugerNybegynder
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.