Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   mehrere sql datenbanken in einem programm (https://www.delphipraxis.net/164121-mehrere-sql-datenbanken-einem-programm.html)

xan553 29. Okt 2011 11:55

Datenbank: paradox 7 • Version: D7 • Zugriff über: BDE

mehrere sql datenbanken in einem programm
 
Nochmal servus,

ich bin gerade an einem programm bzw bei einem fragment dieses programmes.
Die grobe funktion sieht folgendermaßen aus:

1 editfeld: edit1
1 combobox1 zum bestimmen der DB
1 combobox2 zum bestimmen der abzufragenden felder in der bei combobox1 gewählten db
1 button um die query abfrage zu starten
1 DB grid um die query auszugeben.


also im moment ist das so das ich für jede DB ein eigenes Query und iene eigene DS habe

wenn ich in combobox 1 etwas auswähle dann werden in combobox 2 auch nur die optionen angezeigt die auch in der jeweiligen DB vorhanden sind, das funktioniert auch prima aber die umsetzung ist meiner meinung nach sehr umständlich:

ich habe ein onchange ereignis auf combobox1 das die items von combobox 2 über eine procedure anpasst:
onchange:
Delphi-Quellcode:
procedure TTblLieferanten.ComboBox1Change(Sender: TObject);
begin
  suchort := strtoint(combobox1.Text);
  setsearchlabels(suchort);
end;
procedure

Delphi-Quellcode:
procedure TTblLieferanten.setSearchLabels(m: Byte);
begin
  case m of
    1: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.visible := True;Label11.Caption := '2 = Kunden Nr.';
         Label13.visible := True;Label13.Caption := '';
         Label14.visible := True;Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.Items.Add('2');
         combobox2.ItemIndex := 0;
       end;
    2: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.visible := True;Label11.Caption := '3 = Artikel Nr.';
         Label13.visible := True;Label13.Caption := '6 = Bezeichnung';
         Label14.visible := True;Label14.Caption := '7 = Lieferanten';
         combobox2.Items.Add('1');
         combobox2.Items.Add('3');
         combobox2.Items.Add('6');
         combobox2.Items.Add('7');
         combobox2.ItemIndex := 0;
       end;
    3: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '2 = Kunden Nr.';
         Label11.visible := True; Label11.Caption := '5 = Rechnungs Nr.';
         Label13.visible := True; Label13.Caption := '';
         Label14.Caption := '';
         combobox2.Items.Add('2');
         combobox2.Items.Add('5');
         combobox2.ItemIndex := 0;
       end;
    4: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '2 = Kunden Nr.';
         Label11.visible := True;Label11.Caption := '4 = Auftrags Nr.';
         Label13.visible := True;Label13.Caption := '';
         Label14.Caption := '';
         combobox2.Items.Add('2');
         combobox2.Items.Add('4');
         combobox2.ItemIndex := 0;
       end;
    5: begin
         combobox2.Clear;
         Label10.visible := True;Label10.Caption := '1 = Name';
         Label11.Caption := '';
         Label13.Caption := '';
         Label14.Caption := '';
         combobox2.Items.Add('1');
         combobox2.ItemIndex := 0;
       end;
end;

Bei einem klick auf button1 wird dann der SQL string der jeweiligen in combobox1 ausgewählten query angepasst:

Delphi-Quellcode:
procedure TTblLieferanten.Button1Click(Sender: TObject);
var
m,n:byte;
begin
m := suchort;
n := strtoint(combobox2.Text);
  case m of
  1: begin
       case n of
       1:begin
        qrykunden.sql.Clear;
        qrykunden.sql.text := 'SELECT * FROM kunden WHERE Name LIKE "%'+edit1.text+'%"';
        end;
       2: begin
        qryartikel.SQL.Clear;
        qryartikel.sql.text := 'SELECT * FROM kunden WHERE KdNr LIKE "%'+edit1.text+'%"';
        end;
       end;
       qrykunden.active := True;
       DBGrid.Datasource := DSKunden;
       qryartikel.Active := false;
       qryrechnungen.Active := false;
       qryauftraege.Active := false;
       qrylieferanten.active := false;
       end;
  2: begin
       case n of
       1: begin
            qryartikel.sql.Clear;
            qryartikel.sql.text := 'SELECT * FROM artikel WHERE Name LIKE "%'+edit1.text+'%"';
          end;
       3: begin
            qryartikel.sql.Clear;
            qryartikel.sql.text := 'SELECT * FROM artikel WHERE ArtikelNr LIKE "%'+edit1.text+'%"';
          end;
       6: begin
            qryartikel.sql.Clear;
            qryartikel.sql.text := 'SELECT * FROM artikel WHERE Bezeichnung LIKE "%'+edit1.text+'%"';
          end;
       7: begin
            qryartikel.sql.Clear;
            qryartikel.sql.text := 'SELECT * FROM artikel WHERE Lieferant LIKE "%'+edit1.text+'%"';
          end;
       end;
       qrykunden.active := false;
       qryartikel.Active := true;
       DBGrid.Datasource := DSartikel;
       qryrechnungen.active := false;
       qryauftraege.active := false;
       qrylieferanten.active := false;
       end;
  3: begin
       case n of
       2: begin
            qryrechnungen.sql.Clear;
            qryrechnungen.sql.text := 'SELECT * FROM Rechnungen WHERE KdNr LIKE "%'+edit1.text+'%"';
          end;
       5: begin
            qryrechnungen.sql.Clear;
            qryrechnungen.sql.text := 'SELECT * FROM Rechnungen WHERE RechnungsNr LIKE "%'+edit1.text+'%"';
          end;
       end;
       qrykunden.active := false;
       qryartikel.active := false;
       qryrechnungen.active := true;
       DBGrid.Datasource := DSrechnungen;
       qryauftraege.active := false;
       qrylieferanten.active := false;
       end;
  4: begin
       case n of
       2: begin
            qryauftraege.sql.Clear;
            qryauftraege.sql.text := 'SELECT * FROM auftraege WHERE KdNr LIKE "%'+edit1.text+'%"';
          end;
       4: begin
            qryauftraege.sql.Clear;
            qryauftraege.sql.text := 'SELECT * FROM auftraege WHERE auftragsnr LIKE "%'+edit1.text+'%"';
          end;
       end;
       qrykunden.active := false;
       qryartikel.active := false;
       qryrechnungen.active := false;
       qryauftraege.active := true;
       DBGrid.Datasource := DSauftraege;
       qrylieferanten.active := false;
       end;
  5: begin
       case n of
       1: begin
            qrylieferanten.sql.Clear;
            qrylieferanten.sql.text := 'SELECT * FROM lieferanten WHERE Name LIKE "%'+edit1.text+'%"';
          end;
       end;
       qrykunden.active := false;
       qryartikel.active := false;
       qryrechnungen.active := false;
       qryauftraege.active := false;
       qrylieferanten.active := true;
       DBGrid.Datasource := DSKunden;
       end;
end;
end;
der rest vom code ist nur für die farbliche absetzung der DBgrid eintraege verantwortlich.

und nun meine frage ob ich mit diesem code nicht um 10.000 ecken denke und mir das lesen elbst schwer mache.

Mfg Xan553

mkinzler 29. Okt 2011 11:59

AW: mehrere sql datenbanken in einem programm
 
-Du verwendest mehrere Tabellen und nicht mehrere DBs.
-Wenn du die Texteingeschaft von Query.SQL setzt benötigst du kein Clear.
-Warum verwendest du keine DbLookup-Komponenten?
-Warum noch Paradox ( ist total veraltet)?

xan553 29. Okt 2011 12:05

AW: mehrere sql datenbanken in einem programm
 
mit lookupkompunenten habe ich noch nie gearbeitet, werd mich aber in dem fall mal auf die suche machen.

paradox deswegen weil ich das ganze erstmal nur testen will für mich und clear weil ich mir nicht sicher bin ob wenn ich einen neuen string an sql übergebe der nicht einfach nur dazukopiert wird, so wie wenn ich bei den comboboxen einfach nur items.add eingebe

das mit den tabellen stimmt, mein fehler ;)

