Probleme mit TDbf

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Probleme mit TDbf

Beitrag von Patrick »

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!

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

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

Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Beitrag von Patrick »

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?

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

Wenn ich mit Calc im dBase Format speichere, werde ich nach einem Zeichensatz gefragt. Soetwas ist eine nicht zu unterschätzende Fehlerquelle.
Wie liest du denn die Filmtitel in die Listbox ein?

knight

Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Beitrag von Patrick »

Ähm, vielleicht habe ich da einen grandiosen Fehler gemacht oder doch nicht? :oops:

Eigentlich dachte ich, dass das so geht wie im Screenshot Listbox beschrieben:

DataField: FILM
DataSource: Datasource1

Muss man da noch was anderes beachten?

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

Schaue dir mal im Lazarus Verzeichnis unter \examples\easter\ das Beispielprogramm an. Dort wird gezeigt, wie man Daten in eine Listbox 'bekommt'. Für dein Programm müßtest du wahrscheinlich noch eine Schleife basteln, um auch alle Einträge zu erwischen.

knight

Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Beitrag von Patrick »

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

Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Beitrag von Patrick »

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.

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:

Alter Datenbestand

Beitrag von ralli »

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

Beitrag von ralli »

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

Patrick
Beiträge: 6
Registriert: Fr 22. Sep 2006, 20:49

Beitrag von Patrick »

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

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:

Fehlende TDBLookUpComboBox Kompo

Beitrag von ralli »

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

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:

Beitrag von Christian »

@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.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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:

Beitrag von Christian »

@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
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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:

Probieren geht über Studieren

Beitrag von ralli »

Danke Christian,

werde es gleich mal testen.

Ralli

Antworten