Benutzer mit den meisten Antworten
SSRS 2008 Zeiten in einer Spalte aufsummieren

Frage
-
Guten Abend
Ich bin neu im Forum. Ich entwickle gelegentlich Reports in SSRS 2008 um sie dann in Sharepoint bereitzustellen.
Nun habe ich folgendes Problem:
Ich möchte in einer Spalte alle Zeiten (als String im Format hh:mm) vorhanden addieren und unten die Total Zeit anzeigen.
Ein nicht ganz korrektes Resultat erhalte ich mit folgendem Ausdruck:
=DateTime.FromOADate(Sum(DateTime.Parse(Fields!TrplTime.Value).ToOADate())).ToString("hh:mm")
Dieser Ausdruck wandelt den String in DateTime, anschliessend in Bool und dann wieder in einen String.
Leider Zeigt mir die Formatierung hh:mm nur bis maximal 24h an. Ich brauche aber die totalen Stunden und Minuten (bsp. 44:33
Ich wäre sehr froh, wenn mir jemand Helfen könnte.
Gruss
OceanS
Antworten
-
Ich denke ich würde das Problem mit 2 CustomCode Funktionen lösen.
Die Expression sähe in etwa so aus:
=Code.ToHHMM(SUM(Code.ToTotalMinutes(Fields!TrplTime.Value)))
Die Funktion ToTotalMinutes erhält deinen hh:mm string, und trennt diesen am Doppelpunkt auf wandelt die stunden in minuten um und addiert alles, so dass die vollständige Minutenanzahl dieser Zeitangabne als Ergebnis zurückgegeben wird. Sum addiert einfach alle Minuten aller Werte, das Ergebnis wird dann an die Funktion Code.ToHHMM als integer übergeben.
Anhand der vollständigen Minutenzahl kannst du dann wieder die Stunden und Restminuten berechnen und in einem String im gewünschten Format verpacken.
Die Funktionen könnten in etwas wie folgt aussehen:
Function ToHHMM(ByVal Minutes As Integer) As String Dim hh As Integer Dim mm As Integer hh = Minutes / 60 mm = Minutes Mod 60 Return hh.ToString & ":" & mm.ToString End Function Function ToTotalMinutes(ByVal Value As String) As Integer Dim hh As Integer Dim mm As Integer hh = Value.Split(":")(0) mm = Value.Split(":")(1) Return (hh * 60) + mm End Function
Ich hoffe es hilft dir was.
Paul- Als Antwort vorgeschlagen Paul Westerkamp Donnerstag, 16. Juli 2009 06:20
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 16. Juli 2009 14:22
Alle Antworten
-
Ich denke ich würde das Problem mit 2 CustomCode Funktionen lösen.
Die Expression sähe in etwa so aus:
=Code.ToHHMM(SUM(Code.ToTotalMinutes(Fields!TrplTime.Value)))
Die Funktion ToTotalMinutes erhält deinen hh:mm string, und trennt diesen am Doppelpunkt auf wandelt die stunden in minuten um und addiert alles, so dass die vollständige Minutenanzahl dieser Zeitangabne als Ergebnis zurückgegeben wird. Sum addiert einfach alle Minuten aller Werte, das Ergebnis wird dann an die Funktion Code.ToHHMM als integer übergeben.
Anhand der vollständigen Minutenzahl kannst du dann wieder die Stunden und Restminuten berechnen und in einem String im gewünschten Format verpacken.
Die Funktionen könnten in etwas wie folgt aussehen:
Function ToHHMM(ByVal Minutes As Integer) As String Dim hh As Integer Dim mm As Integer hh = Minutes / 60 mm = Minutes Mod 60 Return hh.ToString & ":" & mm.ToString End Function Function ToTotalMinutes(ByVal Value As String) As Integer Dim hh As Integer Dim mm As Integer hh = Value.Split(":")(0) mm = Value.Split(":")(1) Return (hh * 60) + mm End Function
Ich hoffe es hilft dir was.
Paul- Als Antwort vorgeschlagen Paul Westerkamp Donnerstag, 16. Juli 2009 06:20
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 16. Juli 2009 14:22
-
Hallo Paul
Vielen Dank!! Deine Lösung funktioniert bestens. Das einzige Problemchen ist noch das Ausgabeformat. Falls das Resultat 33h 2 Minuten ist, erhält man 33:2. Ich werde diese Lösung verwenden.
Von Microsoft habe ich übrigens zwischenzeitlich auch noch etwas gefunden. Ich werde aber aus dem Code nicht ganz schlau. Falls es jemanden interessiert hier der Ansatz:
Beispielfunktion "GetTimeCardTotal()"
Gehen Sie folgendermaßen vor, um die Funktion GetTimeCardTotal() zu erstellen:
Hinweis: Der Beispielcode in diesem Artikel verwendet Microsoft-Datenzugriffsobjekte (Data Access Objects = DAO). Damit dieser Code ordnungsgemäß ausgeführt wird, müssen Sie einen Verweis auf die Microsoft DAO 3.6-Objektbibliothek anlegen. Klicken Sie hierzu im Menü Extras des Visual Basic-Editors auf Verweise, und stellen Sie sicher, dass das Kontrollkästchen für die Microsoft DAO 3.6-Objektbibliothek aktiviert ist.- Erstellen Sie eine neue Tabelle mit der folgenden Struktur, und speichern Sie sie als "TimeCard".
Tabelle: TimeCard ----------------------- Feldname: Daily Hours Datentyp: Datum/Uhrzeit Format: Zeit, 24Std.
- Zeigen Sie die "TimeCard"-Tabelle in der Datenblattansicht an, geben Sie die folgenden vier Datensätze ein und schließen Sie anschließend die Tabelle:
8:15 7:37 8:12 8:03
- Erstellen Sie ein Modul, und geben Sie die folgende Zeile in den Deklarationsbereich ein, falls sie nicht bereits vorhanden ist:
Option Explicit
- Geben Sie die folgende Funktion ein:
Function GetTimeCardTotal () Dim db As DAO.Database, rs As DAO.Recordset Dim totalhours As Long, totalminutes As Long Dim days As Long, hours As Long, minutes As Long Dim interval As Variant, j As Integer Set db = dbengine.workspaces(0).databases(0) Set rs = db.OpenRecordset("timecard") interval = #12:00:00 AM# While Not rs.EOF interval = interval + rs![Daily hours] rs.MoveNext Wend totalhours = Int(CSng(interval * 24)) totalminutes = Int(CSng(interval * 1440)) hours = totalhours Mod 24 minutes = totalminutes Mod 60 GetTimeCardTotal = totalhours & " hours and " & minutes & " minutes" End Function
- Um diese Funktion zu testen, geben Sie die folgende Zeile in das Direktfenster ein, und drücken Sie anschließend die [EINGABETASTE]:
?GetTimeCardTotal()
Beachten Sie, dass das Direktfenster 32 Stunden und 7 Minuten anzeigt.
- Erstellen Sie eine neue Tabelle mit der folgenden Struktur, und speichern Sie sie als "TimeCard".
-
Um das Ausgabeformat zu anzupassen sodass z.B: 33:02 ausgegeben wird, ändere in der Funktion ToHHMM folgendes:
Return hh.ToString & ":" & mm.ToString
->
Return hh.ToString & ":" & mm.ToString.PadLeft(2,"0")
oder
Return hh.ToString & ":" & mm.ToString("0#")
Beides liefert dir für einstellige Minutenwerte eine führende 0. -
So, mit untenstehender Funktion erhalte ich nun die richtige Anzahl Stunden. Paul, vielen Dank noch einmal für Deine Hilfe!
Function MinutesToTime(ByVal min As Single) As String Dim seconds As String Dim minutes As String Dim hours As String Dim Time As String 'In Sekunden umrechnen min = min * 60 seconds = CStr(min Mod 60) 'In Minuten umrechnen, Sek abgezogen min = CSng((min - CDbl(seconds)) / 60) minutes = CStr(min Mod 60) 'In Stunden umrechnen, Sek+Min abgezogen min = CSng((min - CDbl(seconds) - CDbl(minutes)) / 60) hours = CStr(min Mod 60) If Len(seconds) < 2 Then seconds = "0" & seconds If Len(minutes) < 2 Then minutes = "0" & minutes If Len(hours) < 2 Then hours = "0" & hours Time = hours & ":" & minutes & ":" & seconds Return Time End Function
Gruss OceanS