Oktober 29, 2020, 20:00:33

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Bericht schliesst wegen INNER JOIN-Abfrage Daten aus

Begonnen von Knoot, Juli 23, 2020, 18:24:57

⏪ vorheriges - nächstes ⏩

Knoot

Hallo ihr Lieben

ich bin kompletter Anfänger und hab +/- null Ahnung von Access, brauche also dringendst einfache Anweisungen  ;)

Zum Problem: ein Bericht, der erbrachte Leistungen samt Medikamenten darstellen soll, schliesst leider die Leistungen aus, die keine Medikamente benötigen. Ich hab mich die letzten paar Tage etwas ins ganze INNER/OUTER-JOIN eingelesen, aber die ganzen Informationen prallen leider an mir ab, zufälliges LEFT/RIGHT-Einfügen bringt auch nix  ::)  ;D

hier die per Assistent erstellte Berichtsabfrage:

SELECT [UTab1_Rechnung].[RechnungsNr], [UTab1_Rechnung].[Datum], [Tab2_Kunden].[Anschrift], [UTab3_RLeistung].[Behandlungsatum], [UTab3_RLeistung].[Leistung], [UTab3_RLeistung].[Anzahl], [Tab4_Leistungen].[Bruttopreis_inkl_MWST], [UTab4_RMedikament].[Medikament], [UTab4_RMedikament].[Menge], [Tab3_Medikamente].[PV_arrondi], [UTab3_RLeistung].[RechnungsL] FROM ((Tab2_Kunden

INNER JOIN UTab1_Rechnung ON [Tab2_Kunden].[KundenID] =[UTab1_Rechnung].[Kunde])

INNER JOIN (Tab4_Leistungen

INNER JOIN UTab3_RLeistung ON [Tab4_Leistungen].[ID] =[UTab3_RLeistung].[Leistung]) ON [UTab1_Rechnung].[RechnungsNr] =[UTab3_RLeistung].[RechnungsNr])

INNER JOIN (Tab3_Medikamente

INNER JOIN UTab4_RMedikament ON [Tab3_Medikamente].[ProduktID] =[UTab4_RMedikament].[Medikament]) ON [UTab3_RLeistung].[RechnungsL] =[UTab4_RMedikament].[RechnungsL];



Der Bericht holt seine Infos hauptsächlich aus 3 Tabellen, die aus einem Formular mit mehreren Abfragen erstellt werden. Leistungen mit dazugehörigen Medikamenten werden angezeigt, der Bericht soll jetzt auch die zur jeweiligen Rechnungsnummer gehörenden Leistungen (UTab3_RLeistung.Leistung) ohne Medikamente (UTab4_Medikament.Medikament) darstellen.

Kann mir da jemand helfen, ich steh gerade komplett auf dem Schlauch  :(

Danke im Voraus

Euer Knoot

DF6GL

HAllo,

ins Blaue geschossen:

.
.
.
INNER JOIN (Tab4_Leistungen

LEFT JOIN UTab3_RLeistung ON [Tab4_Leistungen].[ID] =[UTab3_RLeistung].[Leistung]) ON [UTab1_Rechnung].[RechnungsNr] =[UTab3_RLeistung].[RechnungsNr])
.
.



wobei ich die ON-Bedingungen nicht nachvollziehen kann.

Am Besten stellst Du die Verknüpfungsart im Abfrageentwurf ein.  ("Alle Daten aus Rechnungen und nur die aus Leistungen" )

Knoot

Hui das ging ja schnell  ;)

Danke für die Antwort, aber eben, habs auch schon ins Blaue probiert, beim einfügen von LEFT kommt die Fehlermeldung "Join-Ausdruck nicht unterstützt"...das gleiche passiert wenn ich direkt bei den Beziehungen in den Eigenschaften den Typ verändere (alle Datensätze von x und nur die übereinstimmenden von y), also gleicher Fehler.

Kennt sich jemand mit der Klammerung in solchen Fällen aus? Hab irgendwo aufgeschnappt, dass Access da ab und zu etwas eigen sein kann  ::)

Liebe Grüsse

