Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen? (https://www.delphipraxis.net/163002-dbf-neulingfrage-wie-kann-ich-eine-query-ueber-mehrere-dbf-tabellen-joinen.html)

baurat 12. Sep 2011 15:41

Datenbank: mysql+dbf • Version: 5.1 • Zugriff über: zeos + tdbf

DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Hallo zusammen,

ich arbeite seit langem mit MySQL und Zeos problemlos aus Delphi 6 prof (inzwischen etwas angegraut, tuts aber). Nun muss ich aus einer "Fremddatenbank" mit offenbar uralten *.dbf-Dateien einige Infos auslesen.

Dazu habe ich die tdbf-Komponente (http://tdbf.sourceforge.net/) gefunden, mit der ich schön auf die dbf-Tabellen komme.

In der "echten" SQL-Welt hole ich mir die gewünschten Informationen als Join über mehrere Tabellen (select * from tabelle1, tabelle2 where ....).

Nun meine Frage: wie geht das mit den DBF-Tabellen? Gibts überhaupt sowas wie eine Query? Wenn ja, wie müssen da die Pfadangaben zu den einzelnen Tabellen rein?

Konkret:
pfad\schueler.dbf mit schuelerid als Primärschlüssel
pfad\kurs.dbf mit kursid als Primärschlüssel
pfad\belegung.dbf mit belegungid als Primärschlüssel und Fremdschlüsseln fs_schuelerid und fs_kursid (welcher Schueler belegt welchen Kurs)

Jetzt hätt ich gern sowas wie
Code:
Select s.name, s.vorname, k.kursname from schueler s, kurs k, belegung b
where s.schuelerid = b.fs_schuelerid and
b.kursid = k.kursid and b.kursid = 23
(dh. Namen aller Schueler im Kurs 23)


Ich habe dazu leider keine schlüssigen Infos gefunden. Mir ist klar dass das ein Uralt-System ist, aber das hilft mir nichts, ich muss da an die Daten ran und wäre über einen einfachen und schnellen Weg dankbar...

Vielen Dank für die Hilfe (und falls es trivial ist bitte nicht steinigen...) :-)

Danke!

LG Heiko

p80286 12. Sep 2011 16:41

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
DBF? war das nicht DBase?
Wenn ich mich nicht vertue kann die BDE doch mit DBase umgehen??
Ansonsten in ein "richtiges" System importieren und dann kannst Du mit SQL arbeiten.
(ACCESS hat noch importfilter für DBF-Dateien, von da aus sollte der Import in ein richtiges System wohl funktionieren)

Gruß
K-H

baurat 12. Sep 2011 16:53

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Hi K-H, Danke für deine schnelle Antwort.

Zitat:

Zitat von p80286 (Beitrag 1123720)
DBF? war das nicht DBase?
Wenn ich mich nicht vertue kann die BDE doch mit DBase umgehen??
Ansonsten in ein "richtiges" System importieren und dann kannst Du mit SQL arbeiten.
(ACCESS hat noch importfilter für DBF-Dateien, von da aus sollte der Import in ein richtiges System wohl funktionieren)

Ähmm... ob das jetzt dbase-Daten sind, weiß ich gar nicht... ich glaub aber irgendwie wurde das ursprünglich mit Foxpro oder so gemacht...? Keine Ahnung!
Ich hatte mit der BDE noch nie was am Hut, deswegen hilft mir der gut gemeinte Hinweis leider nicht. Das Lesen der dbf-Files ist aber wie gesagt kein Problem.

Zitat:

Ansonsten in ein "richtiges" System importieren und dann kannst Du mit SQL arbeiten.
Das hab ich mir auch schon überlegt, aber die dbf-Daten ändern sich laufend, so dass halt gern "direkt" daraus lesen würde und nicht über die Krücke dbf > Access > mysql o.ä. muss, denn den Importprozess müsste ich dann ja auch jedes Mal neu durchführen.

Irgendwie muss man diese einzelnen Tabellen-Dateien doch auch joinen können?

DeddyH 12. Sep 2011 16:54

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Wenn es wirklich um dBase geht (100% sicher scheint das nicht zu sein): ich mag mich irren, aber IIRC unterstützte dBase gar keine referentielle Integrität.

Union 12. Sep 2011 17:21

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Natürlcih geht ein Join auch ohne Schlüssel. Nur ist die Perfomance dann schlechter. Schau Dir mal den Advantage Local Server an.

baurat 12. Sep 2011 17:28

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von DeddyH (Beitrag 1123727)
IIRC unterstützt dBase gar keine referentielle Integrität.

... das muss ja auch gar nicht sein, um die kümmert sich (hoffentlich) das original-Programm, das die dbf-Dateien erzeugt. Es liegen zumindest die nötigen Informationen auf verschiedenen "Daten-Dateien" (sagt man das so?) verteilt, eben schon nach einem relationalen Schema organisiert.

Ich bin nur das "arme Schw....", das den Kram einlesen und aus den vielen verstreuten Einzelinformationen was Sinnvolles zusammenstellen muss... und immer noch hoffe, dass das über joins geht und ich mich nicht in ewiger Kleinarbeit mit Schleifen und lookups von Tabelle zu Tabelle hangeln zu müssen...

mjustin 12. Sep 2011 17:51

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
dbase ist eine 'teilrelationale' Datenbank, sie unterstützt Joins (siehe http://viprex.de/gkinfo/datenbanken/db_befeh.html), aber eine Delphikomponente die es auch schafft einen Join auszuführen kenne ic noch nicht, in einem ähnlichen Fall (Clipper) half eine ODBC Treibersoftware, die einen eigenen SQL Dialekt unterstützte.

Man kann eventuell mit ClientDataSets und Master/Detail Abhängigkeiten einen Teil der zu Fuss Programmierung einsparen. Nachteil bei beiden (und auch bei ODBC Zugriff) ist, dass alle Datensätze in den Hauptspeicher geladen werden.

Falls nicht noch zufällig eine DBF Komponente oder ein O/R Mapper auftaucht, ist das 'Zu Fuss' in Objektlisten einlesen nicht die schlechteste Alternative - vorausgesetzt die Datenmenge ist absehbar im RAM unterzubringen.

Sir Rufo 12. Sep 2011 17:54

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
"Wenn" es sich um Visual Foxpro handelt, dann einfach den Visual Foxpro ODBC Treiber installieren und dann per ADO darauf zugreifen.

Damit klappt dann auch das JOIN

dataspider 12. Sep 2011 18:10

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von Union (Beitrag 1123733)
Natürlcih geht ein Join auch ohne Schlüssel. Nur ist die Perfomance dann schlechter. Schau Dir mal den Advantage Local Server an.

Und es gab mal Delphi Komponenten:
TDataSet
Damit habe ich das immer gemacht.

Frank

Singlepin 12. Sep 2011 18:20

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Hast du dir schon mal die "Master Tabellen Beziehungen" in http://wiki.lazarus.freepascal.org/L...bf_Tutorial/de
angesehen? Das könnte dich weiterbringen.

baurat 12. Sep 2011 20:28

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Hey Jungs,

vielen Dank für die vielen schnellen Antworten - klasse!

Zitat:

Zitat von Singlepin (Beitrag 1123755)
Hast du dir schon mal die "Master Tabellen Beziehungen" in http://wiki.lazarus.freepascal.org/L...bf_Tutorial/de
angesehen? Das könnte dich weiterbringen.

Das hab ich angeschaut, ja. Aber soooo trivial ist es dann leider doch nicht, dass ich mit zwei Tabellen auskäme - ich muss über drei und z.T. noch mehr Tabellen verknüpfen - und das geht dann damit nicht (oder?)

Zitat:

Zitat von dataspider (Beitrag 1123751)
Und es gab mal Delphi Komponenten:
TDataSet
Damit habe ich das immer gemacht.

Hm. Ich hab ja an der tdbf-Tabelle (also DBF-Tabelle) schon auch eine native DataSource dran hängen. Aber hilft mir das für joins? Die Sybase-Komponente ist leider nicht lizenzfrei :-(

Zitat:

Zitat von Sir Rufo (Beitrag 1123744)
"Wenn" es sich um Visual Foxpro handelt, dann einfach den Visual Foxpro ODBC Treiber installieren und dann per ADO darauf zugreifen.

Damit klappt dann auch das JOIN

DAS klingt sehr gut, ich denke es ist in der Tat Visual Foxpro. Hatte mit ODBC + ADO und Delphi bislang noch nichts zu tun, deswegen... hat jemand vielleicht für den von dir beschriebenen Weg "zufällig" ein kleines Tutorial oder so...?

Aber wenn das ginge, wär es wohl genau das was ich brauche... *Hoffnung*!

Union 12. Sep 2011 21:13

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Mit ADS (sybase) kannst Du in der lokalen Version kostenfrei arbeiten.

Sir Rufo 12. Sep 2011 21:18

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Eine Suche bei Google bringt dich z.B. hierhin ;)
OLEDB-Treiber, der tut auch mit ADO (eigentlich sogar besser als ODBC)

Singlepin 12. Sep 2011 21:26

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Um die Frage zu beantworten, bei den TDBF-Komponenten sind
Master-Detail Beziehungen natürlich auch über mehrere Tabellen möglich.
Sprich, Baumartige Strukturen.

Sir Rufo 12. Sep 2011 21:30

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von Singlepin (Beitrag 1123850)
Um die Frage zu beantworten, bei den TDBF-Komponenten sind
Master-Detail Beziehungen natürlich auch über mehrere Tabellen möglich.
Sprich, Baumartige Strukturen.

Bei dem VF-Treiber via ADO gibt man das Datenbank-Verzeichnis an und kann dann einfach per SQL die Tabellen ansprechen.
Das ist dann schon etwas einfacher in der Handhabung :)

Union 12. Sep 2011 21:32

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Mit Standard Delphi geht es über TAdoCeonnection und TAdoQuery. Wichtig der richtige Connectionstring:

Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=<DEIN PFAD WO DIE DBF LIEGEN>;Mode=Share Deny None;Extended Properties=dBASE IV;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=17;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False

Sir Rufo 12. Sep 2011 21:42

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von Union (Beitrag 1123858)
Mit Standard Delphi geht es über TAdoCeonnection und TAdoQuery. Wichtig der richtige Connectionstring:

Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=<DEIN PFAD WO DIE DBF LIEGEN>;Mode=Share Deny None;Extended Properties=dBASE IV;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=17;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False

Besser du setzt das in einen Code-Block ;)
Code:
Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=<DEIN PFAD WO DIE DBF LIEGEN>;Mode=Share Deny None;Extended Properties=dBASE IV;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=17;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
Allerdings kann man sich den Connectionstring ja auch schön per Doppelklick auf die ADOConnection zusammenklicken

