PDA

Vollständige Version anzeigen : Vormonatswerte in Abfrage


Marcys
06.05.2011, 21:18
Hallo,

ich bin gerade dabei eine DB für Zeitverwaltung zu erstellen. Nun hänge ich ein wenig und hoffe auf eure Unterstützung.

Es handelt sich um eine Zeiterfassung für unsere Aushilfen die nur eine bestimmte Zahl an Stunden im Monat arbeiten dürfen. Arbeiten sie mehr, so werden die Stunden auf den nächsten Monat übertragen und dann mit dem laufendem Monat verrechnet. Demnach müsste die Aushilfe im dem Monat etwas weniger arbeiten, da sie ja noch Stunden aus dem Vormonat hat. Dies möchte ich in eine Abfrage packen. Wie viel Überstunden die Aushilfe in dem jeweiligen Monat hat habe ich bereits in der Abfrage errechnet und diese als "Überstunden" für den jeweiligen Monat ausgegeben. Nun müsste ich das Ergebnis um eine Monat nach vorne Verschieben. Überstunden aus April sollen in einer anderen Spalte für den Mai angerechnet werden.

Wie viel Stunden dann tatsächlich für den jeweiligen Monat ausgezahlt werden, würde ich noch in der Abfrage ergänzen.

Leider weiß ich nicht wie ich das angehen soll.

Hätte jemand einen Tipp für mich?

So sieht im moment meine Abfrage aus:


SELECT tbl_zeitdaten.Pers_nr, Format([a_datum],"mm.yyyy")
AS MonatJahr, Sum(tbl_zeitdaten.stunden) AS SUM_Stunden,
tbl_Personalstammdaten.max_stundenzahl, IIf([sum_stunden]>[max_stundenzahl],[sum_stunden]-[max_stundenzahl]) AS Überstunden, [StundenVormonat] AS ÜberStd_Vormonat
FROM tbl_Personalstammdaten INNER JOIN tbl_zeitdaten ON tbl_Personalstammdaten.Pers_Nr = tbl_zeitdaten.Pers_nr
GROUP BY tbl_zeitdaten.Pers_nr, Format([a_datum],"mm.yyyy"), tbl_Personalstammdaten.max_stundenzahl, [StundenVormonat];



In der Datenblattansicht sieht es dann so aus:
Siehe Bild

Gruß
Martin

guenther_p
06.05.2011, 21:34
Du könntest ja zusätzlich zu Deiner Abfrage eine zweite Abfrage verwenden, in der Du das Monat um 1 erhöhst (Achtung unterschiedliche Tagezahl im Monat)

die beiden Abfrageergebnisse joinst Du dann zusammen.

Gruß
Günther

Marcys
06.05.2011, 21:36
Hallo Günther,

ich würde ja schon gerne das in eine Abfrage packen.

Oder hättest du einen konkreten Lösungsvorschlag?

Gruß
Martin

ebs17
06.05.2011, 21:56
Normalerweise würde man, um einen Wert aus einem vorigen Datensatz in den aktuellen Datensatz zu bekommen, einen SELF JOIN mit einer Verknüpfung der Art <tt>qry1.MonatJahr = qry2.MonatJahr + 1</tt> benutzen. Bei den gewählten Formaten wird eine solche einfache Addition aber nicht funktionieren.

Die Alternative, in der Spalte eine Unterabfrage zu verwenden, die den Wert sucht, wo MonatJahr das maximale ist, das kleiner als MonatJahr im aktuellen Datensatz, gestaltet sich wegen der Formatierung genau so unbefriedigend.

Marcys
06.05.2011, 22:43
Hallo,

das klingt ja recht kompliziert. Nach weitere Überlegung habe ich fest gestellt, dass mein Vorhaben mit meinem zeitlichen Rahmen nicht in Access lösbar ist und stelle mal meinen Beitrag erstmals zurück.

Trotzdem danke für die Tipps.

Gruß
Martin

guenther_p
06.05.2011, 23:15
hätte Dir hier eine Lösung innerhalt einer Abfrage

SELECT aktmonat.jahr, aktmonat.monat, aktmonat.stunden, vormonat.stunden
FROM [SELECT Format(test.Arbeitstag,"YYYY") AS Jahr, Format(test.Arbeitstag,"MM")+0 AS Monat, sum(test.Stunden) AS stunden
FROM test group by Format(test.Arbeitstag,"YYYY"), Format(test.Arbeitstag,"MM")+0]. AS aktMonat INNER JOIN [SELECT Format(test.Arbeitstag,"YYYY") AS Jahr, Format(test.Arbeitstag,"MM")+1 AS Monat, sum(test.Stunden) AS stunden
FROM test group by Format(test.Arbeitstag,"YYYY"), Format(test.Arbeitstag,"MM")+1]. AS vormonat ON (aktmonat.jahr = vormonat.jahr) AND (aktmonat.monat = vormonat.monat);


sieht aber zumindest auf den ersten Blick nicht wirklich verständlich aus ;-)

Achtung: Lösung zeigt natürlich das erste Arbeitsmonat auf Grund des Inner-Join nicht an

Gruß
Günther