Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JOIN über 3 Tabellen (https://www.delphipraxis.net/30732-join-ueber-3-tabellen.html)

Luciano 28. Sep 2004 16:40


JOIN über 3 Tabellen
 
Hi...

Es ist schon spät und ich bekomme das einfach nicht mehr gebacken

Ich habe 3 Tabellen Reservierung (RE), Abrechnung(AB) und Patienten (PA), die wie folgt miteinander verknüpft sind

PA.PA_NR --> RE.RE_PA_NR --> AB.AB_RE_NR und daraus will ich jetzt ein JOIN machen und nach der Abrechnungsnr suchen (AB.AB_NR)

Unternormalen Umständen funktioniert die Anzeige so, die reine Anzeige!
Delphi-Quellcode:
with Data1.Q_ALLERECHNUNGEN do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT '+
            'AB.*, '+
            'RE.RE_NR, RE.RE_PA_NR, RE.RE_ANRDAT, RE.RE_ABRDAT, '+
            'PA.PA_NR, PA.PA_VORNAME, PA.PA_NAME '+
            'FROM '+
            'ABRECHNUNG AB, RESERVIERUNG RE, PATIENTEN PA '+
            'WHERE '+
            'RE.RE_NR = AB.AB_RE_NR '+
            'AND '+
            'PA.PA_NR = RE.RE_PA_NR '+
            'ORDER BY PA.PA_NAME ');
    try
      Active := True;
    except
      ShowMessage('Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!');
    end;
  end;
Jetzt will ich aber eine Suche machen nach der AB.AB_NR

SQL-Code:
AND AB.AB_NR = :v_SUCHE
Sollte da doch wohl noch irgendwie mit reinzubringen sein!

So bekomme ich nicht das gewünsche Ergebnis...
Delphi-Quellcode:
with Data1.Q_ALLERECHNUNGEN do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT '+
            'AB.*, '+
            'RE.RE_NR, RE.RE_PA_NR, RE.RE_ANRDAT, RE.RE_ABRDAT, '+
            'PA.PA_NR, PA.PA_VORNAME, PA.PA_NAME '+
            'FROM '+
            'WHERE '+
            'AB.AB_NR = :v_RECHNGSNR '+
            'AND '+
            'RE.RE_NR = AB.AB_RE_NR '+
            'AND '+
            'PA.PA_NR = RE.RE_PA_NR '+
            'ORDER BY PA.PA_NAME ');
    Prepared := True;
    with Parameters do
      begin
        ParamByName('v_RECHNGSNR').Value := Edit6.Text;
      end;
    try
      Active := True;
    except
      ShowMessage('Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!');
    end;
  end;
Bin für jeden Tipp dankbar

Greets

djmasi 28. Sep 2004 16:50

Re: JOIN über 3 Tabellen
 
Servus,
nimm mal statt
Delphi-Quellcode:
with Parameters do
      begin
        ParamByName('v_RECHNGSNR').Value := Edit6.Text;
      end;
lieber
Delphi-Quellcode:
with Parameters do
      begin
        ParamByName('v_RECHNGSNR').AsInteger := IntToStr(Edit6.Text);
      end;

Luciano 28. Sep 2004 16:56

Re: JOIN über 3 Tabellen
 
Hi Thomas

das klappt nicht weil es eine ADOQuery ist und die Datenbank ist MSDE :?

Greets

shmia 28. Sep 2004 17:18

Re: JOIN über 3 Tabellen
 
Zitat:

Zitat von Luciano
Bin für jeden Tipp dankbar

Verwende doch die SQL/92 Syntax für Joins:
SQL-Code:
SELECT [Feldliste] FROM tableA INNER JOIN tableB ON tableA.FeldA=tableB.FeldB
WHERE [einschränkende Bedingungen]
Dies lässt sich auch ganz leicht auf 3 Tabellen ausweiten.
Vorteil: die WHERE-Bedingung ist viel übersichtlicher, da die Tabellenbeziehungen über ON ...
abgebildet werden und man vergisst keine Beziehung zwischen den Tabellen.
Im Enterprise-Manager vom M$ SQL-Server kann man JOINS ganz einfach mit Klickediklick der Maus
aufbauen und testen.
Nicht vergessen: Prüfe, ob der Datentyp deines Parameters auch richtig ist. Manchmal ist der
Datentyp falsch und die Query liefert dann keine Datensätze.

Leuselator 28. Sep 2004 17:52

Re: JOIN über 3 Tabellen
 