Union 12. Sep 2011 21:52

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1123864)
Allerdings kann man sich den Connectionstring ja auch schön per Doppelklick auf die ADOConnection zusammenklicken

Ging auf meinem PC nicht. Ich musste die wichtigsten Teile manuell setzen und dann hat er das beim Speichern auf diesen Monsterstring expandiert. Kann man bestimmt die Hälfte von löschen.

dataspider 13. Sep 2011 06:03

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von baurat (Beitrag 1123830)
Hm. Ich hab ja an der tdbf-Tabelle (also DBF-Tabelle) schon auch eine native DataSource dran hängen. Aber hilft mir das für joins? Die Sybase-Komponente ist leider nicht lizenzfrei :-(

Die Zugriffskomponenten von SyBase sind IMHO kostenfrei. Nur für den ADS Server muss man bezahlen. Du hast aber DBF.
In den Komponenten ist die TADSQuery, welche perfekt SQL - Statemants verarbeitet.
Beim Zugriff (Benutzung von Index) kommt es auf die Indexe an.
Da gab es wohl:
.ndx (DBase II)
.ntx (Clipper)
.mdx / .cdx (?)
TDataSet von SyBase kann IMHO mit allen Indexformaten umgehen. Bei ADO bin ich mir da nicht so sicher.
Bei meinen Versuchen mit ADO habe ich es irgendwie mit dem OEM - Zeichensatz nicht hinbekommen.

Ich habe noch eine EXE bzw. Source. Da habe ich für einen Kunden nur ein Statement gezimmert, welches aus eine Datei geladen komplexe Daten angezeigt hat.
Bei Interesse könnte ich das schicken (Source ist mit DevExpress Grid, aber das Handling mit ADSQuery kann man als Basis sicher verwenden).
Ist aber etwas grösser (PN angebracht).

Wenn du es allerdings mit ADO lösen kannst, würde ich auf zusätzliche Komponenten verzichten.

Frank

baurat 13. Sep 2011 21:39

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Merci für die ausführlichen Hilfen, schau ich mir an und melde mich!

baurat 24. Sep 2011 20:06

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Bei dem VF-Treiber via ADO gibt man das Datenbank-Verzeichnis an und kann dann einfach per SQL die Tabellen ansprechen.
Das ist dann schon etwas einfacher in der Handhabung
Tataaaaaa! Hab jetzt endlich mal wieder Zeit mir das anzuschauen und auszuprobieren. Bin begeistert!

Connectionstring konnte ich bequem im Delphi zusammenklicken.

ADO-Query klappt "an sich" auch, super!

Jetzt hab ich nur diverse Probleme mit dem SQL-92 (oder ist das ein anderer?). Konkret:

a) in einer Tabelle stehen zwei Fremdschlüssel. Je nach Fall soll der eine oder der andere genommen werden und dann in der gleichen Query die Informationen aus der referenzierten Tabelle angezeigt werden.