mkinzler 29. Okt 2011 12:09

AW: mehrere sql datenbanken in einem programm
 
Zitat:

paradox deswegen weil ich das ganze erstmal nur testen will
Selbst dann würde ich einen riessen Bogen um Paradox machen
Zitat:

und clear weil ich mir nicht sicher bin ob wenn ich einen neuen string an sql übergebe der nicht einfach nur dazukopiert wird, so wie wenn ich bei den comboboxen einfach nur items.add eingebe
Bei Add wird hinzugefügt aber beim Setzen von .Text wird der Inhalt ersetzt.

xan553 29. Okt 2011 12:11

AW: mehrere sql datenbanken in einem programm
 
was würdest du mir als DBempfehlen? was ungefähr mit dem selben geringen aufwand wie paradox verbunden ist?

Bernhard Geyer 29. Okt 2011 12:13

AW: mehrere sql datenbanken in einem programm
 
Zitat:

Zitat von mkinzler (Beitrag 1133356)
Zitat:

paradox deswegen weil ich das ganze erstmal nur testen will
Selbst dann würde ich einen riessen Bogen um Paradox machen

Es gibt auch Leute die mögen es wenn man ihnen weh tut ...

Aber in 2011 ist es doch einfach z.B. ein MySQL-Server oder MS SQL-Express herunter zu laden und zu installieren um damit zu testen.
Eine "krankheit" wie Paradox + BDE braucht man sich wirklich nicht antun