DF6GL

Hallo,

ich hab Dir gesagt, den Abfrageentwurf zu bemühen.

Offensichtlich wird die "Verlinkungs-Konstruktion" so nicht akzeptiert. Die Verknüpfungen sollten  nur über Schlüsselfelder erfolgen...

crystal

Auch mal nur ins Blaue gedacht:
Könnte es sein, dass die verlinkten Felder unterschiedliche Zahlenformate oder auf der linken Seite einen Standard-Wert haben?
Wenn "links" z. B. als Standard-Wert "0" steht, findet der Join natürlich keine passenden Datensätze "rechts" - auch keine leeren, weil "0" mit "Nichts" verglichen wird und das ist eben nicht gleich.

Bitte mal prüfen, denn es ist nur so eine spontane Idee...

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Knoot

Super, vielen Dank euch beiden, jetzt hab ich zumindest zwei Anhaltspunkte statt nur dauernd LEFT, RIGHT und INNER in verschiedenen Kombinationen wahllos einzusetzen  ::)

Mach mich morgen nach der Arbeit ans Werk, ich meld mich, so macht Access doch gleich mehr Spass  ;D

crystal

Nochmal Hallo und ein kleiner Nachtrag,

es gibt leider nur sehr wenig Informationen dazu, wie Access Abfragen optimiert, wenn/bevor sie ausgeführt werden.
Ein einleitender Artikel dazu ist hier:

http://allenbrowne.com/QueryPerfIssue.html

Leider funktionieren nicht mehr alle Links in diesem Artikel.
Interessant fand ich aber z. B. den Hinweis (ganz am Ende):
ZitatAvoid multiple tables on the outer side of a JOIN, as JET can misinterpret these.

Dein konkretes Problem
Zitat von: Knootder Bericht soll jetzt auch die zur jeweiligen Rechnungsnummer gehörenden Leistungen (UTab3_RLeistung.Leistung) ohne Medikamente (UTab4_Medikament.Medikament) darstellen.

deutet m. E. darauf hin, dass der betreffende JOIN nicht "fruchtet", weil "links" und "rechts" eben keine übereinstimmenden Daten ("0" auf beiden Seiten) gefunden werden. Ich hatte Mal sowas ähnliches und habe mir damit beholfen, dass ich in der rechten Tabelle einen (sonst leeren) Datensatz mit dem Primärschlüssel "0" angelegt habe. Hier habe ich dann in einem beschreibenden Textfeld sowas wie "Dies ist ein Dummy" oder "noch keine Daten vorhanden" eingetragen, was die Situation ja auch gleich ersichtlich macht. Das ist aber u. U. etwas schwierig zu machen, wenn die "rechte" Tabelle als Primärschlüssel einen Autowert hat. Dann habe ich das eben kurzfristig auf "Zahl, Long Integer" geändert, um meinen Datensatz mit dem Primärschlüssel 0 anlegen zu können.

Probiere doch auch mal, deine Abfrage so zu reduzieren, dass sie nur noch diesen betreffenden JOIN beinhaltet. Erhälst du dann die gewünschten leeren Datensätze der zweiten Tabelle? Es könnte nämlich auch sein, dass Access bei mehr als 2 JOINS "etwas durcheinander gerät", wie im Internet nachzulesen ist und auch in diesem Forum bereits erläutert/diskutiert wurde...

Ich bin aber durchaus noch der Meinung, dass deine Abfrage funktionieren könnte, wenn du den Standard-Wert des Foreign-Key-Feldes in deiner "linken" Tabelle in der Tabellen-Definition rauslöschst und ggf. bei allen bereits vorhandenen Datensätzen dieser "linken" Tabelle den Wert "0" durch "" (Nix, Nada, Null) ersetzt (Achtung: bitte mit einer UPDATE-Abfrage, nicht mit einer LÖSCH-Abfrage!!!):
update tabelle1 set referenzfeld = null where referenzfeld = 0 (oder so ähnlich, bitte im Abfrage-Generator selbst machen und die Daten vorher sichern).

Viel Erfolg bei deinen Versuchen und
Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...