Notizen bei Bodendenkmalen vom LaKD -- UPDATE auf View

Aus kvwmap
Wechseln zu: Navigation, Suche

--Markus Hentschel 11:16, 14. Dez 2007 (CET)
Die Liste der eingetragenen Bodendenkmale ("rot") wird vom Landesamt für Kultur und Denkmalschutz (LaKD) per Shape zur Verfügung gestellt, siehe die Hinweise zum Einspielen. Unser Bearbeiter in der Kreisverwaltung möchte sich nun in kvwmap Notizen zur Wartung machen. Diese Notizen sollen natürlich nicht beim nächsten Update durch das LaKD verschwinden, sondern dauerhaft erhalten bleiben.

Lösung: Eine eigene Tabelle für die Wartungsnotizen. Für den Zugriff durch kvwmap ein View, der beide Tabellen verknüpft. Für Eintragungen in das Notizfeld über den generischen Layereditor eine entsprechende Regel für den View.

Und so gehts:

Zuerst die zusätzliche Tabelle für die Notizen. Problem bei den Daten vom LaKD ist, dass keine eindeutige laufende Nummer o.ä. vergeben wird, daher muss die Referenzierung über alle Attribute gehen. Das ist nicht eindeutig, da es teilweise mehrere Datensätze gibt, die dieselbe Gemarkung, dieselbe Fundplatznummer und dieselbe Objektbezeichnung aufweisen. Die Notiz wird dann für alle diese Objekte eingetragen, was nach Auskunft des Denkmalpflegers aber auch genau so gewollt ist. Die Definition der Tabelle kann z.B. so lauten:

CREATE TABLE gd_bodendenkm_rot_bemerk
(
  kreis varchar(25),
  gemarkung varchar(25),
  fundplatz int2,
  objekt varchar(30),
  wartung text
) 
WITH OIDS;

Der Zugriff von kvwmap auf die Bodendenkmale und die zugehörigen Notizen erfolgt über einen View. Der Name des Views ist hier bodendenkmal_rot. Die Definition kann z.B. so lauten:

SELECT br.oid, br.oid AS id, br.kreis, br.gemarkung, br.fundplatz, br.objekt, bw.wartung, br.the_geom
 FROM gd_lk_bodendenkm_rot br
 LEFT JOIN gd_bodendenkm_rot_bemerk bw ON br.gemarkung = bw.gemarkung AND br.fundplatz = bw.fundplatz AND br.objekt = bw.objekt
 ORDER BY area(br.the_geom) DESC;

gd_lk_bodendenkm_rot ist die Tabelle, die die Daten des LaKG enthält.

In kvwmap ist wartung ein Textfeld.

Damit der Bearbeiter Einträge machen kann, muss eine Regel für den View erzeugt werden. Die Regel leitet die Updates weiter an die Tabelle mit den Notizen. Die Schwierigkeit hier ist, dass es in dieser Notiztabelle bei einem Neueintrag noch gar keine entsprechende Datenzeile gibt, die geupdatet werden kann. Für diesen Fall müsste eigentlich ein INSERT durchgeführt werden. Ich habe das so gelöst, dass die Regel zweistufig arbeitet: sie löscht zunächst einen evtl. schon vorhandenen Eintrag und führ anschließend ein INSERT durch. So lautet die Definition der Rule:

CREATE OR REPLACE RULE update_bodendenkmal_rot AS
ON UPDATE TO bodendenkmal_rot
DO INSTEAD 
 (DELETE FROM gd_bodendenkm_rot_bemerk WHERE OLD.gemarkung=gemarkung AND OLD.fundplatz=fundplatz AND OLD.objekt=objekt;
  INSERT INTO gd_bodendenkm_rot_bemerk (kreis, gemarkung, fundplatz, objekt, wartung)
  VALUES (NEW.kreis, NEW.gemarkung, NEW.fundplatz, NEW.objekt, NEW.wartung);
 );

Wissenswertes zur Definition von Rules gibts z.B. auf der deutschen postgresql-Seite.