Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tquery variabel die zweite (https://www.delphipraxis.net/167360-tquery-variabel-die-zweite.html)

fl63 26. Mär 2012 12:12

Datenbank: firebird • Version: 2 • Zugriff über: ibx

Tquery variabel die zweite
 
Hallo!

Ich habe 2 Tabellen in einer Firebird Datenbank.
Jetzt möchte ich beide Tabellen auf einmal abfragen, mit folgendem Quelltext:
Delphi-Quellcode:
procedure TForm1.AbfrageClick(Sender: TObject);
var SQLString1 , SQLString2 :String;
begin
Edit1.Text := AnsiUpperCase(Edit1.Text);
If Combobox1.Text = '' then Combobox1.Text := ' Tabelle1  Tabelle2';
Screen.Cursor := crHourGlass;
If Edit1.Text = '' then Edit1.Text := '..';
If Edit2.Text = '' then Edit2.Text := '..';
SQLString1:= StringReplace(Edit1.Text,'#','_',[rfReplaceAll]);
SQLString1:= StringReplace(SQLString1,'..','%',[rfReplaceAll]);
SQLString2:= StringReplace(Edit2.Text,'#','_',[rfReplaceAll]);
SQLString2:= StringReplace(SQLString2,'..','%',[rfReplaceAll]);
  with Query1 do
  begin
    Active:=False;
    SQL.Clear;
    SQL.Add('Select * from '+ combobox1.text +' where feld001 Like :text1 ');
    SQL.Add('And Upper (feld002) Like Upper (:text2) ');
    ParamByName('text1').asString := SQLString1;
    ParamByName('text2').asString := SQLString2;
    Active:=True;
  end;
Screen.Cursor := crDefault;
end;
Das Problem liegt bei
Delphi-Quellcode:
If Combobox1.Text = '' then Combobox1.Text := ' Tabelle1 and Tabelle2';
Ich habe schon die Möglichkeiten
Delphi-Quellcode:
... '' then Combobox1.Text := ' Tabelle1 and from Tabelle2';
sowie
Delphi-Quellcode:
... '' then Combobox1.Text := ' Tabelle1, Tabelle2';
und einige weitere ausprobiert. Leider ohne Ergebnis.
Manchmal wird Tabelle1 abgefragt und Tabelle2 nicht, meist bekomme ich Fehler 104 .

Ich hoffe auf eure Hilfe.

SirThornberry 26. Mär 2012 12:19

AW: Tquery variabel die zweite
 
Kannst du dem Thema bitte einen aussagekräftigen Titel geben? "die zweite" sagt rein gar nichts zum Problem aus. Man kann also nur raten um was es in dem Thema geht.

himitsu 26. Mär 2012 12:24

AW: Tquery variabel die zweite
 
Bei Google suchenSQL JOIN :gruebel:

Darlo 26. Mär 2012 12:26

AW: Tquery variabel die zweite
 
Hi,

nur als Ansatz:
Code:
SELECT p.Feld1, f.Feld1 FROM tableP AS p, tableF AS f

Code:
SELECT p.Feld1, f.Feld1 FROM tableP AS p LEFT JOIN tableF AS f ON p.Feld1 = f.Feld1

fl63 26. Mär 2012 12:31

AW: Tquery variabel die zweite
 
Zitat:

Zitat von SirThornberry (Beitrag 1158600)
Kannst du dem Thema bitte einen aussagekräftigen Titel geben? "die zweite" sagt rein gar nichts zum Problem aus. Man kann also nur raten um was es in dem Thema geht.

"TQuery variabel" habe ich bereits vor einigen Monaten erstellt, damals noch mit BDE, diesmal läuft es über Firebird. "die Zweite" soll nur darauf hinweisen, daß es bereits in Thema dieses Namens gibt.

SirThornberry 26. Mär 2012 12:42

AW: Tquery variabel die zweite
 
Und wenn du "mit Firebird" anstelle von "die zweite" im Titel hinzufügst?

fl63 26. Mär 2012 13:04

AW: Tquery variabel mit Firebird
 
Zitat:

Zitat von Darlo (Beitrag 1158604)
Hi,

nur als Ansatz:
Code:
SELECT p.Feld1, f.Feld1 FROM tableP AS p, tableF AS f

Code:
SELECT p.Feld1, f.Feld1 FROM tableP AS p LEFT JOIN tableF AS f ON p.Feld1 = f.Feld1

ich versteh kein Wort.

@ himitsu

Verbindet join nicht nur voneinander abhängige Tabellen?

Ich möchte zwei unabhängige Tabellen nacheinander Abfragen und das Ergebnis in einem DBGrid darstellen.

vagtler 26. Mär 2012 13:07

AW: Tquery variabel die zweite
 
Bei Google suchenSQL UNION :gruebel:

fl63 26. Mär 2012 13:08

AW: Tquery variabel mit Firebird
 
Zitat:

Zitat von SirThornberry (Beitrag 1158608)
Und wenn du "mit Firebird" anstelle von "die zweite" im Titel hinzufügst?

Ich hoffe das System hat's geändert.

DeddyH 26. Mär 2012 13:12

AW: Tquery variabel die zweite
 
Zitat:

Zitat von vagtler (Beitrag 1158623)
Bei Google suchenSQL UNION :gruebel:

Hätte ich auch vorgeschlagen. Allerdings sollte man vielleicht dazusagen, dass Anzahl und Typ der Felder dabei exakt übereinstimmen müssen. Hat eine der beiden Tabellen weniger Felder, muss man dann eben Konstanten einfügen.

mkinzler 26. Mär 2012 13:18

AW: Tquery variabel die zweite
 
http://www.delphipraxis.net/167343-a...-new-post.html

vagtler 26. Mär 2012 13:19

AW: Tquery variabel die zweite
 
Zitat:

Zitat von DeddyH (Beitrag 1158630)
Zitat:

Zitat von vagtler (Beitrag 1158623)
Bei Google suchenSQL UNION :gruebel:

Hätte ich auch vorgeschlagen. Allerdings sollte man vielleicht dazusagen, dass Anzahl und Typ der Felder dabei exakt übereinstimmen müssen. Hat eine der beiden Tabellen weniger Felder, muss man dann eben Konstanten einfügen.

Da der Threadersteller mit ausreichend Informationen hinter dem Berg hält, wie z.B.
Zitat:

Zitat von fl63 (Beitrag 1158626)
[...] Ich möchte zwei unabhängige Tabellen nacheinander Abfragen und das Ergebnis in einem DBGrid darstellen.

könnte man hier vorsorglich alles bekannte Wissen über UNION noch erläutern.

Aber dafür gibt es Google. ;)

