Probleme mit TDbf
Probleme mit TDbf
Hallo alle zusammen!
Also ich habe folgendes Problem bei der Verwendung von Lazarus:
Ich möchte mit TDbf auf eine dBase-Tabelle zugreifen, um dann eine DBListbox mit diesen Daten zu speisen. Aber was ich auch mache die DBListbox bleibt immer leer. Auch eine DBCombobox habe ich schonmal eingebaut. Die zeigt allerdings immer nur das oberste Element der Tabelle an.
Die erste Tabelle habe ich mit OpenOffice Calc angelegt. Bei einem zweiten Versuch habe ich die Tabelle wie in dem folgenden Link beschrieben mit Lazarus angelegt:
Lazarus Tutorial
Der zweite Versuch hat aber überhaupt nicht geklappt (Die Datei war nicht lesbar; weder mit Lazarus noch mit OpenOffice)
Ich wäre sehr dankbar, wenn mir jemand bei meinem Problem helfen könnte!
Also ich habe folgendes Problem bei der Verwendung von Lazarus:
Ich möchte mit TDbf auf eine dBase-Tabelle zugreifen, um dann eine DBListbox mit diesen Daten zu speisen. Aber was ich auch mache die DBListbox bleibt immer leer. Auch eine DBCombobox habe ich schonmal eingebaut. Die zeigt allerdings immer nur das oberste Element der Tabelle an.
Die erste Tabelle habe ich mit OpenOffice Calc angelegt. Bei einem zweiten Versuch habe ich die Tabelle wie in dem folgenden Link beschrieben mit Lazarus angelegt:
Lazarus Tutorial
Der zweite Versuch hat aber überhaupt nicht geklappt (Die Datei war nicht lesbar; weder mit Lazarus noch mit OpenOffice)
Ich wäre sehr dankbar, wenn mir jemand bei meinem Problem helfen könnte!
Es ist immer hilfreich, wenn du so viele Details wie möglich zu deinem Problem angeben kannst, z.B. mit welchen Programmversionen gearbeitet wird, welche (erfolglosen) Schritte bereits unternommen wurden oder wie z.B. die Daten der Listbox hinzugefügt werden sollten. Im Moment kann ich nur allgemeine Hinweise geben. TDbf unterstützt nicht alle dBase Versionen. Ich würde daher die Version auf jeden Fall prüfen. Beim Anlegen einer Tabelle im Code sollte die TableLevel Eigenschaft beachtet werden. Wenn hier versehentlich das FoxPro Format gewählt wird, könnte es schwierig mit dem Lesen der Daten werden.
knight
knight
Erstmal vielen Dank für die schnelle Antwort!
Also meine Lazarusversion ist 0.9.16 (Windows)
Außerdem habe ich FreePascal 2.0.2
Leider verrät mir OpenOffice nicht in welcher Version es die dBase-Tabelle speichert. Wenn ich allerdings eine dBase Tabelle mit OO anlege und dann den Dateinamen in TDbf eingebe, stellt sich TableLevel immer automatisch auf 3 (auch wenn ich versuche das umzustellen). Daher vermute ich, dass es sich um dBase III+ handelt.
Die Daten die in der Listbox erscheinen sollen, sind Filmtitel (String).
Hat man einen Film ausgewählt, so soll die Länge des Films, Zeitpunkt Abspann, etc. (Integer) als Variablen übernommen werden.
So, hier noch ein paar Screenshots:
Tabelle
Listbox
Dbf1
Datasource
Da ist mir gerade noch etwas aufgefallen:
Bei Dbf1.FieldDefs[0] (Film) ist Size auf 43 eingestellt. Das ist genau die Länge des längsten Filmtitels in der Tabelle. Das würde ja heißen, dass Lazarus die anderen Elemente doch gefunden hat. Aber warum werden sie nicht angezeigt?
Also meine Lazarusversion ist 0.9.16 (Windows)
Außerdem habe ich FreePascal 2.0.2
Leider verrät mir OpenOffice nicht in welcher Version es die dBase-Tabelle speichert. Wenn ich allerdings eine dBase Tabelle mit OO anlege und dann den Dateinamen in TDbf eingebe, stellt sich TableLevel immer automatisch auf 3 (auch wenn ich versuche das umzustellen). Daher vermute ich, dass es sich um dBase III+ handelt.
Die Daten die in der Listbox erscheinen sollen, sind Filmtitel (String).
Hat man einen Film ausgewählt, so soll die Länge des Films, Zeitpunkt Abspann, etc. (Integer) als Variablen übernommen werden.
So, hier noch ein paar Screenshots:
Tabelle
Listbox
Dbf1
Datasource
Da ist mir gerade noch etwas aufgefallen:
Bei Dbf1.FieldDefs[0] (Film) ist Size auf 43 eingestellt. Das ist genau die Länge des längsten Filmtitels in der Tabelle. Das würde ja heißen, dass Lazarus die anderen Elemente doch gefunden hat. Aber warum werden sie nicht angezeigt?
Ich hab mir das Beispiel mal angesehen, aber ich kann mir ne Schleife noch nicht so recht vorstellen. In dem Beispiel wird die Listbox mit diesem Code Stück für Stück erweitert:
ListBox1.Items.Add(DateToStr(Easter - 46));
ListBox1.Items.Add(DateToStr(Easter - 2));
ListBox1.Items.Add(DateToStr(Easter + 1));
ListBox1.Items.Add(DateToStr(Easter + 39));
ListBox1.Items.Add(DateToStr(Easter + 50));
ListBox1.Items.Add(DateToStr(Easter + 60));
Ich müsste also die Datenbank Eintrag für Eintrag durchgehen (mit nem Index oder so) und dann die Listbox auffüllen. Naja...
Aber vielen Dank für nen anderen Tipp: Bis jetzt hab ich noch nicht gemerkt, dass schon Beispiele bei Lazarus dabei sind. Ich schau mal ob ich da eins mit TDbf finde.
Entschuldige bitte, aber ich könnte mir in den Hintern beißen. Da hab ich gerade den Fehler in meinem Programm gefunden und will ihn korrigieren und... Projektdatei zerschossen und Backup auch nicht zu gebrauchen. Naja, erstmal ne Nacht drüber schlafen
ListBox1.Items.Add(DateToStr(Easter - 46));
ListBox1.Items.Add(DateToStr(Easter - 2));
ListBox1.Items.Add(DateToStr(Easter + 1));
ListBox1.Items.Add(DateToStr(Easter + 39));
ListBox1.Items.Add(DateToStr(Easter + 50));
ListBox1.Items.Add(DateToStr(Easter + 60));
Ich müsste also die Datenbank Eintrag für Eintrag durchgehen (mit nem Index oder so) und dann die Listbox auffüllen. Naja...
Aber vielen Dank für nen anderen Tipp: Bis jetzt hab ich noch nicht gemerkt, dass schon Beispiele bei Lazarus dabei sind. Ich schau mal ob ich da eins mit TDbf finde.
Entschuldige bitte, aber ich könnte mir in den Hintern beißen. Da hab ich gerade den Fehler in meinem Programm gefunden und will ihn korrigieren und... Projektdatei zerschossen und Backup auch nicht zu gebrauchen. Naja, erstmal ne Nacht drüber schlafen
Entschuldige den Doppelpost, aber ich konnte nicht schlafen und...:
Endlich habe ich herausgefunden, warum das so nicht funktioniert hat.
Schuld ist nicht mein Programm oder meine Tabelle, sondern Lazarus.
In dem Beispiel address_book haben die ein DBGrid statt einer DBListbox verwendet und siehe da. Mit dieser Veränderung läuft nun auch mein Programm. Ich probier jetzt bald mal Version 0.9.18 aus und wenn das Problem dort immer noch besteht schreib ich den Entwicklern mal ein Feedback.
Endlich habe ich herausgefunden, warum das so nicht funktioniert hat.
Schuld ist nicht mein Programm oder meine Tabelle, sondern Lazarus.
In dem Beispiel address_book haben die ein DBGrid statt einer DBListbox verwendet und siehe da. Mit dieser Veränderung läuft nun auch mein Programm. Ich probier jetzt bald mal Version 0.9.18 aus und wenn das Problem dort immer noch besteht schreib ich den Entwicklern mal ein Feedback.
-
- Beiträge: 374
- Registriert: Mi 13. Sep 2006, 15:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Hagen a.T.W.
- Kontaktdaten:
Alter Datenbestand
Also ich habe schon seit Jahren einige größere dbase Datenbanken, die ich immer zu Testzwecken (Performance) einsetze. Die größte hat immerhin ca. 700 000 Datensätze. Die dbase Datenbanken wurden bereits in viele gängige Formate konvertiert (Paradox,Absolute Database, Mysql, Firebird). Aus diesem Datenbestand kann ich zwar eine alte dbf Datei (Level4) laden, sie wird mit der TDBF Kompo auch geladen und angezeigt, aber ich kann keine neuen Datensätze hinzufügen. Ebenfalls nicht (richtig) indizieren und auch nicht richtig suchen. Meine Vermutung ist, das es sich dabei um unterschiedliche Zeichensätze zwischen Linux und Windows handelt. Dieses Phänomen tritt nämlich nur unter Linux auf. Für Umsteiger von Windows nach Linux nicht erfreulich, die Ihren Datenbestand mitnehmen wollen.
Ralli
Ralli
-
- Beiträge: 374
- Registriert: Mi 13. Sep 2006, 15:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Hagen a.T.W.
- Kontaktdaten:
Verwende TDBLookupComboBox
Hallo Patrick,
Der DBListBox kannst Du nur einen Eintrag aus Items hinzufügen. Befinden sich die auszusuchenden Werte in einer Datenbank, kannst du auch eine TDBLookupComboBox verwenden, der kannst du dann mit ListSource und ListField eine Spalte in einer Datenbanktabelle zuweisen und mit Keyfield eine Spalte der Zieltabelle.
Ralli
Der DBListBox kannst Du nur einen Eintrag aus Items hinzufügen. Befinden sich die auszusuchenden Werte in einer Datenbank, kannst du auch eine TDBLookupComboBox verwenden, der kannst du dann mit ListSource und ListField eine Spalte in einer Datenbanktabelle zuweisen und mit Keyfield eine Spalte der Zieltabelle.
Ralli
Hi ralli! Vielen Dank auch für deine Antwort.
Also eine TDBLookupComboBox finde ich leider nicht unter den Komponenten. Bist du sicher, dass die in Version 0.9.16 schon vorhanden ist?
Die normale TDBComboBox funktioniert bei mir leider auch nicht richtig (siehe ersten Post). Die einzige Lösung, die bei mir bis jetzt funktioniert hat ist TDBGrid. Naja, zur Not kann ich damit leben...
Trotzdem Danke an alle die mir helfen wollten!
Nachtrag: Also jetzt bin ich mir ganz sicher, dass der Fehler in Lazarus 0.9.16 steckt. Ich hab ne alte Excel Version ausgegraben (war zwar nur ne Trial, aber das wichtigste geht noch). Da kann man sogar festlegen in welchem dBase-Format man speichern will. Ich habe 2 verschiedene Formate ausprobiert: dBase 3 und dBase 4
Bei beiden hab ich genau die gleichen Probleme, wie mit der Tabelle aus OO. TDBGrid geht; TDBCombobox, TDBListbox, TDBRadioGroup geht nicht
Also eine TDBLookupComboBox finde ich leider nicht unter den Komponenten. Bist du sicher, dass die in Version 0.9.16 schon vorhanden ist?
Die normale TDBComboBox funktioniert bei mir leider auch nicht richtig (siehe ersten Post). Die einzige Lösung, die bei mir bis jetzt funktioniert hat ist TDBGrid. Naja, zur Not kann ich damit leben...
Trotzdem Danke an alle die mir helfen wollten!
Nachtrag: Also jetzt bin ich mir ganz sicher, dass der Fehler in Lazarus 0.9.16 steckt. Ich hab ne alte Excel Version ausgegraben (war zwar nur ne Trial, aber das wichtigste geht noch). Da kann man sogar festlegen in welchem dBase-Format man speichern will. Ich habe 2 verschiedene Formate ausprobiert: dBase 3 und dBase 4
Bei beiden hab ich genau die gleichen Probleme, wie mit der Tabelle aus OO. TDBGrid geht; TDBCombobox, TDBListbox, TDBRadioGroup geht nicht
-
- Beiträge: 374
- Registriert: Mi 13. Sep 2006, 15:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Hagen a.T.W.
- Kontaktdaten:
Fehlende TDBLookUpComboBox Kompo
Ja mei eine fehlende db Kompo, das ist war mir noch garnicht aufgefallen, weil ich es nur mit Delphi getestet habe. Für die Portierbarkeit von bestehenden Progs von Delphi nach Lazarus keine gute Sache.
Ralli
Ralli
-
- 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:
@Patrick dir DBComboBox funktioneirt wunderbar, was du nicht zu verstehen scheinst sie zeigt nur den inhalt des aktuellene Datenfeldes aus dem aktuellen datensatz an. Wenn du in die Liste alle Einträge deiner datenbank bekommen willst musst du soetwas tun:
DBF1.First;
while not DBF1.eof do
DBComboBox1.Items.Add(DBF1.FieldByName('MEINFELD')).AsString;
@ralli ich bin mir noch nicht sicher aber ich hatte das problem unter linux das ich keine datensätze mehr einfügen konnte als ich auf die betreffende DataSource ein DBGrid mit ReadOnly = True gesetzt habe, als ich das revidiert hatte konnte ich weider datensätze einfügen unter 0.9.17 ging das ganze gar nicht. Da scheint wirklich noch etwas faul zu sein.
DBF1.First;
while not DBF1.eof do
DBComboBox1.Items.Add(DBF1.FieldByName('MEINFELD')).AsString;
@ralli ich bin mir noch nicht sicher aber ich hatte das problem unter linux das ich keine datensätze mehr einfügen konnte als ich auf die betreffende DataSource ein DBGrid mit ReadOnly = True gesetzt habe, als ich das revidiert hatte konnte ich weider datensätze einfügen unter 0.9.17 ging das ganze gar nicht. Da scheint wirklich noch etwas faul zu sein.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- 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:
@ralli ich hab gerade an die Mailingliste geschrieben und mal alle meine kleinen problemchen aufgezählt lol
was ich noch rausgefunden habe kann ich dir ja schonmal sagen, das problem scheint tdbgrid zu sein, wenn du vor dem insert DataSet.DisableControls aufrufst und danach logischerweise wiedre EnableControls sollte es erstmal klappen mit dem Insert, wenn das dbgrid dabei enabled ist scheint es aus irgendweinem grund cancel aufzurufen macht man den insert direkt mit dem grid (pfeiltaste runter oder so) läufts
was ich noch rausgefunden habe kann ich dir ja schonmal sagen, das problem scheint tdbgrid zu sein, wenn du vor dem insert DataSet.DisableControls aufrufst und danach logischerweise wiedre EnableControls sollte es erstmal klappen mit dem Insert, wenn das dbgrid dabei enabled ist scheint es aus irgendweinem grund cancel aufzurufen macht man den insert direkt mit dem grid (pfeiltaste runter oder so) läufts
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Beiträge: 374
- Registriert: Mi 13. Sep 2006, 15:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Hagen a.T.W.
- Kontaktdaten:
Probieren geht über Studieren
Danke Christian,
werde es gleich mal testen.
Ralli
werde es gleich mal testen.
Ralli