Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: mad am Januar 22, 2023, 09:36:54

Titel: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: mad am Januar 22, 2023, 09:36:54
Hallo Zusammen,

folgendes Problem. Bisher habe ich immer jährliche Pflichtübungen mit ,,Letzter Wert" pro Jahr ausgewertet.
Die Auswertung (Kreuztabellenabfrage) konnte für ein Jahr (01.01.-31.12.) aber auch über mehrere Jahre erfolgen. Somit wurden für jeden FW-Kameraden der Datum (tt.mm.jjjj) mit dem jeweiligen ,,Betrachtungsjahr" (jjjj) zur jeweiligen Pflichtübung angezeigt.
In etwa so:
Abfragekriterium:
Zwischen [Forms]![WBA_Personal]![jjjj1] Und [Forms]![WBA_Personal]![jjjj2]

                        Betrachtungsjahr           Pflicht1            Pflicht2            Pflicht3
Name1              2020                            02.02.2020                             10.11.2020
Name1              2021                            05.04.2021      11.08.2021
Name2              2020                                                  12.06.2020
Name3              2021                                                                         06.07.2021

Jetzt verschieb sich aber der Betrachtungszeitraum wie folgt:
vom 01.11.jjjj bis 31.10.jjjj

Mein neues Abfragekriterium sieht wie folgt aus:
Zwischen [Forms]![WBA_Personal]![WBAttmmjjjj1] Und [Forms]![WBA_Personal]![WBAttmmjjjj2]

01.11. und 31.10. sind im Formular vorderfiniert nur das jjjj1 und jjjj2 werden im Formular ausgewählt und in den Textfeldern ,,WBAttmmjjjj1" und ,,WBAttmmjjjj2" zusammengeführt.

Die ist der Code für diese Abfrage:
TRANSFORM Last(Übungen.ADatumU) AS LetzterWertvonDatum
SELECT Personal.NameP, [Registrierung-Üb].NamePUeb, Personal.OK, Year([Übungen.ADatumU]) AS Betrachtungsjahr
FROM (Personal INNER JOIN (Übungen INNER JOIN [Registrierung-Üb] ON Übungen.UebKenn = [Registrierung-Üb].Übungen) ON Personal.Namekenn = [Registrierung-Üb].NamePUeb) INNER JOIN tblRegistrierungAufgabe ON Personal.PID = tblRegistrierungAufgabe.PID_A
WHERE (((Personal.OK)=IIf(Forms!UG_frm_Formauswahl_Allg!OKGlobal<>"yy",Forms!UG_frm_Formauswahl_Allg!OKGlobal,Personal.OK)) And ((Übungen.Thema) Like "9.?*") And ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) And ((tblRegistrierungAufgabe.AufgabeID_A)=121 Or (tblRegistrierungAufgabe.AufgabeID_A)=122) And ((tblRegistrierungAufgabe.AufgabeEnde) Is Null) And ((Übungen.ADatumU) Between Forms!WBA_Personal!WBAttmmjjjj1 And Forms!WBA_Personal!WBAttmmjjjj2))
GROUP BY Personal.NameP, [Registrierung-Üb].NamePUeb, Personal.OK, Personal.OK, Year([Übungen.ADatumU])
ORDER BY [Registrierung-Üb].NamePUeb
PIVOT Übungen.Thema In ("9.1 WBA-Team jährl. Vorbereitungstreffen inkl. Theorie","9.2 WBA jährl. LK-Theorie-Schulung","9.3 WBA-Team jährliche Praxis-Übung","9.4 WBA jährl. LK-Praxis-Schulung","9.5 WBA-Vorstellung","9.6 WBA-Team jährl. Nachbereitungstreffen","9.7 WBA Mitwirken in der Arbeitsgruppe","9.8 WBA Bewegungsfahrt");

Nun sieht aber meine Auswertung, wenn ich nur den Zeitraum von einem Jahr auswerte, für Name1 wie folgt aus:
(Betrachtungszeitraum: 01.11.2020 – 31.10.2021)

                 Betrachtungsjahr        Pflicht1          Pflicht2         Pflicht3
Name1       2020                                                                10.11.2020
Name1       2021                         05.04.2021    11.08.2021

Der Betrachtungszeitraum wird auf die zwei Jahre 2022 und 2021 jeweils als separate Zeile aufgeteilt.

Nun meine Frage: Könnte man die beiden JahresZeilen (Betrachtungsjahr) nicht zusammenführen? Das die Auswertung so aussieht.

(Betrachtungszeitraum: 01.11.2020 – 31.10.2021)

                       Betrachtungszeitraum     Pflicht1          Pflicht2          Pflicht3
Name1             2020/2021                     05.04.2021    11.08.2021     10.11.2020