Sinnvoll wäre für den Threadersteller meiner Meinung erst einmal die Absolvierung eines fundierten SQL-Basiskurs.

fl63 26. Mär 2012 13:20

AW: Tquery variabel mit Firebird
 
Delphi-Quellcode:
... = '' then Combobox1.Text := ' Tabelle1 union Tabelle2';
bringt auch nur Fehler 104.

@DeddyH

Tabellen haben identische Struktur.

DeddyH 26. Mär 2012 13:24

AW: Tquery variabel die zweite
 
Dann bau doch erst einmal außerhalb von Delphi einen syntaktisch korrekten SQL-Befehl zusammen, der das gewünschte Ergebnis liefert. Erst wenn der funktioniert, macht es IMHO Sinn, ihn dynamisch zusammenzustellen.

fl63 26. Mär 2012 13:36

AW: Tquery variabel mit Firebird
 
Zitat:

Zitat von DeddyH (Beitrag 1158637)
Dann bau doch erst einmal außerhalb von Delphi einen syntaktisch korrekten SQL-Befehl zusammen, der das gewünschte Ergebnis liefert. Erst wenn der funktioniert, macht es IMHO Sinn, ihn dynamisch zusammenzustellen.

Werd ich machen, Danke.

p80286 26. Mär 2012 14:16

AW: Tquery variabel die zweite
 
Wenn ich mir den den ersten Beitrag ansehe scheint doch ungefähr dies hier gewünscht:

Delphi-Quellcode:
const
  SQLTEXT1='Select irgendwas from tabelle1 where diese Bedingung';
  SQLTEXT2='Select irgendwas from tabelle2 where diese Bedingung';

