August 13, 2022, 19:36:30

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Abfrage soll auch leere Felder anzeigen

Begonnen von esskah, Juli 12, 2022, 00:31:30

⏪ vorheriges - nächstes ⏩

esskah

Liebe Gemeinde,

meine DB ist eine Mitgliederdatenbank und enthält u.a. eine Tabelle für die Personendaten und eine Tabelle für die Ehrungen. In einer Abfrage möchte ich für einen Bericht nun alle Daten zur Mitgliedsnummer abfragen. Das klappt auch so lange, wie in der Tabelle Ehrungen auch Daten enthalten sind.
Habe ich ein Mitglied, das bisher noch nicht geehrt wurde, taucht es auch nicht in der Abfrage für den Bericht auf.

Ich habe verstanden, dass im JOIN-Ausdruck offenbar die Null separat behandelt werden muss. So habe ich folgendes eingefügt, bzw. die Originalabfrage um "or tblPersonen.perID Is Null and tblEhrungen.ehrperIDRef Is Null" erweitert:
SELECT ...
FROM (INNER JOIN tblEhrungen ON tblPersonen.perID = tblEhrungen.ehrperIDRef or tblPersonen.perID Is Null and tblEhrungen.ehrperIDRef Is Null)
WHERE (((tblPersonen.perID)=[Bitte die Mitgliedsnummer eingeben:]));

Hier erhalte ich den Hinweis "JOIN-Ausdruck nicht unterstützt."

Bisher bearbeite ich die Abfragen nur im Entwurfsmodus, weil mir die SQL-Kenntnisse fehlen. Auch ein Access-Profi bin ich nicht. Meine Datei habe ich mithilfe von Tutorials aufgebaut und erweitert.

Danke für jeden Hilfeversuch!
Esskah

ebs17

Zitatweil mir die SQL-Kenntnisse fehlen
Da kann man nacharbeiten: JOIN - Normalisierte Tabellen für eine Abfrage wieder zusammenfassen

So etwa sollte es lauten:
ZitatSELECT
   [Feldliste]
FROM
   tblPersonen
      LEFT
JOIN tblEhrungen
      ON tblPersonen.perID = tblEhrungen.ehrperIDRef
WHERE
   tblPersonen.perID = [Bitte die Mitgliedsnummer eingeben:]
- Eine verwendete Tabelle muss im FROM-Teil aufgeführt werden.
- OUTER JOIN verwenden (alle Datensätze der einen Tabelle, referenzierte DS der anderen Tabelle)
- keine willkürliche Klammersetzung

Bei funktionierenden Anweisungen kann man auch zwischen Entwurfsansicht (die man beherrscht?) und SQL-Ansicht umschalten, um ein Gefühl für resultierendes SQL zu bekommen.

Die Parameterübergabe ist noch sehr rudimentär: Grundlagen - SQL ist leicht (16) - Abfragen mit Parametern
Mit freundlichem Glück Auf!

Eberhard

esskah

