Neuigkeiten:

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

Mobiles Hauptmenü

Kreuztabellenabfrage mit Jahreszahl filtern

Begonnen von mad, März 24, 2019, 14:11:38

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

ich habe mir eine Kreuztabellenabfrageerstellt "qryTM_Personal_kreuz" erstellt die mir von vier über Kriterium ausgewählten Lehrgängen den Datum liefert, wenn vorhanden. (Bild1 und Bild2). Die Zahlen im Tabellenkopf entsprechen der LehrgangsIDs.
Nun möchte ich beim öffnen des Formulars "TM_Formular" die Kreuztabelle nach Jahr filtern. zB. durch eingabe von "2016". Habe versucht in der Spalte "TMDatum: LehrgEnde" testweise die 2016 einzugeben. Dann kommt die Fehlermeldung das dort keine Kriterien eingetragen werden dürfen.
Anschliessend habe ich aus der Kreuztabellenabfrage eine weitere Abfrage "qryTM_Personal" erstellt. Bild3 u. Bild4. Dort lasse ich aus den Datumswerten der Kreuztabelle nur das Jahr ausgeben. Wenn ich nun unter Kriterium zB. 2016 eingebe dann wird die Abfrage entsprechen gefiltert. Ich möchte aber das Jahr beim öffnen der Formulars erst eingeben.
Nur weis ich nicht wie das aussehen muß.

Für Hilfe wäre ich sehr dankbar.


Gruss
mad

PhilS

Wäre es nicht vielleicht eine einfacherer und auch performantere Lösung, die Basisdaten zu filtern, bevor du die Kreuztabelle daraus aufbauen lässt?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

Hallo,

habe Deinen Rat befolgt, und mit etwas nachdenken komme ich jetzt sogar ohne eine Kreuztabellenabfrage aus. Dieser Teil funktioniert.

Dafür hätte ich jetzt ein anderes Problem. Und zwar möchte ich jetzt filtern wenn jemand den Lehrgang  "TMLehrg" 23 oder 30 hat aber "TMLehrg" 22 oder 31 noch nicht hat.
Das würde bedeuten, jeder der den Lehrgang 23 oder 30 hat aber 22 oder 31 nicht, der sollte angezeigt werden.
Habe es wie im Bild gezeigt ausprobiert, funktioniert aber leider nicht.

Ich denke es hat bestimmt jemand eine bessere Idee als ich.


Gruss
mad

ebs17

Ein Feld in einem Datensatz kann nur einen Inhalt (Wert) haben. Wenn Du auf mehr als einen Wert per AND prüfst, kann da nur False rauskommen.

Ideen für Abfragen hätte ich, aber ...
- mir fehlt jemand, der das Bild abmalt und in eine verwendbare SQL-Anweisung verwandelt sowie
- ich tue mich schwer, eine unbekannte Abfrage als Datenbasis für folgendes zu verwenden. man weiß da nie, ob da nur ein Schwänzchen wackelt oder ob da ein Elefant dranhängt.
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: mad am März 25, 2019, 19:57:45
Und zwar möchte ich jetzt filtern wenn jemand den Lehrgang  "TMLehrg" 23 oder 30 hat aber "TMLehrg" 22 oder 31 noch nicht hat.
Das würde bedeuten, jeder der den Lehrgang 23 oder 30 hat aber 22 oder 31 nicht, der sollte angezeigt werden.
Habe es wie im Bild gezeigt ausprobiert, funktioniert aber leider nicht.
Über den grafischen Abfragededitor geht das m.E. nur wenn du mehrere Teil-Abfragen für die einzelnen Bedingungen erstellst und diese dann in einer weiteren Abfrage zusammenführst.

In SQL geht es in einem Aufwasch mit Unterabfragen.


SELECT *
FROM deineTabelle t1
WHERE t1.TMLehrg IN (23,30)
AND (NOT EXISTS (SELECT 'x'
                FROM deineTabelle t2
                WHERE t1.Name = t2.Name
                AND t2.TMLehrg = 22)
     OR NOT EXISTS (SELECT 'x'
                FROM deineTabelle t3
                WHERE t1.Name = t3.Name
                AND t3.TMLehrg = 31)
         );

Die Verknüpfung über "Name" ist suboptimal. Da gehört eine eindeutige ID hin, die ich aber in deiner Tabellenstruktur nicht erkennen kann. Darüber hinaus ist "Name" ein reserviertes Wort, das Ärger machen kann.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

Hallo PhilS,

Super, aber für mich sind das Böhmische Dörfer, habe es aber hinbekommen in dem das ich wie von Dir beschrieben meine Tabelle/Abfrage eingesetzt habe. Habe auch den "Name" gegen die Personen-ID "PID" ersetzt. Wie der Code allerdings funktioniert verstehe ich nicht.

Aktueller Code:
SELECT *
FROM qryTM_Basis AS t1
WHERE (((Exists (SELECT 'x'
                FROM qryTM_Basis t2
                WHERE t1.PID = t2.PID
                AND t2.TMLehrg = 22))=False) AND ((t1.TMLehrg) In (23,30)) AND ((Exists (SELECT 'x'
                FROM qryTM_Basis t3
                WHERE t1.PID = t3.PID
                AND t3.TMLehrg = 31))=False));

