none
SSRS 2008 Zeiten in einer Spalte aufsummieren RRS feed

  • 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
    Mittwoch, 15. Juli 2009 15:39

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
    Donnerstag, 16. Juli 2009 06:20

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
    Donnerstag, 16. Juli 2009 06:20
  • 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.

    1. 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.
    2. 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
    3. Erstellen Sie ein Modul, und geben Sie die folgende Zeile in den Deklarationsbereich ein, falls sie nicht bereits vorhanden ist:
       Option Explicit
    4. 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
    5. 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.
    Donnerstag, 16. Juli 2009 13:14
  • 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.

    Donnerstag, 16. Juli 2009 13:22
  • Danke!! Das ist genau das, was ich brauche!
    Zwischenzeitlich habe ich gesehen, dass das Resultat immer eine Stunde zuviel anzeigt. Addiert die mod funktion diese Stunde dazu?
    Donnerstag, 16. Juli 2009 15:08
  • 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
    Freitag, 17. Juli 2009 09:09