Zitat von: ebs17 am Juli 12, 2022, 09:41:00Da kann man nacharbeiten:
Das versuche ich ja gerade
Zitat von: ebs17 am Juli 12, 2022, 09:41:00Bei funktionierenden Anweisungen kann man auch zwischen Entwurfsansicht (die man beherrscht?) und SQL-Ansicht umschalten, um ein Gefühl für resultierendes SQL zu bekommen.
beherrschen ist sicher übertrieben, aber ich komme ganz gut zurecht. Bevor ich mich hier an das Forum gewandt habe, habe ich schon versucht über Entwurfs- und SQL-Ansicht weiterzukommen. Brachte aber nix, daher meine Frage hier  :-[

Die DB wurde "aus der Not geboren" ist aber schon länger im Einsatz und leistet gute Dienste. Daher auch der teils stümperhafte Aufbau - man verzeihe mir. Aktuell modifiziere ich sie.

Vielen Dank für Deinen Lösungsansatz, leider hat der nicht geholfen. Wahrscheinlich liegt es aber daran, dass ich nicht die komplette Abfrage gepostet, bzw. aus meiner Sicht unnötiges gelöscht habe. Daher ggf. auch der Gedanke an willkürliche Klammersetzung.

Im Prinzip will ich einfach nur alle Informationen zum Mitglied in einem Bericht anzeigen lassen. Wurde das Mitglied aber bisher noch nie geehrt, existiert auch keine Verbindung zwischen Mitgliedsnummer und Index der Ehrungen. Folglich wird auch im Query nichts angezeigt (so meine Theorie).

Hier nochmal die komplette Abfrage aus der SQL-Ansicht von Access. Danke, wenn Du Dich nochmal bemühst

SELECT tblPersonen.perID, tblPersonen.perNachname, tblPersonen.perMaedchenname, tblPersonen.perVorname, tblPersonen.perStrasse, tblPersonen.perPLZ, tblPersonen.perOrt, tblPersonen.perDatumGeburt, qryPersonenAlterJetztOderBeiSterbedatum.Alter, tblPersonen.perBeitragsfrei, tblPersonen.perFoerdermitglied, tblPersonen.perBemerkung, tblPersonen.perFoto.FileData, tblPersonen.perBeitrittserklaerung.FileName, tblPersonen.perDokumente.FileName, qeryPersonenAktivPassivZeiten.Aktivstatus, qeryPersonenAktivPassivZeiten.SummeAktiv, qeryPersonenAktivPassivZeiten.SummePassiv, tblKontakte.konInhalt, tblKontakte.kontyp, qryPersonenMitgliedschaftenAlles.mitDatumEintritt, qryPersonenMitgliedschaftenAlles.mitDatumAustritt, qryPersonenMitgliedsjahre.Mitgliedsjahre, qryPersonenMitgliedschaftenAlles.mitDatumEhe, qryPersonenMitgliedschaftenAlles.Verwitwet, qryPersonenMitgliedschaftenAlles.geschieden, qryPersonenMitgliedschaftenAlles.mitDatumTod, qryPersonenMitgliedschaftenAlles.perAbteilung, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis, qeryPersonenAktivPassivZeiten.Aktivzeit1, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis, qeryPersonenAktivPassivZeiten.Passivzeit1, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon2, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis2, qeryPersonenAktivPassivZeiten.Aktivzeit2, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon2, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis2, qeryPersonenAktivPassivZeiten.Passivzeit2, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon3, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis3, qeryPersonenAktivPassivZeiten.Aktivzeit3, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon3, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis3, qeryPersonenAktivPassivZeiten.Passivzeit3, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon4, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis4, qeryPersonenAktivPassivZeiten.Aktivzeit4, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon4, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis4, qeryPersonenAktivPassivZeiten.Passivzeit4, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon5, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis5, qeryPersonenAktivPassivZeiten.Aktivzeit5, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon5, qryPersonenMitgliedschaftenAlles.mitDatumpassivBis5, qeryPersonenAktivPassivZeiten.Passivzeit5, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon6, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis6, qeryPersonenAktivPassivZeiten.Aktivzeit6, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon6, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis6, qeryPersonenAktivPassivZeiten.Passivzeit6, qryPersonenMitgliedschaftenAlles.mitDatumAktivVon7, qryPersonenMitgliedschaftenAlles.mitDatumAktivBis7, qeryPersonenAktivPassivZeiten.Aktivzeit7, qryPersonenMitgliedschaftenAlles.mitDatumPassivVon7, qryPersonenMitgliedschaftenAlles.mitDatumPassivBis7, qeryPersonenAktivPassivZeiten.Passivzeit7, tblEhrungen.ehrDatum15, tblEhrungen.ehrDatum25, tblEhrungen.ehrDatum35, tblEhrungen.ehrDatum40, tblEhrungen.ehrDatum50, tblEhrungen.ehrDatum55, tblEhrungen.ehrDatum60, tblEhrungen.ehrDatum65, tblEhrungen.ehrDatum70, tblEhrungen.ehrDatum75, tblEhrungen.ehrDatumBesondereVerdienste, tblEhrungen.ehrHinweise, tblEhrungen.ehrDatumEhrenmitglied, tblEhrungen.ehrDatumEhrenvorstand, tblEhrungen.ehrDatumEhrendirigent, tblEhrungen.ehrDatumExVorstand, qryPersonenMitgliedschaftenAlles.abtNamekurz
FROM (((((tblPersonen INNER JOIN qryPersonenMitgliedsjahre ON tblPersonen.perID = qryPersonenMitgliedsjahre.perID) INNER JOIN qeryPersonenAktivPassivZeiten ON tblPersonen.perID = qeryPersonenAktivPassivZeiten.perID) INNER JOIN qryPersonenAlterJetztOderBeiSterbedatum ON tblPersonen.perID = qryPersonenAlterJetztOderBeiSterbedatum.perID) INNER JOIN qryPersonenMitgliedschaftenAlles ON tblPersonen.perID = qryPersonenMitgliedschaftenAlles.perID) INNER JOIN tblEhrungen ON tblPersonen.perID = tblEhrungen.ehrperIDRef) INNER JOIN tblKontakte ON tblPersonen.perID = tblKontakte.konperIDRef
WHERE (((tblPersonen.perID)=[Bitte die Mitgliedsnummer eingeben:]));

ebs17

Zitatso meine Theorie
Daher der Hinweis auf OUTER JOIN, den Du sowohl inhaltlich durch Eigenrecherche vertiefen und natürlich auch in Dein Bewusstsein einfließen lassen kannst.

Die in den Anstrichen genannten Punkte gelten, theoretisch und praktisch.
Mit freundlichem Glück Auf!

Eberhard

DF6GL

Hallo,


ebs17 meint dieses:

... Left JOIN tblEhrungen ON tblPersonen.perID = tblEhrungen.ehrperIDRef).....


