Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Summe aus Zeitangaben bilden (MS Berichtsfunktion - RDLC)
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

Summe aus Zeitangaben bilden (MS Berichtsfunktion - RDLC)

beantworten | zitieren | melden

Hallo,

ich habe einen Report erstellt, der mir unter anderem die Summe aus den Zeiten der einzelnen Datensätze liefern soll. Also im Grunde so:
Sum(Fields!Dauer.Value, "ReportDataSet_UnitWorkTime")

Ich übergebe die Daten mittels eines DataSets in den Report. Die Spalte "Dauer" ist vom Typ String und sieht immer wie folgt aus: hh:mm:ss

Leider funktioniert die Funktion "Sum" im Report mit diesem Feld nicht. Wie kann ich erreichen, dass ich die Zeiten addieren und die Summe bilden kann?

Danke und liebe Grüße,

MCT
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Schreibe dir eine geeignte Funktion, die den String in eine passenden Wert umberechnet, summiere den und stelle diesen Wert richtig dar.

Oder du verwendest die Report Funktion "DateValue".
Zitat
Returns a Date value containing the date information represented by a string, with the time information set to midnight (00:00:00).
Sollte wohl auch zum Ziel führen.

Lion
lg Lion
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Hi !

Danke für die Antwort, an diese Lösung hatte ich auch schon gedacht, hab dazu aber eine kleine Frage.

In den Reporteigenschaften für ich also unter dem Register "Code" eine neue Funktion hinzu, soweit klar. Dann rufe ich die Funktion in dem Feld auf, in dem das Ergebnis ausgegeben werden soll:
=Code.addTime(???)

Die Frage ist, was übergebe ich anstelle der "???". Ich muss ja irgendwie eine Art Collection übergeben in meine Funktion, um die Werte addieren zu können. Könnte mir jemand sagen was genau ich übergeben muss und welche Datenstruktur (Datentyp) das dann wäre?
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Wenn du dir den Code selbst erstellst, dann wirst du wohl zwei Funktionen brauchen. Eine, die dir den String in eine Zahl umwandelt, und eine Andere, die die Summe dann darstellt.

Also Funktion1(SUM(Funktion2(Feld)))

Funktion2 = Umrechung in eine Zahl
Funktion1 = Darstellung einer Zahl als String

Hast du dir DateValue angeschaut? Das wäre doch das passende oder?

Lion
lg Lion
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Hi !

Den Lösungsweg mit den beiden Funktionen hab ich verstanden. Was ich aber nicht verstanden habe ist, was du mit der Funktion DateValue in Bezug auf mein Problem anstellen willst.

Die Funktion konvertiert doch lediglich ein Datum in einen gültigen DateTime, oder hab ich das falsch verstanden:
Zitat
Gibt einen Date-Wert zurück, der die Datumsangabe als Zeichenfolge enthält und dessen Zeitangabe Mitternacht (00:00:00) lautet.

Liebe Grüße,

MCT
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Hallo mctimotheus,

ich denke, anstatt DateTime ist die Struct TimeSpan eher fuer Dich gedacht.


TimeSpan ts = TimeSpan.Parse("01:08:09");
TimeSpan ts2 = TimeSpan.Parse("03:26:01");
TimeSpan result = ts + ts2;

Gruss, DaMoe
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Hallo,

ja das war von mir falsch "verstanden", ich dachte die geben einen Int Wert oder ähnliches zurück, hatte ich falsch verstanden, sorry.

Lion
lg Lion
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Sorry, ich muss nochmal fragen, denn ich würde gerne die Lösung mit den zwei Funktionen realisieren. Mir ist jedoch noch nicht klar, wie ich die Zeit-Werte aller Datensätze in die Funktion "schaffe" und dort addiere.

Ich stelle mir das ja ungefair so vor:
function addTime(ByVal times As ???) As Integer
Dim result As Integer
foreach times
    result = result + times.Value
  next
return result
end function

Wie bekomme ich denn die komplette Spalte "Zeit" in die Funktion übergeben, damit ich dann dort aus den enthaltenen Zeilen die Summe bilden kann? Brauch nochmal Nachhilfe
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Moin!

Ich gehe mal davon aus, dass Du die gesamte DataTable Instanz uebergeben musst. Anschliessend iterierst Du ueber deine Zeilen (Rows) und gibst ausserdem noch den Spaltenindex an, um an entsprechende Daten zu kommen. Also ausgehend von einem DataSet kommst Du an einen Datensatz wie folgt heran:


int rowIndex = ??;
int columnIndex = ??;

System.Data.DataSet ds = new System.Data.DataSet(); 
TimeSpan time = new TimeSpan((String)ds.Tables["MyTable"].Rows[rowIndex][columnIndex]);