MySQL und MS SQL-Express deshalb weil die GUI-Tools m.E. eine relativ einfachen Einstieg ermöglichen.

xan553 29. Okt 2011 12:16

AW: mehrere sql datenbanken in einem programm
 
da ich nun nicht wirklich auf digitales SM stehe (um vorurteile gleich mal auszumärtzen auch nicht auf reales) werd ich mir in dem fall mal nen lokalen mysqlserver einrichten.

danke soweit, habt ihr vielleicht noch ein paar seiten auf denen die lookup komponenten gut erklärt werden?

mkinzler 29. Okt 2011 12:17

AW: mehrere sql datenbanken in einem programm
 
Ich musste deinen Beitrag gerade 2mal Lesen. Du rätst du MySQL?
Ich werfe noch FireBird + IBExpert (Personal) in den Raum.

Neumann 29. Okt 2011 12:20

AW: mehrere sql datenbanken in einem programm
 
Hallo,

es ist doch wohl nur eine Datenbank, aber mehrere Tabellen, die abgefragt werden.

Man könnte den SQL-Code für die jeweiligen Abfragen einmalig setzen, wenn man mit Parametern arbeitet.

Beispiel:
Delphi-Quellcode:
  'SELECT * FROM artikel WHERE Name LIKE :p;
  Query.ParamByName('p').asstring:='%'+edit1.text+'%';
Warum die Labels immer auf visible:=true setzten? Sehe keinen Grund dafür.

Auftragsnummer usw mit Like suchen? Dann lieber mit Locate in der offenen Tabelle.

Paradox mag ja für die ersten Übungen mit Datenbankprogrammierung noch ok sein; eine reale Anwendung sollte man damit heute nicht mehr machen. Versuche mal Firebird mit den IBX-Komponenten und als Hilsprogramm IBExpert oder SQLLite.

xan553 29. Okt 2011 12:23

AW: mehrere sql datenbanken in einem programm
 
ich würde halt gerne etwas haben das einfach zu verstehen und dennoch effektiv ist

und das mit den parametern ist mir dann auch noch nicht bekannt, bin erst seit kurzer zeit dabei mich mit datenbaken zu beschäftigen.

hast du dazu irgendwelche lektüre?

mkinzler 29. Okt 2011 12:26

AW: mehrere sql datenbanken in einem programm
 
Das ist aber bei Paradoix imho nicht der Fall.
Parameter sind Platzhalter, die anschliessend durch konkrete Werte ersetzt werden können. Die Abfrage muss man nur einmal setzen und später werden nur die Parameter entsprechend gesetzt.

xan553 29. Okt 2011 12:33

AW: mehrere sql datenbanken in einem programm
 
das heißt ich gebe einmalig im sql query den string ein und

dann wird im endeffekt in dem von combobox 2 ausgewählten parameter x nach dem in edit1 eingegebenen string y gesucht und mit combobox 1 wähle ich weiterhin die entsprechende query aus?

mkinzler 29. Okt 2011 12:35

AW: mehrere sql datenbanken in einem programm
 
Ja. Aber noch besser man packt das in eine Abfrage und kann so die Suchbegriffe kombinieren

Neumann 29. Okt 2011 12:36

AW: mehrere sql datenbanken in einem programm
 
Aktuelle Lektüre in Buchform für Delphi ist leider ein Problem. Es gibt aber ältere Bücher, die ganz gut Grundlagen vermitteln. Einfach mal bei Amazon oder Ebay nachsehen.

Kenne Ebner: Delphi 6 Datenbankprogrammierung oder ? Interbase-Datenbankentwicklung mit Delphi (was da steht kann man im wesentlichen auch auf Firebird anwenden)

mkinzler 29. Okt 2011 12:39

AW: mehrere sql datenbanken in einem programm
 
Oder durch Tutorials z.B. http://www.delphi-treff.de/tutorials/datenbanken/

xan553 29. Okt 2011 12:42

AW: mehrere sql datenbanken in einem programm
 
und zu welchem datenbanksystem ratet ihr nun? bzw welche vorteile haben diese im einzelnen?

mkinzler 29. Okt 2011 12:47

AW: mehrere sql datenbanken in einem programm
 