Das sollte auf jeden Fall auch mit MSDE funktionieren:
Delphi-Quellcode:
with Data1.Q_ALLERECHNUNGEN do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('   SELECT AB.*                   ');
    SQL.Add('        , RE.RE_NR              ');
    SQL.Add('        , RE.RE_PA_NR           ');
    SQL.Add('        , RE.RE_ANRDAT          ');
    SQL.Add('        , RE.RE_ABRDAT          ');
    SQL.Add('        , PA.PA_NR              ');
    SQL.Add('        , PA.PA_VORNAME         ');
    SQL.Add('        , PA.PA_NAME            ');
    SQL.Add('     FROM PA                    ');
    SQL.Add('INNER JOIN RE                    ');
    SQL.Add('       ON RE.RE_PA_NR = PA.PA_NR ');
    SQL.Add('INNER JOIN AB                    ');
    SQL.Add('       ON AB.AB_RE_NR = RE.RE_NR ');
    SQL.Add('      AND AB.AB_NR   = :iRNR   ');
    SQL.Add('    ORDER BY PA.PA_NAME         ');
    Parameters.ParamByName('iRNR').DataType := ftInteger;
    Parameters.ParamByName('iRNR').AsInteger := StrToInt(Edit6.Text);
  end;
try
  Data1.Q_ALLERECHNUNGEN.Open;
except
  ShowMessage('Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!');
end;
Gruß

Luciano 29. Sep 2004 07:31

Re: JOIN über 3 Tabellen
 
Danke für Eure Hilfe!!! :thumb:

@Andreas
Dann sollte ich mir den Enterprise Manager mal zu gemüte führen und mal wild durch die Gegend klicken... :P mit 2 Tabellen ist das (auch für mich) kein Problem, ich wußte nur nicht wie ich die Dritte mit einbinden sollte. Aber wenn mir der Enterprise Manager dabei hilft dann teste ich das gleich mal

@Time
Thx :thumb: Das funktioniert, habe nur noch die Tabellen eintragen müssen, weil nur der Alias alleine funktioniert nicht. Aber diese Zeile funktioniert immer noch nicht...
Delphi-Quellcode:
    Parameters.ParamByName('iRNR').DataType := ftInteger;
    Parameters.ParamByName('iRNR').asInteger := StrToInt(Edit6.Text);
Ich kann den Parameter nur als Variant übergeben was eigentlich nicht schlimm ist solange er nicht "verwurschtelt" wird Aber genau so funzt es jetzt wie ich es haben wollte...

für die Nachwelt noch mal so wie es sein sollte!
Delphi-Quellcode:
with Data1.Q_ALLERECHNUNGEN do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('   SELECT AB.*                   ');
    SQL.Add('        , RE.RE_NR              ');
    SQL.Add('        , RE.RE_PA_NR           ');
    SQL.Add('        , RE.RE_ANRDAT          ');
    SQL.Add('        , RE.RE_ABRDAT          ');
    SQL.Add('        , PA.PA_NR              ');
    SQL.Add('        , PA.PA_VORNAME         ');
    SQL.Add('        , PA.PA_NAME            ');
    SQL.Add('     FROM PATIENTEN PA          ');
    SQL.Add('INNER JOIN RESERVIERUNG RE       ');
    SQL.Add('       ON RE.RE_PA_NR = PA.PA_NR ');
    SQL.Add('INNER JOIN ABRECHNUNG AB         ');
    SQL.Add('       ON AB.AB_RE_NR = RE.RE_NR ');
    SQL.Add('      AND AB.AB_NR   = :iRNR   ');
    SQL.Add('    ORDER BY PA.PA_NAME         ');
    Parameters.ParamByName('iRNR').Value := StrToInt(Edit6.Text);
  end;
try
  Data1.Q_ALLERECHNUNGEN.Open;
except
  ShowMessage('Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!');
end;
Greets

shmia 29. Sep 2004 07:50

Re: JOIN über 3 Tabellen
 
Zitat:

Zitat von Luciano
Delphi-Quellcode:
try
  Data1.Q_ALLERECHNUNGEN.Open;
except
  ShowMessage('Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!');
end;

Dein ShowMessage unterdrückt die eigentliche Fehlermeldung. Dann ist grosses Rätzelraten abgesagt :?
Besser so:
Delphi-Quellcode:
try
  Data1.Q_ALLERECHNUNGEN.Open;
except
  on E:Exception do
  begin
    E.Message := 'Query Q_ALLERECHNUNGEN konnte nicht geöffnet werden!'#13#10+
      E.Message;
    Raise;
  end;
end;

Luciano 29. Sep 2004 08:04

Re: JOIN über 3 Tabellen
 
Hi Andreas

da hast du recht, das sollte ich noch ändern :thumb:
jetzt ist es perfekt... :-D

Greets


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