begin
  myquery.close;
  if bedingung then
    myquery.sql.text:=SQLTEXT1 
  else
    myquery.sql.text:=SQLTEXT2;
  ...
Wenn die Dynamik über den Inhalt einer Combobox kommt, dann habe ich ein sehr ungutes Gefühl dabei.
(SQL injection)

Gruß
K-H

fl63 26. Mär 2012 16:36

AW: Tquery variabel die zweite
 
Zitat:

Zitat von p80286 (Beitrag 1158661)
Wenn ich mir den den ersten Beitrag ansehe scheint doch ungefähr dies hier gewünscht:

[DELPHI]const
SQLTEXT1='Select irgendwas from tabelle1 where diese Bedingung';
SQLTEXT2='Select irgendwas from tabelle2 where diese Bedingung';

Nein, ungefähr so etwas:
Delphi-Quellcode:
SQl.Text := 'select * from tabelle1 und tabelle2 where feld1....
// wobei ..tabelle1 und tabe... ein einschließendes und darstellen soll

DeddyH 26. Mär 2012 16:40

AW: Tquery variabel die zweite
 
Aber ohne JOIN, oder? Da bietet sich wie gesagt die UNION an.
SQL-Code:
SELECT Feld1, Feld2, Feld3, ... FROM Tabelle1
UNION ALL
SELECT Feld1, Feld2, Feld3, ... FROM Tabelle2
Das soll jetzt nur eine grobe Orientierung sein.

shmia 26. Mär 2012 17:30

AW: Tquery variabel die zweite
 
Zitat:

Zitat von fl63 (Beitrag 1158597)
Ich habe 2 Tabellen in einer Firebird Datenbank.

Sind die beiden Tabellen von gleicher Feldstruktur?
Falls ja, liegt fast immer ein fehlerhaftes Datenbankdesign vor.
Dann gibt es zwei Möglichkeiten:
a.) Datenbankdesign verbessern und plötzlich werden Abfragen, die vorher ein Problem dargestellt haben ganz einfach
b.) weitermachen wie bisher

Hier noch ein Beispiel für mangelhaftes Datenbankdesign
Code:
Tabelle Frauen
==================================================================
IdGirl| Vorname | Nachname | Geburtstag | PLZ | Ort | Geburtsname

Tabelle Maenner
==================================================================
IdBoy| Vorname | Nachname | Geburtstag | PLZ | Ort
Das Beispiel ist natürlich eine klare Fehlkonstruktion.
Selbst wenn Männer üblicherweise keinen abweichenden Geburtsnamen haben (Ausnahmen bestätigen die Regel) sollte doch klar sein, dass alle Daten in eine gemeinsame Tabelle gehören
Code:
Tabelle Personen
=================================================================================
IdPerson | Vorname | Nachname | Geburtstag | PLZ | Ort | Geschlecht |Geburtsname

fl63 26. Mär 2012 18:08

AW: Tquery variabel die zweite
 
Und hier die funktionierende Lösung:

Delphi-Quellcode:
SQL.Add('Select * from tabelle1 union all select * from tabelle2 where feld001 Like :text1 ');
SQL.Add('And Upper (feld002) Like Upper (:text2) ');
Diese zwei Zeilen in die Vergleichszeilen vom Quelltext Beitrag 1 kopiert und es funktioniert.

Danke an alle, FL63

vagtler 26. Mär 2012 19:53

AW: Tquery variabel die zweite
 
Zitat:

Zitat von fl63 (Beitrag 1158727)
Und hier die funktionierende Lösung: [...]

Da bin ich mir nicht so sicher, Tim... :mrgreen:

Dir ist schon klar, dass die WHERE-Bedingung nur auf die zweite Tabelle wirkt?

fl63 27. Mär 2012 12:17

AW: Tquery variabel die zweite
 
Zitat:

Zitat von vagtler (Beitrag 1158741)

Dir ist schon klar, dass die WHERE-Bedingung nur auf die zweite Tabelle wirkt?

Mist, stimmt.

shmia 27. Mär 2012 12:27

AW: Tquery variabel die zweite
 
