ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
755
755
EMPFEHLEN
-
Ich bräuchte für ein Formular eine Berechnung der Nachtstunden. (Zeiten zwischen 00:00 und 06:00 Uhr.)
Arbeite mit 2 Tabellen
tblTag
TagID
Tag (Datum)
SchichtID_F, (Fremdschlüssel aus tblSchicht)
Bemerkung (Text)
tblSchicht
SchichtID
Schicht (gibt 25 Stck)
Beginn (Uhrzeit 24St Format)
Ende (Uhrzeit 24St Format)
Die Daten werden im Formular frmArbeiten zusammen gefasst.
Dort werden auch die Anzahl der Std in einem ungebundenen Textfeld berechnet.
Nun hätte ich gerne noch das oben genannte Feld, welches mir die Summe der Nachtstunden in einem weiteren ungebunden Textfeld anzeigt.
Hat da jemand eine Idee ?
Danke im vor raus.
P.S. Arbeite mit Office 2010
-
Mit einer reinen Formel wird es sehr schwer. Ein wenig VBA ist da hilfreich
Ich habe dir mal etwas zusammengestellt
Code vb:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
Private Type periode beginHour As Integer endHour As Integer End Type Public Function getNightHours(ByVal iBegin As Integer, ByVal iEnd As Integer) As Integer 'Nacht definieren Const C_NIGHT_BEGIN As Integer = 0 Const C_NIGHT_END As Integer = 6 Dim night As periode Dim shift As periode night = createPerode(C_NIGHT_BEGIN, C_NIGHT_END) shift = createPerode(iBegin, iEnd) getNightHours = min(night.endHour, shift.endHour) - max(night.beginHour, shift.beginHour) If Sgn(getNightHours) = -1 Then getNightHours = 0 End Function '--Hilfsfunktionen Private Function createPerode(ByVal iBegin As Integer, ByVal iEnd As Integer) As periode With createPerode If iBegin > iEnd Then .beginHour = iBegin - 24 .endHour = iEnd Else .beginHour = iBegin .endHour = iEnd End If End With End Function 'min() und max(): [url]http://wiki.yaslaw.info/wikka/VbVbaFunctions:[/url] '/** ' * Gibt den Höheren von 2 Werten zurück ' * @param Variant Wert 1 ' * @param Variant Wert 2 ' * @return Variant der Grössere Wert ' */ Public Function max(ByVal iValue1 As Variant, ByVal iValue2 As Variant) As Variant If iValue1 > iValue2 Then max = iValue1 Else max = iValue2 End If End Function '/** ' * Gibt den Tieferen von 2 Werten zurück ' * @param Variant Wert 1 ' * @param Variant Wert 2 ' * @return Variant der Kleinere Wert ' */ Public Function min(ByVal iValue1 As Variant, ByVal iValue2 As Variant) As Variant If iValue1 < iValue2 Then min = iValue1 Else min = iValue2 End If End Function
Das kannst du jetzt aus dem Formular so aufrufen
Code :1 2 3
=getNightHours(Hour([begin]);Hour([ende])) Beziehungsweise so im Header für die gesammtsumme =Sum(getNightHours(Hour([begin]);Hour([ende])))
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Hi Yaslaw
danke für deine Antwort und die Hilfe.
Habe deinen Vorschlag mal eingepflegt und klappt fast.
Ich bekomme wenn ich mein ungebundenes Feld nicht formatiere, den Wert als einfache Zahl wieder.
Beispiel.
Beginn 17:33
Ende 01:39
Wert = 1
Normalerweise wären das 1 Std und 39 Min.
Formatiere ich das Feld nun als Zeit 24 Std, bekomme ich den Wert 00:00 zurück.
P.S.
Ich kann kein VB, habe da Null Plan von.
-
oh, du arbeitest mit Minuten. Dann muss man meine Formeln anpassen. Die folgende Formeln arbeitet nicht mehr mit Stunden sondern mit Sekunden
Du kannst leider in Access nicht mehr als 24 Stunden als Time rechnen Ich habe darum das ganze so umgeschrieben, dass das Resultat als String zurückgegeben wird
zb: 37:30:05
Code :1 2 3 4 5
//Aufurf in einem Feld im Detail-bereich: =getNightHours([begin];[ende]) //Aufurf im Header-Bereich (also die Summe) =convertSecoundsToTimeString(Sum(getNightHoursInSec([begin];[ende])))
und hier das Module
Code vb:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
Option Compare Database Private Type periode begin As Variant end As Variant End Type Private Const C_DAY_IN_SEC As Long = 86400 ' Public Function getNightHours(ByVal iBegin As Date, ByVal iEnd As Date) As String getNightHours = convertSecoundsToTimeString(getNightHoursInSec(iBegin, iEnd)) End Function Public Function getNightHoursInSec(ByVal iBegin As Date, ByVal iEnd As Date) As Variant 'Nacht definieren Const C_NIGHT_BEGIN = "00:00:00" Const C_NIGHT_END = "06:00:00" Dim night As periode Dim shift As periode Dim secounds As Long night = createPerode(C_NIGHT_BEGIN, C_NIGHT_END) shift = createPerode(iBegin, iEnd) getNightHoursInSec = min(night.end, shift.end) - max(night.begin, shift.begin) If Sgn(getNightHoursInSec) = -1 Then getNightHoursInSec = 0 End Function '/** ' * Erstellt eine Zeit-Periode ' * @param Date Startzeit Time(hh:nn:ss) ' * @param Date Endzeit Time(hh:nn:ss) ' * @return periode ' */ Private Function createPerode(ByVal iBegin As Date, ByVal iEnd As Date) As periode With createPerode .begin = convertTimeToSecounds(iBegin) .end = convertTimeToSecounds(iEnd) 'Falls die Startzeit hinter der Endzeit liegt, den Wert degieren (Periode geht über Mitternacht) If iBegin > iEnd Then .begin = .begin - C_DAY_IN_SEC End With End Function '/** ' * Konvertiert Time (hh:nn:ss) in Sekunden ' * @param Date Time(hh:nn:ss) ' * @return Long Anzahl Sekunden ' */ Public Function convertTimeToSecounds(ByVal iTime As Date) As Variant convertTimeToSecounds = DateDiff("s", CDate("00:00:00"), iTime) End Function '/** ' * Konvertiert Sekunden in Time (hh:nn:ss) ' * @param Date Anzahl Sekunden ' * @return Long Time(hh:nn:ss) ' */ Public Function convertSecoundsToTimeString(ByVal iSecounds As Variant) As String Dim time As Date Dim dateInHours As Variant time = Format(iSecounds / C_DAY_IN_SEC, "dd.mm.yyyy hh:nn:ss") dateInHours = Fix(iSecounds / C_DAY_IN_SEC) convertSecoundsToTimeString = dateInHours + Hour(time) & ":" & Format(time, "nn:ss") End Function '/** ' * Gibt den Höheren von 2 Werten zurück ' * @param Variant Wert 1 ' * @param Variant Wert 2 ' * @return Variant der Grössere Wert ' */ Private Function max(ByVal iValue1 As Variant, ByVal iValue2 As Variant) As Variant If iValue1 > iValue2 Then max = iValue1 Else max = iValue2 End If End Function '/** ' * Gibt den Tieferen von 2 Werten zurück ' * @param Variant Wert 1 ' * @param Variant Wert 2 ' * @return Variant der Kleinere Wert ' */ Private Function min(ByVal iValue1 As Variant, ByVal iValue2 As Variant) As Variant If iValue1 < iValue2 Then min = iValue1 Else min = iValue2 End If End Function
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Hi,
ich weiß schon warum ich VB nicht mag.
Bekomme einen Syntaxfehler beim kompelieren.
Zitat:
In diesem Visual Basic Modul liegt ein Syntax-Fehler vor.
Mal schauen ob ich es selber finde
Nochmals Danke
-
Ist mit Access 2003 geschrieben und kompiliert.
Ich kanns am Montag im Büro noch mit Access 2007 kompilieren.
Nachtrag:
Auch mit Access 2007 gehts.
Access 2010 habe ich nicht zur Verfügung---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
30.01.12 13:47 #7
- Registriert seit
- Jul 2008
- Ort
- Hinter dem Mond gleich links
- Beiträge
- 735
Ummm, denke ich jetzt mit meinem VBA-Ansatz zu sehr um die Ecke?
Code vb:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Zeits = DateDiff("s", "30.01.2012 00:00:00", "30.01.2012 05:35:20") Zeith = Zeits \ 3600 Zeitm = Zeits - Zeith * 3600 Zeitm = Zeitm \ 60 Zeitsec = Zeits - Zeith * 3600 - Zeitm * 60 Debug.Print Zeits Debug.Print "Stunden: " & Zeith Debug.Print "Minuten: " & Zeitm Debug.Print "Sekunden: " & Zeitsec
ergibt
Stunden: 5
Minuten: 35
Sekunden: 20Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein
Code vb:1
If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")
-
Nunja, ich versuchte in meiner Lösung auch die folgenden Fälle Abzudecken:
- Die Schicht beginnt um 22 Uhr und Endet um 4 Uhr Morgens
- Die Definition der Nacht startet im 23 Uhr und endet um 6 Uhr Morgens
Darum ist die Rechnung etwas komplexer geraten---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
30.01.12 15:54 #9
- Registriert seit
- Jul 2008
- Ort
- Hinter dem Mond gleich links
- Beiträge
- 735
Wie kommst du denn da drauf?
Das einzige was er noch zur Abgrenzung bräuchte ist:Ich bräuchte für ein Formular eine Berechnung der Nachtstunden. (Zeiten zwischen 00:00 und 06:00 Uhr.)
Schichtbeginn vor 24:00 Uhr wird auf 00:00 Uhr nächstes Tagesdatum verschoben, Schichtende falls grösser 06:00 auf 06:00 Uhr
Und dann die DateDiff oben in meinem Beispiel.Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein
Code vb:1
If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")
-
Jepp, ich weiss.
Das ist der Stand heute - Sorry, ich mache möglichst immer allgemeingültige Lösungen die nicht beim ersten Managerfurz (und solche gibts nach meinen Erfahrungen am mehr als man Zeit hat sie umzusetzen) gleich neu programmiert werden müssen.
Ob das mit dem Schichtende und Schichtanfang so ist, ist halt eine Frage wie es im System drin ist - aber der Ansatz ist nicht schlecht, dass man einfach aus einer Schicht 2 macht zum berechnen. Darauf könnte man aufbauen.---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
30.01.12 16:05 #11
- Registriert seit
- Jul 2008
- Ort
- Hinter dem Mond gleich links
- Beiträge
- 735
Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein
Code vb:1
If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")
-
Hi Yaslaw
Sorry das ich erst jetzt antworte, Stress auf der Arbeit gehabt.
Der Fehler lag bei mir, sorry. Hatte es als Modul gespeichert.
Danke noch mal.
Ähnliche Themen
-
csv berechnen
Von samaki im Forum Sonstige SprachenAntworten: 1Letzter Beitrag: 31.12.11, 01:52 -
BMI mit JSP berechnen
Von starbug im Forum JavaAntworten: 2Letzter Beitrag: 23.07.11, 15:22 -
Datumsdifferenz berechnen
Von Mailyn im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 13.09.09, 16:40 -
[C] Pi berechnen
Von Azi im Forum C/C++Antworten: 23Letzter Beitrag: 09.12.07, 14:47 -
Tagesrekord berechnen
Von Metha im Forum PHPAntworten: 5Letzter Beitrag: 27.05.05, 14:40





Zitieren


Login





