Neuigkeiten:

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

Mobiles Hauptmenü

Bericht dynanisch nach Jahreszahl anpassen

Begonnen von mad, Januar 01, 2020, 09:51:56

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe ein Problem mit dem Jahreswechsel!
Ich habe eine Kreuztabellen-Abfrage "abf_keine_Ueb_Aktiver_Jahr_Kreuz" erstellt die die Jahressumme an Übungen je Kollegen vom aktuellen Jahr bis -4 anzeigt.

Code:
TRANSFORM Sum([Registrierung-Üb].ÜbStdN_min) AS SummevonÜbStdN_min
SELECT Personal.NameP
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 (((Year([ADatumU])) Between Year(Date()) And Year(Date())-4) AND ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) AND ((tblRegistrierungAufgabe.AufgabeID_A)<>113))
GROUP BY Personal.NameP, Personal.statusID_P, tblRegistrierungAufgabe.AufgabeID_A
PIVOT Year([ADatumU]);


Dazu habe ich einen Bericht (noch in 2019) automatisch erstellen lassen. Im Bericht wurden fünf Spalten von 2015 - 2019 erstellt und angezeigt. Hat erstmal soweit funktioniert.
Nun habe ich aber das Problem, zum Jahreswechsel auf 2020 geht der Bericht nicht automatisch um ein Jahr weiter sondern bleibt auf den Jahren 2015 - 2019, obwohl die Abfrage bereits 2016-2020 ausgibt. Somit öffnet der Bericht nicht, weil er keine Spalte/Werte für 2015 mehr findet.

Wie kann ich einen Bericht erstellen der immer, wie in der Abfrage das aktuelle Jahr und dazu die vier vorangegangen Jahre anzeigt.

Für die Spaltenüberschriften im Seitenkopf des Berichts habe ich aktuell wie folgt gelöst:
=Jahr(Datum())-4
=Jahr(Datum())-3
...
...
=Jahr(Datum())
funktioniert soweit.

Aber welchen Steuerelementecode müssen die ungebundenen Textfelder im Detailbereich bekommen um den Bericht dynamisch von Jahr zu Jahr weiter zu schreiben?

Hätte jemand einen Ansatz bzw. ein Beispiel dazu?

Gruss
Manfred

DF6GL

Hallo,

für die KT-Abfrage benötigst Du "fixierte Spaltenüberschriften". 

In SQL sieht das so aus:


für die Jahre 2016-2020  sähe das wie folgt aus:
....
PIVOT Year([ADatumU])
  IN (2016,2017,2018,2019,2020)




Die In-Klausel kannst Du mithilfe der Angaben für Start und Enddatum per VBA zusammenstellen,wenn das Ganze dynamisch werden soll.

mad

Hallo,

Zitat....
PIVOT Year([ADatumU])
  IN (2016,2017,2018,2019,2020)
ich wollte aber die Jahre nicht fest fixieren sondern dynamisch von Jahr zu Jahr weiterführen.
Habe es aber mal so eingebaut und jetzt werde ich beim öffnen des Berichtes nach dem Parameter 2015 gefragt. Wo das jetzt herkommt weis ich nicht.

ZitatDie In-Klausel kannst Du mithilfe der Angaben für Start und Enddatum per VBA zusammenstellen,wenn das Ganze dynamisch werden soll.
das verstehe ich gar nicht was ich da tun müsste!

Gruss
mad

DF6GL

Hallo,

wodurch die Parameterabfrage initialisiert wird, weiß ich auch nicht.  Vermutlich ist noch eine derartige Angabe im Bericht versteckt, bzw. ein Feld verweist auf diesen Wert.


Die KT-Abfrage hat keine dynamische Where-Condition, es wird lediglich die Date-Funktion benutzt.

somit könnte es heißen:


.
WHERE (((Year([ADatumU])) Between Year(Date()) And Year(Date())-4)
.
.
PIVOT Year([ADatumU])
  IN (Year(Date())-4, Year(Date())-3, Year(Date())-2, Year(Date())-1, Year(Date()))

mad

Hallo,

beiße mir gerade die Zähne aus. Habe schon an den verschiedesten Positionen eine Klammer ) gesetzt und in Foren nachgelesen, es will aber nicht funktionieren.
Es kommt immer diese Meldung, siehe Bild im Anhang.

Gruss
mad

DF6GL

#5
Hallo,

statt Bild besser den Text mit copy&paste hier herein kopieren....

PS:


Es könnte sein, dass in der In-Liste keine Funktionen auftreten dürfen..

Setze das SQL-Stetement mit ausgelagerten Funktionen zusammen und weise den String der Berichtsabfrage zu:

Dim strSQl as String
strSQl = "TRANSFORM Sum([Registrierung-Üb].ÜbStdN_min) AS SummevonÜbStdN_min "  & _
"SELECT Personal.NameP "  & _
" 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 (((Year([ADatumU])) Between Year(Date()) And Year(Date())-4) AND ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) AND ((tblRegistrierungAufgabe.AufgabeID_A)<>113))  "  & _
" GROUP BY Personal.NameP, Personal.statusID_P, tblRegistrierungAufgabe.AufgabeID_A  "  & _
" PIVOT Year([ADatumU]) In (" & Year(Date())-4 & "," & Year(Date())-3 & "," &  Year(Date())-2 & "," & Year(Date())-1 & "," &  Year(Date()) & ")"

Currentdb.Querydefs("DeineAbfrage").SQL = strSQL




mad

Hallo,

bisher will es nich klappen.
Was habe ich gemacht;

Funktion "keineUeb" erstellt. Ist der Name hier wichtig?
Function keineUeb()
Dim strSQL As String
strSQL = "TRANSFORM Sum([Registrierung-Üb].ÜbStdN_min) AS SummevonÜbStdN_min " & _
"SELECT Personal.NameP " & _
" 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 (((Year([ADatumU])) Between Year(Date()) And Year(Date())-4) AND ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) AND ((tblRegistrierungAufgabe.AufgabeID_A)<>113))  " & _
" GROUP BY Personal.NameP, Personal.statusID_P, tblRegistrierungAufgabe.AufgabeID_A  " & _
" PIVOT Year([ADatumU]) In (" & Year(Date) - 4 & "," & Year(Date) - 3 & "," & Year(Date) - 2 & "," & Year(Date) - 1 & "," & Year(Date) & ")"
End Function


Habe Deinen Code "beim Laden" des Reports verwendet:
Private Sub Report_Load()
CurrentDb.QueryDefs("abf_keine_Ueb_Aktiver_Jahr_Kreuz").SQL = strSQL
End Sub


und habe als Datenherkunft des Berichts meine Abfrage "abf_keine_Ueb_Aktiver_Jahr_Kreuz" gelassen.

Code der Abfrage lautet so:
TRANSFORM Sum([Registrierung-Üb].ÜbStdN_min) AS SummevonÜbStdN_min
SELECT Personal.NameP
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 (((Year([ADatumU])) Between Year(Date()) And Year(Date())-4) AND ((Personal.statusID_P)=1 Or (Personal.statusID_P)=2) AND ((tblRegistrierungAufgabe.AufgabeID_A)<>113))
GROUP BY Personal.NameP
PIVOT Year([ADatumU]);

Beim Kompilieren tritt momentan keine Fehler auf.

Beim Aufruf des Berichts kommt jetzt folgende Fehlermeldung:
ZitatLaufzeitfehler '3129': Unzulässige SQL-Anweisung; 'DELETE', 'INSERT', 'SELECT', 'PROCEDURE', oder 'UPDATE' erwartet.

Was mache ich Falsch? Oder ist mein ganzer Ansatz falsch?
Ich bastle auch mal eine Muster-DB, wird aber ein paar Stunden dauern.


Gruss
mad


mad

Muster-DB ging doch schneller als erwartet.
Vielleicht hilft diese mehr.


Gruss
mad


mad

Hallo,

erstmal herzlichen Dank.
Ich habe mir das alles genauer angesehen und muß wiedermal feststellen das ich noch einige Defizite habe uns das so nie hingebracht hätte.
Habe ich das richtig verstanden, der Code (Ereignisprozedur) des Bottuns im frmForm1 erzeugt/aktualisiert erst die Abfrage "qry_rptKTBericht".
Was ich aber nicht verstanden habe für was in der drittletzten Zeile,
Zitat....
CurrentDb.QueryDefs("Qry_rptKTBericht").SQL = strSql
DoCmd.OpenReport "rptKTBericht", acViewPreview, , , , Me!txtJahr
...
"Qry_rptKTBericht" steht?

Habe es aber noch hinbekommen den richtigen Klarnamen mit einzubauen.


Nochmals herzlich Dank
mad

DF6GL

Hallo,
Zitat

Was ich aber nicht verstanden habe für was in der drittletzten Zeile   ... steht

CurrentDb.QueryDefs("Qry_rptKTBericht").SQL = strSql

na, jetzt aber..


Es wird der gespeicherten Abfrage, die für den Bericht (Datenherkunft) benutzt wird,  der vorher zusammengesetzte  Kreuztabellen-SQL-String zugewiesen.