Über Hilfe würde ich mich sehr freuen.
mad
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: markusxy am Januar 22, 2023, 15:47:27
Zitat von: mad am Januar 22, 2023, 09:36:54Nun meine Frage: Könnte man die beiden JahresZeilen (Betrachtungsjahr) nicht zusammenführen? Das die Auswertung so aussieht.

Was hindert dich daran es umzusetzen?
Jetzt verwendest du die Funktion Year um die Spalte Betrachtungsjahr zu erzeugen. Schreib also eine Funktion oder versuche es zumindest, welche deinen gewünschten Ausdruck erzeugt.

Dafür ist ja nur etwas Basiswissen erforderlich.
Du musst ja nur prüfen, zu welcher Jahreskombination ein bestimmtes Datum gehört.
Mit etwas Nachdenken deinerseits sollte das lösbar sein.
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: ebs17 am Januar 22, 2023, 16:39:12
Mein genereller Tipp: Verwendung einer Kalendertabelle (https://www.ms-office-forum.net/forum/showthread.php?t=298670)
Eines der denkbaren Formate zu einem Datum kann auch ein Geschäfts- oder Finanzjahr sein.
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: mad am Januar 23, 2023, 13:14:51
Hallo markusxy,

ich habe jetzt das Betrachtungsjahr wie fokgt geändert:

Betrachtungsjahr: Jahr([Forms]![WBA_Personal]![WBAttmmjjjj1]) & "/" & Jahr([Forms]![WBA_Personal]![WBAttmmjjjj2])

So bekomme ich z.B. als Betrachtungsjahr 2020/2021 und jeweils das Ergebnis (letzter Wert) in eine Zeile. Für einen Betrachtungszeitraum vom 01.11.2020 bis 31.10.2021 soweit oK.

Wenn ich jetzt aber den Zeitraum z.B. von 01.11.2020 bis 31.10.2023 Abfrage, bekomme ich als Betrachtungsjahr:
2020/2023 angezeigt.

ich hätte aber gerne:
2020/2021 (01.11.2020-31.10.2021)
2021/2022 (01.11.2021-31.10.2022)
2022/2023 (01.11.2022-31.10.2023)

Wie müsste ich dazu vorgehen?


Gruss
mad
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: markusxy am Januar 23, 2023, 18:43:33
Zitat von: mad am Januar 23, 2023, 13:14:51Hallo markusxy,

ich habe jetzt das Betrachtungsjahr wie fokgt geändert:

Betrachtungsjahr: Jahr([Forms]![WBA_Personal]![WBAttmmjjjj1]) & "/" & Jahr([Forms]![WBA_Personal]![WBAttmmjjjj2])

Bis jetzt verwendest du ja
Year([Übungen.ADatumU]).
Die Grundlage für die Funktion bildet also das Feld Übungen.ADatumU.
Du musst eine eigene Funktion schreiben, an die das Feld Übungen.ADatumU übergeben wird und daraus muss dann für jeden Datensatz ein String erzeugt. Für die Gruppierung musst du logischerweise die selbe Funktion einsetzen.

Versuch es erstmal selbst.
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: ebs17 am Januar 24, 2023, 12:42:03
Vielleicht damit:
? #10/25/2022#, FinancialYear(#10/25/2022#)
25.10.2022    2022/2023
Public Function FinancialYear(ByVal AnyDate As Date, Optional ByVal FirstMonthFY As Long = 10) As String
    Dim lYear As Long

    lYear = Year(AnyDate)
    If FirstMonthFY = 1 Then
        FinancialYear = lYear
    Else
        Select Case Month(AnyDate)
            Case Is < FirstMonthFY
                FinancialYear = lYear - 1 & "/" & lYear
            Case Is >= FirstMonthFY
                FinancialYear = lYear & "/" & lYear + 1
        End Select
    End If
End Function

Den Hinweis auf Kalendertabelle würde ich wiederholen wollen, insbesondere wenn man mit Massendaten umgeht und trotzdem Performance wünscht.
Einmal berechnen, nachschlagen und indexunterstützt gruppieren statt jedesmalig neuberechnen und ohne Index gruppieren macht einen Unterschied.
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: mad am Januar 24, 2023, 14:05:46
Hallo Zusammen,

habe natürlich selbst auch weiter (bis soeben) nach einer Lösung gesucht. Denn das mit der ,,Funktion" hätte ich wohl nicht hinbekommen.
Werde es mir aber genauso wie die Kalenderfunktion ansehen, man lernt ja nie aus.

Ich habe mir mit diversen Hilfsspalten in der Abfrage beholfen:
ZitatWenn(Monat([ADatumU])=11 Oder Monat([ADatumU])=12;Jahr([ADatumU])+1;Jahr([ADatumU]))

Und:
ZitatBetrachtungszeitraum: Wenn(Monat([ADatumU])=11 Oder Monat([ADatumU])=12;Jahr([ADatumU]) & "/" & Jahr([ADatumU])+1;Jahr([ADatumU])-1 & "/" & Jahr([ADatumU]))

Der ganze Code der Abfrage lautet wie folgt:
TRANSFORM Last(Übungen.ADatumU) AS LetzterWertvonDatum
SELECT Personal.NameP, [Registrierung-Üb].NamePUeb, Personal.OK, IIf(Month([ADatumU])=11 Or Month([ADatumU])=12,Year([ADatumU]) & "/" & Year([ADatumU])+1,Year([ADatumU])-1 & "/" & Year([ADatumU])) AS Betrachtungszeitraum
FROM (Personal INNER JOIN (Übungen INNER JOIN [Registrierung-Üb] ON Übungen.UebKenn = [Registrierung-Üb].Übungen) ON Personal.Namekenn = [Registrierung-Üb].NamePUeb) INNER JOIN tblRegistrierungAufgabe ON Personal.PID = tblRegistrierungAufgabe.PID_A
WHERE (((IIf(Month([ADatumU])=11 Or Month([ADatumU])=12,Year([ADatumU])+1,Year([ADatumU]))) Between [Forms]![WBA_Personal]![WBAJahr1] And [Forms]![WBA_Personal]![WBAJahr2]) AND ((Personal.OK)=IIf([Forms]![UG_frm_Formauswahl_Allg]![OKGlobal]<>"yy",[Forms]![UG_frm_Formauswahl_Allg]![OKGlobal],[Personal].[OK])) AND ((Übungen.Thema) Like "9.?*") AND ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) AND ((tblRegistrierungAufgabe.AufgabeID_A)=121 Or (tblRegistrierungAufgabe.AufgabeID_A)=122) AND ((tblRegistrierungAufgabe.AufgabeEnde) Is Null))
GROUP BY Personal.NameP, [Registrierung-Üb].NamePUeb, Personal.OK, Personal.OK, IIf(Month([ADatumU])=11 Or Month([ADatumU])=12,Year([ADatumU]) & "/" & Year([ADatumU])+1,Year([ADatumU])-1 & "/" & Year([ADatumU]))
ORDER BY [Registrierung-Üb].NamePUeb
PIVOT Übungen.Thema In ("9.1 WBA-Team jährl. Vorbereitungstreffen inkl. Theorie","9.2 WBA jährl. LK-Theorie-Schulung","9.3 WBA-Team jährliche Praxis-Übung","9.4 WBA jährl. LK-Praxis-Schulung","9.5 WBA-Vorstellung","9.6 WBA-Team jährl. Nachbereitungstreffen","9.7 WBA Mitwirken in der Arbeitsgruppe","9.8 WBA Bewegungsfahrt");

