DBGrid

Für Fragen von Einsteigern und Programmieranfängern...
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

DBGrid

Beitrag von l0lhaxx »

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

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

l0lhaxx hat geschrieben:Ich hab mir eine kleine "Datenbank" mit Dbf und Datasource gebastelt (Sqlite3).
Hast du die Datenbank auf Dbf oder SQLite aufgebaut?
l0lhaxx 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.
Für soetwas würde ich lieber eine TDBLookupComboBox empfehlen, sie ist dafür gemacht. Siehe http://wiki.freepascal.org/dblookupcombobox
l0lhaxx 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.
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

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

Michl hat geschrieben:Hast du die Datenbank auf Dbf oder SQLite aufgebaut?
Dbf!
Michl hat geschrieben:Für soetwas würde ich lieber eine TDBLookupComboBox empfehlen, sie ist dafür gemacht. Siehe http://wiki.freepascal.org/dblookupcombobox
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: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
Ist es dann vielleicht notwendig doch auf SQLite umzusteigen? Bzw. basiert das ganze mit DBF nicht auf SQLite?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

l0lhaxx hat geschrieben:Bzw. basiert das ganze mit DBF nicht auf SQLite?
Wie kommst du darauf (http://wiki.freepascal.org/Lazarus_Tdbf ... Dbf_bietet vs. http://wiki.freepascal.org/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).
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...
Hast du auch ListSource und ListField entsprechend gesetzt?

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;  

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

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... :?:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

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):

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;
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.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

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.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

l0lhaxx hat geschrieben:Genau dieses "auslesen" nach der Selektierung durch die Nr. möchte ich nun tun. Hab aber keine Idee wie.
Nachdem du einen Datensatz (eine Zeile) gewählt hast, kannst du die Daten z.B. so auslesen:

Code: Alles auswählen

ShowMessage(DataModule1.Dbf.FieldByName('NAME').AsString);
oder so:

Code: Alles auswählen

ShowMessage(Dbf.Fields[0].AsString);
Bevor ich dir irgendwelchen Blödsinn erzähle (hatte Dbf schon lange nicht mehr getestet), habe ich eben ein kleines Bsp (unausgefeilt) mit Dbf zusammengestellt, was das macht, wie du es scheinbar willst. Projekt anbei. Kann man sicherlich auch anders aufbauen.

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;  

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

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! :wink:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

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;  

Christian
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

Beitrag von Christian »

Würd dir raten auf SQLite umzusteigen.
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/

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

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?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

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?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: DBGrid

Beitrag von l0lhaxx »

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

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid

Beitrag von Michl »

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 von

Code: Alles auswählen

    Dbf.FieldDefs.Add('ADRSSSE', ftString, 500, True);       
nach

Code: Alles auswählen

    Dbf.FieldDefs.Add('ADRESSE', ftString, 500, True);       
, dann sollte das mit der Neuerstellung funktionieren. Habe die Datei oben eben entsprechend geändert.
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.
Die Aussage verstehe ich nicht. Form2 sollte sich erst nach dem Buttonclick in Form1 öffnen. Was meinst du mit Hauptmenü?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten