bstroebl / xplanplugin

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

Zweckbestimmungen für GenerischeObjekte bei Import übernehmen #6

Open swen100 opened 4 years ago

swen100 commented 4 years ago

Die Tabelle "FP_Sonstiges"."FP_GenerischesObjekt_zweckbestimmung" enthält nach dem Import keine Einträge, obwohl die Daten aus dem Ursprungs-XplanGML in die Import-Tabelle "fp_generischesobjekt_zweckbestimmung" (im Import-Schema) übernommen wurden.

Mit den beiden nachfolgenden SQL-Befehlen hat es bei mir geklappt (basierend auf einem Imort in das Schema "buxtehude").

INSERT INTO "FP_Sonstiges"."FP_ZweckbestimmungGenerischeObjekte" ("Bezeichner")
SELECT DISTINCT "value" FROM "buxtehude"."fp_generischesobjekt_zweckbestimmung";

INSERT INTO "FP_Sonstiges"."FP_GenerischesObjekt_zweckbestimmung"
SELECT c.gid, b."Code" FROM "buxtehude"."fp_generischesobjekt_zweckbestimmung" a 
JOIN "FP_Sonstiges"."FP_ZweckbestimmungGenerischeObjekte" b ON a.value = b."Bezeichner"
JOIN "XP_Basisobjekte"."XP_Objekt" c ON a.parent_id = c.gml_id;

Für die Einbindung in den Python-Code könnte das hier genommen werden. Allerdings weiß ich nicht, an welcher Stelle das am besten eingefügt werden sollte.

insertSql = "INSERT INTO \"FP_Sonstiges\".\"FP_ZweckbestimmungGenerischeObjekte\" (\"Bezeichner\") \
                SELECT DISTINCT \"value\" FROM " + importSchema + "\".fp_generischesobjekt_zweckbestimmung\"; \
                INSERT INTO \"FP_Sonstiges\".\"FP_GenerischesObjekt_zweckbestimmung\" \
                SELECT c.gid, b.\"Code\" FROM \"" + importSchema + "\".\"fp_generischesobjekt_zweckbestimmung\" a \
                JOIN \"FP_Sonstiges\".\"FP_ZweckbestimmungGenerischeObjekte\" b ON a.value = b.\"Bezeichner\" \
                JOIN \"XP_Basisobjekte\".\"XP_Objekt\" c ON a.parent_id = c.gml_id";

self.__impExecuteSql(insertSql)

Swen

bstroebl commented 4 years ago

Hallo, danke für das Ticket. Ich habe mich mit der Frage bereits beschäftigt, es ist leider nicht so einfach: Es geht generell um den Import von CodeList-Werten, die in vielen Objektarten auftreten. Um nicht jede CodeList individuell behandeln zu müssen (so wie in Ihrem Code), habe ich einen generischen Ansatz gewählt (noch nicht veröffentlicht), der über den Attributnamen feststellt, ob es sich um eine CodeList handelt, dann nachprüft, ob der neue Wert in der CodeList bereits voranden ist und wenn nicht, ihn darin anlegt. Dann kann das Objekt auf den CodeList-Wert referenzieren. Der Attributname zweckbestimmung bezeichnet leider nur beim generischen Objekt eine CodeList, bei sehr vielen anderen Objektarten aber eine abschließende Werteliste (Enumeration), wodurch der generische Ansatz an dieser Stelle durch eine individuelle Programmierung zu ergänzen ist. Also: Problem ist bekannt und bereits in Arbeit.