Konkret: ich hab Teilnehmer (Stammdaten...), Kurse (Infos zu den Kursen) und Belegung (welcher Teilnehmer ist in welchem Kurs). Dummerweise gibts zwei Belegungen (1. Jahr und 2. Jahr). JEtzt will ich natürlich nur die aktuell gültige Belegung haben.

Mit MySQL geht das etwa so:

select t.famname, t.rufname,
ku.bezeichnung, ku.kursname,
if(t.startjahr=2009, b.kursid_1, b.kursid2) as kursid
from belegung b, teilehmer t, kurs ku
where b.tnid = t.id
and ku.id=kursid

Hier wird also der alias aus der if-Abfrage in der where-clause verwendet.

In der ado-query klappt das aber nicht, was - wie ich inzwischen gelesen hab - daran liegt, dass ein alias nur beim order by vorkommen darf.

Außerdem gibts kein "if", sondern ein "iif", auch das hat 15min gedauert bis ich was gefunden habe...

Große Frage: wie lautet die Query in sql-92? Sorry, geht über meine eingangs gepostete Frage hinaus, vielleicht weiß es ja trotzdem jemand auf die Schnelle...?

Auf jeden Fall DANKE für den Tipp mit ADO und dem VisualFoxpro-Treiber, das ist klasse!