@fl63: du hast meine Frage aus Beitrag #19 noch nicht beantwortet.
Wenn ich mir schon die Mühe mache Hintergrundinfos zum Datenbankdesign zu geben, wäre es zumindest höflich wenn du erklären würdest warum du es trotzdem anderst machen willst.

fl63 27. Mär 2012 12:48

AW: Tquery variabel die zweite
 
@ vagtler

Aber jetzt:
Delphi-Quellcode:
  with Query1 do
  begin
    Active:=False;
    SQL.Clear;
    SQL.Add('Select * from tabelle1 where feld001 Like :text1 ');
    SQL.Add('And Upper (feld002) Like Upper (:text2) ');
    SQL.Add('Union All Select * from tabelle2 where feld001 Like :text1 ');
    SQL.Add('And Upper (feld002) Like Upper (:text2) ');
    ParamByName('text1').asString := SQLString1;
    ParamByName('text2').asString := SQLString2;
    Active:=True;
  end;
@ shmia

Ich hoffe ich gebe Dir erschöpfend Auskunft:

Code:
Tabelle 1   Feld001  varChar 50
            Feld002  varchar 250

Tabelle 2   Feld001  varchar 50
            Feld002  varchar 250

shmia 27. Mär 2012 14:38

AW: Tquery variabel die zweite
 
Zitat:

Zitat von fl63 (Beitrag 1158866)
Code:
Tabelle 1   Feld001  varChar 50
            Feld002  varchar 250

Tabelle 2   Feld001  varchar 50
            Feld002  varchar 250

Heissen deine Felder wirklich "Feld001" und "Feld002"?
Dann kann ich nur dringend raten "sprechende" Feld- und Tabellennamen zu verwenden.
Ausserdem kann ich nur dringend raten aus den 2 Tabellen eine Tabelle zu machen:
Code:
Feld001 varchar(50)
Group  smallint     // 1=Daten aus Tabelle 1, 2=Daten aus Tabelle 2
Feld002 varchar(250)
Die Felder "Feld001" und "Group" bilden dann zusammen den neuen Primärschlüssel (du hast doch hoffentlich einen PK?).

Diue Abfrage sieht dann so aus:
SQL-Code:
Select * from TabelleNeu where feld001 Like :text1 And Upper (feld002) Like Upper (:text2)

fl63 27. Mär 2012 16:50

AW: Tquery variabel die zweite
 
Zitat:

Zitat von shmia (Beitrag 1158910)
Dann kann ich nur dringend raten "sprechende" Feld- und Tabellennamen zu verwenden.

Das werde ich machen.
Zitat:

Zitat von shmia (Beitrag 1158910)
Ausserdem kann ich nur dringend raten aus den 2 Tabellen eine Tabelle zu machen:
Code:
Feld001 varchar(50)
Group  smallint     // 1=Daten aus Tabelle 1, 2=Daten aus Tabelle 2
Feld002 varchar(250)
Die Felder "Feld001" und "Group" bilden dann zusammen den neuen Primärschlüssel (du hast doch hoffentlich einen PK?).

Diue Abfrage sieht dann so aus:
SQL-Code:
Select * from TabelleNeu where feld001 Like :text1 And Upper (feld002) Like Upper (:text2)

Das Zusammenfügen der Tabellen in eine neue Tabelle, läßt sich per SQL machen?

Was meinst du mit:
Code:
//1= Daten ausTabelle 1, 2=Daten...
Einen Primärschlüssel habe ich bisher keinen.

rwachtel 27. Mär 2012 17:06

AW: Tquery variabel die zweite
 
Zitat:

Zitat von fl63 (Beitrag 1158951)
[...] Das Zusammenfügen der Tabellen in eine neue Tabelle, läßt sich per SQL machen? [...]

Ja klar. Wie wäre es endlich mal mit Grundlagen?
Zitat:

Was meinst du mit:
Code:
//1= Daten ausTabelle 1, 2=Daten...

Das hat shmia doch schon exemplarisch in http://www.delphipraxis.net/1158721-post19.html erläutert. Das ist analog zu dem dortigen Feld GESCHLECHT.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.

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