Hallo,
Ich möchte eine Tabelle mit Kalenderdaten erstellen.
Die Tabelle soll folgende Felder haben:
Tag Datum KW
Fr 1. Jan 16 1
Ich möchte die Tabelle dann automatisch mit den Datumswerten befüllen lassen.
Dazu noch meine Frage:
Ich benötige die Tabelle um später damit Arbeitszeiten zu erfassen
Macht es Sinn für jedes Jahr bsp. Jahr 2016 Jahr 2017 ect..... eine Tabelle erstellen zu lassen.
oder ist es Problematisch bsp. in der Tabelle gleich die Daten von 2016 bsi beispielsweise 2020 schreiben zu lassen ???
Hallo,
das kannst Du auch gleich für die nächsten 20 Jahre machen, das sind dann gerade mal ca. 7300 Datensätze.
Im anderen Forum hast Du eine Antwort.
Ausserdem kannst Du die Felder Tag und KW weglassen, die lassen sich
jederzeit berechnen.
Hallo,
@Beaker
den Tag wegzulassen ist nicht immer zu empfehlen. Das im anderen Forum hochgeladene Beispiel dient zur Berechnung von Arbeitstagen. Da werden die Tage >5 ausgeblendet. Daher wird dieses Feld in der Tabelle erstellt und auch gespeichert, denn nur so kann das Feld indiziert werden. Was dann einen enormen Performancegewinn bedeutet. Natürlich abhängig von der Datenmenge.
Da das Erstellen der Tabelle eine Kleinigkeit ist und man das für die nächsten 20 Jahre machen kann, sollte man das Feld in der Tabelle führen.
Auch für die KW könnte sinngemäß das gleiche gelten. Wenn man in großen Datenmengen die KW mit speichert und indiziert, kann man sich die KW Rechnerei sparen, zumal man eine eigene Funktion für DINKW verwenden müsste, da die eingebaute Funktion nicht immer korrekt rechnet. KW einmalig in die Kalendertabelle geschrieben und der Rest (das Ermitteln einer KW) geht dann ratz fatz.
Nur nebenbei. ;D
Hallo Klaus,
Zitatden Tag wegzulassen ist nicht immer zu empfehlen. Das im anderen Forum hochgeladene Beispiel dient zur Berechnung von Arbeitstagen. Da werden die Tage >5 ausgeblendet.
Darfst Du den Link dazu hier posten? Oder, falls nein, ihn mir per PM
zukommen lassen. Würde ich mir gerne anschauen.
ZitatDaher wird dieses Feld in der Tabelle erstellt und auch gespeichert, denn nur so kann das Feld indiziert werden. Was dann einen enormen Performancegewinn bedeutet.
Das macht Sinn ... 8)
Zitatzumal man eine eigene Funktion für DINKW verwenden müsste
Na ja, so eine verwende ich schon geraume Zeit. Deshalb wohl auch
mein Einwand. Aber, wie gesagt, Indizierung ist natürlich ein Argument,
dem man sich nicht widersetzen kann.
gruss ekkehard
Hallo,
die Sache mit dem Speichern und der Indizierung war übrigens ein Hinweis von Ebs17, weil ich auch erst berechnen wollte.
Hier die Beispieldb ( ich besitze die Rechte an der DB :D ).
Wollte diese ohnehin hier auch hochladen.
Da ist aber die KW nicht in der Tabelle.
Um noch mal auf die KW zu kommen, diese DINKW ist ja eine recht umfangreiche Funktion.
Wenn die KW gespeichert ist, muss man nur die Datentabelle mit der Kalendertabelle über das Datumsfeld (das natürlich ohne Zeit sein muss) verknüpfen und schon hat man auch die KW ohne etwas rechnen zu müssen zur Anzeige. Dieses Verfahren ist dann superschnell, das dürfte alle anderen Vorgehensweisen um Längen schlagen.
Hallo Klaus,
Danke für Beispiel-DB und Erläuterungen.
gruss ekkehard
Hallo Klaus,
ich glaube ich bin zu blöde das hin zu bekommen.
Ich habe mir ja jetzt die DB "Arbeitstage" runter laden können. Noch einmal rechtherzlichen Danke dafür !!!
Es funktioniert soweit soweit auch alles mit der Erstellung der Tabelle. TOP
Wenn ich mir jetzt über dein Formular eine Tabelle für das Jahr 2016 erstelle dann enhält die Tabelle auch den TAG, den Wochentag von 1-7 den Feiertag und ZusArbeitsFrei alles soweit ganz gut.
Noch einmal kurz erwähnt wir haben 7 Arbeitstage von So bis So.
Des weiteren hätte ich gerne eine Spalte in der Der Tag quasi Mo. Di. Mi. usw. angezeigt wird. Hier bekomme ich es irgendwie nicht hin das in einer Abfrage zu erstellen.
Dann wäre es schön eine Spalte für KW zu haben.
Feiertag und ZusArbeitsFrei soll auch so bleiben.
Absolut genianl wäre ja wenn ich über das Formular eine Tabelle erstellen könnte für ein ganzes Jahr in der Folgende Daten vorhanden sind.
Spalte Tag "Freitag, 1. Januar 2016" bsp.
Spalte Tag "Mo.Di.Mi. usw." bsp.
Die folgenden Spalten sollen dann später über eine Abfrage berechnet werden.
Spalte "kommt" im Uhrzeitformat h:m
Spalte "geht" im Uhrzeitformat h:m
Spalte "Pause" im Uhrzeitformat h:m
Spalte "IST Stunden" im Uhrzeitformat h:m
Ich habe derzeit eine Excel Tabelle mit der ich das berechne möchte es aber über eine Accesdatenbank für die Zukunft
erledigen da die Datenbank dann noch erweiter werden soll.
Hallo,
ZitatNoch einmal kurz erwähnt wir haben 7 Arbeitstage von So bis So.
nur mal kurz erwähnt, So-So sind 8 Arbeitstage. So-Sa sind sieben.
ZitatSpalte Tag "Freitag, 1. Januar 2016" bsp.
Spalte Tag "Mo.Di.Mi. usw." bsp.
das kommt
nicht in die Tabelle, das ist eine reine Frage der Formatierung. Siehe Formular "MitFormatierung" im angehängten erweiterten Beispiel.
ZitatSpalte "kommt" im Uhrzeitformat h:m
Spalte "geht" im Uhrzeitformat h:m
Spalte "Pause" im Uhrzeitformat h:m
Spalte "IST Stunden" im Uhrzeitformat h:m
Was willst Du hier berechenen, nur die Spalte "IST Stunden" ist berechnet. Die anderen Felder sind Eingabefelder bzw. Pause könnte ein fester Vorgabewert sein. Die Zeitenerfassung muss natürlich in eine extra Tabelle mit einem Fremdschlüssel zum Mitarbeiter.
Geänderte DB anbei.
die Pause soll ebenfalls berechnet werden
ab 3 Std- 15 Min.
ab 6 Std. 30 Min.
ab 9 Std. 45 Min.
So habe ich es in meiner Excel Tabelle
Formel Spalte Pause::
=WENN(ISTTEXT(C6);0;WENN(D6-C6>=0,375;0,03125;WENN(D6-C6>=0,25;0,02083333;WENN(D6-C6>=0,125;0,01041667;REST(1;1)))))
D6 ist Spalte = geht
C6 ist Spalte = kommt
der Wert 0,375 ergibt bei der Zellenformatierung (h:mm) gleich 9:00 Stunden
der Wert 0,03125 ergibt bei der Zellenformatierung (H:mm) gleich 0:45 Minuten
der Wert 0,25 ergibt bei der Zellenformatierung (H:mm) gleich 6:00 Stunden
der Wert 0,02083333 ergibt bei der Zellenformatierung (H:mm) gleich 0:30 Minuten
der Wert 0,125 ergibt bei der Zellenformatierung (H:mm) gleich 3:00 Stunden
der Wert 0,01041667 ergibt bei der Zellenformatierung (H:mm) gleich 0:15 Minuten
Somit schreibt die Formel in der Spalte Pause :
Größer gleich 9:00 Stunden dann 0:45 Minuten
Größer gleich 6:00 Stunden dann 0:30 Minuten
Größer gleich 3:00 Stunden dann 0:15 Minuten
So soll die Datenbank das dann letzten -endes auch über eine Abfrage erstellen.
Hallo,
und wo ist jetzt das Problem ?
Hallo dj,
Vielleicht so:
Public Function Pausenzeit(AZeit As Date) As Date
'---------------------------------------------------------------------------------------
On Error GoTo Fehler
' Procedure : Pausenzeit
' Author : ede
' Date : 27.03.2016
' Purpose : Pausenzeit berechnen anhand der vorgegebenen Arbeitszeit
' Parameter : AZeit = Differenz von Beginn und Ende/kommt und geht, wird schon in der
' : aufrufenden Abfrage berechnet
'---------------------------------------------------------------------------------------
Select Case AZeit
Case Is >= #09:00:00 AM#
Pausenzeit = #12:45:00 AM#
Case >= #06:00:00 AM#
Pausenzeit = #12:30:00 AM#
Case Is >= #03:00:00 AM#
Pausenzeit = #12:15:00 AM#
End Select
Ende_CleanUp:
On Error Resume Next
Exit Function
Fehler:
'Behandlung nach Belieben/Erfordernissen
Resume Ende_CleanUp
End Function
Zur Nutzung in einer Abfrage schreibst du dort (Entwurf) in eine leere Spalte
Pause: Pausenzeit(Tabelle.Geht - Tabelle.Kommt)
(Feldnamen anpassen)
hth
gruss ekkehard
Mh...
Den Code welchen Du geschrieben hast orüber dann leten Endes über das Formular
die Tabelle erstellt wird, kann man das so schreiben das die Spalte kommt - Geht und Pause in der zu erstellenden Tabelle
gleich mit eingebunden wird ?
Das wäre echt super.
Hallo dj,
Der Code gehört in eine allgemeines Modul.
Den Rest verstehe ich nicht.
Eine Tabelle erstellt man doch nicht im Formular; da wird die nur befüllt.
Da sollten die Felder Kommt und Geht doch schon vorhanden sein. Die
Pausenzeit muss nicht gespeichert werden, da mit dem geposteten Code
immer wieder berechenbar.
gruss ekkehard
ich versuch das erst einmal heute abend mit MzKlMu seiner DB
die er mir super netterweise zur verfügung gestellt hat.
Hallo,
Ich bleibe jetzt an folgender Aufgabe seit Wochen hängen ohne eine Lösung dafür zu finden.
Ich habe folgende Abfrage:
KW Tag Datum von bis Std Pause IstStd [SuStd] ????
1 Fr 01.Jan. 16 09:30 18:00 8:30 0:30 8:00 8:00
1 Sa 02.Jan.16 09:30 18:00 8:30 0:30 8:00 16:00
Ich möchte irgendwie in der Abfrage das Feld [SuStd] berechnen lassen,
so das in diesem Feld bzw. Spalte die fortlaufende Summe angezeigt wird.
Quasi die Stunden zusammen gerechnet.
Ich bekomme es aber nicht mit der Formatierung hin.
Wer kann bitte helfen ????
Vielen Lieben Dank.
Hallo,
die laufende Summe muss ohne Formatierung ermittelt werden. Zeitsummen >=24h können nicht als Zeit formatiert werden. Formatieren kann man nur Uhrzeiten und eine Zeitsumme ist keine Uhrzeit.
Hast Du die fortlaufende Summe realisiert ?
Wenn ja, was wird da angezeigt (ohne Formatierung) ?
Solche Probleme hatten andere Leute auch schon und haben deshalb Funktionen, wie sie unter Berechnungen mit mehr als 24 Stunden (http://vb-tec.de/stunden.htm) zu finden sind, geschrieben.
Zitat von: MzKlMu am Juli 26, 2016, 09:36:52
Hallo,
die laufende Summe muss ohne Formatierung ermittelt werden. Zeitsummen >=24h können nicht als Zeit formatiert werden. Formatieren kann man nur Uhrzeiten und eine Zeitsumme ist keine Uhrzeit.
Hast Du die fortlaufende Summe realisiert ?
Wenn ja, was wird da angezeigt (ohne Formatierung) ?
Ja ich habe die Laufende Summer realisiert bzw. die Gesamtsumme.
In MS Excel geht das ja !
Laut Excel ist die Gesamtsumme der erabrneiteten Stunden im Januar 196,15
Wenn ich es Ohne Formatierung der Spalte in der Abfrage berechnen lasse steht dort der Wert las Zahl 8,17708333333333
Wenn ich 24,std Format wähle dann wird 4:15 angezeigt.
In Excel kann ich die Zelle so formatiern [h],mm dann berechnet Excel auch die 196,15 Gesamtstunden.
Allerdings muß ich in Excel dann unter Extras-Optionen in der Registerkarte Berechnungen- 1904-Datumswerte anhaken.
Ich dachte in Access funktioniert das auch irgendwie.
Hallo,
nein, in Access funktioniert das nicht. Allerdingst, müsstet Du Dir das aus der Zahl auch selbst ableiten können.
Eine Zeit ist vor dem Komma die ganzen Tage.
Also 8:24 = 192
0,17708 = 4:15.
Zusammen: 196:15
Im Link von Lauchtaube findest Du alles was Du brauchst.
in dem Link von Lauchtaube bzw. der Beschreibung steige ich nicht durch !
muß ich da ein Modul erstellen ?
Hallo,
ja, der Code muss in ein Modul.
Zitat von: MzKlMu am Juli 26, 2016, 13:38:18
Hallo,
ja, der Code muss in ein Modul.
Sorry wenn ich noch einmal Frage
also einfach ein neues Modul erstellen und den Code dort komplett so wie er in dem Link von Lauchtaube steht hinein kopieren und unter einem frei wählbaren Namen speichern.
Muß ich den Code nicht noch an meine Abfrage anpassen oder so ?
Hallo,
ZitatMuß ich den Code nicht noch an meine Abfrage anpassen oder so ?
nein, die Funktion muss der Abfrage mit Übergabe der lfd. Summe übergeben werden.
Zitat von: MzKlMu am Juli 26, 2016, 14:12:53
Hallo,
ZitatMuß ich den Code nicht noch an meine Abfrage anpassen oder so ?
nein, die Funktion muss der Abfrage mit Übergabe der lfd. Summe übergeben werden.
owei....
wie ?
meine Abfrage hat den Namen ABFstundenMitarbeiter
und die laufende Summe soll in der Spalte mit dem Namen SummeStunden berechnet werden.
Wie soll ich das übergeben ?
Hi,
wie sieht denn der SQL-Code der Abfrage bislang aus? Wie berechnest du die Summe in der Abfrage?
Im Abfrageentwurf: SuStd: HHNNString(_exakt_dein_bisheriger_ausdruck_)
Zitat von: Lachtaube am Juli 26, 2016, 16:24:50
Im Abfrageentwurf: SuStd: HHNNString(_exakt_dein_bisheriger_ausdruck_)
OK dann gebe ich das bei dem Feld SuStd: ein
SuStd: HHNNString(_meinen_Ausdruck_)
und ein neues Modul erstellen und dort den Text aus deinem Link im Original kopieren ?
ich versuche das gleich mal
Zitat von: MaggieMay am Juli 26, 2016, 16:16:35
Hi,
wie sieht denn der SQL-Code der Abfrage bislang aus? Wie berechnest du die Summe in der Abfrage?
Hi,
hier die Kopie vom SQL Code:
SELECT Format([TDatum],"ww",2,2) AS KW, StundenMitarbeiter.TDatum AS Tag, StundenMitarbeiter.TDatum, StundenMitarbeiter.Sondertage, StundenMitarbeiter.von, StundenMitarbeiter.bis, [bis]-[von] AS Std, IIf([bis]-[von]>0.5 Or [bis]-[von]=0.5,0.0416666666666667,IIf([bis]-[von]>0.375 Or [bis]-[von]=0.375,0.03125,IIf([bis]-[von]>0.25 Or [bis]-[von]=0.25,0.0208333333333333,IIf([bis]-[von]>0.125 Or [bis]-[von]=0.125,0.0104166666666667,0)))) AS Pause, [Std]-[Pause] AS StdPause, IIf([WT]=7,[Std]/[Std]*0.166666666666667,0) AS Zuschlag, IIf([WT]=7 And [Sondertage]="Feiertag",0,IIf([WT]=6 And [Sondertage]="Feiertag",0,IIf([Sondertage]="Krank",0.333333333333333,IIf([Sondertage]="Urlaub",0.333333333333333,IIf([Sondertage]="Feiertag",0.333333333333333,IIf([Sondertage]="unb.Krank",0,IIf([Sondertage]="Freizeit",0,IIf([Sondertage]="Frei",0,IIf([Sondertage]="Überstunden",0,[Std]-[Pause]+[Zuschlag]))))))))) AS IstStd, IIf([WT]=7 And [Sondertage]="Feiertag",0,IIf([WT]=6 And [Sondertage]="Feiertag",0,IIf([Sondertage]="Krank",0.333333333333333,IIf([Sondertage]="Urlaub",0.333333333333333,IIf([Sondertage]="Feiertag",0.333333333333333,IIf([Sondertage]="unb.Krank",0,IIf([Sondertage]="Freizeit",0,IIf([Sondertage]="Frei",0,IIf([Sondertage]="Überstunden",0,[Std]-[Pause]+[Zuschlag]))))))))) AS IstStdZahl, IIf([Sondertage]="Urlaub",1,0) AS Urlaub, IIf([Sondertage]="Krank" Or [Sondertage]="unb.Krank",1,0) AS Krank
FROM StundenMitarbeiter;
Zitat von: teamdj am Juli 26, 2016, 18:05:19
Zitat von: Lachtaube am Juli 26, 2016, 16:24:50
Im Abfrageentwurf: SuStd: HHNNString(_exakt_dein_bisheriger_ausdruck_)
OK dann gebe ich das bei dem Feld SuStd: ein
SuStd: HHNNString(_meinen_Ausdruck_)
und ein neues Modul erstellen und dort den Text aus deinem Link im Original kopieren ?
ich versuche das gleich mal
Soo ich habe das Modul erstellt
ebenfalls in der Abfrage die Spalte ** SuStd:HHNNString(_meinen_Ausdruck_) ** wie von Dir beschrieben verändert.
Wenn ich die Abfrage jetzt aufrufe dann erscheint ein:
Laufzeitfehler ´94´
mit der Meldung: Unzulässige Verwendung von Null
Ich muß aber dazu sagen das der Laufzeitfehler erst erscheint wenn ich in der Tabelle runter scrolle.
Da in der Tabelle die Daten vom Monat Januar komplett eingetragen sind stehen in der Spalte SuStd bis ende Januar auch werte. Ab Februar nicht mehr.
jetzt bin ich auf der suche wie ich da einen Standardwert von 0 setzten kann.
Ich bin am Verzweifeln .......
ich lade hier einmal die Datenbank Test Stunden.mdb hoch
vielleicht mag sich das ja jemand anschauen.
ich möchte gerne das in der Abfrage ** ABFStundenMitarbeiter **
in der Spalte ** IstStdZahl ** die Stunden mit laufender Summe angezeigt werden.
quasi wenn:
IstStd IstStdZahl <<<< (IstStdZahl) sollen die Summen untereinander zusammengerechnet werden
10,00 10,00
8,00 18,00
8,00 26,00
8,45 34,45
Hallo,
Zitatmit der Meldung: Unzulässige Verwendung von Null
bei der Behandlung von Null-Werten empfiehlt sich der Einsatz der NZ-Funktion.
Zitat von: MaggieMay am Juli 26, 2016, 20:14:23
Hallo,
Zitatmit der Meldung: Unzulässige Verwendung von Null
bei der Behandlung von Null-Werten empfiehlt sich der Einsatz der NZ-Funktion.
wie mache ich das mit der NZ-Funktion ?
Ersetze Deine Abfrage hierdurch:SELECT DatePart("ww",sm.[TDatum],2,2) AS KW,
sm.TDatum AS Tag,
sm.TDatum,
sm.Sondertage,
sm.von,
sm.bis,
sm.[bis]-sm.[von] AS Std,
Switch(sm.[bis]-sm.[von]>=#12/30/1899 12:0:0#,#12/30/1899 1:0:0#,sm.[bis]-sm.[von]>=#12/30/1899 9:0:0#,#12/30/1899 0:45:0#,sm.[bis]-sm.[von]>=#12/30/1899 6:0:0#,#12/30/1899 0:30:0#,sm.[bis]-sm.[von]>=#12/30/1899 3:0:0#,#12/30/1899 0:15:0#,sm.[bis]-sm.[von]<#12/30/1899 3:0:0#,#12/30/1899#) AS Pause,
[Std]-[Pause] AS StdPause,
IIF(
sm.[WT]=7,[Std]/[Std]*#12/30/1899 0:4:0#,#12/30/1899#) AS Zuschlag,
IIF((
sm.[WT] IN (6,7)
AND sm.[Sondertage]="Feiertag")
OR sm.[Sondertage] IN ("unb.Krank",
"Freizeit",
"Frei",
"Überstunden"),#12/30/1899#,
IIF(
sm.[Sondertage] IN ("Krank",
"Urlaub",
"Feiertag"),#12/30/1899 8:0:0#,[Std]-[Pause]+[Zuschlag])) AS IstStd,
ABS(Nz(sm.[Sondertage])="Urlaub") AS Urlaub,
ABS(Nz(sm.Sondertage) IN ("Krank",
"unb.Krank")) AS Krank
FROM StundenMitarbeiter AS sm;und erstelle eine neue Abfrage:SELECT q.KW,
q.Tag,
q.TDatum,
q.Sondertage,
q.von,
q.bis,
q.Std,
q.Pause,
q.StdPause,
q.Zuschlag,
q.IstStd,
HHNNString((SELECT Sum(IstStd)
FROM ABFStundenMitarbeiter
WHERE TDatum <= q.TDatum)) AS IstStdSum,
q.Urlaub,
q.Krank
FROM ABFStundenMitarbeiter AS q;Den Code der beiden Funktionen kannst Du noch etwas verfeinern.Option Compare Database
Option Explicit
'"hh:nn" in Datumswert umwandeln:
Function HHNNValue(ByVal Text)
Dim PosTrenner As Long
Dim Stunden As Variant
Dim Minuten As Variant
If IsNull(Text) Then Exit Function
On Error GoTo e
'Stundenanteil:
Stunden = CDec(Val(Text))
'Ggf. Minutenanteil:
PosTrenner = InStr(Text, ":")
If PosTrenner Then
Text = Mid$(Text, PosTrenner + 1)
Minuten = CDec(Val(Text))
End If
'Konvertieren in Tagesanteil:
HHNNValue = (Stunden + Minuten / 60) / 24
e:
End Function
'Datumswert in "hh:nn" umwandeln:
Function HHNNString(ByVal Zeit)
Dim Stunden As Long
Dim Minuten As Long
If IsNull(Zeit) Then Exit Function
On Error GoTo e
'In (gerundete) Gesamtminuten konvertieren:
Zeit = Int(Zeit * 24 * 60 + 0.5)
'Stunden- und Minutenanteil bestimmen:
Stunden = Zeit \ 60
Minuten = CLng(Zeit - Stunden * 60)
'Formatierung:
HHNNString = Format$(Stunden, "00") _
& ":" & Format$(Minuten, "00")
e:
End FunctionDie ersten Zeilen des Ergebnisses schauen dann so aus:KW Tag TDatum Sondertage von bis Std Pause StdPause Zuschlag IstStd IstStdSum Urlaub Krank
53 Fr Fr, 01.01.2016 Frei 0:00 0:00 00:00 0 0
53 Sa Sa, 02.01.2016 Frei 0:00 0:00 00:00 0 0
53 So So, 03.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 06:04 0 0
1 Mo Mo, 04.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 14:04 0 0
1 Di Di, 05.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 22:04 0 0
1 Mi Mi, 06.01.2016 09:00 18:30 9:30 00:45:00 8:45 0:00 8:45 30:49 0 0
1 Do Do, 07.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 38:49 0 0
1 Fr Fr, 08.01.2016 07:30 18:30 11:00 00:45:00 10:15 0:00 10:15 49:04 0 0
1 Sa Sa, 09.01.2016 12:00 17:00 5:00 00:15:00 4:45 0:00 4:45 53:49 0 0
1 So So, 10.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 59:53 0 0
2 Mo Mo, 11.01.2016 08:00 14:00 6:00 00:30:00 5:30 0:00 5:30 65:23 0 0
2 Di Di, 12.01.2016 07:45 14:00 6:15 00:30:00 5:45 0:00 5:45 71:08 0 0
2 Mi Mi, 13.01.2016 07:45 16:30 8:45 00:30:00 8:15 0:00 8:15 79:23 0 0
2 Do Do, 14.01.2016 07:45 16:30 8:45 00:30:00 8:15 0:00 8:15 87:38 0 0
2 Fr Fr, 15.01.2016 07:45 14:30 6:45 00:30:00 6:15 0:00 6:15 93:53 0 0
2 Sa Sa, 16.01.2016 Frei 0:00 0:00 93:53 0 0
2 So So, 17.01.2016 Frei 0:00 93:53 0 0
3 Mo Mo, 18.01.2016 Frei 0:00 0:00 93:53 0 0
3 Di Di, 19.01.2016 09:30 17:30 8:00 00:30:00 7:30 0:00 7:30 101:23 0 0
3 Mi Mi, 20.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 109:23 0 0
3 Do Do, 21.01.2016 09:30 18:15 8:45 00:30:00 8:15 0:00 8:15 117:38 0 0
3 Fr Fr, 22.01.2016 09:30 18:30 9:00 00:45:00 8:15 0:00 8:15 125:53 0 0
3 Sa Sa, 23.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 135:08 0 0
3 So So, 24.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 141:12 0 0
4 Mo Mo, 25.01.2016 09:30 18:15 8:45 00:30:00 8:15 0:00 8:15 149:27 0 0
4 Di Di, 26.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 158:42 0 0
4 Mi Mi, 27.01.2016 07:30 16:30 9:00 00:45:00 8:15 0:00 8:15 166:57 0 0
4 Do Do, 28.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 176:12 0 0
4 Fr Fr, 29.01.2016 07:30 16:30 9:00 00:45:00 8:15 0:00 8:15 184:27 0 0
4 Sa Sa, 30.01.2016 Frei 0:00 0:00 184:27 0 0
4 So So, 31.01.2016 Frei 0:00 184:27 0 0
Zitat von: Lachtaube am Juli 26, 2016, 22:20:54
Ersetze Deine Abfrage hierdurch:SELECT DatePart("ww",sm.[TDatum],2,2) AS KW,
sm.TDatum AS Tag,
sm.TDatum,
sm.Sondertage,
sm.von,
sm.bis,
sm.[bis]-sm.[von] AS Std,
Switch(sm.[bis]-sm.[von]>=#12/30/1899 12:0:0#,#12/30/1899 1:0:0#,sm.[bis]-sm.[von]>=#12/30/1899 9:0:0#,#12/30/1899 0:45:0#,sm.[bis]-sm.[von]>=#12/30/1899 6:0:0#,#12/30/1899 0:30:0#,sm.[bis]-sm.[von]>=#12/30/1899 3:0:0#,#12/30/1899 0:15:0#,sm.[bis]-sm.[von]<#12/30/1899 3:0:0#,#12/30/1899#) AS Pause,
[Std]-[Pause] AS StdPause,
IIF(
sm.[WT]=7,[Std]/[Std]*#12/30/1899 0:4:0#,#12/30/1899#) AS Zuschlag,
IIF((
sm.[WT] IN (6,7)
AND sm.[Sondertage]="Feiertag")
OR sm.[Sondertage] IN ("unb.Krank",
"Freizeit",
"Frei",
"Überstunden"),#12/30/1899#,
IIF(
sm.[Sondertage] IN ("Krank",
"Urlaub",
"Feiertag"),#12/30/1899 8:0:0#,[Std]-[Pause]+[Zuschlag])) AS IstStd,
ABS(Nz(sm.[Sondertage])="Urlaub") AS Urlaub,
ABS(Nz(sm.Sondertage) IN ("Krank",
"unb.Krank")) AS Krank
FROM StundenMitarbeiter AS sm;
Hallo,
Wenn ich meine Abfrage durch deinen Code ersetzte sieht das ganz gut aus jedoch wird der Zuschlag nicht korrekt berechnet !
Für den Sonntag werden nur 4 Minuten berechnet wodurch dann letzten Endes 06:04 für den Sonntag herauskommen.
Es sollen aber für den Sonntag bei einer Arbeitszeit von 06:30 ** 4 Stunden zuzüglich ** berechnet werden.
Quasi:
So von bis Std. Pause StdPasue Zuschlag IstStunden
09:45 16:15 06:30 00:30 06:00 04:00 10:00
( Anwesende) ( - 30min. Pause) (4 std. Plus) (bezahlte Stunden)
und erstelle eine neue Abfrage:SELECT q.KW,
q.Tag,
q.TDatum,
q.Sondertage,
q.von,
q.bis,
q.Std,
q.Pause,
q.StdPause,
q.Zuschlag,
q.IstStd,
HHNNString((SELECT Sum(IstStd)
FROM ABFStundenMitarbeiter
WHERE TDatum <= q.TDatum)) AS IstStdSum,
q.Urlaub,
q.Krank
FROM ABFStundenMitarbeiter AS q;Den Code der beiden Funktionen kannst Du noch etwas verfeinern.Option Compare Database
Option Explicit
'"hh:nn" in Datumswert umwandeln:
Function HHNNValue(ByVal Text)
Dim PosTrenner As Long
Dim Stunden As Variant
Dim Minuten As Variant
If IsNull(Text) Then Exit Function
On Error GoTo e
'Stundenanteil:
Stunden = CDec(Val(Text))
'Ggf. Minutenanteil:
PosTrenner = InStr(Text, ":")
If PosTrenner Then
Text = Mid$(Text, PosTrenner + 1)
Minuten = CDec(Val(Text))
End If
'Konvertieren in Tagesanteil:
HHNNValue = (Stunden + Minuten / 60) / 24
e:
End Function
'Datumswert in "hh:nn" umwandeln:
Function HHNNString(ByVal Zeit)
Dim Stunden As Long
Dim Minuten As Long
If IsNull(Zeit) Then Exit Function
On Error GoTo e
'In (gerundete) Gesamtminuten konvertieren:
Zeit = Int(Zeit * 24 * 60 + 0.5)
'Stunden- und Minutenanteil bestimmen:
Stunden = Zeit \ 60
Minuten = CLng(Zeit - Stunden * 60)
'Formatierung:
HHNNString = Format$(Stunden, "00") _
& ":" & Format$(Minuten, "00")
e:
End FunctionDie ersten Zeilen des Ergebnisses schauen dann so aus:KW Tag TDatum Sondertage von bis Std Pause StdPause Zuschlag IstStd IstStdSum Urlaub Krank
53 Fr Fr, 01.01.2016 Frei 0:00 0:00 00:00 0 0
53 Sa Sa, 02.01.2016 Frei 0:00 0:00 00:00 0 0
53 So So, 03.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 06:04 0 0
1 Mo Mo, 04.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 14:04 0 0
1 Di Di, 05.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 22:04 0 0
1 Mi Mi, 06.01.2016 09:00 18:30 9:30 00:45:00 8:45 0:00 8:45 30:49 0 0
1 Do Do, 07.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 38:49 0 0
1 Fr Fr, 08.01.2016 07:30 18:30 11:00 00:45:00 10:15 0:00 10:15 49:04 0 0
1 Sa Sa, 09.01.2016 12:00 17:00 5:00 00:15:00 4:45 0:00 4:45 53:49 0 0
1 So So, 10.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 59:53 0 0
2 Mo Mo, 11.01.2016 08:00 14:00 6:00 00:30:00 5:30 0:00 5:30 65:23 0 0
2 Di Di, 12.01.2016 07:45 14:00 6:15 00:30:00 5:45 0:00 5:45 71:08 0 0
2 Mi Mi, 13.01.2016 07:45 16:30 8:45 00:30:00 8:15 0:00 8:15 79:23 0 0
2 Do Do, 14.01.2016 07:45 16:30 8:45 00:30:00 8:15 0:00 8:15 87:38 0 0
2 Fr Fr, 15.01.2016 07:45 14:30 6:45 00:30:00 6:15 0:00 6:15 93:53 0 0
2 Sa Sa, 16.01.2016 Frei 0:00 0:00 93:53 0 0
2 So So, 17.01.2016 Frei 0:00 93:53 0 0
3 Mo Mo, 18.01.2016 Frei 0:00 0:00 93:53 0 0
3 Di Di, 19.01.2016 09:30 17:30 8:00 00:30:00 7:30 0:00 7:30 101:23 0 0
3 Mi Mi, 20.01.2016 09:30 18:00 8:30 00:30:00 8:00 0:00 8:00 109:23 0 0
3 Do Do, 21.01.2016 09:30 18:15 8:45 00:30:00 8:15 0:00 8:15 117:38 0 0
3 Fr Fr, 22.01.2016 09:30 18:30 9:00 00:45:00 8:15 0:00 8:15 125:53 0 0
3 Sa Sa, 23.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 135:08 0 0
3 So So, 24.01.2016 09:45 16:15 6:30 00:30:00 6:00 0:04 6:04 141:12 0 0
4 Mo Mo, 25.01.2016 09:30 18:15 8:45 00:30:00 8:15 0:00 8:15 149:27 0 0
4 Di Di, 26.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 158:42 0 0
4 Mi Mi, 27.01.2016 07:30 16:30 9:00 00:45:00 8:15 0:00 8:15 166:57 0 0
4 Do Do, 28.01.2016 07:30 17:30 10:00 00:45:00 9:15 0:00 9:15 176:12 0 0
4 Fr Fr, 29.01.2016 07:30 16:30 9:00 00:45:00 8:15 0:00 8:15 184:27 0 0
4 Sa Sa, 30.01.2016 Frei 0:00 0:00 184:27 0 0
4 So So, 31.01.2016 Frei 0:00 184:27 0 0
Hi,
ZitatEs sollen aber für den Sonntag bei einer Arbeitszeit von 06:30 ** 4 Stunden zuzüglich ** berechnet werden.
der Zuschlag wird mit dieser Anweisung berechnet:
IIF(sm.[WT]=7,[Std]/[Std]*#12/30/1899 0:4:0#,#12/30/1899#) AS Zuschlag,Was meinst du wohl an welcher Stelle da etwas geändert werden muss?!
PS:
Das Zitieren vollständiger Beiträge ist völlig überflüssig.
Mag sein, dass ich die Formel etwas verfratzt habe - die richtige Logik kannst Du aber bestimmt selbst einpflegen. :)
ich denke
0:4:0 ändern auf 4:0:0
ich versuche das einmal.
Vielen dank für die Hilfe !!!!👍
Ich werde mich bestimmt noch mal melden. Ich probiere erst einmal mit deiner super Vorarbeit zu tüfteln
DANKE
Hallo Lachtaube,
wenn ich eine neue Abfrage mit deinem Code erstelle
*************************************************
SELECT q.KW,
q.Tag,
q.TDatum,
q.Sondertage,
q.von,
q.bis,
q.Std,
q.Pause,
q.StdPause,
q.Zuschlag,
q.IstStd,
HHNNString((SELECT Sum(IstStd)
FROM ABFStundenMitarbeiter
WHERE TDatum <= q.TDatum)) AS IstStdSum,
q.Urlaub,
q.Krank
FROM ABFStundenMitarbeiter AS q;
****************************************
dann werden in der Spalte [IstStdSum] die Stunden auch so wie ich es wollte berechnet.
Nur leider kann ich in der Abfrage jetzt keine neuen Daten mehr einfügen oder ändern ?
Hi,
es dürfte bereits die zugrunde liegende Abfrage "ABFStundenMitarbeiter" nicht änderbar sein.
Zur Dateneingabe müsste man die Unterabfrage (SELECT Sum()...) in eine Funktion auslagern und mit dem TDatum als Argument versorgen. Lade mal eine abgespeckte Version der DB (als Access 2002/2003-Version) mit Spieldaten im Anhang hoch - dann bastelt Dir bestimmt jemand diese Funktion.
@MaggieMay,
wieso?
@Lachtaube:
Wegen der zahlreichen berechneten Felder, vermute ich.
Hllo MaggieMay,
doch die ABFStundenMitarbeiter ist veränderbar dort kann ich Daten eintragen.
ich lade eine abgespeckte Version hoch
moment bitte
Hier mal die Datenbank.
in der Abfrage [ABFStundenMitarbeiter] kann ich noch Daten eingeben welche dann auch in
der Abfrage [ABFStdMaGesamtstunden] übergeben werden und die Gesamtsumme der Stunden auch berechnet werden.
schön wäre es aber, wenn ich in der Abfrage [ABFStdMaGesamtstunden] die Daten eingeben könnte.
Ich wollte dann von der Abfrage [ABFStdMaGesamtstunden] ein Formular zur Eingabe der Daten kreieren.
Hallo Lauchtaube,
habe noch ein Problem ....
wenn ich in der Abfrage [ABFStundenMitarbeiter] in der Spalte [Sondertage]
aus der Auswahlliste "Urlaub" eintrage soll in der Spalte [IstStd] 8,00 stehen und in der
Spalte [Urlaub] eine 1 stehen. <<< die 1 wird geschrieben aber die 8,00 Stunden nicht.
Bei Krank funktioniert das.
muss ich den Fehler in diesem Code von Dir suchen ?
***********************
SELECT DatePart("ww",sm.[TDatum],2,2) AS KW,
sm.TDatum AS Tag,
sm.TDatum,
sm.Sondertage,
sm.von,
sm.bis,
sm.[bis]-sm.[von] AS Std,
Switch(sm.[bis]-sm.[von]>=#12/30/1899 12:0:0#,#12/30/1899 1:0:0#,sm.[bis]-sm.[von]>=#12/30/1899 9:0:0#,#12/30/1899 0:45:0#,sm.[bis]-sm.[von]>=#12/30/1899 6:0:0#,#12/30/1899 0:30:0#,sm.[bis]-sm.[von]>=#12/30/1899 3:0:0#,#12/30/1899 0:15:0#,sm.[bis]-sm.[von]<#12/30/1899 3:0:0#,#12/30/1899#) AS Pause,
[Std]-[Pause] AS StdPause,
IIF(
sm.[WT]=7,[Std]/[Std]*#12/30/1899 4:0:0#,#12/30/1899#) AS Zuschlag,
IIF((
sm.[WT] IN (6,7)
AND sm.[Sondertage]="Feiertag")
OR sm.[Sondertage] IN ("unb.Krank",
"Freizeit",
"Frei",
"Überstunden"),#12/30/1899#,
IIF(
sm.[Sondertage] IN ("Krank",
"Urlaub",
"Feiertag"),#12/30/1899 8:0:0#,[Std]-[Pause]+[Zuschlag])) AS IstStd,
ABS(Nz(sm.[Sondertage])="Urlaub") AS Urlaub,
ABS(Nz(sm.Sondertage) IN ("Krank",
"unb.Krank")) AS Krank
FROM StundenMitarbeiter AS sm;
*********************************************
Die letzte Frage habe ich erst gerade gesehen und nicht berücksichtigt.
Wow Lauchtaube das ist genial Danke Dir damit kann ich was anfangen.
Das ist ja noch nicht das Ende meines Projektes.
Wegen dem Eintrag bezüglich "Urlaub" das bei IstStd keine 8,00 Stunden eingetragen werden
müsste ich doch nur in einer Abfrage den Code ändern ? Oder ?
vielen Dank noch mal
Vermutlich kann die Logik in die Abfrage einfließen.
PS: man könnte übrigens annehmen, dass sich die ganze Geschichte nur um einen einzigen Mitarbeiter dreht. ;D
Hallo Lauchtaube,
meinst Du mit,
"vermutlich kann die Logik in die Abfrage mit einfließen"
Bezogen darauf, das bei Sondertage der Eintrag "Urlaub" keine 8,00 std berechnet werden ?
Nein ... es soll für 10 Mitarbeiter berechnet werden.
Ich wollte mich vorerst mit der Berechnung der Stunden beschäftigen ob das überhaupt realisierbar ist. Wobei ich jetzt merke das es recht komoplex ist. Ich möchte das gerne verstehen "lernen" mit Excel hab ich das so hinbekommen. 😯
Aber mit deiner guten Unterstützung denke ich schaffe ich das auch.
Ich versuche deine Codes irgendwie zu verstehen ist schwer momenta aber ich gebe nicht suf.
Sei noch gessgt super Forum und Klasse Leute 👍