Formeloperator (zeilenweise)
Aus XIMES
Time Intelligence Solutions > TIS Operatoren > Formeloperator (zeilenweise)
- Übersicht
- Neues
- Screenshot
- 1. Schritte
- Datum & Zeit
- Allg. Math.
- Texte
- Umwandeln
- Zeilennr. ...
- Zugriff Tabelle
- Extras
- Troubleshooting
Kurzbeschreibung
Es können eigene Berechnungsformeln in C#-Syntax eingegeben werden.
Die eingegebene Berechnungsformel wird auf jede Zeile angewandt und eine neue Spalte erzeugt, in der die Ergebnisse eingetragen werden.
Die Offenheit dieser Operation erlaubt enorm vieles damit zu tun
Konfiguration
Betroffene Tabellenbereiche
- Eingabespalten
- [Vorgabe] Alle Eingabespalten werden unverändert mitkopiert. Dieser Wert kann nicht verändert werden.
Einstellungen
- Funktion
- [Eingabe] Hier wird eine benutzerdefinierte Funktion in C#-Syntax. Durch "Bearbeiten..." kann die Formel angepasst und z.B. mit Parametern versehen werden. Beispiele finden sich auf den weiteren Tabs.
- Name der Ergebnisspalte
- [Eingabe] Wie soll die Ergebnisspalte heißen?
- Typ der Ergebnisspalte
- [Eingabe] Welcher Datentyp ist der Ergebniswert?
- [Auswahl] Text, ganze Zahl, Zahl mit Nachkommastellen, Ja/Nein-Wert, Datum
Zusatzinformationen über den Knoten
Der Formeloperator bietet zusätzlich noch eigene Funktionalität
- Die Eingabe des Textes: string projectName liefert den Namen des Projektes als Text
- Die Eingabe des Textes: string folderName liefert den Namen des Ordners als Text
- Die Eingabe des Textes: string nodeName liefert den Namen des Knotens als Text
- Die Eingabe des Textes: rowNumber liefert die Zeilennummer als Ganzzahl (Achtung beginnend mit 0)
- Die Eingabe des Textes: rows liefert die Gesamtzahl der Zeilen
Möglichkeiten des Schreibens und Lesens von Daten
- Die Eingabe des Textes: cc.CSharp.DataHelper.GetValue (dataRow, "Daten", rowNumber, (int) #offset#) holt den Werte aus der Spalte "Daten" der um den Werte in offset versetzten Zeilen. Das int ist erforderlich, weil hier ganze Zahlen erforderlich sind. Also zB um 4 Zeilen früher. ACHTUNG: Wenn über die erste/letzte Zeile hinaus gegangen wird, wird der erste/letzte Wert genommen. - Falls ein anderer Wert genommen werden soll, müsste das vorher mit entsprechendem if then else abgefangen werden.
- Die Eingabe des Textes: cc.CSharp.DataHelper.SetValue (#wert#, dataRow, "Daten", rowNumber, (int) #offset#) SCHREIBT den Wert aus #wert# in die Spalte "Daten" der um den Wert in offset versetzten Zeilen. Ergebnis dieser Operation is boolean (0,1). Damit können mehrere Datenspalten gleichzeitig verändert werden.
Formatieren von Strings zeigt wie man die Ausgabe formatieren kann
Erstes Fenster
Hauptdialog Formeloperator (zeilenweise)
Zweites Fenster
Über den Link Bearbeiten... wird das Fenster zum Eingeben der Formel geöffnet:
Dialogfenster zum Eingeben der Funktion in C# Syntax
Beispiel 1: Multiplizieren von 2 Werten
| Ausgangssituation |
| Eingabe der Formel Breite mal Höhe |
| Hinweise: |
| Führt zu folgendem Ergebnis |
Beispiel 2: Rechnen mit ganzen Zahlen bzw. Dezimalzahlen
- 5 / 2 ergibt 2 (Ganzzahl abgerundet). Ohne Konvertierung auf Double wird vom C#-Compiler automatisch auf Ganzzahl konvertiert.
- 5.0 / 2.0 ergibt 2.5 (Dezimalzahl).
- 5 / 2.0 ergibt 2.5 (Dezimalzahl), weil mindestens 1 Zahl eine Dezimalzahl ist.
- (double) #Ganzzahlspalte# wandelt eine Ganzzahl in eine Dezimalzahl um.
Beispiel 3: If then else
|
Wenn Wert in Spalte größer als 3 ist, schreibe 1, ansonsten schreibe 0 in die Ergebnisspalte. #Spalte# > 3.0 ? 1.0 : 0.0 |
|
Wenn das Datum der Spalte im Zeitraum von 1.1.2003 bis 30.9.2003 liegt, schreibe 1, ansonsten schreibe 0 in die Ergebnisspalte. #Datum#.Year == 2003 && #Datum#.Month <= 9 ? 1 : 0 |
|
Beispiel für geschachteltes If: #zeitvon# > 1000.0 ? "N" : (#zeitvon# < 100.0 ? "Frei" : "F") |
Beispiel 4: Feste Werte in eine Spalte schreiben
|
Den gleichen Text in jede Zeile einer Spalte schreiben: Der Text muß immer unter Hochkomma stehen. Zusätzlich muss der Typ der Ergebnisspalte auf Text gesetzt werden. "Gleicher Text" |
Beispiel 5: Zwei Spalten auf einen Identifizieren zusammenfassen
| Formel | Ergebnis |
|
Falls die Funktionalität von Spalten zusammenfassen erweitert werden soll #datumsSpalte#.ToString() + "_" + #textSpalte# |
Ergibt Text,der mit _ getrennt ist. Beispiel: 01.01.2007 00:00:00_Abteilung1 |
Syntax
| Zeichen/Zeichenfolge | Wirkung | Beispiel für Anwendung |
|---|---|---|
| == | Vergleich auf GLEICHEN Wert. Z.B. Ist A gleich B, wenn ja 1, sonst 0 | A == B ? 1 : 0 |
| != | Vergleich auf UNGLEICHEN Wert. Z.B. Ist A gleich B, wenn ja 1, sonst 0 | A != B ? 1 : 0 |
| || | logisches ODER wobei die zweite Seite nur geprüft wird, wenn die erste noch schon WAHR war. = Normalfall bei der Verwendung. | A == B || B == C ? 1 : 0 |
| && | logisches UND wobei die zweite Seite nur geprüft wird, wenn die erste noch schon FALSCH war. = Normalfall bei der Verwendung. | A == B && B == C ? 1 : 0 |
| % | Modulorechnung. | 45%10 ergibt den Wert 5 |
| & ...angewandt auf boolsche Werte | logisches UND wobei immer beide Seiten geprüft werden | A != 0 & B/A == C ? 1 : 0 |
| | ...angewandt auf boolsche Werte | logisches ODER wobei immer beide Seiten geprüft werden | A == 0 | B/A != C ? 0 : 1 |
| SONDERTHEMA: | ...angewandt auf integral: | bitweises ODER | z.B. 85 | 170 = 255 Bitmuster: (01010101, 10101010) daher Ergebnis: 11111111 = 255 |
| SONDERTHEMA: & ...angewandt auf integral: | bitweises UND | 3 & 1 = 1 Bitmuster: (0011, 0001) daher Ergebnis: 0001 = 1 |
| SONDERTHEMA: ^ ...angewandt auf integral: | bitweises XOR | 85 ^ 255 = 170 Bitmuster: (01010101, 11111111) daher Ergebnis: 10101010 = 170 |
Einstiegsbeispiele
| Ausgangssituation | Formel | Ergebnis |
|
In der Spalte 'Von' steht das Datum und die Uhrzeit. Ein reines Datum ohne Zeitanteil sei gewünscht. |
#Von#.Date |
Ergibt Datum ohne spezifische Uhrzeit. (zB aus 02.05.2008 06:00:00 wird 02.05.2008 00:00:00) |
| Ziel: Länge eines Zeitintervalls in Minuten (zB einer Schicht) |
(#Bis# - #Von#).TotalMinutes |
ZB für 1.1.2006 8:00:00 Bis 1.1.2006 14:00 ergibt das 360,0 |
| C# ist case-sensitiv. Deshalb muß auf Groß- und Kleinschreibung geachtet werden. |
Funktionen
| Funktion/Property | Rückgabewert | Beschreibung |
| #name#.Date | Datum/Zeit | Datum ohne Uhrzeit |
| #name#.TimeOfDay | Datum/Zeit | Nur Uhrzeit |
| #name#.Day | Ganzzahl | Tag im Monat |
| #name#.DayOfWeek | Ganzzahl/Zeichenfolge | Wievielter Tag der Woche oder Wochentag |
| #name#.DayOfYear | Ganzzahl | Wievielter Tag des Jahres? |
| #name#.Hour | Ganzzahl | Stunde des Tages |
| #name#.Minute | Ganzzahl | Minute der Stunde |
| #name#.Month | Ganzzahl | Monat |
| #name#.Year | Ganzzahl | Jahr |
| #name#.AddYears(n) | Datum/Zeit | Addiert eine Anzahl von Jahren zu einem Datum/Zeit |
| #name#.AddMonths(n) | Datum/Zeit | Addiert eine Anzahl von Monaten zu einem Datum/Zeit |
| #name#.AddDays(n) | Datum/Zeit | Addiert eine Anzahl von Tagen zu einem Datum/Zeit |
| #name#.AddHours(n) | Datum/Zeit | Addiert eine Anzahl von Stunden zu einem Datum/Zeit |
| #name#.AddMinutes(n) | Datum/Zeit | Addiert eine Anzahl von Minuten zu einem Datum/Zeit |
| #name#.ToShortDateString() | Zeichenfolge | Umwandlung eines Datum/Zeit-Objektes in eine Zeichenfolge (nur Datum) |
| #name#.ToString() | Zeichenfolge | Umwandlung eines Datum/Zeit-Objektes in eine Zeichenfolge |
| #name#.ToString(f) | Zeichenfolge | Umwandlung eines Datum/Zeit-Objektes in eine Zeichenfolge mit Formatangabe Formatangaben siehe Grundbegriffe:Formate |
| System.DateTime.Now | Datum/Zeit | Aktuelles Datum und Uhrzeit |
| System.DateTime.DaysInMonth(y,m) | Ganzzahl | wie viele Tage hat der Monat m im Jahr y |
| System.DateTime.IsLeapYear(y) | Ja/Nein-Wert | Ist das Jahr y ein Schaltjahr? |
| System.DateTime.Parse(s) | Datum/Zeit | Umwandlung einer Zeichenfolge s in ein Datum/Zeit-Objekt |
| System.DateTime.TimeOfDay | Text | Tageszeit im Format HH:mm:ss |
| (#Bis#-#Von#).TotalSeconds | Kommazahl | Länge des Zeitintervalls in Sekunden (inkl. Kommaanteile) |
| (#Bis#-#Von#).TotalMinutes | Kommazahl | Länge des Zeitintervalls in Minuten (inkl. Kommaanteile) |
| (#Bis#-#Von#).TotalHours | Kommazahl | Länge des Zeitintervalls in Stunden (inkl. Kommaanteile) |
| (#Bis#-#Von#).TotalDays | Kommazahl | Länge des Zeitintervalls in Tagen (inkl. Kommaanteile) |
Weitere Beispiele
| Aufgabe | Code |
|---|---|
| Addieren von Datum und Uhrzeit aus zwei Feldern |
bzw. zusammen'
|
| Verweildauer - inkl dem ganzen letzten Tag |
(#Bis#.Date - #Von#.Date).Days + 1 |
| Vergleich, ob etwas eine Nachtschicht ist (ist Von < Bis) |
(#Von#.TimeOfDay.CompareTo(#Bis#.TimeOfDay) == 1 ? "T" : "N") |
| Vergleich, ob ein Zeitpunkt nach einem anderen kommt |
(#Von#.CompareTo(#Bis#) == 1 ? 1:0)</tt> |
| eine fixe Uhrzeit für jeden Tag eintragen und als DATUM zurückbekommen |
Von#.Date.AddHours(16).AddMinutes( 15) ... 16:15 Von#.Date ... 00:00" |
| Codierte Zeitintervalle in Minuten umrechnen und zu Datum addieren |
(zB Code 1 steht für 0:00-0:15, 2 für 0:15-0:30, ... 4 für 0:45-1:00, 11 für 1:00-1:15, ... 14 für 1:45-2:00, ... 72 für 7:15-7:30)
|
| Prüfung ob eine VON BIS Zeitintervall in ein bestimmtes Stundenfenster |
Die Variablen "Suche Von in h" und "Suche Bis in h" können im Formeloperator angelegt werden #Suche Von in h# >=#Suche Bis in h# ? -1 :
(#Suche Bis in h# <= #Von#.Hour + #Von#.Minute/60.0 ?
(#Von#.Date < #Bis#.Date && #Suche Von in h# < #Bis#.Hour + #Bis#.Minute/60.0 ? 1 : 0) :
(#Von#.Date < #Bis#.Date && #Suche Von in h# < #Suche Bis in h# ? 1 :
(#Suche Von in h# < #Bis#.Hour + #Bis#.Minute/60.0 ? 1 : 0 )))
|
| Alles auf den ersten Tag der ersten Spalte des ersten Datensatzes stellen (Uhrzeiten behalten) |
#Von#.AddDays(-(#Von#.Date - System.Convert.ToDateTime(dataRow.Table.Rows[0][0]).Date).Days) |
| Achtung, wenn bei den Datums/Zeit-Funktionen Nachkommastellen | wenn bei den Datums/Zeit-Funktionen Nachkommastellen zu erwarten sind (zB Long oder Integer), dann muss ein Cast (Compilerbefehl zur "Typumwandlung") verwendet werden, und zwar auf jeden beliebigen Floating-Point-Typ, am besten double, zB
1 + (double)#Anaesthesiepräsenz Doppelminuten# / (#Ende Anaesthesie# - #Beginn Anaesthesie#).TotalMinutes |
| Zusammenführung von getrenntem Datum (als Datum eingelesen) und getrennter Zeit (als Uhrezeit eingelesen) |
Zusammenführung: System.Convert.ToString(#Datum# ).Substring(0,10) +" " + System.Convert.ToString(#Von#).Substring(10,8) Falls Wechsel über Mitternacht: #Bis roh#.AddDays(#Bis roh# < #Von# ? 1 : 0) |
| Eine fiktive Woche einführen, um Werte miteinander vergleichen zu können |
Hilfswert Von: zB #Von Hilf# Typ Datum. HINWEIS ... Wochentag mit allgemeinem Kalender holen, dann steht an erster Stelle eine Wochentagsnummer System.DateTime.ParseExact("20080225","yyyyMMdd",null).
AddDays(System.Convert.ToDouble(#Wochentag#.Substring(0,1))-1).
AddHours(#Von#.Hour).
AddMinutes(#Von#.Minute).
AddSeconds(#Von#.Second)
Hilfswert Bis: zB #Bis Hilf# Typ Datum |
| Tagsdatum im SPX-Format |
(#Von# - System.DateTime.ParseExact("19900101","yyyyMMdd",null)).Days In Tagen
(#Von# - System.DateTime.ParseExact("19900101","yyyyMMdd",null)).Ticks/600000000 In Minuten
|
| Folge von Kurzbezeichnungen Wochentage richtig sortieren |
(#Tag Aufnahme# == "Mo" ? "1 Mo" : (#Tag Aufnahme# == "Di" ? "2 Di" : (#Tag Aufnahme# == "Mi" ? "3 Mi" : (#Tag Aufnahme# == "Do" ? "4 Do" : (#Tag Aufnahme# == "Fr" ? "5 Fr" : (#Tag Aufnahme# == "Sa" ? "6 Sa" : "7 So" )))))) wird die entsprechende Nummer davor gestellt. |
| Gerade und ungerade Wochen bestimmen | Die folgende Formel erwartet eine Wochenbezeichnung (als Text) folgender Art in #Woche#:
die Formel nimmt die Zahl ab Stelle 6 (Achtung da im Text von 0 weg gezählt wird, ist das das 7 Zeichen). HIER ist eventuell Anpassung erforderlich. (System.Math.Ceiling(System.Convert.ToDouble(#Woche#.Substring(6,2))/2)*2 == System.Convert.ToDouble(#Woche#.Substring (6,2)) ? "gerade" : "ungerade") und liefert "gerade" : "ungerade". |
| Kalenderwoche (KW): wie kann ich aus einem Datum die KW errechnen? | Normalerweise wird die Operation: TIS:Allgemeiner Kalender verwendet.
new System.Globalization.CultureInfo("de-AT").Calendar.GetWeekOfYear
(#Datum#,System.Globalization.CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Monday);
Anpassungen (wie wird KW gerechnet):
Anpassungen (was ist der erste Tag der Woche):
|
Hinweise
| C# ist case-sensitiv. Deshalb muß auf Groß- und Kleinschreibung geachtet werden. |
Funktionen
| Funktion/Property | Rückgabewert | Beschreibung |
| System.Math.Abs(d) | Zahl m. Nachkommastellen | Zahl ohne Vorzeichen (Absolutwert) |
| System.Math.Floor(d) | Ganzzahl | Größte ganze Zahl, die kleiner oder gleich der Zahl ist |
| System.Math.Ceiling(d) | Ganzzahl | Größte ganze Zahl, die größer oder gleich der Zahl ist |
| System.Math.Round(a,n) | Zahl m. Nachkommastellen | Rundet a auf n Nachkommastellen |
| System.Math.IEEERemainder(a,n) | Rest bei Division | Dividiert a durch n und liefert Rest |
| System.Math.Log(a) | Zahl m. Nachkommastellen | Liefert das ln von a |
| System.Math.Log10(a) | Zahl m. Nachkommastellen | Liefert log zur Basis 10 von a |
| System.Math.Log(a,b) | Zahl m. Nachkommastellen | Liefert log zur Basis a von b |
| System.Math.Max(a,b) | Zahl m. Nachkommastellen | Liefert das Maximum von a und b |
| System.Math.Min(a,b) | Zahl m. Nachkommastellen | Liefert das Minimum von a und b |
| System.Math.Pow(x,y) | Zahl m. Nachkommastellen | Bildet x hoch y |
| System.Math.Sqrt(d) | Zahl m. Nachkommastellen | Berechnet die Quadratwurzel aus d |
| System.Math.Sign(d) | Zahl m. Nachkommastellen | Vorzeichen von d |
| System.Math.Sin(d) | Zahl m. Nachkommastellen | Sinus von d |
| System.Math.Cos(d) | Zahl m. Nachkommastellen | Cosinus von d |
| C# ist case-sensitiv. Deshalb muß auf Groß- und Kleinschreibung geachtet werden. |
Beispiel
Zeit im Format "530" bzw. "1407" umwandeln in den Text der Art "05:30" bzw. "14:07"
#Von#.Length > 3 ? #Von#.Substring(0,2) + ":" + #Von#.Substring(2,2) : "0" + #Von#.Substring(0,1) + ":" + #Von#.Substring(1,2)
Funktionen
| Funktion/Property | Rückgabewert | Beschreibung |
| #name# + #name2# | Zeichenfolge | Aneinanderhängen der Zeichenfolgen |
| #name#.Length | Ganzzahl | Anzahl Zeichen in der Zeichenfolge |
| #name#.StartsWith(s) | Ja/Nein-Wert | Prüft, ob die Zeichenfolge mit einer bestimmten Zeichenfolge s beginnt. |
| #name#.EndsWith(s) | Ja/Nein-Wert | Prüft, ob die Zeichenfolge mit einer bestimmten Zeichenfolge s endet. |
| #name#.IndexOf(s) | Ganzzahl | Liefert den Index, ab dem die Zeichenfolge s in #name# vorkommt, -1 falls die Zeichenfolge nicht gefunden wurde. |
| #name#.Replace(s,f) | Zeichenfolge | Ersetzt alle Vorkommen der Zeichenfolge s durch die Zeichenfolge f und liefert das Ergebnis zurück. Umgang mit Sonderzeichen:
\" als zeichen für " geht nicht weil Formeloperator keine Escape sequenz erlaubt |
| #name#.Substring(n) | Zeichenfolge | Liefert die Teilzeichenfolge die bei Position n beginnt. Das erste Zeichen hat die Position 0. |
| #name#.Substring(n,m) | Zeichenfolge | Liefert die Teilzeichenfolge die bei Position n beginnt und maximal m Zeichen lang ist. Das erste Zeichen hat die Position 0. Beispiel: Die letzten 2 Zeichen: #name#.Substring(0,#name#.Length-2) |
| #name#.Contains("text") | Zeichenfolge | Prüft, ob Zeichenfolge vorkommt. |
| #name#.ToLower() | Zeichenfolge | Wandelt alle Buchstaben in Kleinbuchstaben um. |
| #name#.ToUpper() | Zeichenfolge | Wandelt alle Buchstaben in Großbuchstaben um. Erweiterung: #A#.TrimBegin(new char[] {':','5','0'}) ... führt 05:39:51 in 39:51 über |
| #name#.Trim() | Zeichenfolge | Entfernt alle Leerzeichen am Anfang und am Ende der Zeichenfolge.. Erweiterung: #A#.Trim(new char[] {':','5','0'}) ... führt 05:39:51 in 39:51 über, da Zeichen am Rand stehen |
| #name#.TrimStart() | Zeichenfolge |
Entfernt alle Leerzeichen am Anfang der Zeichenfolge.. Erweiterung: #A#.TrimEnd(new char[] {':','5','0'}) ... führt 05:39:51 in 05:39:51 über - da nichts am Ende |
| #name#.TrimEnd() | Zeichenfolge | Entfernt alle Leerzeichen am Ende der Zeichenfolge. Erweiterung: #A#.Trim(new char[] {':','5','0'}) ... führt 05:39:51 in 39:51 über, da Zeichen am Rand stehen |
Weitere Beispiele
| Stichwort | Code |
|---|---|
| Wie kann ich einen String aus mehreren Teilen mit variabler Länge je nach Trennzeichen splitten? | Trenner sei das Zeichen ',':
1. Teil mit: #Spalte#.Split(new char[]{','})[0]
2. Teil mit: #Spalte#.Split(new char[]{','})[1]
3. Teil mit: #Spalte#.Split(new char[]{','})[2]
...
|
Einstiegsbeispiel
Eine einfache Form der Umwandlung ist auch durch entsprechende Einstellung des Ergebniswertes möglich. Wenn zB der Text 07 in Formeleditor reinkommt und nur bei Result umgestellt wird auf Zahl, kommt die Zahl 7 heraus. Recht praktisch. Ohne Zahl in Identifizierer geht genaus so
ZB Datum 01.05.2006 00:00:00 in Spalte #A# da soll der Text "07:00" in Spalte #B# zu Uhrzeit dazu kommen Zwischenrechnung 1: #B#.Substring(0,2) und dann in Spalte mit Namen Result den Typ Zahl auswählen Zwischenrechnung 2: #A#.AddHours(#Result#)
Funktionen
| C# ist case-sensitiv. Deshalb muß auf Groß- und Kleinschreibung geachtet werden. |
| Funktion/Property | Rückgabewert | Beschreibung |
| System.Convert.ToDouble(o) | Zahl m. Nachkommastellen | Wandelt einen Wert bzw. Wertestring in eine Zahl mit Nachkommastellen um. |
| System.Convert.ToInt32(o) | Ganzzahl | Wandelt einen Wert bzw. Wertestring in eine Ganzahl um. |
| System.Convert.ToString(o) | Text | Wandelt einen Wert bzw. Wertestring in eine Zeichenkette um. |
Weitere Beispiele
| Stichwort | Code |
|---|---|
| String in Datum oder Zeit umwandeln |
Datenformat yyyyMMddHHmmss OHNE Trennzeichen: zur Umwandlung von zB 20060101090000 auf 01.01.2006 09:00:00 mit Formeloperator (zeilenweise)
ACHTUNG
|
Alternativ zuerst Formeloperator (zeilenweise):
#VonZeitpunkt#.Substring(6,2) + "." + #VonZeitpunkt#.Substring(4,2) + "." + #VonZeitpunkt#.Substring(0,4) + " " + #VonZeitpunkt#.Substring(8,2) + "." + #VonZeitpunkt#.Substring(10,2) + ":" + #VonZeitpunkt#.Substring(12,2) + ":" + | |
| Eine Zahl Von Stunden als String in #B# zu Datum #A# hinzuaddieren |
#A#.AddHours(System.Convert.ToInt32(#B#.Substring(0,2)) ... |
| Eine Zahl in ein bestimmtes Textformat überführen |
#Zahl#.ToString("000") ... wandelt zB in genau dreistellige Darstellung
Komplexere Beispiele inkl. Unterscheidung positiv, negativ ... ähnlich EXCEL "$#,##0.00;($#,##0.00);Zero" mit \n könnte in C# auch ein Zeilenumbruch erzeugt werden, das ist aber im Formeleditor nicht erlaubt. |
| Eine Stundenzahl in einen Text im Uhrzeitformat überführen |
Wenn #Von Uhrzeit in Std# eine Stundenwert enthält: zB 17,5. Dann macht die folgende Definition: "17:30" daraus. System.Math.Floor(#Von Uhrzeit in Std#).ToString("00") + ":"
+ ((#Von Uhrzeit in Std# - System.Math.Floor(#Von Uhrzeit in Std#))*60.0).ToString("00")
|
| Einen numerischen Datumswert (mit Offset Startdatum als Basis) in ein Datum umwandeln |
Einfach zB: System.Convert.ToDateTime("01.01.1970").AddSeconds(#duration#)
|
| Datumsfelder mit Tagen umgewandeln |
Im Formeleditor bitte folgendes eingeben: System.DateTime(System.TimeSpan.FromTicks(new System.DateTime(1900, 1, 1).Ticks +
((long)#Eingangswert# * 0xc92a69c000)).Ticks
Kurzerklärung:
|
Beispiel: Zeilen fortlaufend nummerieren, bzw. Gesamtzahl anzeigen werden
Beispiel: Gruppen von Zeilen bilden
|
Es soll eine Spalte erzeugt werden, die Gruppen von Zeilen fortlaufend numeriert (zB für verschiedene Linien in Grafik). Dazu muss zuerst eine eigene Zählervariable angelegt werden und dann auf diese die Formel angewandt werden. Typ der Ergebnisspalte ist Zahl mit Nachkommastellen. Hinweis: Die Variablenzuweisung muss links stehen (wie üblich). Den Typ (in diesem Fall zB double) muss man mitgeben, weil Array untypisiert ist. Was hinter dem = steht, landet im Record. Das links steht, kommt in die Variable.
Hier zum Kopieren für eine Variable VAR Zahl mit Startwert 0: additionalParameters["VAR"] = (double) additionalParameters["VAR"] + (#Was# =="Von" ? 1 : 0) |
Beispiel: Laufende Summe bilden
Beispiele: GET und SET (NUR FÜR PROGRAMMIERER)
Diese Art von Zugriff ist nur für Programmierer oder sehr experimentierfreudige Menschen gedacht.
Mit GetValue und SetValue kann "beliebig" auf Zellen zugegriffen werden:
- GETValue:
- Form: cc.CSharp.DataHelper.GetValue (dataRow, "Daten", rowNumber, (int) #offset#)
- Beispiel: (string) cc.CSharp.DataHelper.GetValue (dataRow, "Daten", rowNumber, (int) #offset#) holt Zeichenkette aus aktueller Zeile von #Daten#
- Man muss immer dazu sagen, was es vom weiter rechnen sein soll. Z.B.
- (System.DateTime) für DatumUhrzeit
- (int) für Ganzzahl, (double) für Zahl mit Kommastellen
- (string) für Texte
- SETVALUE:
- Form: cc.CSharp.DataHelper.SetValue (#wert#, dataRow, "Daten", rowNumber, (int) #offset#)
- Beispiel: cc.CSharp.DataHelper.SetValue (45, dataRow, "Daten", rowNumber, (int) 0) schreibt 45 in die aktuelle Zeile des Feldes #Daten#
- Gibt als Ergebnis boolschen Werte zurück Wahr/Falsch
| Ausgangssituation | Formel | Ergebnis |
|
In der Spalte 'Von' steht das Datum und die Uhrzeit . Es soll der Minutenabstand seit Beginn gerechnet werden. |
(#Von# - (System.DateTime) cc.CSharp.DataHelper.GetValue
(dataRow, "Von", 0, (int) 0)).TotalMinutes
|
Ergibt Minuten seit Beginn der Liste: zB 0, 1440 |
|
In der Spalte 'Von' steht das Datum und die Uhrzeit . Es soll der Minutenabstand seit X-Zeilen vorher gerechnet werden. Die konkrete Zahl soll von den Benutzern eingegeben werden können. |
rowNumber < #Zeilen vorher# || 0 > #Zeilen vorher# ? 0 : (#Von# - (System.DateTime) cc.CSharp.DataHelper.GetValue (dataRow, "Von", rowNumber, (int) -#Zeilen vorher#) ).TotalMinutes |
| Type | Beschreibung |
| System.Data.DataTable | Object Datenbanktabelle |
| System.Data.DataRow | Object Datenbankzeile |
| System.Data.DataColumn | Object Datenbankspalte |
| Funktion/Property | Rückgabewert | Beschreibung |
| dataRow.Table | System.Data.DataTable | Gibt die Datenbanktabelle der aktuellen Datenbankzeile zurück. |
| dataRow.Table.Rows.Count | Zahl | Gibt die Anzahl der Datenbankzeilen zurück. |
| dataRow.Table.Rows[i] | System.Data.DataRow | Gibt die i-te Zeile der Datenbanktabelle zurück. Die erste Zeilen hat den Zeilenindex 0. |
| dataRow.Table.Rows[i][j] | object | Gibt den Wert der Spalte j in der i-te Zeile zurück. Zeilen- und Spaltenindizes beginnen immer mit 0. Nachdem die Werte immer vom Typ object sind, müssen diese zur Weiterverarbeiten auf den richtigen Typen konvertiert werden.
System.Convert.ToDouble(dataRow.Table.Rows[0][3]) |
| dataRow.Table.Columns.Count | Zahl | Gibt die Anzahl der Datenbankspalten zurück. |
Beispiel: Auf Tabellenwerte über Objekt dataRow direkt zugreifen
| Formel | Beschreibung |
System.Convert.ToDouble(dataRow[3]) |
Double-Wert der vierten Spalte der aktuellen Zeile. Die Spaltenindizierung beginnt mit 0! Die Art der Konvertierung ist notwendig, weil dataRow[i] immer einen Datentyp object liefert. | </tr>
System.Convert.ToDouble(dataRow.Table.Rows[0][0]) |
Double-Wert der ersten Spalte in der ersten Zeile. Die Art der Konvertierung ist notwendig, weil dataRow.Table.Rows[i][j] immer einen Datentyp object liefert. ZB Liefert auf Datum/Uhrzeit Wert in erster Spalte #Von# und ABSTEIGEND sortierten Daten
die Zahl der Tage |
Zusatzfunktionen
Der Formeloperator bietet zusätzlich noch eigene Funktionalität
- Die Eingabe des Textes: string projectName liefert den Namen des Projektes als Text
- Die Eingabe des Textes: string folderName liefert den Namen des Ordners als Text
- Die Eingabe des Textes: string nodeName liefert den Namen des Knotens als Text
- Die Eingabe des Textes: rowNumber liefert die Zeilennummer als Ganzzahl (Achtung beginnend mit 0)
- Die Eingabe des Textes: rows liefert die Gesamtzahl der Zeilen
- Die Eingabe des Textes: cc.CSharp.DataHelper.GetValue (dataRow, "Daten", rowNumber, (int) #offset#) holt den Werte aus der Spalte "Daten" der um den Werte in offset versetzten Zeilen. Das int ist erforderlich, weil hier ganze Zahlen erforderlich sind. Also zB um 4 Zeilen früher. ACHTUNG: Wenn über die erste/letzte Zeile hinaus gegangen wird, wird der erste/letzte Wert genommen. - Falls ein anderer Wert genommen werden soll, müsste das vorher mit entsprechendem if then else abgefangen werden.
- Die Eingabe des Textes: cc.CSharp.DataHelper.SetValue (#wert#, dataRow, "Daten", rowNumber, (int) #offset#) SCHREIBT den Wert aus #wert# in die Spalte "Daten" der um den Wert in offset versetzten Zeilen. Ergebnis dieser Operation is boolean (0,1). Damit können mehrere Datenspalten gleichzeitig verändert werden.
Guter Editor für Formeloperator
Mit folgendem freien Editor Scite media:Scite_for_TIS.zip und den mitgelieferten Einstellungsdaten (HINWEIS: nur entzippen genügt, keine Installation erforderlich) wird das Editieren komplexer Ausdrücke sehr angenem unterstützt (inkl. der Vervollständigung von Schlüsselworten).
Falls man Unterstützung bei regulären Ausdrücken für Suchen und Ersetzen für Scite will, findet sich dafür hier Nützliches [1]
Erzeugen einer Ampel mittels Formel
- Ansatz: Textspalte erzeugen, in der ein HTML-Code, der auf Icons am Server zeigt, drinnen steht.
- Wichtig: Der Typ der Ergebnisspalte muss Text sein.
| Folgende Formel: |
#Anzahl# > 3.0 ? "<img src=images/Tree/Icons/bullet_ball_glass_red.gif>" : "<img src=images/Tree/Icons/bullet_ball_glass_green.gif>" |
| Bedeuted: |
| Wenn Werte in der Spalte Anzahl größer als 3.0 sind, wird eine rote Ampel, ansonsten eine grüne Ampel angezeigt. |
Abfangen von Null-Werten
|
Es soll geprüft werden, ob in bestimmter Stelle ein null-Wert steht (also ein Wert fehlt). Damit kann z.B. gesteuert werden, dass wenn der Wert fehlt, ein bestimmter Rechenschritt anders gemacht wird, als sonst. dataRow.Table.Rows[rowNumber][3] == System.DBNull.Value ? #Wert A# : #Wert B# Wenn in der Spalte 4 (Achtung: Zählung startet mit 0, daher hat die 4. Spalte die Nummer 3) kein Wert vorliegt, wird auf Wert A zurück gegriffen, sonst auf Wert B.
|
Erzeugung von Zufallszahlen
- Es braucht in jeder Zeile eigene Zahl (zB Wochennummer oder zB Satznummer Zeile - siehe Extras
- Dann wird bei jeder Neuberechnung eine neue Zufallszahl zwischen 0- und 100 generiert (Satznummer und Aktuelle Systemzeit dienen als Initialisierungswert)
- new System.Random((int)System.DateTime.Now.Ticks + (int)#Satznummer#).Next(100)</tt>
Suche
| Operator liefert Fehler und es ist unklar was es ist |
|
| Berechnung geht gar nicht oder Spalten verschwinden |
|
Editieren
| Formel wird voll unübersichtlich |
|
Gegenmassnahmen gegen "Formelwürste":
|
| Berechnung liefert falsches Ergebnis (Ganzzahl statt Komma!) |
|
| Berechnung liefert viel zu hohes Zahlenergebnis |
|
AUSGANGSSITUATION:
|
| Fehlermeldung: Input string was not in correct format |
|