Ich setze Firebird ein. Ist OpenSource und darf auch kommerziell ohne Einschränkungen verwendet werden. es gibt auch eine embedded Form. Die Datenbanken sind zur normalen Version aber kompatibel auch der Zugriff vom Programm aus it identisch ( Skalierbarkeit)

MSSQL express ist die kostenlose Variante des MS SQL Servers. Ähnliche abgespeckte Versionen gibt es auch von Oracle und DB2.

MySQL wird unter 2 Formen lizensiert: Für openSource Projekte und für kommerzielle Projekte. Der erstere Form werden aber ständig Features entzogen. es gibrt mit mariaDB aber einen reinen OpenSource Fork, der getrennt weiterentwickelt wird.

SQLite ist eine reine embedded Datenbank. Sie wird von Mozilla FireFox, iOS, Android, webOS, .. verwendet und soll auch Teil von HTML5 werden.

Bernhard Geyer 29. Okt 2011 13:00

AW: mehrere sql datenbanken in einem programm
 
Zitat:

Zitat von mkinzler (Beitrag 1133372)
MSSQL express ist die kostenlose Variante des MS SQL Servers. Ähnliche abgespeckte Versionen gibt es auch von Oracle und DB2.

Ich würde aber niemanden Empfehlen eine Einstieg in die DB-Programmierung mit Oracle zu machen. Außer man will Gründe finden nichts mit DB's zu machen :-)

Zitat:

Zitat von mkinzler (Beitrag 1133372)
SQLite ist eine reine embedded Datenbank.

Hat aber (jedenfalls vor 3 Jahren) einige Performancenachteile. Jedenfalls war es bei mir gegenüber allen anderen von uns unterstützten DBMS sehr langsam.

stahli 29. Okt 2011 13:02

AW: mehrere sql datenbanken in einem programm
 
Die Datenbankauswahl hängt von den Ansprüchen und finanziellen Möglichkeiten ab.

Die BDE ist m.E. ganz gut zum lernen und ausprobieren. Bei älteren Delphis war sie ja auch als Standard dabei.
Für ein kleines privates Projekt kann man die schon mal verwenden, aber nicht (mehr) für ernsthaftere Anwendungen.
In Verbindung mit der Datenbankoberfläche war das schon alles sehr einfach nutzbar.

Darüber hinaus gibt es viele SQL-Datenbanken. Ich versuche mal, meinen Kenntnisstand zusammenzufassen:

Ansonsten gehört Interbase mit zum Leistungsumfang von Delphi. Für den kommerziellen Einsatz muss man jedoch Lizenzen erwerben.
Firebird ist die kostenlose Alternative und fast gleichwertig zum Interbase zu sehen. Firebird ist auch als embedded-Version erhältlich. (Auf dem Anwendungsrechner muss dann der Firebirdserver nicht vorher installiert sein, man gibt eine eine DLL zu der Anwendung dazu. Allerdings kann dann nur ein User die Datenbank benutzen.)

Beide sind reine SQL-Datenbanken. Analog zu der Datenbankoberfläche gibt es Tools wie IBExpert, mit denen man die Tabellen leichter erstellen und modifizieren kann. Ohne diese Tools geht es mit Anweisungen wie "create table 'TABLE'" u.ä.

Firebird lässt sich weitestgehend mit den Interbase-Komponenten (IBX) von Delphi benutzen.

M.E. ist das daher die einfachste Datenbankvariante.


Es gibt leistungsfähigere, aber die sind dann mit zusätzlichen Kosten verbunden.


Soweit meine Einschätzung. Ich lerne aber auch gern noch dazu ;-)

mkinzler 29. Okt 2011 13:03

AW: mehrere sql datenbanken in einem programm
 
Zitat:

Die BDE ist m.E. ganz gut zum lernen und ausprobieren. Bei älteren Delphis war sie ja auch als Standard dabei.
Für ein kleines privates Projekt kann man die schon mal verwenden, aber nicht (mehr) für ernsthaftere Anwendungen.
In Verbindung mit der Datenbankoberfläche war das schon alles sehr einfach nutzbar.
Nur sind Kenntnisse der Funktionsweise der BDE wenig nützlich, da neurer DBMS hier ganz anders ticken. Deshalb würde ich gleich mit etwas "Brauchbaren" anfangen. Die erwähnte IBExpert Personal Edition geht in ihren Möglichkeiten schon weit über die der Datenbankoberfläche hinaus.
Zitat:

Ansonsten gehört Interbase mit zum Leistungsumfang von Delphi. Für den kommerziellen Einsatz muss man jedoch Lizenzen erwerben.
Firebird ist die kostenlose Alternative und fast gleichwertig zum Interbase zu sehen.
Firebird basiert auf Interbase 6. Allerdings entwicjkeln die beiden Systeme sich auseinandner ( Die gleichen Features werden verschieden implementiert)
Zitat:

Firebird ist auch als embedded-Version erhältlich. (Auf dem Anwendungsrechner muss dann der Firebirdserver nicht vorher installiert sein, man gibt eine eine DLL zu der Anwendung dazu. Allerdings kann dann nur ein User die Datenbank benutzen.)
Diese Einschränkung gilt seit Firebird 2.5 nicht mehr; ich würde bei mehreren Benutzern aber die Servervariante bevorzugen.

Zitat:

jeztz nochmal zu den parametern, ich finde dazu nichts in den tutorials.
SQL-Code:
SELECT
    *
FROM
    kunden
WHERE
     <feldname> = :such;
Später kann man dann den konkreten Suchwert setzen:
Delphi-Quellcode:
qrykunden.params.parambyname('par_feld').Value := '%'+Edit1.Text+'%';
qrykunden.Refresh;

xan553 29. Okt 2011 13:06

AW: mehrere sql datenbanken in einem programm
 
in dem fall werde ich wohl auch auf firebird setzen, klingt mir so wie du es sagst am plausiebelsten.

jeztz nochmal zu den parametern, ich finde dazu nichts in den tutorials.

Delphi-Quellcode:
SELECT
*
FROM
kunden
WHERE
:par_feld = "%'+edit1.text+'%"

wobei ich mit
Delphi-Quellcode:
qrykunden.params.parambyname('par_feld').asstring:= suchfeld;
den parameter übergebe

und mit

Delphi-Quellcode:
m := combobox2.text
case m of
1: begin
suchfeld := name
end;
.....
end;
den wert des parameters setze oder was habe ich da falsch verstanden?
und was meintest du mit den abfragen?

mkinzler 29. Okt 2011 13:17

AW: mehrere sql datenbanken in einem programm
 
Zitat:

jeztz nochmal zu den parametern, ich finde dazu nichts in den tutorials.
SQL-Code:
SELECT
    *
FROM
    kunden
WHERE
     <feldname> = :such;
Später kann man dann den konkreten Suchwert setzen:
Delphi-Quellcode:
qrykunden.params.parambyname('such').Value := '%'+Edit1.Text+'%';
qrykunden.Refresh;
Zitat:

und was meintest du mit den abfragen?
Du hast ja je eine Abfrage pro Feld, du könntest ja auch eine für alle Felder machen, so könntest du gleichzeiteig nach mehreren Dingen Filtern.

xan553 29. Okt 2011 13:22

AW: mehrere sql datenbanken in einem programm
 
und wie setze ich <feldname>?
wie würde ich das mit den mehreren feldern realisieren?

mkinzler 29. Okt 2011 13:28

AW: mehrere sql datenbanken in einem programm
 
Zitat:

Zitat von xan553 (Beitrag 1133380)
und wie setze ich <feldname>?

Den must du fest setzen.
Zitat:

wie würde ich das mit den mehreren feldern realisieren?
SQL-Code:
SELECT
    * 
FROM
    artikel
WHERE
    Name LIKE :name and
    ArtikelNr like :artikelnr and
    Bezeichnung like :bez and
    Liefernat like :liefer;
Delphi-Quellcode:
  qrykunden.params.parambyname('name').Value := '%'+Edit1.Text+'%';
  qrykunden.params.parambyname('artikelnr').Value := '%'+Edit2.Text+'%';
  ..
  if qrykunden.Active then
     qrykunden.Refesh
  else
     qrykunden.Open;

xan553 29. Okt 2011 13:30

AW: mehrere sql datenbanken in einem programm
 
achso meintest du das, aber ich möchte ja mit der zweiten combobox das zu durchsuchende feld auswählen also wäre doch ein parameter für das feld besser oder?


und wenn ich es so machen würde wie du meinst dann hätte ich ca 5 editfelder, wenn ich in einam davon etwas eingebe wird nach der eingabe dieses edit feldes gesucht, dann müsste ich halt mit der ersten combobox die editfelder erstellen bzw auf visible setzen

mkinzler 29. Okt 2011 13:35

AW: mehrere sql datenbanken in einem programm
 
Wenn man in die anderen Feldern nichts einträgt, wird das entsprechende Feld nicht gefiltert.

xan553 29. Okt 2011 13:42

AW: mehrere sql datenbanken in einem programm
 
das ist in dem fall dann auch eine super idee ... danke erstmal :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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