====== Berechnungen mit Visual Basic Script ====== Berechnungen mit Visual Basic Script werden in MIKE URBAN eingesetzt, um * mit der Feldberechnung (Field Calculator) Werte in einer Tabellenspalte zu berechnen, und * komplexere Beschriftungsausdrücke (Label) zu erstellen. Eine komplette Referenz bietet zB. das [[http://www.gruenthal.de/tutorial/vbscript/vbs229.htm|VBScript-Sprachverzeichnis]]. ===== Konvertierung ===== ===== Rundung ===== Siehe auch [[#FormatNumber]]! ==== Round ==== Gibt eine auf die angegebene Anzahl Dezimalstellen gerundete Zahl zurück. Lässt man die Anzahl der Dezimalstellen weg, wird auf ganze Zahlen gerundet. Round(Ausdruck[, AnzDezimalstellen]) Round([Laenge], 2) ^ Laenge ^ Ergebnis ^ | 47,224| 47,22| | 47,225| 47,22| | 47,226| 27,23| | 47,234| 47,23| | 47,235| 47,24| | 47,236| 47,24| Es wird nach wissenschaftlichen Prinzipien gerundet. Wenn beide Zahlen gleich weit entfernt sind, wird * abgerundet, wenn die letzte vebleibende Stelle gerade ist (47,225), und * aufgerundet, wenn die letzte verbleibende Stelle ungerade ist (47,235). Dadurch ist gewährleistet, dass der Mittelwert einer Datenmenge nach dem Runden gleich bleibt, weil im Mittel genauso oft auf- wie abgerundet wird. ===== Zeichenfolgen ===== ==== Left ==== Gibt eine bestimmte Anzahl von Zeichen ab dem ersten (linken) Zeichen einer Zeichenfolge zurück. Left(Zeichenfolge, Länge) ==== Mid ==== === Syntax === Gibt eine bestimmte Anzahl von Zeichen aus einer Zeichenfolge zurück. Mid(Zeichenfolge, Start[, Länge]) *//Start//: legt den Beginn des Ausschnitts fest. Das erste Zeichen der Zeichenfolge hat die Position 1! *//Länge//: Die Angabe der Länge ist optional. === Beispiel === Mid([Profil],4,Len([Profil])-5) ^Profil ^Ergebnis ^ |DN 80mm |80 | |DN 120mm |120 | ==== Right ==== Gibt eine bestimmte Anzahl von Zeichen vom rechten Teil (dem Ende) einer Zeichenfolge zurück. Right(Zeichenfolge, Länge) Right([EG],3) ^EG ^Ergebnis ^ |Catch_572 |572 | |Catchment_573 |573 | ==== Verkettung ==== Zeichenfolgen werden mit dem kaufmännischen **&** verkettet. "Ich bin mit " & "diesem Teil verkettet." **Ergebnis:** Ich bin mit diesem Teil verkettet. ==== Split ==== === Syntax === Teilt die Zeichenfolge anhand eines bestimmten Trennzeichens und gibt ein eindimensionales Datenfeld zurück, das alle Teilzeichenfolgen enthält. Split(Ausdruck, Trennzeichen) Weil das Ergebnis von Split nicht ein Einzelwert, sondern ein Datenfeld ist, muss man zusätzlich mit ''Index'' die Zeichenfolge an der gewünschten Position ansprechen.((Die längere, offizielle Version verwendet im Field Calculator die Option "Advanced" und lautet: 'Pre-Logic VBA Script Code Dim MeineZeichenfolge, MeinErgebnisfeld MeineZeichenfolge = [Haltung] MeinErgebnisfeld = Split(MeineZeichenfolge, " ") 'Ergebnis = MeinErgebnisfeld(1) )) Split(Ausdruck, Trennzeichen)(Index) * //Ausdruck//: zu teilende Zeichenfolge * //Trennzeichen//: einzelnes Zeichen, an dem geteilt werden soll * //Index//: gibt an, welcher Teil aus dem Datenfeld zurückgegeben werden soll. Beachten Sie, dass die erste Zeichenfolge den Index 0 trägt, die zweite Zeichenfolge den Index 1 etc. === Beispiel === Die Linke Spalte "Haltung" enthält Profiltyp, Höhe und Material, jeweils getrennt durch einen Unterstrich. Mit Split([Haltung], "_")(1) erhält man das Ergebnis: ^Haltung ^Ergebnis ^ |Kreis_300_STZ |300 | |Ei_750_Beton |750 | Mit Split([Haltung], "_")(2) erhält man das Ergebnis ^Haltung ^Ergebnis ^ |Kreis_300_STZ |STZ | |Ei_750_Beton |Beton | Eine Fehlermeldung im Stil\\ ''Error running VBA code : user interrupt.''\\ und dann \\ ''Index außerhalb des gültigen Bereichs: '[number: 1]''' \\ weist darauf hin, dass in einem Datensatz MeinDatenfeld(1) nicht berechnet werden konnte, z.B. wenn im obigen Beispiel die zweite Zeile nur "DN1000" enthalten würde. Umgehen Sie das Problem, indem Sie eine Auswahl mit den Datensätzen erstellen, die korrekt zerlegt werden können. ==== Replace ==== === Syntax === Gibt eine Zeichenfolge zurück, in der eine bestimmte Teilzeichenfolge durch eine andere Zeichenfolge so oft wie angegeben ersetzt wurde. Replace(Ausdruck, SuchZF, ErsetzenDurch[, Start[, Anzahl]]) * //Ausdruck//: zu durchsuchender Text * //SuchZF//: Suchzeichenfolge * //ErsetzenDurch//: Ersatzzeichenfolge * //Start// (optional; immer in Verbindung mit //Anzahl//): Position in //Ausdruck//, an der die Suche begonnen soll * //Anzahl// (optional; immer in Verbindung mit //Start//): Maximale Anzahl der Ersetzungen in //Ausdruck// === Beispiel 1 === Das folgende Beispiel ersetzt Leerzeichen im Feld MUID durch den Unterstrich. In der praktischen Anwendung braucht diese Berechnung einigermaßen lang, weil von der MUID abhängige Tabellen ebenfalls neu berechnet werden, daher mit Vorsicht und Umsicht anwenden! Replace([MUID] , " " , "_" ) === Beispiel 2 === Die linke Spalte enthält Höhenangaben als Text. Weil das Dezimaltrennzeichen in den Ländereinstellungen auf Komma gesetzt ist, muss der Punkt durch ein Komma erstetzt werden. Die rechte Spalte hat das Format Double. Die Berechnung besteht aus zwei Teilen. ''Mid()'' holt den Textteil ab der dritten Position, und ''Replace'' ersetzt den Punkt durch ein Komma. Replace(Mid([HoeheTxt],3) , "." , "," ) ^ HoeheTxt ^ Ergebnis ^ |H 855.08 | 855,08| |H 854.43 | 854,43| |H 1011.37 | 1011,37| ===== Zeichenfolgenformatierung ===== ==== FormatNumber ==== === Syntax === Gibt einen als Zahl formatierten Ausdruck zurück. FormatNumber(Ausdruck[,AnzDezimalen [,FolgendeNull [,NegativKlamer [,ZiffGruppe]]]]) * //Ausdruck//: zu formatierender Ausdruck * //AnzDezimalen// (optional): Anzahl der Dezimalstellen oder -2...Ländereinstellungen verwenden (Voreinstellung) * //FolgendeNull// (optional): Sollen Nullen nach dem Komma angezeigt werden? -1...Ja, 0...Nein, -2...Ländereinstellungen berücksichtigen (Voreinstellung) * //NegativKlammer// (optional): Sollen negative Werte in Klammer gesetzt werden? -1...Ja, 0...Nein, -2...Ländereinstellungen berücksichtigen (Voreinstellung) * //ZiffGruppe// (optional): Sollen Ziffern gruppiert werden? -1...Ja, 0...Nein, -2...Ländereinstellungen berücksichtigen (Voreinstellung) === Beispiel === Links stehen Durchflussmengen, rechts sieht man das Ergebnis mit zwei fixen Dezimalstellen, wie es beim Labeln des Lageplans angezeigt wird. FormatNumber([Durchfluss],2,-1) ^ Durchfluss ^ Ergebnis ^ | 41,9| 41,90| | 44,41| 44,41| | 47,225| 47,23| | 47,235| 47,24| FormatNumber hat wahrscheinlich nur beim Labeln Sinn. Zum Berechnen von Feldern taugt es nicht, weil in den numerischen Feldern ja nur der Wert gespeichert wird, nicht deren Darstellung. FIXME Runden testen