Ist natürlich nicht so Professionell wie eure Vorschläge, aber funktioniert erstmal.
Wobei ich zu den Vorschlägen von ebs17 tendiere und diese im Nachgang umsetzen möchte.


Danke für die tolle Unterstützung.
mad
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: ebs17 am Januar 24, 2023, 14:17:57
Zitathabe natürlich selbst auch weiter (bis soeben) nach einer Lösung gesucht
Das finde ich gut. Wenn man sich selber gequält hat, ist die Aufnahmequalität eines Vorschlages inklusive Einordnung deutlich verbessert, als wenn man nur wartet, um einen Vorschlag zubekommen, um ihn blind zu kopieren.
Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: markusxy am Januar 24, 2023, 21:36:13
Zitat von: mad am Januar 24, 2023, 14:05:46Ist natürlich nicht so Professionell wie eure Vorschläge, aber funktioniert erstmal.

Was ist dein Problem, deinen Code in eine Funktion zu gießen?
Dein Ansatz ist so ja ganz gut.

Titel: Re: Betrachtungszeitraum über zwei (Teil)Jahre hinweg
Beitrag von: mad am Januar 26, 2023, 10:47:30
Hallo Zusammen,

habe das jetzt mit der "Funktion", Vorschlag von ebs17 umgesetzt.
Hatte aber anfänglich das Problem das ich die Funktion in ein Klassenmodul gepackt habe anstatt in ein Modul.

Nach Anpassung der Funktion, startend ab Monat 11 (Nov):
Public Function FinancialYear(ByVal AnyDate As Date, Optional ByVal FirstMonthFY As Long = 11) As String
...

und die Integration in die Abfrage:

TRANSFORM Last(Übungen.ADatumU) AS LetzterWertvonDatum
SELECT Personal.NameP, [Registrierung-Üb].NamePUeb, Personal.OK, FinancialYear([ADatumU]) AS Betrachtungszeitraum
...

...
WHERE (((FinancialYear([ADatumU])) Between [Forms]![WBA_Personal]![WBAJahr1] And [Forms]![WBA_Personal]![WBAJahr2]) AND....

funktioniert es jetzt super. Zumindestens werden alle Inhalte wie mit dem Code unter #6 angezeigt.


Nochmals herzlichen Dank.
mad