Nun wollte ich es versuchen den Code für eine Andere Abfrage zu nutzen indem das ich den Code ändere. Bringt zwar ein Ergebnis aber nicht das gewünschte.
Geänderter Code:
SELECT *
FROM qry_ELA_Basis AS t1
WHERE (((Exists (SELECT 'x'
                FROM qry_ELA_Basis t2
                WHERE t1.PID = t2.PID
                AND t2.TMLehrg = 27))=False) AND ((t1.TMLehrg) In (16)) AND ((Exists (SELECT 'x'
                FROM qry_ELA_Basis t3
                WHERE t1.PID = t3.PID
                AND t3.TMLehrg = 27))=False));

Es werden mir nur alle angezeigt die den Lehrgang "16" abgelgt haben. Aber ich hätte gerne alle angezeigt die nur den Lehrgang "16" haben und den "27" nicht. Oder alle beide nicht. Wenn die Person/en "16" und "27" abgelgt hat dann soll Sie nicht mehr angezeigt werden.

Somit wäre dann mein anderes Thema gleich mit erledigt:
https://www.access-o-mania.de/forum/index.php?topic=23888.msg140800;topicseen#new

Dürfte ich nochmals um Deine Hilfe bitten?



Gruss
mad

PhilS

Zitat von: mad am März 26, 2019, 18:29:22
Aber ich hätte gerne alle angezeigt die nur den Lehrgang "16" haben und den "27" nicht. Oder alle beide nicht. Wenn die Person/en "16" und "27" abgelgt hat dann soll Sie nicht mehr angezeigt werden.

Du hast die Bedingung schon in Prosa etwas widersprüchlich formuliert.- Sollen Personen, die nur "27" haben angezeigt werden, oder nicht?

Wenn beide Lehrgänge abgelegt werden sollen, ist es einfach:


SELECT *
FROM qry_ELA_Basis AS t1
WHERE NOT EXISTS (SELECT 'x'
                 FROM qry_ELA_Basis t2
                 WHERE t1.PID= t2.PID
                 AND t2.TMLehrg IN (16, 27))


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

Hallo,

Nein, sobald "27" abgelegt ist, sollen diese Personen nicht mehr angezeigt werden.


Gruss
mad

PhilS

Zitat von: mad am März 28, 2019, 08:16:41
Nein, sobald "27" abgelegt ist, sollen diese Personen nicht mehr angezeigt werden.

Ok, dann kann man sich ja einfach auf die 27 konzentrieren. - Das obige SQL war übrigens so oder so nicht korrekt.

SELECT *
FROM qry_ELA_Basis AS t1
WHERE NOT EXISTS (SELECT 'x'
                 FROM qry_ELA_Basis t2
                 WHERE t1.PID= t2.PID
                 AND t2.TMLehrg = 27)
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

Hallo,

probiere zwar bereits seit gestern, Vorschlag bringt zwar ein Ergebnis aber leider nur teilweise das gewünschte. Es würden jetzt noch diejenigen fehlen die noch überhaupt keinen Lehrgang abgelegt haben.
Es ist wirklich schwierig zu beschreiben was das Ergebnis sein soll wenn das alles so verschachtelt ist.

Versuche es jetzt mal mit Einzelschritten.
Um es erstmal in die Einzelschritte zu zerlegen, habe ich jetzt mal eine kleine Muster-DB erstellt und versucht die Einzelschritte in separaten Abfragen auf zu splitten. Und mich auch erstmal nur auf einen Lehrgang ,,16" zu beschränken.

Folgende Tabellen habe ich erstellt: eine tblPD mit fünf Personen. Eine tblLehrg mit diversen Lehrgängen die die Personen bereits gemacht haben. Eine Person hat noch gar keinen Lehrgang gemacht.
Bisher habe ich es nur geschafft eine Abfrage zu erzeugen die einen der drei Ansprüche richtig wieder gibt:

,,abf16offen" gibt mir alle Personen wieder die den Lehrgang ,,16" (LG) bereits als gemeldet noch offen haben, aber auch bereits andere Lehrgänge haben können. Heißt sie sind für ,,16" gemeldet ,,Status = 1". Status 2 wäre bestanden. 3 und 4 habe ich erstmal weggelassen, darum <>2.
i.O. ist "name2"

,,abfkeinen16" sollte alle Personen wiedergeben die zwar bereits verschiedene Lehrgänge abgelegt haben oder dafür gemeldet sind, aber noch keinen Lehrgang ,,LG = 16". Es sollte eigentlich die Person (name3) ausgegeben werden. Allerdings werden mit meiner Abfrage aber alle anderen angezeigt und nicht name3. Ich weiß aber nicht wie ich das ganze umkehre? Habe schon <> 16 versucht, funktioniert aber leider nicht.
Meine dritte Abfrage habe ich noch gar nicht zustande bekommen, und zwar: Es sollten alle Personen angezeigt werden die es in der tblPD gibt aber die in der tblLehrg noch keinen Lehrgang aufweisen, also noch gar nicht vorkommen. Das wäre eigentlich die Person ,,name5".

Im Idealfall würden man am Ende alles drei Abfragen, falls Sie den funktionieren, zusammenfügen zu einer.

Möchte mich jetzt schonmal für die Umstände entschuldigen.


Gruss
mad