Gruss, DaMoe
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Hi !

Wie bekomme ich denn die komplette DataTable in die Funktion, genau das ist es ja, was ich nicht verstehe

Der Aufruf der Funktion findet im Report ja später wie folgt statt:
=Code.addTime(???)

Was muss ich da anstelle der Fragezeichen übergeben, damit ich alle Datensätze in der Funktion zur Verfügung habe und die Werte alle auch addieren kann?
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Hi!

Ich weiß nicht, in wieweit Du Dich mit DataTables bzw. DataSets auskennst, aber ausgehend von meinem Beispiel, wenn Du ein DataSet namens ds besitzt, kommst Du an die DataTable per ds.Tables[Tabellenindex oder Tabellenname]. rowIndex ist eine Laufvariable, die du in einer For-Schleife generierst. columnIndex hingegen musst Du wissen (ich meine, dass man statt einem index auch einen Spaltennamen angebenen kann, falls dieser existiert).

Deine Methodensignatur muesste dann in etwas so aussehen:

function addTime(ByVal times As DataTable) As Integer

Ich wuerde die Methode umbenennen in sumTime, da add mir suggeriert, dass ich eine Zeit zu einem bereits bestehendem Wert addieren moechte. Du moechtest aber mit Deiner Funktion eine Spalte von Zeiten aufsummieren.


Gruß, DaMoe
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Sorry, ich muss nochmal nerven aber meine eigentliche Frage hast du jetzt nicht beantwortet. Die Methode zu schreiben und diese dann im Report einzufügen ist klar.

Was nicht klar ist, wie übergebe ich die DataTable in die Methode:
Zitat
function addTime(ByVal times As DataTable) As Integer

ich stelle mir das so vor:
=Code.addTime(fields!Time.Value)

aber damit hab ich doch nur einen Wert übergeben und nicht alle, oder?

Danke und liebe Grüße,

MCT
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Zitat
...wenn Du ein DataSet namens ds besitzt, kommst Du an die DataTable per ds.Tables[Tabellenindex oder Tabellenname]...

In VB meine ich, sollte ein Aufruf so aussehen:

Code.addTime(ds.Tables("MyTable"))

Es kann natuerlich auch sein, dass wir uns missverstehen, aber da C# und VB.Net recht ähnlich sind, sollten wir eigentlich von dem Gleichen sprechen, wenn wir uns ueber DataTables unterhalten.
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Hallo DaMoe80,

Er spricht davon, Code im Report selbst hinzuzufügen, also nichts mit C# oder VB.net. (Report Eigenschaften, Code).

mctimotheus,
ich bin mir nicht sicher ob du die ganze Collection übergeben kannst, aber was spricht den gegen meine Vorgeschlagene Variante?

Du erstellt eine Funktion, mit der du den Wert in einen float oder ähnliches umrechnest, daraus bildest du die Summe, und die zweite Funktion stellt diesen float Wert wieder so dar, wie du es dir wünscht.

Lion
lg Lion
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Hi Lion !

Ich finde deine Lösung schon irgendwie logisch und gut, kann aber die Brücke zur Realisierung nicht schlagen X(

Ich hab jetzt folgende Codes im meinen Report eingepflegt:

Public Function sumTime(???)

// Hier kommt dann der Code, der die Addition mittels
// einer foreach-Schleife durchführt

End Function


Private Function timeToSeconds(ByVal time As String)
            Dim timearray() As String = time.Split(Char.Parse(":"))
            Dim hours As Integer = Integer.Parse(timearray(0))
            Dim minutes As Integer = Integer.Parse(timearray(1))
            Dim seconds As Integer = Integer.Parse(timearray(2))

            Dim sum As Integer = seconds
            sum += minutes * 60
            sum += hours * 3600

            Return sum
End Function

Die eine Methode übernimmt die Umrechung von hh:mm:ss in Sekunden, das geht auch. Aber wie bilde ich nun die Summe als allen Zeiten, dafür bräuchte ich doch dann in der Methode sumTime alle Werte als Collection, oder?

Dazu bietet sich gleich noch eine Frage an: Wie rufe ich später dann die Methode sumTime auf bzw. was genau muss ich übergeben?

Bitte habt noch etwas Geduld mit mir *g*
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Wie wärs mit SUM() drumherum?

=SUM(timeToSeconds(Value))
lg Lion
private Nachricht | Beiträge des Benutzers
mctimotheus
myCSharp.de - Member



Dabei seit:
Beiträge: 181
Herkunft: Rheinland-Pfalz

Themenstarter:

beantworten | zitieren | melden

Bin ich doof !!! *BrettVormKopf*

Danke !!!
Wer nicht wagt .. der nicht gewinnt .. !
private Nachricht | Beiträge des Benutzers