Monday, 17 March 2014

Punktfang und NULL Werte - Teil 2

Das Problem von heute morgen ist doch etwas anders gelagert als es auf den ersten Blick scheint. Hier eine Übersicht über unterschiedliche thematischen Regeln bzw. "Ausdrücke" und deren Ergebnis in Map und Oracle.

Ausgangsbedingungen:

- es gibt nur eine Regel im Layer
- Tabelle mit 6239 Datensätzen,
CREATION_CODE_XY_1    Anzahl
<null>                1222
2                        1
8                     5016   



Test 1 Regel: "NOT CREATION_CODE_XY_1 IN (8)"

Map-Ergebnis:
Objekte mit <null> werden dargestellt, aber Punktfang auf diese funktioniert nicht.
(Objekte mit z.B. CREATION_CODE_XY_1 = 2 werden dargestellt und Punktfang funktioniert).

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 not in (8);
COUNT(*)
--------
       1

Anmerkung:
- Map und Oracle liefern unterschiedliche Ergebnisse.
- merkwürdiger Nebeneffekt in Map - der Punktfang funktioniert nicht.

Was ist an dieser Stelle der Fehler? Das Map ein anderes Ergebnis liefert oder der fehlende Punktfang?

Fügt man jetzt eine thematische Regel ohne Ausdruck ("Standard") hinzu, setzt die Farbe des Symbols auf "keine"  und verschiebt die Regeln nach unten dann funktioniert auch der Objektfang (zusätzlich wird aber auch auf das "unsichtbare" Symbol gesnappt).
      
      
Test 2 - Regel: "CREATION_CODE_XY_1 <> 8"


Ergebnis:
Objekte mit <null> Wert werden nicht dargestellt.
(Objekte mit z.B. NOT CREATION_CODE_XY_1 = 2 werden dargestellt und Punktfang funktioniert).

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 <> 8;
COUNT(*)
--------
       1

Anmerkung:
- Map und Oracle liefern das gleiche Ergebnis
- der Unterschied im Ausdruck zwischen Test 1 und 2 ist minimal führt in Map aber zu einem ganz anderen Ergebnis


Test 3a - Regel: CREATION_CODE_XY_1  NULL   OR   NOT  CREATION_CODE_XY_1  IN ( 8 )

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 is null or creation_code_xy_1 not in (8);
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern gleiches Ergebnis
   
Test 3b - Regel : NOT  CREATION_CODE_XY_1  IN ( 8 ) OR  CREATION_CODE_XY_1  NULL

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL-Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 not in (8) or creation_code_xy_1 is null;
COUNT(*)
--------
    1223


Anmerkung:
- Map und Oracle liefern gleiches Ergebnis

 
Test 4a - Regel: CREATION_CODE_XY_1   NULL   OR   CREATION_CODE_XY_1   <> 8
 

Ergebnis:
Objekte mit <null> werden dargestellt, Punktfang funktioniert.

SQL Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 is null or creation_code_xy_1 <> 8;
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern gleiches Ergebnis   
   
Test 4b - Regel: CREATION_CODE_XY_1  <>8  OR  CREATION_CODE_XY_1  NULL 

Ergebnis:
Objekte mit <null> werden nicht dargestellt

SQL Ergebnis:
select count(*) from wdp_dp_punktelement where creation_code_xy_1 <> 8 or creation_code_xy_1 is null;
COUNT(*)
--------
    1223

Anmerkung:
- Map und Oracle liefern ein unterschiedliches Ergebnis, Reihenfolge des Ausdruckes beeinflusst Ergebniss in Map (nicht aber beim Test 3b, bei dem die neue Reihenfolge kein anderes Ergebnis zur Folge hatte).


Schlussfolgerungen:
- treten <null> Werte in den Daten auf ist besondere Aufmerksamkeit gefordert
- <null> Werte immer separat behandeln
- auf <null> immer mit den speziellen Ausdrücken testen (is null / is not null)
- Ergebnis mit Testdatensatz veifizieren
- Reihenfolge der Ausdrücke kann in Map das Ergebnis beeinflussen
- in Map führt Operator <> zu anderem Ergebnis als Operator (NOT) IN


Noch am Rande – folgende Ausdrücke wurden in einem DM verwendet. Der letzte als "Auffangregel" um auf "leere" Datensätze bei der Symbolart zu testen (die in der Regel <null> sind):

ID_SYMBOLART  =  15  AND  ID_FARBE  =  1
….
to_char(ID_SYMBOLART)  = '' AND ID_FARBE  =  1


Der Ausdruck führt ebenfalls dazu, dass der Punktfang nicht funktioniert. Der Ausdruck muss korrekt lauten:
NOT ID_SYMBOLART NULL AND ID_FARBE = 1


Map 2013, SP2

Snap does not work with some layers

Snapping doesn't work with some layers due to a bug in Map. The issue is related to thematic rules and <null> values. Here is an example -  there is only one rule which is defined as

NOT IS_EXTERNAL IN (1)

IS_EXTERNAL contains <null> values.

To get snapping to work again you need to:

- add a second rule which deals with <null> values (e.g. : IS_EXTERNAL  NULL)
- set colours for the symbol used in the second rule to "none" (symbol will not be drawn)
- move rule on lowest position in style-editor.



Snapping restored....

...by fiddling around with thematic rules.

The exact circumstances of the causes of the issue are not known to me.
Map 2013, SP2

