Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit SELECT (https://www.delphipraxis.net/19157-probleme-mit-select.html)

Luciano 30. Mär 2004 10:09


Probleme mit SELECT
 
Hi...

Ich habe dan ein Problem mit einer Select-Anfrage, die wie folgt aussieht

Delphi-Quellcode:
'( SELECT * FROM FAKTURIERUNG'+
' WHERE KONTRAKT_NR = '+QuotedStr(DataModule1.Q_PARTIEDAMPFKontrakt_nr.Value)+
' AND '+
'( SELECT * FROM FAKTRELA '+
' WHERE FAKTURIER_LFDNR = '+QuotedStr(IntToStr(DataModule1.Q_FAKTURIERUNGLfdnr.Value))+' ))';
Als Fehlermeldung kommt "Falsche Syntax in der Nähe von ')'"
Die SELECT Anweisung wird mit einer ADOQuery ausgeführt auf SQL 2000 Server.


Es sind 2 Tabellen die miteinander verknüpft sind und ich will davon nur bestimmt Daten dann in einem DBGrid ausgeben, was wohl weniger das Problem ist.

Vielleicht wäre das auch mit einem INNER JOIN möglich, oder besser möglich :?:

Bin da nicht so helle...

Ich bin für jede Antwort dankbar!

Greets

Luciano

Smokey 30. Mär 2004 10:13

Re: Probleme mit SELECT
 
hm werd mal bisschen genauer, keine Ahnung, was du mit deinem SQL da erreichen willst, aber das der nicht geht ist schonmal recht klar :o)

Schreib mal die Tabellen hier rein, wie die aussehen (zumindest die teile auf die es ankommt) und was du dann genau in der anzeige haben möchtest.

Cuchulainn 30. Mär 2004 10:16

Re: Probleme mit SELECT
 
Herzlich willkommen bei DelphiPraxis :D

schließ mal vor dem AND die Klammer, die du vor dem ersten SELECT geöffnet hast.

Robert_G 30. Mär 2004 10:23

Re: Probleme mit SELECT
 
Da du dort 2 Tabellen aufgelistet hast, denke ich mal, dass du die Werte beider Abfragen untereinander in deiner ADOQuery ausgeben willst.
Der Spaß nennt sich UNION-SELECT. Damit es klappt muss auf jeden Fall eine Bedingung erfüllt sein:
  • Beide Unterabfragen müssen die gleiche Anzahl von Spalten haben, die wiederum in beiden Abfragen den gleichen Typ haben müssen.

Haben beide Tabellen die gleichen Spaltentypen & -Anzahl, dann könnte das so klappen:

Delphi-Quellcode:
With ADOQuery Do
Begin
  SQL.Text :=
    'SELECT *' + #10 +
    'FROM  FAKTURIERUNG' + #10 +
    'WHERE KONTRAKT_NR = :i_Kontrakt' + #10 +
    'UNION' + #10 +
    'SELECT *' + #10 +
    'FROM  FAKTRELA ''+' + #10 +
    'WHERE FAKTURIER_LFDNR = :i_LfdNr';
  // Parse Statement um Variablen zu erkennen
  Prepared := True;
  // Parameterzuweisung
  With Parameters Do
    ParamByName('i_KONTRAKT').Value := DataModule1.Q_PARTIEDAMPFKontrakt_nr.Value;
    ParamByName('i_LFDNR').Value := DataModule1.Q_FAKTURIERUNGLfdnr.Value;
  End;
  // Ausführen
  Open;
End;

Luciano 30. Mär 2004 10:27

Re: Probleme mit SELECT
 
Also diese Tabellen habe ich

PARTIEDAMPF
-----------
Lfdnr <-- primary key
Kontrakt_nr <-- Soll im DBGrid angezeigt werden


FAKTURIERUNG
------------
Lfdnr <-- primary key
Kontrakt_nr <-- Verknüpfung zur Tabelle PARTIEDAMPF
Relation <-- Soll im ABGrid angezeigt werden



FAKTRELA
--------
Fakturier_lfdnr <-- Verknüpfung mit Tabelle FAKTURIERUNG
Faktor <-- Soll im DBGrid angezeigt werden

Diese Tabellen will ich mit einer ADOQuery dursuchen und dann diese Felder in einem DBGrid anzeigen lassen.

Vielleicht kann man damit jetzt etwas mehr anfangen, hoffe ich

Danke


Luciano

Luciano 30. Mär 2004 11:10

Re: Probleme mit SELECT
 
Thx Robert_G

Ich denke mal das das funktionieren würde aber ich bekomme noch eine kleine Fehlermeldung.

