bstroebl / xplanplugin

QGIS Plugin for German standard XPlanung
GNU General Public License v2.0
3 stars 2 forks source link

Problem bei der Ausführung der SQL-Scripte #4

Open ralfkoenig opened 4 years ago

ralfkoenig commented 4 years ago

Sehr geehrter Herr Stroebl,

ich habe zur Ersteinrichtung einer Datenbank für die Stadtplanung unter PostgreSQL 11.6, compiled by Visual C++ build 1914, 64-bit

POSTGIS="2.5.3 r17699" [EXTENSION] PGSQL="110" GEOS="3.7.2-CAPI-1.11.0 3.7.2" PROJ="Rel. 4.9.3, 15 August 2016" GDAL="GDAL 2.2.4, released 2018/03/19" LIBXML="2.7.8" LIBJSON="0.12" LIBPROTOBUF="1.2.1" RASTER

das Script DB_User.sql problemlos ausgeführt.

Dann jeweils versucht, Ihr XP_Basisschema.sql auszuführen. Dieses endete jedoch für Zeile 784 mit folgender Fehlermeldung:

ERROR:  FEHLER:  Operator existiert nicht: character varying > integer
LINE 1: SELECT NEW."Code" > 1000000
HINT:  Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
QUERY:  SELECT NEW."Code" > 1000000
CONTEXT:  PL/pgSQL-Funktion "XP_Basisobjekte"."isCodeList"() Zeile 7 bei IF
SQL state: 42883

(Ich habe diese Zeile testweise geändert in ...'1000000'...)

Dann habe ich nach der problemlosen Ausführung der übrigen sql-Scripte das Script layer_styles_QGIS.sql ausgeführt.

Dieses endete mit verschiedenen Fehlermeldungen: (Die danach folgenden Fehlermeldungen wurden nach beschriebener Korrektur erzeugt)

ERROR:  FEHLER:  Syntaxfehler bei »P«
LINE 53023: ...itScale="0,0,0,0,0,0" fontSize="8.25" fieldName="'P & R'...
SQL state: 42601
Character: 2688187

(geändert in ="P & R")

ERROR:  FEHLER:  Syntaxfehler bei »Anschlussflaeche«
LINE 53037: ...itScale="0,0,0,0,0,0" fontSize="8.25" fieldName="'Anschlussf...
SQL state: 42601
Character: 2691110

(geändert in ="Anschlussflaeche")


ERROR:  FEHLER:  Syntaxfehler bei »Platz«
LINE 53051: ...itScale="0,0,0,0,0,0" fontSize="8.25" fieldName="'Platz'" na...
SQL state: 42601
Character: 2694029

(geändert in ="Platz")


ERROR:  FEHLER:  Syntaxfehler bei »P«
LINE 53095: ...SE WHEN  "zweckbestimmung" = 1000 THEN 'P'
&#x..

Haben Sie eine Idee, wie diese Fehler (insb. der letzte F.) vermieden werden kann? Sind die Korrekturvorschläge richtig ? Wo liegt mein Anwendungsfehler ? Welchen Link empfehlen Sie als Tutorial für die Anwendung Ihres Plugins unter QGIS ? Viele Grüße

bstroebl commented 4 years ago

Hallo Herr König, zunächst mal vielen Dank für die genauen Fehlerbeschreibungen. Aus

compiled by Visual C++

entnehme ich, dass Ihr Postgres-Server auf Windows läuft. Ich weiß, dass da manchmal Probleme auftreten, weiß aber weder, ob die PgSql-Syntax dort anders ist als unter Linux noch kann ich es testen. Der erste Fehler zeigt ein Problem mit doppelten und einfachen Anführungszeichen auf. Doppelte Anführungszeichen umschliessen hier einen Feldnamen mit Großschreibung "Code", während der Server dies offenbar als String interpretiert, obwohl Strings mit einfachen Anführungszeichen eingeschlossen werden. Ihr Fix sollte das Problem beheben, besser wäre natürlich, dass das Skript unverändert funktioniert. Ich vermute hier irgendeine Fehlinterpretation der einfachen und doppelten Anführungszeichen, evtl. auch ein Zeichenkodierungsproblem, ebenso wie bei den Fehlern mit den Stilen. Wie führen Sie die SQL-Skripte aus? Die Skripte sind UTF-8 kodiert, Ihre Datenbank sollte das auch sein.

auf github finden Sie das Schulungspaper der letzten FOSSGIS, das eine Einführung enthält.

ralfkoenig commented 4 years ago

Sehr geehrter Herr Stroebl, vielen Dank für die Hinweise.

Die DB habe ich als UTF-8 eingerichtet. Insofern dürfte es von dieser Seite her kein Problem geben.

Die o.g. Zeile 53095 habe ich auf

<property key="labeling/fieldName" value="CASE WHEN &quot;zweckbestimmung&quot; = 1000 THEN "P&#xd;&#xa;" ELSE "&#xd;&#xa;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1200 THEN "V&#xd;&#xa;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1300 THEN "RF&#xd;&#xa;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1400 THEN "R&#xd;&#xa;&#x9;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1500 THEN "FW&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;ELSE&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1600 THEN "AF&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1700 THEN "Br&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 1800 THEN "D&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; IN (2000,2200) THEN "Anschlussflaeche&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" ELSE "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" CASE WHEN &quot;zweckbestimmung&quot; = 2100 THEN "Platz&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;&#x9;" END "&#xd;&#xa;&#x9;&#x9;" END "&#xd;&#xa;&#x9;" END &#xd;&#xa;" END "/>

geändert. Zumindest lief das Script dann reibungslos durch. Ich werde mir bei näherer Beschäftigung mit Ihrem vorgenannten Tutorial ansehen, ob die daraus entstandene Symbologie plausibel erscheint und mich dann ggf. gesondert melden.

Viele Grüße

tschuettenberg commented 4 years ago

Hallo! Die genannten Fehler stammen alle aus dem Layerstil zu BP_Verkehr.BP_VerkehrsFlaecheBesondererZweckbestimmungFlaeche


ERROR:  FEHLER:  Syntaxfehler bei »P«
LINE 53095: ...SE WHEN  &quot;zweckbestimmung&quot; = 1000 THEN 'P'&#xd;&#x..

Hier geht es um Strings, die in einfache Anführungszeichen zu setzten sind. Entsprechend der Syntax der anderen Stile benötigen diese als escape character ein zusätzliches einfaches Anführungszeichen, also: CASE WHEN &quot;zweckbestimmung&quot; = 1000 THEN ''P''&#xd;&#xa; und so weiter.

P.S. Die drei erstgenannten Fehler betreffen wie schon gesagt Feldnamen und haben daher die einfachen Anführungszeichen zu viel. Beste Grüße