Punktfang funktioniert für einige Layer nicht

Der Punktfang hat für einige Layer nicht funktioniert. 

Punktfang für Symbole funktioniert nicht.
Ursache ist ein Programmfehler. Dieser tritt scheinbar im Zusammenhang mit thematischer Darstellung und <null> Werten auf. Im Beispiel ist nur eine thematische Regel vorhanden, die wie folgt definiert ist:
 

NOT IS_EXTERNAL IN (1)

IS_EXTERNAL enthält auch <null> Werte.

Damit der Punktfang für diese Darstellung funktioniert muss man:

(1) eine weitere thematische Regel anlegen, die die  <null> Werte abfragt (z.B. : IS_EXTERNAL  NULL)

(2) die Farben des Symbols für diese Klasse jeweils auf "Keine" setzen, so dass effektiv kein Symbol gezeichnet wird.

(3) die thematische Klasse an die unterste Position schieben.


Thematische Regel ergänzen um Objektfang wiederherzustellen

Anschliessend funktioniert für die Objekte des Layers der Punktfang wieder.


Punktfang funktioniert wieder
Die genauen Umstände, wann das Problem im Zusammenhang mit <null> Werten auftritt sind mir nicht klar.

Map 2013, SP2

Thursday, 13 March 2014

Creating Security Role takes a very long time

We ran into the following issue: it was not possible to create a security role as the process took a long time and eventually we had to kill SecurityAdminitrator before it finished. Whilst the process is running SecurityAdministrator doesn't respond anymore and it looks like the application has crashed. But SecurityAdmin is just waiting that the following SQL statement finishes in Oracle:

insert into mdsys.sdo_geom_metadata_table(sdo_OWNER, sdo_table_name, sdo_column_name, sdo_DIMINFO, sdo_SRID) select 'WT_EW_05_INFO', s.synonym_name, m.column_name, m.DIMINFO, m.SRID from all_sdo_geom_metadata m, all_synonyms s where m.owner=s.table_owner and m.TABLE_NAME = s.TABLE_NAME and s.owner='WT_EW_05_INFO'

We had that issue with Oracle 11.2.0.3 on AIX.

Autodesk Support suggested using SQL Tuning Advisor to find a better execution plan. So we did and it resolved the issue. The security role is now created within seconds. Drawback is - you need an extra license for Oracle's Tuning Package (luckily we have one).  You need to use Enterprise Manager to run the advisor.


AutoCAD Map 2013, SP2




Gastdokument anlegen dauert extrem lange

Das Anlegen eines Gastdokumentes dauerte extrem lange (mehrere Stunden bevor wir abgebrochen haben). Während der Erstellung des Oracle Benutzers und dessen Einrichtung scheint der Sicherheits-Administrator wie abgestürzt und reagiert nicht mehr. In Oracle läuft jedoch folgende Anweisung:

insert into mdsys.sdo_geom_metadata_table(sdo_OWNER, sdo_table_name, sdo_column_name, sdo_DIMINFO, sdo_SRID) select 'WT_EW_05_INFO', s.synonym_name, m.column_name, m.DIMINFO, m.SRID from all_sdo_geom_metadata m, all_synonyms s where m.owner=s.table_owner and m.TABLE_NAME = s.TABLE_NAME and s.owner='WT_EW_05_INFO'

Wir hatten das Problem mit Oracle 11.2.0.3 unter AIX.

Der Vorschlag vom Autodesk Support war, über den Oracle SQL Tuning Advisor einen alternativen Ausführungsplan ermitteln zu lassen. Das hat bei uns das Problem auch behoben - nur benötigt man dafür  die separate Lizenz für das Tuning Paket (die wir auch haben).

Oracle ermittelt dabei Abfragen, die mit hohem Ressourcenverbrauch bzw. langer Laufzeit einhergehen und schlägt einen alternativen Ausführungsplan vor. Dieser kann dann gespeichert werden, so dass in Zukunft bei der gleichen Abfrage der optimierte Ausführungsplan zur Anwendung kommt. Die Einstellungen dafür muss man über den Enterprise Manager vornehmen.

Noch am Rande - die SELECT Anweisung im genannten Statement läuft ohne weiteres durch. Erst im Zusammenhang mit dem INSERT kommt es zur extrem langen Ausführungszeit. 


Map 2013, SP2

Tuesday, 18 February 2014

Calculation




Make sure that the name of a calculation has no trailing space when you create it. Otherwise you will get an error message when generating graphics – something along the lines:

Saving objects in cache failed.
Index out of range.

You need to open the layer file in an editor and delete the trailing space:

<CalculatedProperty>
      <Name>AL_ABSTLINIE_ID </Name>
to

<CalculatedProperty>
      <Name>AL_ABSTLINIE_ID</Name>

Map 2103. SP2

Berechnung




Enthält die Bezeichnung der Berechnung am Ende ein Leerzeichen gibt es eine Fehlermeldung beim Bildaufbau

Speichern der Objekte im Cache fehlgeschlagen.
Der eingegebene Index liegt außerhalb des Bereichs des Lesevorgangs.

Den Fehler kann man nur in der XML Datei beheben.

<CalculatedProperty>
      <Name>AL_ABSTLINIE_ID </Name>
zu
<CalculatedProperty>
      <Name>AL_ABSTLINIE_ID</Name>

Map 2013, SP2