oder evtl.  Right JOIN tblEhrungen ....

andyfau

Hallo,
vielleicht helfen die zwei Bilder, wenn man kein SQL-Profi ist.

esskah

Zitat von: DF6GL am Juli 15, 2022, 13:33:03oder evtl.  Right JOIN tblEhrungen ....

Hier erhalte ich den Hinweis "JOIN-Ausdruck nicht unterstützt."

esskah

Zitat von: andyfau am Juli 17, 2022, 10:35:08Hallo,
vielleicht helfen die zwei Bilder, wenn man kein SQL-Profi ist.

Danke für die Verdeutlichung. Diese Verknüpfungseigenschaften habe ich schon ausgewählt, erhalte aber immer einen leeren Eintrag, wenn noch keine Ehrung durchgeführt wurde.
Ich vermute aber, dass ich schlicht den Aufbau der Tabelle(n) falsch gemacht habe. Bei mir gibt es nur bestimmte Ehrungen, in Deiner Tabelle werden einfach die Ehrungen unbestimmt eingetragen. Man könnte (sehe ich das richtig?) noch eine Nachschlagetabelle hinzufügen, aus der man dann die entsprechende Ehrung (25, 40, 50 Jahre, etc.) auswählt?


andyfau

Richtig, die Tabelle, die Du zeigst, ist eigentlich das Ergebnis noch eine Stufe weiter gedacht, nämlich eine Kreuztabelle aus meiner Ergebnistabelle.
Siehe auch
https://www.access-tutorial.de/abfragen/kreuztabellenabfragen.htm

Ob Du dabei noch die Eingabe der Ehrungen über eine weitere Tabelle (Ehrungsart, oder so) verifizierst, ist für die Abfrage uninteressant.
Wenn die DB richtig normalisiert wurde, ist jede Ehrung einer Person ein eigener Datensatz und keine Spalte....

Gruß
Andreas