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
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.
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.
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
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.
Vielleicht damit:
? #10/25/2022#, FinancialYear(#10/25/2022#)
25.10.2022 2022/2023Public 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.
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
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.
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.
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