Neuigkeiten:

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

Mobiles Hauptmenü

(Alias)-Abfrage mit Kriterium erweitern

Begonnen von mad, Februar 07, 2022, 17:34:46

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe vor längerer Zeit über das Forum eine Abfrage (mit Alias-Bezeichnungen), bekommen. Habe bereits versucht die Alias-Abfrage in ihre Original-Bezeichnungen aufzulösen. Stoße aber leider an meine Grenzen.
Leider habe ich zu Alias-Abfragen so gut wie keine Ahnung.

Nun würde ich gerne die Alias-Abfrage, hier der aktuelle SQL-Code, gerne:

TRANSFORM
   COUNT(B.PID) AS XY
SELECT
   B.[Alter]
FROM
   (
      SELECT
         V.I AS [Alter],
         V.Geschlecht,
         P.PID
      FROM
         (
            SELECT
               T.I,
               tblgeschlecht.ID,
               tblgeschlecht.Geschlecht
            FROM
               T99 AS T,
               tblgeschlecht
            WHERE
               T.I BETWEEN 12 AND 19
         ) AS V
            LEFT JOIN
               (
                  SELECT
                     PID,
                     Geschlecht,
                     Year(Now()) - Year(GebDatum) AS [Alter]
                  FROM
                     Personal
                  WHERE
                     statusID_P IN(1, 2)
                        AND
                     gruppe Like "JF*"
               ) AS P
               ON V.ID = P.Geschlecht
                  AND
               V.I = P.[Alter]) AS B
GROUP BY
   B.[Alter]
PIVOT
   B.Geschlecht

um folgendes erweitern wollen:

Feld: ,,OK"
Tabelle: ,,Personal"
Kriterium: ,,[Forms].[UG_frm_Formauswahl_Allg].[OKGlobal]"

Wie und wo müsste ich den das einfügen?

Über Unterstützung würde ich mich sehr freuen.


Gruss
mad

ebs17

ZitatLeider habe ich zu Alias-Abfragen so gut wie keine Ahnung.
Alias-Abfragen gibt es nicht.
Grundlagen - SQL ist leicht (2) - Alias

Zitatwo müsste ich den das einfügen?
Wo macht es denn funktional Sinn?
Oder reicht es, dass es "irgendwie" drin ist?

Formularbezüge als Kriterium einzubasteln ist kein guter Stil. Vor allem aber wird ein Einsatz so in einer Unterabfrage nicht mehr funktionieren.
Grundlagen - SQL ist leicht (16) - Abfragen mit Parametern
Je nach Anwendungszweck und -umgebung Varianten 3) bis 6)
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo,

hab mich jetzt mal so rangetastet, --> nur zur markierung wo ich was eingefügt habe:

TRANSFORM COUNT(B.PID) AS XY
SELECT B.[Alter]
FROM (SELECT
         V.I AS [Alter],
         V.Geschlecht,
         P.PID,
-->      P.OK
      FROM
         (
            SELECT
               T.I,
               tblgeschlecht.ID,
               tblgeschlecht.Geschlecht
            FROM
               T99 AS T,
               tblgeschlecht
            WHERE
               T.I BETWEEN 12 AND 19
         ) AS V
            LEFT JOIN
               (
                  SELECT
                     PID,
                     Geschlecht,
-->                  OK,
                     Year(Now()) - Year(GebDatum) AS [Alter]
                  FROM
                     Personal
                  WHERE
                     statusID_P IN(1, 2)
                        AND
                     gruppe Like "JF*"
                        AND
-->                  OK Like "XX"
               ) AS P
               ON V.ID = P.Geschlecht
                  AND
               V.I = P.[Alter])  AS B
GROUP BY B.[Alter]
PIVOT B.Geschlecht;

mit
Zitat...
 OK Like "XX"
...
erhalte ich das richtige Ergebnis.
Allerdings müsste ich jetzt "XX" gegen "[Forms].[UG_frm_Formauswahl_Allg].[OKGlobal]" austauschen. Funktioniert aber noch nicht.

Wie müsste ich anpassen?


Gruss
mad

ebs17

IM SELECT-Teil einer Unterabfrage wirst Du OK nie sehen, gebraucht wird es dort auch nicht: Überflüssig.

Zum Filtern:
WHERE ...
   AND P.OK = fGetOK()
Bitte Gleich benutzen, nicht Like, auch schon bei dem Kriterium oben drüber.
Um das inhaltlich zu verstehen: Sag mal Deiner Partnerin oder Deinem Partner: Ich liebe jemanden wie Dich.
Dann guckst Du, wie der Gegenüber guckt ... Ähnlichkeit ist etwas anderes wie Gleichheit.
Technisch (für jene, denen Performance nicht egal ist): Diese Mustersuche unterbindet eine Indexnutzung.

Damit das beispielhafte Kriterium funktioniert, muss in einem Standardmodul eine Funktion angelegt werden:
Public Function fGetOK()
   fGetOK = Forms.UG_frm_Formauswahl_Allg.OKGlobal       ' wenn die Bezüge stimmen