Die Spalte Kontrakt_nr ist vom Typ VARCHAR und dann sagt mit Delphi das er VARCHAR nicht in INTEGER konvertieren kann, was wohl klar ist, weil der Aufbau der Spalte Kontrakt_nr sieht so aus xxxx/xx/xx x= beliebige Zahl und den Slash (/) als Trennzeichen.


Erstmal wollte vielen Dank sagen für die wirklich verdammt schnellen Antworten :-D

Greets

Luciano

Smokey 30. Mär 2004 11:18

Re: Probleme mit SELECT
 
Noch nicht so ganz, aber ich rate mal :o)

Wenn du nun alle Daten anzeigen willst (wo du es hintergeschrieben hast)
von EINER Lfdnr aus PARTIEDAMPF (also alle daten für genau dieses Ding aus Partiedampf) dann gehts so :

SQL-Code:
SELECT
   PARTIEDAMPF.Kontrakt_nr,
   FAKTURIERUNG.Kontrakt_nr,
   FAKTRELA.Faktor
FROM
   PARTIEDAMPF,
   FAKTURIERUNG,
   FAKTRELA
WHERE
   PARTIEDAMPF.Kontrakt_nr = FAKTURIERUNG.Kontrakt_nr
AND
   FAKTURIERUNG.Lfdnr = FAKTRELA.Fakturier_lfdnr
wenn du nur für ein Objekt willst, hängste noch ein :
AND PARTIEDAMPF.Kontrakt_nr = 'xyz' dran.

Darüber, dass du Tabellen nicht über ihre Primary Keys verknüpfst (Partie dampf zu Fakturierung), lasse ich mich mal nicht aus ;o)

Robert_G 30. Mär 2004 11:30

Re: Probleme mit SELECT
 
Ein UNION-SELECT wäre hier völlig unangebracht.
Smokeys Lösung würde wohl genau das machen, was du willst.
Seinem Einwand wegen prim. Key <> verknüpftes Feld schließe ich mich an.

Luciano 30. Mär 2004 12:05

Re: Probleme mit SELECT
 
:? Wegen dem Primary Key... OK aber da muß ich einiges umstellen, irgendetwas hatte ich mir dabei gedacht, aber was wohl :?: Naja... mal sehen ob ich das noch hinbekomme...

Jetzt mal so wie ich das gelöst habe... zumindest so wie es einigermaßen funktioniert. Ich hatte nicht alles gepostet, ich wollte eigentlich nur einen Ansatz wissen...

Nachmal vielen Dank für eure Hilfe... Ich hoffe ich kann auch mal helfen aber mein wissen beschränkt sich bis jetzt nur auf Fragen :roll:

Hier jetzt das Resultat, ich habe noch eine Tabellen mehr mit eingebracht. Wäre das auch mit einem JOIN gegangen? Nur so als Frage, da es jetzt funktioniert will ich es nicht noch einmal umschreiben... bin etwas unter Zeitdruck :freak:

Greets

Luciano

Delphi-Quellcode:
 Anfrage2 := '( SELECT '+
             ' FAKTURIERUNG.KONTRAKT_NR, '+
             ' FAKTURIERUNG.LFDNR, '+
             ' FAKTRELA.FAKTURIER_LFDNR, '+
             ' FAKTRELA.LFDNR, '+
             ' FAKTRELA.RELATION1, '+
             ' VONNACH.FAKTRELA_LFDNR, '+
             ' VONNACH.LFDNR, '+
             ' VONNACH.SUMME, '+
             ' FAKTFAKTOR.VONNACH_LFDNR, '+
             ' FAKTFAKTOR.LFDNR '+
             ' FROM '+
             ' FAKTURIERUNG, FAKTRELA, VONNACH, FAKTFAKTOR '+
             ' WHERE '+
             ' FAKTURIERUNG.KONTRAKT_NR = '+QuotedStr(DataModule1.Q_PARTIEDAMPFKontrakt_nr.Value)+
             ' AND FAKTRELA.FAKTURIER_LFDNR = FAKTURIERUNG.LFDNR '+
             ' AND VONNACH.FAKTRELA_LFDNR = FAKTRELA.LFDNR '+
             ' AND FAKTFAKTOR.VONNACH_LFDNR = VONNACH.LFDNR )';

      //ShowMessage(Anfrage2);

      with DataModule1.Q_TEST do
        begin
          Close;
          SQL.Clear;
          SQL.Add(Anfrage2);
          Open;
        end;

    with DBGrid21 do
      begin
        Columns.Add;
        Columns[0].FieldName := 'KONTRAKT_NR';
        Columns[0].Title.Caption := 'Kontraktnr.';

        Columns.Add;
        Columns[1].FieldName := 'SUMME';
        Columns[1].Title.Caption := 'Fakturiersatz';

        Columns.Add;
        Columns[2].FieldName := 'RELATION1';
        Columns[2].Title.Caption := 'Relation';
      end;


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