CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Verwenden von C# in den Formeln von DeltaMasters Flexreports

In den Flexreports von DeltaMaster gibt es die Möglichkeit Formeln zu verwenden, die ähnlich zu dem allgegenwärtigen Vorbild Microsoft Excel aufgebaut sind. Zu beachten ist aber, dass die von DeltaMaster verwendete Schreibweise (Syntax) nicht die von Microsoft Excel ist, sondern eher der moderneren, objektbezogenen Syntax der .Net-Sprache C# entspricht. In diesem Blobeitrag zeigen wir ein paar Möglichkeiten auf, die Formeln von DeltaMaster Flexreports mit der Hilfe von ‚C#-Einzeilern‘ zu nutzen.

Das erste Beispiel zeigt das Datum der Berichtserstellung:

= System.DateTime.Now.ToString()

Typisch für die C#-Schreibweise ist es, mehrere Schritte hintereinander auszuführen. In diesem Beispiel ist der erste Schritt das Ermitteln des Datums: System.DateTime.Now. Ergebnis dieses Schrittes ist ein DateTime-Objekt, welches das aktuelle Datum enthält. Objekte enthalten in einer objektorientierten Sprache nicht nur Daten (hier das aktuelle Datum), sondern auch Funktionen, die die Daten des Objektes verarbeiten. Wie jedes andere Objekt in C#, enthält das DateTime-Objekt die Funktion ToString(), die den Wert eines Objektes in einen String (Zeichenkette) umwandelt, da der Flexreport nur Strings und Zahlenformate anzeigen kann. Die Umwandlung des DateTime-Objektes ist daher notwendig.

Bei C#-Code muss auf Groß-/Kleinschreibung geachtet werden. Die Funktion ToString() ist nur genau so geschrieben richtig. Tostring() oder tostring() oder TOSTRING() funktionieren nicht.

In Formeln können natürlich auch die Werte anderer Zellen genutzt werden. R(0)C(-1) referenziert z. B. auf die Zelle links nebenan.

= R(0)C(-1).Substring(0, 3)

Wenn man sich sicher ist, dass in der linken Nachbarzelle immer ein Wert vom Typ String steht, kann man direkt nach der Referenz und einem Punkt eine der Funktionen des String-Objektes verwenden. Substring(x,y) ist solch eine Funktion – sie gibt einen Teil des Strings zurück: .Substring(Beginn, Länge).

Weitere häufig genutzte Funktionen des String-Objektes sind:

.Length: Länge des Strings

.Replace(zu ersetzende Zeichenfolge, ersetzende Zeichenfolge): Ersetzt im String bestimmte Zeichenfolgen durch andere

.Contains (gesuchte Zeichenfolge): Gibt ‚true’ zurück, wenn die gesuchte Zeichenfolge im String enthalten ist.

Das ist nur ein kleiner Teil der Funktionen des String-Objektes. Eine gute Möglichkeit, sich einen umfassenden Überblick über dieses und alle anderen hier vorgestellten Objekte zu machen, ist Microsofts msdn-Seite (msdn.microsoft.com) der .Net-Sprache C#.

Typumwandlungen

Oft ist es notwendig, den Wert einer Zelle, oder eines Ergebnisses in einen anderen Typ umzuwandeln. Als Beispiel dafür kann unsere erste Formel: = System.DateTime.Now.ToString() wieder verwendet werden. Notwendig wurde eine Umwandlung an dieser Stelle, um den Wert des DateTime-Objektes anzeigen zu können.

Alle Objekte der Sprache C# besitzen genau zu diesem Zweck die Funktion ToString(). Dadurch kann auf einfache Art und Weise alles in C# in einen String umgewandelt werden. Für die Umwandlung in einen anderen Typ (z. B. Date oder Integer) verwendet man häufig die Funktionen der Klasse System.Convert. System.Convert.ToInt32(umzuwandelnder Wert) wandelt den in Klammern angebenden Wert in einen Integer (Integer: ganze Zahl) um. Bei solchen Umwandlungen sollte sehr genau darauf geachtet werden, dass ein sinnvolles Ergebnis auch möglich ist. Sollte z. B. versucht werden einen String umzuwandeln, der gar keine Zahlen enthält (oder auch nur andere Zeichen außer Zahlen und Punkt), wird die Funktion einen Fehler zurückgeben.

=System.Convert.ToDateTime(“1.3.2010”).AddDays(3).ToString()

In diesem Beispiel wird der String „1.3.2010” (der ja ein Datum im deutschen Datumsformat repräsentiert) in ein DateTime-Objekt umgewandelt. Im nächsten Schritt kann eine der Funktionen des DateTime-Objektes benutzt werden, um das Datum zu bearbeiten. Hier wird die Funktion .AddDays(Anzahl der Tage) genutzt, um eine bestimmte Anzahl von Tagen dem Datum hinzuzuaddieren. Das Ergebnis ist wieder ein DateTime-Objekt. Zur Anzeige des Wertes dieses DateTime-Objektes muss der Wert in einen String umgewandelt werden, was durch die Funktion ToString() erledigt wird. Natürlich kann anstatt des festen Strings „1.3.2010“ auch eine Referenz auf eine andere Zelle benutzt werden.