End Function
Das Formular muss bei Abfrageaufruf selbstredend offen sein, damit die Funktion sich den Inhalt holen kann.
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo,
habe die Funktion angelegt:
ZitatPublic Function fGetOK()
   fGetOK = Forms.UG_frm_Formauswahl_Allg.OKGlobal       ' wenn die Bezüge stimmen
End Function

Das entsprechende Formular "UG_frm_Formauswahl_Allg" mit dem Feld "OKGlobal" ist geöffnet.

Habe die Abfrage wie folgt geändert:
TRANSFORM COUNT(B.PID) AS XY
SELECT B.[Alter]
FROM (SELECT
         V.I AS [Alter],
         V.Geschlecht,
         P.PID,
         P.OK
      FROM
         (
            SELECT
               T.I,
               tblgeschlecht.ID,
               tblgeschlecht.Geschlecht
            FROM
               T99 AS T,
               tblgeschlecht
            WHERE
               T.I BETWEEN 12 AND 19
         ) AS V
            LEFT JOIN
               (
                  SELECT
                     PID,
                     Geschlecht,
                     OK,
                     Year(Now()) - Year(GebDatum) AS [Alter]
                  FROM
                     Personal
                  WHERE
                     statusID_P IN(1, 2)
                        AND
-->                   gruppe = "JF*"
                        AND
-->                   P.OK = fGetOK()
               ) AS P
               ON V.ID = P.Geschlecht
                  AND
               V.I = P.[Alter])  AS B
GROUP BY B.[Alter]
PIVOT B.Geschlecht;

Jetzt bekomme ich die Fehlermeldung:
"Syntaxfehler in FROM-Klausel"

Mit den angebotenen Fehlerursachen aus der Hilfe komme ich leider nicht weiter.

Gruss
mad

ebs17

Natürlich.
P.OK = fGetOK()

' muss natürlich hier lauten
OK = fGetOK()
In jener Abfrageebene heißt die Tabelle Personal (ohne Alias). Auf Grund dessen, dass hier nur Felder aus genau einer Tabelle kommen, kann man auf eine Qualifizierung der Felder (Voranstellen des Tabellennamens) verzichten.
Der Fehler ist also, dass hier auf eine Tabelle verwiesen wird, die an der Stelle nicht definiert und somit unbekannt ist.
Mit freundlichem Glück Auf!

Eberhard

mad

Jetzt entsprechend geändert:

TRANSFORM COUNT(B.PID) AS XY
SELECT B.[Alter]
FROM (SELECT
         V.I AS [Alter],
         V.Geschlecht,
         P.PID,
         P.OK
      FROM
         (
            SELECT
               T.I,
               tblgeschlecht.ID,
               tblgeschlecht.Geschlecht
            FROM
               T99 AS T,
               tblgeschlecht
            WHERE
               T.I BETWEEN 12 AND 19
         ) AS V
            LEFT JOIN
               (
                  SELECT
                     PID,
                     Geschlecht,
                     OK,
                     Year(Now()) - Year(GebDatum) AS [Alter]
                  FROM
                     Personal
                  WHERE
                     statusID_P IN(1, 2)
                        AND
                  gruppe = "JF*"
                        AND
                   OK = fGetOK()
               ) AS P
               ON V.ID = P.Geschlecht
                  AND
               V.I = P.[Alter])  AS B
GROUP BY B.[Alter]
PIVOT B.Geschlecht;

Nun kommt die Fehlermeldung: Undefinierter Function 'fGetOK' in Ausdruck


Gruss
mad

mad

Hallo,

habe mal zum ausprobieren ein "Test.accdb" hinzugefügt.
DB startet mit dem Formular "UG_frm_Formauswahl_Allg" in dem das Feld "OKGlobal" (gelb hinterlegt) das als Filterkriterium verwendet werden soll.
Es gibt dann die beiden Abfragen:
"qyrJahresbericht_JF_Original" ohne
Zitat' muss natürlich hier lauten
OK = fGetOK()

und "qyrJahresbericht_JF" mit
Zitat' muss natürlich hier lauten
OK = fGetOK()
funktioniert leider nicht.

In der ZIP-Datei ist auch eine Excel hinzugefügt die das Ergenis zeigt das bei der Abfrage rauskommen soll.

Bei den anderen Abfragen "1_abf_...." handelt es sich nur um Test-Abfrage bei denen ich versucht habe die Abfrage "qyrJahresbericht_JF" mit Orginalbezeichnungen step für step nachzuvollziehen.

Vielleicht hilft ja die Test-DB.


Gruss
mad

ebs17

Damit das beispielhafte Kriterium funktioniert, muss in einem Standardmodul eine Funktion angelegt werden:

Vielleicht kannst Du Dich in die Lage versetzen, Deine Wahrnehmung etwas aufzubohren und vollständiger zu lesen. Pampern kostet nämlich extra.
Mit freundlichem Glück Auf!

Eberhard

mad

Entschuldige mich für die Oberflächlichkeit, war nicht meine Absicht.

Habe nun die Funktion in einem "Modul", nicht wie bisher in einem "Klassenmodul" angelegt.

Und habe

Zitat...And gruppe = "JF*"...

'wieder umgestellt auf

...And gruppe like "JF*"...

funktioniert.

Möchte mich mochmals für Deine Geduld bedanken.

Herzlichen Dank
mad