Union 24. Sep 2011 20:43

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Viélleicht so?

Code:
select t.famname,
       t.rufname,
       ku.bezeichnung,
       ku.kursname,
       ku.id as kursid
from belegung b
inner join teilnehmer t on t.id = b.tnid
inner join kurs ku on ku.id = iif(t.startjahr=2009, b.kursid_1, b.kursid2)

baurat 24. Sep 2011 22:23

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Zitat:

Zitat von Union (Beitrag 1126476)
Viélleicht so?

Code:
select t.famname,
       t.rufname,
       ku.bezeichnung,
       ku.kursname,
       ku.id as kursid
from belegung b
inner join teilnehmer t on t.id = b.tnid
inner join kurs ku on ku.id = iif(t.startjahr=2009, b.kursid_1, b.kursid2)


...ja, ZIEMLICH GENAU so... :-D

Danke!

Nur für mich: anstelle einen Alias in der where-clause zu verwenden, nehme ich jetzt also immer einen (bzw. mehrere) inner join. Und aus "if" wird "iif". Bin gespannt was noch für Dialekt-Besonderheiten auftauchen...

Union 24. Sep 2011 22:27

AW: DBF-Neulingfrage: Wie kann ich eine Query über mehrere DBF-Tabellen joinen?
 
Sei froh dass Du nicht von PL/SQL umsteigen musst. Dagegen kommt Dir jeder andere Dialekt "nackt" vor ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz