Flur-Übersichtslayer ohne eigene Geometrie -- UPDATES auch bei Views

Aus kvwmap
Wechseln zu: Navigation, Suche

--Markus Hentschel 11:24, 3. Dez 2007 (CET)

Ich habe für Übersichtszwecke Layer geschaffen, die flurweise den Bearbeitungsstand in der sogenannten "Vormigration", den Stand der Erfassung der Gebäude in Folie 084 und den Stand der digitalen Nachweisdokumenterfassung anzeigen sollen. Diese Daten stehen alle in einer Postgis-Tabelle, wobei die Besonderheit ist, dass die Tabelle selbst keine eigene Geometrie besitzt, sondern the_geom aus den ALK-Tabellen des edbs2wkt-Konverters holt.

Damit der generische Layereditor richtig funktioniert, war es nötig, den Zugriff des Layers nicht auf die Tabelle, sondern auf einen entsprechenden View zu definieren. Damit über den generischen Layereditor auch Eingaben bzw. Änderungen vorgenommen werden können, musste schließlich zum View eine sogenannte Regel (rule) definiert werden.

Voraussetzung für das Gelingen in der Version 1.6.6 ist die Behebung eines Fehlers in zwei SQL-Abfragen, der in der Bug-Liste beschrieben wird.

Hier die Definition der Tabelle:

CREATE TABLE gd_flur_uebersichten
(
 flurnummer int4 NOT NULL,
 abgleich_laeuft varchar(30),
 abgleich_fertig varchar(30),
 vormigration varchar(30),
 folie084 varchar(30),
 anz_geb_084 varchar(30),
 risse_erfasst varchar(30)
) 
WITH OIDS;

Die aktuellen Flurnummern erhält man aus der Tabelle alknflur, z.B. über

select gemkgschl||flur as flurnummer from alknflur where flur != '000'

Die Definition des Views lautet dann:

CREATE OR REPLACE VIEW flur_uebersichten AS 
 SELECT o.objnr AS oid, o.objnr AS id, u.flurnummer, u.abgleich_laeuft, u.abgleich_fertig, u.vormigration, u.folie084, u.anz_geb_084, u.risse_erfasst, o.the_geom
 FROM gd_flur_uebersichten u, alknflur af, alkobj_e_fla o
 WHERE "substring"(u.flurnummer::text, 1, 6) = af.gemkgschl::text AND "substring"(u.flurnummer::text, 7, 3) = af.flur::text AND af.objnr::text = o.objnr::text;

Die Regel zu diesem View wird wie folgt erzeugt:

CREATE OR REPLACE RULE update_flur_uebersichten AS
 ON UPDATE TO flur_uebersichten
 DO INSTEAD  UPDATE gd_flur_uebersichten SET flurnummer = new.flurnummer, abgleich_laeuft = new.abgleich_laeuft, abgleich_fertig = new.abgleich_fertig, vormigration = new.vormigration, folie084 = new.folie084, anz_geb_084 = new.anz_geb_084, risse_erfasst = new.risse_erfasst
 WHERE gd_flur_uebersichten.flurnummer = old.flurnummer;
--Markus Hentschel 11:22, 14. Dez 2007 (CET) Diese Regel funktioniert, weil es für jede Flur bereits eine entsprechende Zeile in der Tabelle gd_flur_uebersichten gibt. Wie man vorgehen kann, wenn das UPDATE auf den View je nachdem entweder ein UPDATE oder ein INSERT ist, weil die entsprechende Tabelle nicht alle Datenzeilen schon vorhält, kann man am Beispiel der Bodendenkmale sehen.

Damit hat man datenbankseitig alles zusammen. Jetzt kann man Layer definieren, hier mal als Beispiel der Layer "Vormigration":

PFAD:
SELECT oid, flurnummer, abgleich_laeuft, abgleich_fertig, vormigration, the_geom
FROM flur_uebersichten
WHERE 1=1

DATA:
the_geom from flur_uebersichten as foo using unique oid using srid=2398

Die Classes für diesen Layer sehen so aus:

 INSERT INTO `classes` (`Class_ID`, `Name`, `Layer_ID`, `Expression`, `drawingorder`, `text`)
 VALUES
 (20404, 'keine Bearbeitung', 7012, '(''[abgleich_laeuft]'' eq '''' and ''[abgleich_fertig]'' eq '''' and ''[vormigration]'' eq '''') ', 10, NULL),
 (20269, 'Abgleich läuft', 7012, '(''[abgleich_laeuft]'' ne '''' and ''[abgleich_fertig]'' eq '''' and ''[vormigration]'' eq '''') ', 20, NULL),
 (20271, 'Abgleich fertig', 7012, '(''[abgleich_fertig]'' ne '''' and ''[vormigration]'' eq '''') ', 30, NULL),
 (20272, 'Vormigration', 7012, '(''[vormigration]'' ne '''') ', 40, NULL);

Damit das Ganze richtig läuft, müssen neben dem Alias im Attributeditor âuch die Einstellungen in der Layerattribut-Rechteverwaltung richtig gesetzt werden. Insbesondere muss - wenn der Layer bearbeitbar sein soll - das globale Recht auf "lesen und bearbeiten" gestellt sein - nicht auf "neue Datensätze erzeugen" oder gar "Datensätze erzeugen und löschen"! Dann sollten die jeweiligen Attribute, die bearbeitbar sein sollen, auf "editieren" eingestellt werden und the_geom auf "lesen".

Im Ergebnis kann man nach den Einträgen suchen, man kann auf die entsprechende Flur zoomen und man kann die Einträge ändern.