Laden...

Summe aus Zeitangaben bilden (MS Berichtsfunktion - RDLC)

Erstellt von mctimotheus vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.376 Views
M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren
Summe aus Zeitangaben bilden (MS Berichtsfunktion - RDLC)

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 .. !

L
770 Beiträge seit 2006
vor 14 Jahren

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".

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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 .. !

L
770 Beiträge seit 2006
vor 14 Jahren

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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:

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 .. !

D
500 Beiträge seit 2007
vor 14 Jahren

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

L
770 Beiträge seit 2006
vor 14 Jahren

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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 .. !

D
500 Beiträge seit 2007
vor 14 Jahren

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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 .. !

D
500 Beiträge seit 2007
vor 14 Jahren

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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:

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 .. !

D
500 Beiträge seit 2007
vor 14 Jahren

...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.

L
770 Beiträge seit 2006
vor 14 Jahren

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

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

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 .. !

L
770 Beiträge seit 2006
vor 14 Jahren

Wie wärs mit SUM() drumherum?

=SUM(timeToSeconds(Value))

lg Lion

M
mctimotheus Themenstarter:in
179 Beiträge seit 2008
vor 14 Jahren

Bin ich doof !!! BrettVormKopf

Danke !!!

Wer nicht wagt .. der nicht gewinnt .. !