DBGrid
DBGrid
Hallo zusammen,
ich hätte mal ein paar Fragen zum Thema DBGrid.
Ich hab mir eine kleine "Datenbank" mit Dbf und Datasource gebastelt (Sqlite3).
Mein DBGrid zeigt die Daten die ich hinterlegt habe schon richtig an.
Ich möchte nun aber mir den Daten in der DBGrid arbeiten, heißt auslesen.
Jede Zeile hat in der ersten Spalte eine Nummer vergeben.
Mit Hilfe eines TEdit möchte ich nun die korrekte Zeile auswählen (Heißt Nummer eingeben die der Nummer in der ersten Spalte entspricht) und die Daten in den folgenden Spalten auswerten.
Die Tabelle sieht quasi wie folgt aus:
10|Adresse|Name....
11| ...
13|
16|
25|
Da ich schon gelesen habe das die Auswertung über das DBGrid anscheinend nicht möglich ist, wollte ich euch Experten fragen ob und wie man solche Anwendungen dann umsetzen kann.
Zu meiner zweiten Frage:
Kann ich die Spalten auch irgendwie Filtern? Sprich ich möchte alle Zeilen eingeblendet haben die in der ersten Spalte die Nummer 10 z.B. stehen hat.
Danke für euer ständiges Engagement.
Grüßle,
l0lhaxx
EDIT: Mit auswerten meine ich z.B. einer Variable übergeben oder einem Label
ich hätte mal ein paar Fragen zum Thema DBGrid.
Ich hab mir eine kleine "Datenbank" mit Dbf und Datasource gebastelt (Sqlite3).
Mein DBGrid zeigt die Daten die ich hinterlegt habe schon richtig an.
Ich möchte nun aber mir den Daten in der DBGrid arbeiten, heißt auslesen.
Jede Zeile hat in der ersten Spalte eine Nummer vergeben.
Mit Hilfe eines TEdit möchte ich nun die korrekte Zeile auswählen (Heißt Nummer eingeben die der Nummer in der ersten Spalte entspricht) und die Daten in den folgenden Spalten auswerten.
Die Tabelle sieht quasi wie folgt aus:
10|Adresse|Name....
11| ...
13|
16|
25|
Da ich schon gelesen habe das die Auswertung über das DBGrid anscheinend nicht möglich ist, wollte ich euch Experten fragen ob und wie man solche Anwendungen dann umsetzen kann.
Zu meiner zweiten Frage:
Kann ich die Spalten auch irgendwie Filtern? Sprich ich möchte alle Zeilen eingeblendet haben die in der ersten Spalte die Nummer 10 z.B. stehen hat.
Danke für euer ständiges Engagement.
Grüßle,
l0lhaxx
EDIT: Mit auswerten meine ich z.B. einer Variable übergeben oder einem Label
Re: DBGrid
Hast du die Datenbank auf Dbf oder SQLite aufgebaut?l0lhaxx hat geschrieben:Ich hab mir eine kleine "Datenbank" mit Dbf und Datasource gebastelt (Sqlite3).
Für soetwas würde ich lieber eine TDBLookupComboBox empfehlen, sie ist dafür gemacht. Siehe http://wiki.freepascal.org/dblookupcomboboxl0lhaxx hat geschrieben:Mit Hilfe eines TEdit möchte ich nun die korrekte Zeile auswählen (Heißt Nummer eingeben die der Nummer in der ersten Spalte entspricht) und die Daten in den folgenden Spalten auswerten.
Keine Ahnung, wie man das mit Dbf macht. Mit SQLite würde ich das Select Statement entsprechend aktualisieren (Google mal nach "SQLite + Where") z.b.: http://www.tutorialspoint.com/sqlite/sq ... clause.html0lhaxx hat geschrieben:Kann ich die Spalten auch irgendwie Filtern? Sprich ich möchte alle Zeilen eingeblendet haben die in der ersten Spalte die Nummer 10 z.B. stehen hat.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid
Dbf!Michl hat geschrieben:Hast du die Datenbank auf Dbf oder SQLite aufgebaut?
Wenn ich diese mit meinem Datasource verknüpfe und die Zeile auswähle, erscheint später im Programm trotzdem nur eine Leere Box...Michl hat geschrieben:Für soetwas würde ich lieber eine TDBLookupComboBox empfehlen, sie ist dafür gemacht. Siehe http://wiki.freepascal.org/dblookupcombobox
Ist es dann vielleicht notwendig doch auf SQLite umzusteigen? Bzw. basiert das ganze mit DBF nicht auf SQLite?Michl hat geschrieben:Keine Ahnung, wie man das mit Dbf macht. Mit SQLite würde ich das Select Statement entsprechend aktualisieren (Google mal nach "SQLite + Where") z.b.: http://www.tutorialspoint.com/sqlite/sq ... clause.htm
Re: DBGrid
Wie kommst du darauf (http://wiki.freepascal.org/Lazarus_Tdbf ... Dbf_bietet vs. http://wiki.freepascal.org/SQLite)?l0lhaxx hat geschrieben:Bzw. basiert das ganze mit DBF nicht auf SQLite?
Bei einer Dbf basierten Lösung brauchst du keine Bibliothek mit deinem Projekt mitliefern, verzichtest aber auf SQL. Mit Dbf habe ich persönlich, außer zu Testzwecken, keine Erfahrungen (Offtopic: für ganz kleine Anwendungsfälle habe ich manchmal TBufDataset verwendet, würde aber immer zu SQLite raten).
Hast du auch ListSource und ListField entsprechend gesetzt?l0lhaxx hat geschrieben:Wenn ich diese mit meinem Datasource verknüpfe und die Zeile auswähle, erscheint später im Programm trotzdem nur eine Leere Box...
Alternativ könntest du auch ein TEdit nehmen und deinen Record per Locate händisch suchen lassen. Das ist aber nicht der Königsweg.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid
Aber dann kann ich doch wieder nur einen Eintrag in eine andere Tabelle übergeben, wenn ich das jetzt richtig nachgelesen habe.
Ich möchte die Einträge aus meiner Datenbank aber in Variablen schreiben...
Ich möchte die Einträge aus meiner Datenbank aber in Variablen schreiben...

Re: DBGrid
Ich verstehe dich nicht, wenn du mir immer nur ein paar Brocken zuwirfst. Auch weiss ich nicht, was du mit den Daten vorhast. Möglicherweise kann die Datenbank schon die Aufgabe übernehmen und du brauchst nur noch mittels einem entsprechendem Select die notwendigen Informationen abholen.
Ich versuche es nochmal einen Lösungsansatz zu geben, wie ich die Aufgabenstellung jetzt verstanden habe.
- stelle dir die gewünschten Daten mittels deines Datasets (ob nun per Dbf oder SQLite) in deinem Programm zur Verfügung
- mit SQLite kannst du ein Select machen, wo nur Daten mit der ID mod 10 = 0 ausgelesen werden (Das Select müsste in etwa so aussehen (ungetestet) "SELECT yourdata FROM yourtable WHERE column % 10 = 0;")
- mit Dbf kenne ich mich nicht aus, denke aber, dass du dort (wäre auch so mit SQLite möglich) alle Records in einer Schleife durchlaufen müsstest und prüfen musst, ob sie einen gesuchten Datensatz darstellen oder nicht. (z.B. könnte es mit SQLite und SQLDB so aussehen):Anstatt diese Daten wie hier per ShowMessage auszugeben, könntest du diese in ein Array oder eine Liste speichern. Ob es notwendig ist, kann ich dir aufgrund des bisherigen Informationsstandes nicht sagen.
Auf jeden Fall ist diese Aufgabe nicht für das DBGrid (ist nur die Anzeigenkomponente) sondern für das Dataset (oder die Datenbank) bestimmt.
Ich versuche es nochmal einen Lösungsansatz zu geben, wie ich die Aufgabenstellung jetzt verstanden habe.
- stelle dir die gewünschten Daten mittels deines Datasets (ob nun per Dbf oder SQLite) in deinem Programm zur Verfügung
- mit SQLite kannst du ein Select machen, wo nur Daten mit der ID mod 10 = 0 ausgelesen werden (Das Select müsste in etwa so aussehen (ungetestet) "SELECT yourdata FROM yourtable WHERE column % 10 = 0;")
- mit Dbf kenne ich mich nicht aus, denke aber, dass du dort (wäre auch so mit SQLite möglich) alle Records in einer Schleife durchlaufen müsstest und prüfen musst, ob sie einen gesuchten Datensatz darstellen oder nicht. (z.B. könnte es mit SQLite und SQLDB so aussehen):
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
SQLQuery1.First;
while not SQLQuery1.EOF do
begin
if SQLQuery1.Fields[0].AsInteger mod 10 = 0 then
ShowMessage('Record ' + SQLQuery1.Fields[0].AsString + ': ' + SQLQuery1.Fields[1].AsString);
SQLQuery1.Next;
end;
end;
Auf jeden Fall ist diese Aufgabe nicht für das DBGrid (ist nur die Anzeigenkomponente) sondern für das Dataset (oder die Datenbank) bestimmt.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid
Also....
Ich arbeite mit einem Dbf, Datasource und DBGrid.
In der Datei Dbf1 habe ich die Felder
Nr. | Adresse | Name | Kosten | Kosten2
erstellt.
Anschließend habe ich einen Pfad angelegt und dem Programm gesagt, falls dort diese Datei nicht befindet soll er sie erstellen.
Dann wurde das Dbf mit einem Datasource verknüpft, welche die Daten an meine DBGrid übergibt.
Mit dem DBGrid habe ich dann alle Daten hinterlegt, also ein paar beispiel Namen, Adressen, Kosten etc.
Jetzt möchte ich anhand der Nummer berechnungen durchführen. Über eine DBlookUpComboBox soll eine der Nr. gewählt werden (Also die erste Spalte). Anschließend möchte ich die folgenden Zeilen der Spalte Adresse, Name, Kosten in Labels schreiben bzw. mit den Werten bei "Kosten" ein paar rechnungen durchführen und diese dann wieder auf Labels ausgeben (Das Ganze auf einer anderen Form, die "Datenkbank" soll quasi unsichtbar im Hintergrund liegen).
Genau dieses "auslesen" nach der Selektierung durch die Nr. möchte ich nun tun. Hab aber keine Idee wie.
Sorry aber ich bin neu auf diesem Gebiet. Danke für deine Hilfe.
Ich arbeite mit einem Dbf, Datasource und DBGrid.
In der Datei Dbf1 habe ich die Felder
Nr. | Adresse | Name | Kosten | Kosten2
erstellt.
Anschließend habe ich einen Pfad angelegt und dem Programm gesagt, falls dort diese Datei nicht befindet soll er sie erstellen.
Dann wurde das Dbf mit einem Datasource verknüpft, welche die Daten an meine DBGrid übergibt.
Mit dem DBGrid habe ich dann alle Daten hinterlegt, also ein paar beispiel Namen, Adressen, Kosten etc.
Jetzt möchte ich anhand der Nummer berechnungen durchführen. Über eine DBlookUpComboBox soll eine der Nr. gewählt werden (Also die erste Spalte). Anschließend möchte ich die folgenden Zeilen der Spalte Adresse, Name, Kosten in Labels schreiben bzw. mit den Werten bei "Kosten" ein paar rechnungen durchführen und diese dann wieder auf Labels ausgeben (Das Ganze auf einer anderen Form, die "Datenkbank" soll quasi unsichtbar im Hintergrund liegen).
Genau dieses "auslesen" nach der Selektierung durch die Nr. möchte ich nun tun. Hab aber keine Idee wie.
Sorry aber ich bin neu auf diesem Gebiet. Danke für deine Hilfe.
Re: DBGrid
Nachdem du einen Datensatz (eine Zeile) gewählt hast, kannst du die Daten z.B. so auslesen:l0lhaxx hat geschrieben:Genau dieses "auslesen" nach der Selektierung durch die Nr. möchte ich nun tun. Hab aber keine Idee wie.
Code: Alles auswählen
ShowMessage(DataModule1.Dbf.FieldByName('NAME').AsString);
Code: Alles auswählen
ShowMessage(Dbf.Fields[0].AsString);
PS: Ich würde trotzdem eine SQLite-Variante vorziehen und die Kosten in einer separaten Tabelle unterbringen, diese mit der ID der Tabelle mit dem Namen verbinden. Somit könne man später unterschiedlich viele Kosten zu einer Person zuordnen (falls du das überhaupt willst).
- Dateianhänge
-
DbfTest.zip
- (4.85 KiB) 70-mal heruntergeladen
Zuletzt geändert von Michl am Mi 3. Feb 2016, 09:52, insgesamt 1-mal geändert.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid
Genau das habe ich gesucht!
Ich versuch mich gleich selbst daran!
Aber wirklich mal ein großes Lob an das Forum und besonderst an dich.
Besser geht es nicht und dann noch mit einem Beispiel serviert. Köstlich!
Ich versuch mich gleich selbst daran!
Aber wirklich mal ein großes Lob an das Forum und besonderst an dich.
Besser geht es nicht und dann noch mit einem Beispiel serviert. Köstlich!

Re: DBGrid
Danke, für die netten Worte! Ich hoffe es hilft als Anregung.
Zuletzt geändert von Michl am Di 2. Feb 2016, 21:32, insgesamt 1-mal geändert.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: DBGrid
Würd dir raten auf SQLite umzusteigen.
Mit TDbf hatt ich damals arge Probleme. Bis hin zu nicht reparablen Datenverlusten.
Mit TDbf hatt ich damals arge Probleme. Bis hin zu nicht reparablen Datenverlusten.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
Re: DBGrid
So hab das ganze jetzt mal probiert.
Das Programm wird zwar kompiliert aber die projekt.exe öffnet sich nicht. Auch nicht wenn ich 10min warte.
Hab die bestehende Projekt.exe mal gelöscht und neu kompiliert, mit gleichem Ergebnis.
Wenn ich die Projekt.exe direkt im Projekt-Verzeichnis starte, erscheint nun auch keine Form mehr. Im Tastmanager unter "Prozesse" ist diese jedoch eingetragen.
Hab ich was falsch gemacht?
Das Programm wird zwar kompiliert aber die projekt.exe öffnet sich nicht. Auch nicht wenn ich 10min warte.
Hab die bestehende Projekt.exe mal gelöscht und neu kompiliert, mit gleichem Ergebnis.
Wenn ich die Projekt.exe direkt im Projekt-Verzeichnis starte, erscheint nun auch keine Form mehr. Im Tastmanager unter "Prozesse" ist diese jedoch eingetragen.
Hab ich was falsch gemacht?
Re: DBGrid
K.A., habe es eben noch auf einem Laz. 1.4.0 probiert, da läuft es problemlos (Windows 7).
Ich könnte mir höchstens vorstellen, dass das Formular nicht im sichtbaren Bereich liegt. Kannst ja mal die Eigenschaft Form1.Position im Objektinspektor von poScreenCenter auf poDesigned stellen.
Falls das nicht funktioniert, zwei Fragen:
Ist das Formular in der IDE normal sichtbar?
Unter welchem OS mit welcher Lazarusversion arbeitest du?
Ich könnte mir höchstens vorstellen, dass das Formular nicht im sichtbaren Bereich liegt. Kannst ja mal die Eigenschaft Form1.Position im Objektinspektor von poScreenCenter auf poDesigned stellen.
Falls das nicht funktioniert, zwei Fragen:
Ist das Formular in der IDE normal sichtbar?
Unter welchem OS mit welcher Lazarusversion arbeitest du?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid
Hab die Projekt.exe jetzt mal vom Projekt-Verzeichnis auf den Desktop kopiert. Wenn ich die Datenbank Dateien nicht mitkopiere, startet das Programm wie gewünscht und erstellt sich die Datenbank Dateien neu. Ich füge dann provisorisch einen neuen Eintrag in die Datenbank ein.Dann funktioniert auch alles (Mit den Änderungen des Auswerten). Schließe ich dann die Projekt.exe und starte sie neu und wähle mit DBLookupComboBox1 ein Name aus, bekomme ich die Fehlermeldung "Dbf1: Field not found:" ".
Alle freien Felder beim provisorischen anlegen wurden aber ausgefüllt.
Das Formular1 wo sich die DBLookupComboBox1 befindet ist immer sichtbar. Zum anzeigen der Datenbank muss im Hauptmenü der entsprechende Eintrag ausgewählt werden.
Ich arbeite mit Windows 7 SP1 und Lazarus 1.4.4
Alle freien Felder beim provisorischen anlegen wurden aber ausgefüllt.
Das Formular1 wo sich die DBLookupComboBox1 befindet ist immer sichtbar. Zum anzeigen der Datenbank muss im Hauptmenü der entsprechende Eintrag ausgewählt werden.
Ich arbeite mit Windows 7 SP1 und Lazarus 1.4.4
Re: DBGrid
Damn!
Ich hatte in der Unit "UDataModule" die Fieldnamen später in Großbuchstaben geändert, da Dbf generell alle Fieldnamen in Großbuchstaben umändert. Dabei habe ich einen Schreibfehler eingearbeitet.
Öffne mal die Unit UDataModule und ändere die Zeile 43 vonnach, dann sollte das mit der Neuerstellung funktionieren. Habe die Datei oben eben entsprechend geändert.
Ich hatte in der Unit "UDataModule" die Fieldnamen später in Großbuchstaben geändert, da Dbf generell alle Fieldnamen in Großbuchstaben umändert. Dabei habe ich einen Schreibfehler eingearbeitet.
Öffne mal die Unit UDataModule und ändere die Zeile 43 von
Code: Alles auswählen
Dbf.FieldDefs.Add('ADRSSSE', ftString, 500, True);
Code: Alles auswählen
Dbf.FieldDefs.Add('ADRESSE', ftString, 500, True);
Die Aussage verstehe ich nicht. Form2 sollte sich erst nach dem Buttonclick in Form1 öffnen. Was meinst du mit Hauptmenü?l0lhaxx hat geschrieben:Das Formular1 wo sich die DBLookupComboBox1 befindet ist immer sichtbar. Zum anzeigen der Datenbank muss im Hauptmenü der entsprechende Eintrag ausgewählt werden.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;