====== Import Export - Feldzuweisung ======
Nutzt man beim Import oder Export den Spezialeditor, stehen eine Reihe von Operationen zur Verfügung, um die Daten zu manipulieren. Jede Zeile im Spezialeditor entspricht einer Feldzuweisung zwischen externen Daten und MIKE URBAN.
===== Grundsätzlicher Aufbau =====
Eine Feldzuweisung sieht prizipiell immer so aus:
ZIEL = QUELLE
Bei einem //Datenimport// spielt MIKE URBAN die Rolle des Ziels. Die MIKE URBAN-Feldnamen stehen daher links vom Gleichheitszeichen, die Feldnamen der externen Daten stehen rechts vom Gleichheitszeichen.
Bei einem //Datenexport// spielt MIKE URBAN die Rolle der Quelle. Die MIKE URBAN-Feldnamen stehen daher rechts vom Gleichheitszeichen, die Feldnamen der externen Daten stehen links vom Gleichheitszeichen.
**Zahlen** werden ohne Anführungszeichen angeschrieben. Will man Kommastellen angeben, muss man einen DezimalPUNKT verwenden. Hier wird dem MIKE URBAN-Feld ''Demand'' der Wert ''1.5'' zugewiesen:
Demand = 1.5
**Text** wird unter einfache Anführungszeichen gesetzt. Hier wird dem MIKE URBAN-Feld ''DataSource'' der Text ''Netzdatenbank'' zugewiesen.:
DataSource = 'Netzdatenbank'
**Feldnamen** werden ohne Anführungszeichen angeschrieben. Hier wird dem MIKE URBAN-Feld ''Thickness'' der Inhalt des externen Feldes ''Wanddicke'' zugewiesen.
Thickness = Wanddicke
===== Operatoren =====
| + |Addition |
| - |Subtraktion |
| * |Multiplikation |
| / |Division |
Setzen Sie unbedingt Leerzeichen links und rechts der Operatoren. Im folgenden Beispiel wird der Befestigungsgrad in Prozent aus den absoluten Flächen berechnet:
ImpArea = 100 * ( Dach + Strasse ) / ( Dach + Strasse + Gruen )
Um ein Vorzeichen umzukehren, verwenden Sie nicht "minus...", sondern "Null minus...".
Im folgenden Beispiel sind die Entnahmen im externen Datensatz mit negativem Vorzeichen gespeichert, während MIKE URBAN ein positives Vorzeichen verwendet. Die dargestellte Feldzuweisung führt den Vorzeichenwechsel durch:
Demand = 0 - Entnahme
===== Klammern =====
Setzen Sie auf jeden Fall Klammern, wenn es auf die Reihenfolge der Operatoren ankommt! "Punktrechnung vor Strichrechnung" wird von MIKE URBAN nicht berücksichtigt, und selbst bei gleichrangigen Operatoren kann man Überraschungen erleben.
| ( |Klammer auf |
| ) |Klammer zu |
Im folgenden Beispiel wird der Quotient aus Dachfläche und Gesamtfläche gebildet und dann mit 100 multipliziert, um auf Prozentwerte zu kommen.
AISteep = ( DACHM2 / FLAECHEM2 ) * 100
Wenn Sie die Klammer weglassen, führt MIKE URBAN zuerst die Multiplikation aus und dann die Division, was zu völlig falschen Ergebnissen führt.
===== Kommentare =====
Zeilen werden zu Kommentaren, indem man ein Hash ''#'' voransetzt:
# Diese Zeile ist ein Kommentar.
#
# Auch Leerzeilen kann man durch einen Kommentar einfuegen.
Nach einem Ausdruck ist ein Kommentar nicht erlaubt. Die folgende Zeile würde beim Import falsch interpretiert oder gar nicht ausgeführt werden:
InvertLevel = Gelaende - Abstich # unzulaessiger Kommentar
Vermeiden Sie in den Kommentaren Umlaute etc. Spätestens wenn Sie die XML-Datei mit einem externen Editor öffnen und bearbeiten, können Sie in Schwierigkeiten kommen, weil die Zeichenkodierung nicht festgelegt ist.
===== Funktionen =====
==== Quadratwurzel ====
Width = sqrt(Area * 10000)
berechnet die mittlere SWMM-Einzugsgebietsbreite als Wurzel der Fläche [ha], wobei die Fläche zuerst in m2 umgerechnet wird.
==== Textbereinigung ====
MUID = RemoveSpaces(KnotenID)
konvertiert Wert in Text und entfernt alle Leerzeichen und Tabulatoren. Nützlich, wenn im Externen Datensatz am Anfang oder Ende der KnotenID Leerzeichen importiert werden würden.
==== Textverkettung ====
MUID = VonKnoten + '-' + NachKnoten
===== Bedingungen =====
Jede Feldzuweisung lässt sich durch 'WHERE ' mit Bedingungen verknüpfen.
Erlaubt sind die Vergleichsoperatoren
| = |gleich |
| <> |ungleich |
| < |kleiner |
| > |größer |
| %%<=%% |kleiner oder gleich |
| >= |größer oder gleich |
Es gibt offenbar keine Möglichkeit, mit einem Teil eines Textes zu vergleichen.
Innerhalb einer Feldzuweisung kann man Bedingungen mittels AND und OR kombinieren.
Die folgende Sequenz verwendet das Feld 'Layer', um einen Rohrdurchmesser zuzuweisen, was sehr praktisch ist, wenn man Daten aus AutoCAD-Zeichungen importiert.
Diameter = 30 WHERE Layer = '_WL_Bestand_DN_30'
Diameter = 40 WHERE Layer = '_WL_Bestand_DN_40'
Diameter = 50 WHERE Layer = '_WL_Bestand_DN_50'
Diameter = 60 WHERE Layer = '_WL_Bestand_DN_60'
Diameter = 75 WHERE Layer = '_WL_Bestand_DN_75'
Diameter = 80 WHERE Layer = '_WL_Bestand_DN_80'
Diameter = 100 WHERE Layer = '_WL_Bestand_DN_100'
Diameter = 125 WHERE Layer = '_WL_Bestand_DN_125'
Diameter = 150 WHERE Layer = '_WL_Bestand_DN_150'
Diameter = 200 WHERE Layer = '_WL_Bestand_DN_200'
Bedingungen durch UND verknüpfen:
DataTypeName = 'Water Level' WHERE (TypeNo = 100) AND (BcTypeNo = 1)
Will man mehrere Bedingungen durch ein ODER verknüpfen, schreibt man sie am besten in mehrere Zeilen:
# Schmutzwasser
NetTypeNo = 1 WHERE Kanalart = 'KS'
NetTypeNo = 1 WHERE Kanalart = 'DS'
# Regenwasser
NetTypeNo = 2 WHERE Kanalart = 'KR'
NetTypeNo = 2 WHERE Kanalart = 'DR'
# Mischwasser
NetTypeNo = 3 WHERE Kanalart = 'KM'
NetTypeNo = 3 WHERE Kanalart = 'DM'
Auf leere Felder prüfen:
# leeres Feld
... WHERE Feld = NULL
#
# nicht leeres Feld
... WHERE Feld <> NULL
===== Tabellen verknüpfen (LookUp) =====
Mittels ''LookUp'' kann man Werte aus einer anderen Tabelle einlesen.
LookUP("SuchTabelle","SuchSpalte",Eingangswert,"RückgabeSpalte")
Mit dem //Eingangswer//t wird in der "Suchspalte" der "Suchtabelle" nach einem passenden Wert gesucht. In der ersten Zeile mit einem Treffer wird der Wert aus der "Rückgabespalte" gelesen und an den LookUP zurückgegeben.
Als Suchtabelle kommt sowohl eine Quelltabelle in Frage, als auch eine bereits in MIKE URBAN vorhandene Tabelle.
Das folgende Beispiel zeigt den Import von Schächten, wenn keine Schachtsohle gegeben ist. LookUP geht mit der //SchachtID// in die Tabelle "Haltungen" und sucht in der Spalte "Schacht_oben" nach der abgehenden Haltung. Sobald die abgehende Haltung gefunden ist, wird in der gleichen Zeile der Wert in der Spalte "Rohsohle oben" zurückggegeben und in //InvertLevel// (das ist die Schachtsohle in MIKE URBAN) geschrieben. Falls es mehrere abgehende Haltungen mit unterschiedlichen "Rohrsohlen oben" gibt, könnte natürlich der falsche Wert erwischt werden!
InvertLevel = LookUP("Haltungen","Schacht_oben",SchachtID,"Rohrsohle_oben")
===== Datensätze löschen =====
Die folgenden Zeilen stehen am Ende einer Importroutine für Wasserbedarfsdaten. Mit einem ''LookUp'' wird geprüft, ob der Bedarf sich auf einen Knoten bezieht, der im Netz vorhanden ist. Wenn der Knoten nicht vorhanden ist, wird der Datensatz gelöscht, statt importiert.
Var_ExistingJunction = NULL
Var_ExistingJunction = LookUP("mw_Junction","MUID",JunctionID,"MUID")
DeleteRecord WHERE Var_ExistingJunction = NULL
Das ''WHERE'' nach dem ''DeleteRecord'' ist zwingend notwendig. Wenn Sie keine Bedingung benötigen, schreiben Sie
DeleteRecord WHERE 1=1
===== Meldungen abestzen =====
Mit dem Befehl Log() können Sie Meldungen in die Datei "all-utf8.log" schreiben, die Sie im folgenden Verzeichnis finden:((In Versionen vor 2009 befand sich diese Datei in "C:\Programme\Gemeinsame Dateien\DHI\", in den Versionen 2009 bis 2012 im Verzeichnis "C:\Dokumente und Einstellungen\\Lokale Einstellungen\Anwendungsdaten\DHI\<2009>\MIKE URBAN".))
MIKE URBAN 2016: c:\Users\\AppData\Local\DHI\2016\MIKE URBAN\all-utf8.log
MIKE URBAN 2014: c:\Users\\AppData\Local\DHI\2014\MIKE URBAN\all-utf8.log
Die Klammer muss ohne Abstand auf das ''Log()'' folgen, mit ''Log ()'' provozieren Sie eine Fehlermeldung!
Der folgende Befehl schreibt die aus Geländehöhe und Schachttiefe berechneten Schachtsohlen in die Log-Datei:
Invertlevel = Gelaende - Tiefe
Log(Gelaende - Tiefe)
Sie können sich mit ''Log()'' nur auf die externen Daten beziehen. Daher führt der folgende Befehl nicht zum gewünschten Ergebnis:
Invertlevel = Gelaende - Tiefe
Log(Invertlevel)
Falls eine globale Variable definiert wurde, könnten Sie aber folgendermaßen vorgehen:
Var1 = Gelaende - Tiefe
Log(Var1)
===== Offene Punkte =====
* Wie weist man einem Feld den Wert NULL zu? Mit Targetfield = NULL? Kann sinnvoll sein, um beispielsweise einen speziellen Wert in einer Shape-Datei, beispielsweise 9999 durch NULL zu ersetzen.