Außerdem besitzt jedes Datums- und Zahlenobjekt die Funktion Parse(Zeichenkette). Diese Funktion wandelt die in Klammern übergebene Zeichenkette in das entsprechende Zahlenobjekt um.

=System.Int32.Parse(„-3“)

Dieses Beispiel gibt den Integerwert -3 zurück.

Entweder-Oder-Entscheidung

Sehr häufig ist es notwendig, dass der Inhalt eines Feldes von einer Entscheidung abhängt. Zum Beispiel: wenn der Monat in einem Datums kleiner als 7 ist, dann ist der Wert der Zelle „1. Halbjahr“ sonst „2. Halbjahr“.

Für solche Anforderungen ist eine If-Then-Konstrukt notwendig.

Dieses Konstrukt für die Flexreports sieht in allgemeiner Form so aus (Entscheidung, welche entweder ‚true’ oder ‚false’ zurückgibt ? der Wert der ‚true’ entspricht : der Wert der ‚false’ entspricht). Für das Beispiel würde dann folgende Formel entstehen:

=(System.Convert.ToDateTime(“1.3.2010“).Month < 7 ? „1. Halbjahr“ : „2. Halbjahr“)

Im Teil der Entscheidung (zwischen erster Klammer und Fragezeichen) wird als Erstes der String „1.3.2010“ in ein DateTime-Objekt umgewandelt. Dies erledigt die Funktion ToDateTime() des System.Convert-Objektes. Das von dieser Funktion zurückgegebene DateTime-Objekt enthält die Eigenschaft .Month, welche die Monatszahl zurückgibt. Die Monatszahl wird anschließend mit 7 verglichen. Ist sie kleiner (d. h. die Entscheidung ist ‚true’) wird der Wert zwischen Fragezeichen und Doppelpunkt in der Zelle erscheinen, sonst der Wert zwischen Doppelpunkt und Klammer.

Formatierungen

Ein weiteres wichtiges Thema ist die Darstellung von Datum und Zahl im gewünschten Format. Hier erweist sich die Funktion ToString() als Alleskönner.

Die Zahlen und Datums-Objekte selbst kennen keine Formatierungen. Sie beinhalten nur den entsprechenden Wert. Erst die Umwandlung in einen String erfordert die Formatierung.

Zur Beschreibung der Formatierung wird der Funktion ToString(Formatinformation) eine Zeichenkette ‘Formatinformation‘ übergeben. Welche Zeichen dabei welches Format erwirken, ist in der C# Hilfe für die Klasse NumberFormatInfo (für Zahlenformate) bzw. DateTimeFormatInfo (für Datumsformate) zu finden.

Für Zahlenformate können zum Beispiel folgende Zeichen verwendet werden:

c:         Währungsformat

f:          Festkommaformat

etc.

Es können aber auch die Formatierungs-Zeichenketten verwendet werden, die in Excel üblich sind: #,###.00 repräsentiert eine Zahl mit Tausender-Kennzeichnung und immer 2 Nachkommastellen.

Gleiches gilt für Datumsformate: auch hier können Formatierungs-Zeichenketten, ähnlich denen in Excel eingesetzt werden:

=System.DateTime.Now.ToString(“dd.MMM yyyy HH:mm”) + ” Uhr”

Dadurch würde z. B. entstehen: 22.Apr 2010 23:14 Uhr

Formatierungen von Formelergebnissen können natürlich auch direkt im Flexreport vorgenommen werden und müssen nicht mit den Funktionen von C# eingestellt werden. Direkt im Flexreport sind die Formatierungsmöglichkeiten zwar auf die häufigsten Formate beschränkt, reichen im Allgemeinen aber aus. Es ist jedoch auch möglich im Flexreport dieselben Formatierungs-Zeichenketten zu verwenden, die hier beschrieben wurden. Auch dafür lohnt es sich, die Dokumentationen zu den Klassen NumberFormatInfo und DateTimeFormatInfo in der Hilfe zu C# anzuschauen.

Rechnen mit Zahlen und Datumswerten

Sehr interessant ist auch die Verwendung der Funktionen des Objektes System.Math. Hier findet man eine Anzahl von mathematischen Funktionen wie z. B. Runden, Potenzen, Winkelfunktionen, Logarithmen. Außerdem stellt dieses Objekt die Konstanten e und pi zur Verfügung:

=System.Math.Round(System.Math.PI, 3)

Diese Formel wird pi gerundet auf die 3. Nachkommastelle zurückgeben: 3,142.

Als letztes möchte ich auch noch auf das TimeSpan-Objekt hinweisen. Das entsteht z. B. bei der Subtraktion zweier Datumswerte. Es liefert eine Zeitspanne zurück:

=System.Convert.ToDateTime(“2.03.2010 15:07:23”).Subtract(System.Convert.ToDateTime(“26.02.2010 07:23:45”)).ToString()

Es wird ein DateTime-Objekt erzeugt und mit Hilfe dessen Funktion Subtract ein anderes Datum abgezogen. Das Ergebnis ist ein TimeSpan-Objekt. Auch dieses hat die Funktion ToString() um das Ergebnis anzeigen zu können (bzw. auch um die Anzeige zu formatieren). Ergebnis dieser Formel (ohne weitere Formatierungen) ist: 4.07:43:38 (zu lesen: 4 Tage, 7 Stunden, 43 Minuten und 38 Sekunden).