IWAN ist ab Version 3.1.0 in der Lage Filter auf Layer zu setzen. Zusammen mit LinkLayern ist somit einfach eine "Sicht" auf bestehende Daten möglich.
Die Abfragesprache dazu ist ein SQL ähnlicher Dialekt, genannt ISQL (Iwan-SQL). Die Möglichkeiten sind dabei natürlich nicht so umfangreich wie bei "richtigen" Datenbanken. Das ISQL Statement wird je nach tatsächlicher Datenquelle umgesetzt und bietet somit einen von der Datenquelle weitgehend unabhängigen Zugriff. Im Falle von der Ebene zugrunde liegenden Datenbanken wird das Statement nur leicht modifiziert an die Datenquelle durchgereicht, wodurch die Funktionen des originalen Datenspeichers genutzt werden können.
Die Ausdrücke werden z.B. für die Erstellung von Filtern an Shapedateien, ODBC-Quellen, Splinetexte oder bei der Ausführung von Selektionen verwendet.
ISQL Syntax
Die Syntax ähnelt wie oben angegeben dem SQL Standard. Eine Abfrage besteht aus den Teilen:
Der Ausdruck wird immer von einer vorgegeben Ebene ausgeführt. Diese Quelle wird dabei immmer als $SELF referenziert und muss in jedem Ausdruck vorhanden sein.
Die Auswahl von einzelnen Spalten wird z.Z. *nicht* untersützt. Um die syntaktische Gültigkeit des Ausdruck zu gewährleisten muss der ISQL Ausdruck immer mindestens einen Aufbau in der Form "SELECT MY.* FROM $SELF AS MY" haben.
Als besonderes Feature kann vor dem SELECT Ausdruck ein in Klammern gefasster Block mit weiteren Steuerinformationen vorhanden sein. Dabei handelt es sich um Argument=Werte Paaren welche durch ein Semikolon getrennt werden. Mögliche Parameter sind:
- ILFFILE
- OptimizeSQL
- COMPARENOCASE
- NEWPARSER (ab Version 4.0.0.60)
Die Parameter und Werte werde case-insensitiv ausgewertet. Die Werte müssen in einfachen Hochkommata angegeben werden.
ILFFile gibt den (relativen) Namen zu einer ILF Datei an. siehe "Symbolinformationen aus externen Quellen"
OptimizeSQL ist im Zusammenhang mit "JOIN" Angaben sinnvoll. Es wird dabei versucht, die SQL-Anweisung so zu modifizieren, dass nur noch für diese Operation wichtige Felder enthalten sind. Des Weiteren wird die Abfrage entsprechend dem internen Index sortiert. Damit kann u.U. eine Performancesteigerung erreicht werden.
Führen die Optimierungen zu einem Fehler, werden diese rückgängig gemacht, und die gleiche Operation mit dem Ausgangsausdruck ohne Optimierung wird wiederholt. Mögliche Werte sind true oder false
COMPARENOCASE legt fest wie Zeichenkettenvergleiche durchgeführt werden sollen. Mögliche Werte sind true oder false. Standard ist false.
NEWPARSER legt fest, ob beim Parsen des Statements der ab Version 4.0.0.60 neu entwickelte Parser verwendet werden soll. Mit diesem Parser kann innerhalb der WHERE-Klausel geklammert und somit der Vorrang vor anderen Tests geregelt werden. Weiterhin wurden seit der Version 4.0.0.60 Rangfolgen bei der Abarbeitung der logischen Verknüpfungen eingeführt. Hierbei hat ein AND einen höheren Stellenwert, als ein OR. Des Weiteren ist es möglich mehrere Geometrievergleiche innerhalb einer Abfrage zu tätigen. Es ist ebenfalls möglich innerhalb eines Stringvergleichs auf doppelte oder einfache Hochkommata zu testen, indem diese, wie bei üblichen SQL, doppelt hintereinander geschrieben werden. Mögliche Werte bei der Einstellung dieses Parameters sind true oder false. Der Standardwert bei Nichtverwendung ist false.
Externe Datenquellen
Der Zugriff auf maximal eine externe Datenquelle ist möglich. Der JOIN zwischen den Datenquellen erfolgt z.Z. immer als EQUI-Join. Die externe Datenquellen wird dabei primär durchlaufen. Die Verknüpfung ist auf jeweils eine Spalte beschränkt. Als externe Datenquellen kommen alle über ODBC verfügbaren Datenbanken in Frage.
Die externe Quelle wird dabei als String in folgender Definition referenziert:
ODBC-Verbindungzeichenfolge;SQL=\exterenesSttm\
Das externe SQL-Statement wird dabei durch die Zeichen "\" am Anfang und Ende maskiert. Der gesamte Ausdruck muss mit "AS" als Alias deklariert werden.
Der JOIN - Ausdruck findet sich als letztes Argument des ISQL Ausdruck in der Form:
JOIN ALIAS_1.SPALTE = ALIAS_2.SPALTE
Symbolinformationen aus externen Quellen
"Filter" können ebenfalls dazu benutzt werden die Symbolinformationen, Feld für Klassifikation oder Unique-Value, aus einer externen Datenbank zu beziehen. Dazu kann in einem "Filterausdruck" in Klammern am Anfang weitere Parameter gesetzt werden.
"ILFFILE", dort wird der (relative) Name zu einer ILF Datei erwartet.
Enthält der Filterausdruck eine "JOIN" Angabe, wird geprüft ob der in der angegebenen ILF Datei angegebene Feldname in der Shape oder Externen Datenquelle enthalten ist und die Zuweisung entsprechend durchgeführt.
Hinweis: Der Filter muss dabei nicht unbedingt über "WHERE" Angaben verfügen, daher hier die Hervorhebung mittels Hochkommata.
Ein Beispiel:
Go;
//wie im obigen Bsp. ein Filter
//mit Angabe einer ILF Datei zur Klassifikation
extSql="(ILFFILE='..\leg\my.ilf')SELECT MY.* FROM $SELF AS MY"
+",'DSN=ORA1;uid=user;pwd=passWd;SQL=\"+extSql+"\ AS ORATAB "
+"JOIN MY.ID = ORATAB.SHAPE_ID";
ret=ExecOld("AddTheLinkLayer",
theName:"GEM_WITH_MIDDLE_SIZE",
theLayer:"GEM_ALL",
theSymbol:25,
theFilter:sqlStmt);
End;
Filter mit Geometrien
In ISQL Ausdrücken kann neben Sachdatenabfragen auch auf die Geometrie der Datenquelle bezug genommen werden. Z.Z. ist pro Ausdruck nur eine Geometrie zulässig. Das Format der Geometrie ist [hier] beschrieben. Wird das Statement gegen einen Datenquelle eines Geodatenservers (PostgreSQL, SDO,...) abgesetzt wird dieser Ausdruck in einen SQL Statement passend zu der Datenbank umgesetzt. Der Geometrievergleich wird immer primär ausgeführt.
Go;
//eine Angabe für Selektion
//dieser Ausdruck könnte ebenso als Filter eingesetzt werden
//Sucht alle Gebäude, welche nicht in der angegeben Box liegen und
//bei welchen das Feld STRNAME mit "Fried" beginnt, mit "e" endet
//und dazwischen "stra" vorkommt
strGeom="gBox:5410554.985636|5658802.778980|5410974.569360|5659303.152116";
sql="SELECT MY.* FROM $SELF AS MY "
+" WHERE NOT MY.$GEOM = "+strGeom+" AND STRNAME LIKE 'Frie%stra%e'";
ret=ExecOld("ExecuteTheSelectionEx",
theLayer:"Gebaeude",
FetchGeo:false,
theStmt:sql);
End;
Komplexes Beispiel
Go;
//Laden einer "normalen" Shapedatei...
ret=ExecOld("AddTheShapeLayerA",
theName:"GEM_ALL",
theFile:"..\daten\gemeinde.shp",
theSymbol:12);
//auf diese Ebene wird eine Filter gelegt
//das Attribut "onlyInUserScope" definiert eine Sitzungsbezogen Gültigkeit
//der Ebene. Das Schlüsselwort $SELF bezieht sich dabei auf Felder der Shapedatei
//AREA ist dabei ein Sachdatenfeld in der zum Shape gehörenden DBF Datei
ret=ExecOld("AddTheLinkLayer",
theName:"GEM_WITH_MIDDLE_SIZE",
theLayer:"GEM_ALL",
theSymbol:25,
theFilter:"SELECT MY.* FROM $SELF AS MY WHERE AREA > 10 AND AREA < 100");
//auch diese Ebenen basiert auf GEM_ALL und wird mit einem Filter versehen
//diese Filter bezieht aber die Verknüpfung zu einer externen Datenquelle
sqlStmt="SELECT MY.* FROM $SELF AS MY,"
+"'DSN=ORA1;uid=user;pwd=passWd;SQL=\SELECT ID,NUTZUNG FROM TAB.TABLE1\'"
+" AS ORATAB "
+"WHERE "
+"ORATAB.NUTZUNG LIKE 'Acker' AND MY.AREA > 1000 "
+"JOIN MY.ID = ORATAB.SHAPE_ID";
ret=ExecOld("AddTheLinkLayer",
theName:"GEM_WITH_MIDDLE_SIZE",
theLayer:"GEM_ALL",
theSymbol:25,
theFilter:sqlStmt);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HINWEISE:
Wird die den Linklayern zugrunde liegende Ebene entladen, so
werden auch alle damit verknüpften Ebenen entladen.
ein Linklayer kann nur auf generische Ebenen zeigen welche nicht
im "UserScope" sind
durch die Angabe "OnlyInUserScope:true" wird jeder Filter für
jede neue Sitzung ausgeführt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
End;