Changeset 331
- Timestamp:
- 09/11/14 17:23:54 (10 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/import/alkis-functions.sql
r330 r331 18 18 19 19 -- 2014-09-04 Trigger-Funktion "delete_feature_kill()" angepasst: keine Tabelle "alkis_beziehungen" mehr. 20 21 -- 2014-09-11 Functions auskommentiert oder gelöscht, die "alkis_beziehungen" benötigen: 22 -- "alkis_mviews()", delete_feature_kill_vers07(), alkis_beziehung_inserted() 23 -- Trigger-Function "delete_feature_hist" durch aktuelle Version aus OSGeo4W ersetzt. 20 24 21 25 -- Table/View/Sequence löschen, wenn vorhanden … … 162 166 163 167 -- Ãbersicht erzeugen, die alle alkis_beziehungen mit den Typen der beteiligen ALKIS-Objekte versieht 168 /* 164 169 SELECT alkis_dropobject('alkis_mviews'); 165 170 CREATE FUNCTION alkis_mviews() RETURNS varchar AS $$ … … 191 196 END; 192 197 $$ LANGUAGE plpgsql; 198 */ 193 199 194 200 -- Indizes erzeugen … … 275 281 $$ LANGUAGE plpgsql; 276 282 283 -- Die folgende Trigger-Version kopiert aus OSGeo4W / apps / alkis-import, Datei:alkis-functions.sql 284 277 285 -- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen 278 286 -- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur … … 280 288 281 289 -- Löschsatz verarbeiten (MIT Historie) 290 -- context='update' => "endet" auf ÃŒbergebene Zeit setzen und anlass festhalten 282 291 -- context='delete' => "endet" auf aktuelle Zeit setzen 283 292 -- context='replace' => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen 284 293 CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 285 294 DECLARE 286 sql TEXT; 287 gml_id TEXT; 295 s TEXT; 296 alt_id TEXT; 297 neu_id TEXT; 298 beginnt TEXT; 288 299 endete TEXT; 289 300 n INTEGER; 290 301 BEGIN 291 302 NEW.context := lower(NEW.context); 292 gml_id := substr(NEW.featureid, 1, 16);293 294 303 IF NEW.context IS NULL THEN 295 304 NEW.context := 'delete'; 305 END IF; 306 307 -- TIMESTAMP weder in gml_id noch identifier verlÀÃlich. 308 -- also ggf. aus Datenbank holen 309 310 IF length(NEW.featureid)=32 THEN 311 alt_id := substr(NEW.featureid, 1, 16); 312 313 IF NEW.featureid<>NEW.replacedBy THEN 314 -- Beginnt-Datum aus Timestamp 315 beginnt := substr(NEW.featureid, 17, 4) || '-' 316 || substr(NEW.featureid, 21, 2) || '-' 317 || substr(NEW.featureid, 23, 2) || 'T' 318 || substr(NEW.featureid, 26, 2) || ':' 319 || substr(NEW.featureid, 28, 2) || ':' 320 || substr(NEW.featureid, 30, 2) || 'Z' 321 ; 322 END IF; 323 ELSIF length(NEW.featureid)=16 THEN 324 alt_id := NEW.featureid; 325 ELSE 326 RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.featureid, length(NEW.featureid); 327 END IF; 328 329 IF beginnt IS NULL THEN 330 -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist 331 -- => der Satz dessen 'endet' gesetzt werden muà 332 EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename 333 || ' WHERE gml_id=''' || alt_id || '''' 334 || ' AND endet IS NULL' 335 INTO beginnt; 336 END IF; 337 338 IF beginnt IS NULL THEN 339 IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN 340 RAISE NOTICE 'Kein Beginndatum fÃŒr Objekt % gefunden - ignoriert.', alt_id; 341 NEW.ignored := true; 342 RETURN NEW; 343 ELSE 344 RAISE EXCEPTION 'Kein Beginndatum fÃŒr Objekt % gefunden.', alt_id; 345 END IF; 296 346 END IF; 297 347 … … 308 358 END IF; 309 359 310 IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN 311 IF NEW.safetoignore = 'true' THEN 312 RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy; 313 NEW.ignored := true; 314 RETURN NEW; 360 IF length(NEW.replacedBy)=32 THEN 361 -- Beginnt-Datum aus Timestamp 362 IF NEW.featureid<>NEW.replacedBy THEN 363 endete := substr(NEW.replacedBy, 17, 4) || '-' 364 || substr(NEW.replacedBy, 21, 2) || '-' 365 || substr(NEW.replacedBy, 23, 2) || 'T' 366 || substr(NEW.replacedBy, 26, 2) || ':' 367 || substr(NEW.replacedBy, 28, 2) || ':' 368 || substr(NEW.replacedBy, 30, 2) || 'Z' 369 ; 370 END IF; 371 ELSIF length(NEW.replacedBy)<>16 THEN 372 RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.replacedBy, length(NEW.replacedBy); 373 END IF; 374 375 neu_id := NEW.replacedBy; 376 IF endete IS NULL THEN 377 -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist 378 -- => Enddatum fÃŒr vorherigen Satz 379 EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename 380 || ' WHERE gml_id=''' || NEW.replacedBy || '''' 381 || ' AND beginnt>''' || beginnt || '''' 382 || ' AND endet IS NULL' 383 INTO endete; 384 IF endete IS NULL AND length(NEW.replacedBy)=32 THEN 385 EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename 386 || ' WHERE gml_id=''' || substr(NEW.replacedBy, 1, 16) || '''' 387 || ' AND beginnt>''' || beginnt || '''' 388 || ' AND endet IS NULL' 389 INTO endete; 390 neu_id := substr(NEW.replacedBy, 1, 16); 391 END IF; 392 END IF; 393 394 IF alt_id<>substr(neu_id, 1, 16) THEN 395 RAISE NOTICE 'Objekt % wird durch Objekt % ersetzt.', alt_id, neu_id; 396 END IF; 397 398 IF endete IS NULL THEN 399 RAISE NOTICE 'Kein Beginndatum fÃŒr Objekt % gefunden.', NEW.replacedBy; 400 END IF; 401 402 IF endete IS NULL OR beginnt=endete THEN 403 RAISE EXCEPTION 'Objekt % wird durch Objekt % ersetzt (leere Lebensdauer?).', alt_id, neu_id; 404 END IF; 405 ELSIF NEW.context='update' THEN 406 endete := NEW.endet; 407 ELSE 408 RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'', ''replace'' oder ''update'' erwartet).', NEW.featureid, NEW.context; 409 END IF; 410 411 s := 'UPDATE ' || NEW.typename 412 || ' SET endet=''' || endete || '''' 413 || ',anlass=''' || coalesce(NEW.anlass,'000000') || '''' 414 || ' WHERE gml_id=''' || NEW.featureid || '''' 415 || ' AND beginnt=''' || beginnt || '''' 416 || ' AND endet IS NULL'; 417 EXECUTE s; 418 GET DIAGNOSTICS n = ROW_COUNT; 419 IF n=0 AND alt_id<>NEW.featureid THEN 420 s := 'UPDATE ' || NEW.typename 421 || ' SET endet=''' || endete || '''' 422 || ',anlass=''' || coalesce(NEW.anlass,'000000') || '''' 423 || ' WHERE gml_id=''' || alt_id || '''' 424 || ' AND beginnt=''' || beginnt || '''' 425 || ' AND endet IS NULL'; 426 EXECUTE s; 427 GET DIAGNOSTICS n = ROW_COUNT; 428 END IF; 429 430 IF n<>1 THEN 431 RAISE NOTICE 'SQL[%<>1]: %', n, s; 432 IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN 433 RAISE NOTICE '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 434 NEW.ignored := true; 435 RETURN NEW; 436 ELSIF n=0 THEN 437 EXECUTE 'SELECT endet FROM ' || NEW.typename || 438 ' WHERE gml_id=''' || alt_id || '''' || 439 ' AND beginnt=''' || beginnt || '''' 440 INTO endete; 441 442 IF NOT endete IS NULL THEN 443 RAISE NOTICE '%: Objekt bereits % untergegangen - ignoriert', NEW.featureid, endete; 315 444 ELSE 316 RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy;445 RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid; 317 446 END IF; 318 END IF; 319 320 IF length(NEW.replacedBy)=16 THEN 321 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 322 ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' || 323 ' ORDER BY beginnt DESC LIMIT 1' 324 INTO endete; 325 ELSE 326 -- replaceBy mit Timestamp 327 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 328 ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || '''' 329 INTO endete; 330 IF endete IS NULL THEN 331 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 332 ' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' || 333 ' ORDER BY beginnt DESC LIMIT 1' 334 INTO endete; 335 END IF; 336 END IF; 337 338 IF endete IS NULL THEN 339 IF NEW.safetoignore = 'true' THEN 340 RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy; 341 NEW.ignored := true; 342 RETURN NEW; 343 ELSE 344 RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy; 345 END IF; 346 END IF; 347 ELSE 348 RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context; 349 END IF; 350 351 sql := 'UPDATE ' || NEW.typename 352 || ' SET endet=''' || endete || '''' 353 || ' WHERE gml_id=''' || gml_id || '''' 354 || ' AND endet IS NULL' 355 || ' AND beginnt<''' || endete || ''''; 356 -- RAISE NOTICE 'SQL: %', sql; 357 EXECUTE sql; 358 GET DIAGNOSTICS n = ROW_COUNT; 359 IF n<>1 THEN 360 RAISE NOTICE 'SQL: %', sql; 361 IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN 362 RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 447 363 448 NEW.ignored := true; 364 449 RETURN NEW; 365 450 ELSE 366 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nureinem auf % gesetzt - Abbruch', NEW.featureid, n, endete;451 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 367 452 END IF; 368 453 END IF; … … 373 458 $$ LANGUAGE plpgsql; 374 459 375 -- "delete" und "replace" verarbeiten (OHNE Historie). Historische Objekte werden sofort gelöscht.376 -- Geaendert 2014-02-03 auf Vorschlag M.B. Krs. Unna377 378 -- 2014-08-27: Anpassung an vereinheitlichtes Datenbank-Schema.379 -- Wenn die Spalte gml_id im Format "character varying" (ohne LÀngenbegrenzung) angelegt wird,380 -- muss gezielt der ID-Teil vor dem Timestamp angesprochen werden.381 -- Zugriff auf die Spalte gml_id umgestellt von "=" auf "like".382 CREATE OR REPLACE FUNCTION delete_feature_kill_vers07() RETURNS TRIGGER AS $$383 DECLARE384 begsql TEXT;385 aktbeg TEXT;386 gml_id TEXT;387 BEGIN388 NEW.typename := lower(NEW.typename); -- Objektart = Tabellen-Name389 NEW.context := lower(NEW.context); -- Operation 'delete', 'replace' oder 'update'390 gml_id := substr(NEW.featureid, 1, 16); -- ID-Teil der gml_id, ggf. anhÀngender Timestamp abgeschnitten391 392 IF NEW.context IS NULL THEN393 NEW.context := 'delete'; -- default394 END IF;395 396 IF NEW.context='delete' THEN -- ersatzloses Löschen des Objektes397 398 -- In der Objekt-Tabelle399 EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%''';400 401 -- Beziehungen von und zu dem Objekt sind hinfaellig (zukÃŒnftig entfallend)402 EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || '''';403 404 --RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename;405 406 ELSE -- Ersetzen eines Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu).407 408 -- beginnt-Wert des aktuellen Objektes ermitteln409 begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL';410 EXECUTE begsql INTO aktbeg;411 412 -- Alte Objekte entfernen413 EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || '''';414 415 -- Beziehungen des alten Objektes entfernen, die aus frÃŒheren Importen stammen416 EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von like ''' || gml_id || '%'' AND import_id < (SELECT max(id) FROM import)';417 418 END IF;419 420 NEW.ignored := false;421 RETURN NEW;422 END;423 $$ LANGUAGE plpgsql;424 460 425 461 -- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle … … 459 495 460 496 -- BeziehungssÀtze aufrÀumen 497 /* 461 498 CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$ 462 499 BEGIN … … 465 502 END; 466 503 $$ LANGUAGE plpgsql; 504 */ 467 505 468 506 -
trunk/import/alkis-trigger-hist.sql
r215 r331 1 -- 2014-09-11 PostNAS 0.8 2 1 3 CREATE TRIGGER delete_feature_trigger 2 4 BEFORE INSERT ON delete … … 4 6 EXECUTE PROCEDURE delete_feature_hist(); 5 7 8 /* 6 9 CREATE TRIGGER insert_beziehung_trigger 7 AFTER INSERT ON alkis_beziehungen 8 FOR EACH ROW 9 EXECUTE PROCEDURE alkis_beziehung_inserted(); 10 AFTER INSERT ON alkis_beziehungen 11 FOR EACH ROW 12 EXECUTE PROCEDURE alkis_beziehung_inserted(); 13 */ -
trunk/import/alkis_PostNAS_schema.sql
r330 r331 130 130 -- B e z i e h u n g e n 131 131 -- ---------------------------------------------- 132 -- Zentrale Tabelle fuer alle Relationen im Buchwerk. ZukÃŒnftig e n t f a l l e n d.132 -- Zentrale Tabelle fuer alle Relationen im Buchwerk. Seit PostNAS 0.8 entfallen. 133 133 -- Die FremdschlÃŒssel 'beziehung_von' und 'beziehung_zu' verweisen auf die ID des Objekte (gml_id). 134 -- Das Feld 'gml_id' sollte daher in allen Tabellen indiziert werden.135 134 -- ZusÀtzlich enthÀlt 'beziehungsart' noch ein Verb fÃŒr die Art der Beziehung. 136 135 /* … … 4567 4566 SELECT AddGeometryColumn('ax_gemarkung','dummy',:alkis_epsg,'POINT',2); 4568 4567 4569 CREATE UNIQUE INDEX ax_gemarkung_gml ON ax_gemarkung USING btree (gml_id, beginnt); -- Index fÃŒr alkis_beziehungen4568 CREATE UNIQUE INDEX ax_gemarkung_gml ON ax_gemarkung USING btree (gml_id, beginnt); 4570 4569 CREATE INDEX ax_gemarkung_nr ON ax_gemarkung USING btree (land, gemarkungsnummer); -- Such-Index, Verweis aus ax_Flurstueck 4571 4570 -
trunk/import/konv_batch.sh
r330 r331 38 38 ## Entfernen der historischen Objekte nach Konvertierung. 39 39 ## 2014-09-09 F.J. krz: Parameter "--config PG_USE_COPY YES" zur Beschleunigung. Ausgabe import-Tabelle. 40 ## 2014-09-11 F.J. krz: Eintrag in import-Tabelle repariert. 41 ## Keine Abfrage des Symlinks auf kill/hist. Enstscheidend ist die aktuelle DB, nicht der Symlink 40 42 41 43 POSTNAS_HOME=$(dirname $0) … … 133 135 134 136 # Import Eintrag erzeugen 135 # UrsprÃŒnglich fÃŒr Trigger-Ste ierung benötigt. Nun als Metadaten nÃŒtzlich.136 psql $con -c "INSERT INTO import (datum,verzeichnis,importart) VALUES ('"$(date '+%Y-%m-%d %H:%M:%S')"','"${ORDNER}"','"${verarb}"');"137 # UrsprÃŒnglich fÃŒr Trigger-Steuerung benötigt. Nun als Metadaten nÃŒtzlich. 138 echo "INSERT INTO import (datum,verzeichnis,importart) VALUES ('"$(date '+%Y-%m-%d %H:%M:%S')"','"${ORDNER}"','"${verarb}"');" | psql $con 137 139 138 140 # Ordner abarbeiten … … 193 195 fi 194 196 195 if [ "$(readlink $POSTNAS_HOME/alkis-trigger.sql)" = "alkis-trigger-kill.sql" ]; then 196 197 # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert 198 echo "** delete-Tabelle enthaelt:" 199 psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";' 200 201 echo " delete-Tabelle loeschen:" 202 psql $con -c 'TRUNCATE table "delete";' 203 204 # Wenn die Datenbank MIT Historie geladen wurde, man diese aber gar nicht braucht, 205 # dann hinterher aufrÀumen der historischen Objekte 206 echo "** geendete Objekte entfernen:" 207 psql $con -c "SELECT alkis_delete_all_endet();" 208 209 fi 197 # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert 198 echo "** delete-Tabelle enthaelt:" 199 psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";' 200 201 echo " delete-Tabelle loeschen:" 202 psql $con -c 'TRUNCATE table "delete";' 203 204 #if [ "$(readlink $POSTNAS_HOME/alkis-trigger.sql)" = "alkis-trigger-kill.sql" ]; then 205 # AufrÀumen der historischen Objekte 206 # echo "** geendete Objekte entfernen:" 207 # psql $con -c "SELECT alkis_delete_all_endet();" 208 #fi 210 209 211 210 echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot" -
trunk/import/sichten.sql
r330 r331 30 30 -- 2014-01-31 Kommentar 31 31 -- 2014-02-06 nachmigration_aehnliche_anschriften 32 -- 2014-09-02 Die Tabelle "alkis_beziehungen" ÃŒberflÃŒssig machen. 33 -- Relationen nun direkt ÃŒber neue Spalten in den Objekttabellen. 32 -- 2014-09-02 Tabelle "alkis_beziehungen" ÃŒberflÃŒssig machen. Relationen nun ÃŒber Spalten in den Objekttabellen. 33 -- 2014-09-11 Neu: View "fehlersuche_namensanteile_je_blatt", substring(gml_id) bei Relation-Join, mehr "endet IS NULL" 34 35 -- ToDo: Einige Views sind sehr langsam geworden. Z.B. exp_csv welcher doppelverbindung verwendet. 36 -- Dadurch Export aus Bauchauskunft sehr langsam! 37 -- Derzeit provisorische Version von "doppelverbindung" (schnell aber nicht ganz korrrekt). 34 38 35 39 -- Bausteine fÃŒr andere Views: … … 50 54 -- DROP VIEW public.doppelverbindung; 51 55 56 /* -- korrekte Version, leider unertrÀglich langsam, z.B. beim Export von CSV aus der Auskunft 57 52 58 CREATE OR REPLACE VIEW public.doppelverbindung 53 59 AS 54 60 -- FS >istGebucht> Buchungstelle 55 SELECT f1.gml_id AS fsgml, -- gml_id FlurstÃŒck56 b1.gml_id AS bsgml, -- gml_id Buchungs57 0 AS ba_dien61 SELECT f1.gml_id AS fsgml, -- gml_id FlurstÃŒck 62 b1.gml_id AS bsgml, -- gml_id Buchungs 63 0 AS ba_dien 58 64 FROM ax_flurstueck f1 59 JOIN ax_buchungsstelle b1 ON f1.istgebucht = b1.gml_id65 JOIN ax_buchungsstelle b1 ON f1.istgebucht = substring(b1.gml_id,1,16) 60 66 UNION 61 67 -- FS >istGebucht> Buchungstelle <an< Buchungstelle 62 SELECT f2.gml_id AS fsgml, -- gml_id FlurstÃŒck63 b2.gml_id AS bsgml, -- gml_id Buchung - (herrschendes GB)64 dien.buchungsart AS ba_dien -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung68 SELECT f2.gml_id AS fsgml, -- gml_id FlurstÃŒck 69 b2.gml_id AS bsgml, -- gml_id Buchung - (herrschendes GB) 70 dien.buchungsart AS ba_dien -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung 65 71 FROM ax_flurstueck f2 66 JOIN ax_buchungsstelle dien ON f2.ist Gebucht = dien.gml_id67 JOIN ax_buchungsstelle b2 ON dien.gml_id = ANY (b2.an)68 WHERE dien.endet IS NULL; -- FÃŒr das zusÀtzliche Verbindungselement die Historie hierausschlieÃen,72 JOIN ax_buchungsstelle dien ON f2.istgebucht = substring(dien.gml_id,1,16) 73 JOIN ax_buchungsstelle b2 ON substring(dien.gml_id,1,16) = ANY (b2.an) -- auch "zu" ? 74 WHERE dien.endet IS NULL; -- FÃŒr das zusÀtzliche Verbindungselement die Historie HIER ausschlieÃen, 69 75 -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet. 76 */ 77 78 -- TEST: Schneller, wenn auf Subtring verzichtet wird? Ja! 79 -- Aber: Verbindungen ÃŒber aktualisierte, also lange ID's werden nicht gefunden. 80 CREATE OR REPLACE VIEW public.doppelverbindung 81 AS 82 -- FS >istGebucht> Buchungstelle 83 SELECT f1.gml_id AS fsgml, -- gml_id FlurstÃŒck 84 b1.gml_id AS bsgml, -- gml_id Buchungs 85 0 AS ba_dien 86 FROM ax_flurstueck f1 87 JOIN ax_buchungsstelle b1 ON f1.istgebucht = substring(b1.gml_id,1,16) 88 UNION 89 -- FS >istGebucht> Buchungstelle <an< Buchungstelle 90 SELECT f2.gml_id AS fsgml, -- gml_id FlurstÃŒck 91 b2.gml_id AS bsgml, -- gml_id Buchung - (herrschendes GB) 92 dien.buchungsart AS ba_dien -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung 93 FROM ax_flurstueck f2 94 JOIN ax_buchungsstelle dien ON f2.istgebucht = substring(dien.gml_id,1,16) 95 --JOIN ax_buchungsstelle b2 ON substring(dien.gml_id,1,16) = ANY (b2.an) -- korrekt 96 JOIN ax_buchungsstelle b2 ON dien.gml_id = ANY (b2.an) -- schnell 97 WHERE dien.endet IS NULL; -- Nur fÃŒr das zusÀtzliche Verbindungselement die Historie HIER ausschlieÃen, 98 -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet. 70 99 71 100 COMMENT ON VIEW public.doppelverbindung 72 IS 'ALKIS-Beziehung von FlurstÃŒck zu Buchung. UNION-Zusammenfassung des einfachen Falls mit direkter Buchung und des Falles mit Recht einer Buchungsstelle an einer anderen Buchungsstelle.'; 101 IS 'ALKIS-Beziehung von FlurstÃŒck zu Buchung. UNION-Zusammenfassung des einfachen Falls mit direkter Buchung und des Falles mit Recht einer Buchungsstelle an einer anderen Buchungsstelle. 102 Dies ist ausschlieÃlich gedacht zur Verwendung in anderen Views um diese einfacher zu machen.'; 103 104 /* Test zur Zeitmessung 105 106 SELECT dien.gml_id, herr.gml_id 107 FROM ax_buchungsstelle dien 108 JOIN ax_buchungsstelle herr ON dien.gml_id = ANY (herr.an) 109 WHERE dien.endet IS NULL AND herr.endet IS NULL 110 LIMIT 300; 111 -- 78 ms 112 113 SELECT dien.gml_id, herr.gml_id 114 FROM ax_buchungsstelle dien 115 JOIN ax_buchungsstelle herr ON substring(dien.gml_id,1,16) = ANY (herr.an) 116 WHERE dien.endet IS NULL AND herr.endet IS NULL 117 LIMIT 300; 118 -- 19454 ms 119 120 121 */ 73 122 74 123 -- Test-Ausgabe: Ein paar FÀlle mit "Recht an" 75 124 -- SELECT * FROM doppelverbindung WHERE ba_dien > 0 LIMIT 20; 76 125 -- Nach Umstellung auf PostNAS 0.8 - mit ANY() und Substring - sehr lange Antwortzeit in PG 8.4 77 126 78 127 -- Ein View, der die Verbindung von FlurstÃŒck zur StraÃentabelle fÃŒr zwei verschiedene FÀlle herstellt. … … 81 130 82 131 -- DROP VIEW public.flst_an_strasse; 83 84 132 CREATE OR REPLACE VIEW public.flst_an_strasse 85 133 AS … … 90 138 FROM ax_flurstueck fm -- FlurstÃŒck Mit 91 139 JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT 92 ON lm.gml_id= ANY (fm.weistauf)140 ON substring(lm.gml_id,1,16) = ANY (fm.weistauf) 93 141 JOIN ax_lagebezeichnungkatalogeintrag sm 94 ON lm.land=sm.land AND lm.regierungsbezirk=sm.regierungsbezirk AND lm.kreis=sm.kreis 95 WHERE lm.endet IS NULL -- Verbinder nicht Historisch142 ON lm.land=sm.land AND lm.regierungsbezirk=sm.regierungsbezirk AND lm.kreis=sm.kreis AND lm.gemeinde=sm.gemeinde AND lm.lage=sm.lage 143 WHERE lm.endet IS NULL AND fm.endet IS NULL -- nichts Historisches 96 144 UNION 97 145 -- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag … … 101 149 FROM ax_flurstueck fo -- FlurstÃŒck OHNE 102 150 JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE 103 ON lo.gml_id= ANY (fo.zeigtauf)151 ON substring(lo.gml_id,1,16) = ANY (fo.zeigtauf) 104 152 JOIN ax_lagebezeichnungkatalogeintrag so -- StraÃe OHNE 105 153 ON lo.land=so.land AND lo.regierungsbezirk=so.regierungsbezirk AND lo.kreis=so.kreis AND lo.gemeinde=so.gemeinde AND lo.lage=so.lage 106 WHERE lo.endet IS NULL ; -- Verbinder nicht Historisch154 WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches 107 155 108 156 COMMENT ON VIEW public.flst_an_strasse … … 184 232 FROM ax_flurstueck f -- FlurstÃŒck 185 233 JOIN doppelverbindung d -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von Buchung an Buchung 186 ON d.fsgml = f.gml_id 234 ON d.fsgml = f.gml_id 187 235 JOIN ax_gemarkung g -- entschlÃŒsseln 188 236 ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 189 237 JOIN ax_buchungsstelle s -- Buchungs-Stelle 190 ON d.bsgml = s.gml_id 238 ON d.bsgml = s.gml_id 191 239 JOIN ax_buchungsstelle_buchungsart b -- EnstschlÃŒsselung der Buchungsart 192 240 ON s.buchungsart = b.wert 193 241 JOIN ax_buchungsblatt gb -- Buchung >istBestandteilVon> Grundbuchblatt 194 ON gb.gml_id= s.istbestandteilvon242 ON substring(gb.gml_id,1,16) = s.istbestandteilvon 195 243 JOIN ax_buchungsblattbezirk z 196 244 ON gb.land=z.land AND gb.bezirk=z.bezirk 197 245 JOIN ax_namensnummer nn -- Blatt <istBestandteilVon< NamNum 198 ON gb.gml_id= nn.istbestandteilvon246 ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 199 247 JOIN ax_person p -- NamNum >benennt> Person 200 ON p.gml_id= nn.benennt248 ON substring(p.gml_id,1,16) = nn.benennt 201 249 LEFT JOIN ax_anschrift a 202 ON a.gml_id= ANY (p.hat)250 ON substring(a.gml_id,1,16) = ANY (p.hat) 203 251 204 252 -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen: … … 209 257 FROM ax_namensnummer r 210 258 JOIN ax_buchungsblatt gr 211 ON r.istbestandteilvon = gr.gml_id-- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)259 ON r.istbestandteilvon = substring(gr.gml_id,1,16) -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 212 260 WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft 213 261 ON rg.gml_id = gb.gml_id -- zum GB … … 292 340 ON s.buchungsart = b.wert 293 341 JOIN ax_buchungsblatt gb -- Buchung >istBestandteilVon> Grundbuchblatt 294 ON gb.gml_id= s.istbestandteilvon342 ON substring(gb.gml_id,1,16) = s.istbestandteilvon 295 343 JOIN ax_buchungsblattbezirk z 296 344 ON gb.land=z.land AND gb.bezirk=z.bezirk 297 345 JOIN ax_namensnummer nn -- Blatt <istBestandteilVon< NamNum 298 ON gb.gml_id= nn.istbestandteilvon346 ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 299 347 JOIN ax_person p -- NamNum >benennt> Person 300 ON p.gml_id= nn.benennt348 ON substring(p.gml_id,1,16) = nn.benennt 301 349 LEFT JOIN ax_anschrift a 302 ON a.gml_id= ANY (p.hat)350 ON substring(a.gml_id,1,16) = ANY (p.hat) 303 351 304 352 -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen: … … 309 357 FROM ax_namensnummer r 310 358 JOIN ax_buchungsblatt gr 311 ON r.istbestandteilvon = gr.gml_id-- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)312 WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft359 ON r.istbestandteilvon = substring(gr.gml_id,1,16) -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 360 WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft 313 361 ON rg.gml_id = gb.gml_id -- zum GB 314 362 … … 345 393 nn.beschriebderrechtsgemeinschaft 346 394 FROM ax_buchungsblatt gb 347 JOIN ax_namensnummer nn ON gb.gml_id= nn.istbestandteilvon395 JOIN ax_namensnummer nn ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 348 396 WHERE NOT nn.artderrechtsgemeinschaft IS NULL 349 397 AND gb.endet IS NULL AND nn.endet IS NULL -- Historie weglassen … … 435 483 f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen 436 484 FROM ax_flurstueck f 437 JOIN ap_pto p ON f.gml_id = ANY(p.dientzurdarstellungvon)438 WHERE f.endet IS NULL ;485 JOIN ap_pto p ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon) 486 WHERE f.endet IS NULL AND p.endet IS NULL; 439 487 -- TIPP: mit zusÀtzlichem LIMIT auftrufen! 440 488 … … 447 495 f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen 448 496 FROM ax_flurstueck f 449 LEFT JOIN ap_pto p ON f.gml_id = ANY(p.dientzurdarstellungvon)450 451 452 -- TIPP: mit zusÀtzlichem LIMIT auf trufen!497 LEFT JOIN ap_pto p ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon) 498 WHERE p.gml_id IS NULL 499 AND f.endet IS NULL; 500 -- TIPP: mit zusÀtzlichem LIMIT aufrufen! 453 501 454 502 COMMENT ON VIEW flstnr_ohne_manuelle_position … … 496 544 ON r.artderfestlegung = a.wert 497 545 LEFT JOIN ax_dienststelle d 498 ON r.land = d.land AND r.stelle =d.stelle546 ON r.land=d.land AND r.stelle=d.stelle 499 547 WHERE r.endet IS NULL AND d.endet IS NULL ; 500 548 … … 561 609 l.hausnummer 562 610 FROM ax_flurstueck f 563 JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id= ANY (f.weistauf)611 JOIN ax_lagebezeichnungmithausnummer l ON substring(l.gml_id,1,16) = ANY (f.weistauf) 564 612 JOIN ax_gemeinde g ON l.kreis=g.kreis AND l.gemeinde=g.gemeinde 565 613 JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage … … 623 671 FROM ax_person p 624 672 JOIN ax_namensnummer n -- Namennummer >benennt> Person 625 ON p.gml_id= n.benennt673 ON substring(p.gml_id,1,16) = n.benennt 626 674 JOIN ax_buchungsblatt g -- Namensnummer >istBestandteilVon> Grundbuch 627 ON n.istbestandteilvon = g.gml_id675 ON n.istbestandteilvon = substring(g.gml_id,1,16) 628 676 JOIN ax_buchungsblattbezirk b ON g.land = b.land AND g.bezirk = b.bezirk 629 677 JOIN ax_buchungsstelle s -- Buchungs-Stelle >istBestandteilVon> Grundbuch 630 ON s.istbestandteilvon = g.gml_id678 ON s.istbestandteilvon = substring(g.gml_id,1,16) 631 679 JOIN ax_buchungsstelle_buchungsart art 632 680 ON s.buchungsart = art.wert 633 681 JOIN ax_flurstueck f -- Flurstueck >istGebucht> Buchungs-Stelle 634 ON f.istgebucht = s .gml_id682 ON f.istgebucht = substring(s.gml_id,1,16) 635 683 JOIN ax_gemarkung k 636 684 ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer … … 685 733 FROM ax_person p 686 734 JOIN ax_namensnummer n -- Namennummer >benennt> Person 687 ON p.gml_id= n.benennt735 ON substring(p.gml_id,1,16) = n.benennt 688 736 JOIN ax_buchungsblatt g -- Namensnummer >istBestandteilVon> Grundbuch 689 ON n.istBestandteilVon = g.gml_id737 ON n.istBestandteilVon = substring(g.gml_id,1,16) 690 738 JOIN ax_buchungsblattbezirk b 691 739 ON g.land = b.land AND g.bezirk = b.bezirk 692 740 JOIN ax_buchungsstelle sh -- B-Stelle herr >istBestandteilVon> Grundbuch 693 ON sh.istbestandteilvon = g.gml_id-- herrschende Buchung741 ON sh.istbestandteilvon = substring(g.gml_id,1,16) -- herrschende Buchung 694 742 JOIN ax_buchungsstelle_buchungsart arth 695 743 ON sh.buchungsart = arth.wert 696 744 JOIN ax_buchungsstelle sd -- B-Stelle herr. >an/zu> B-Stelle dien. 697 ON (s d.gml_id =ANY(sh.an) OR sd.gml_id = ANY(sh.zu))745 ON (substring(sd.gml_id,1,16) = ANY(sh.an) OR substring(sd.gml_id,1,16) = ANY(sh.zu)) 698 746 JOIN ax_buchungsstelle_buchungsart artd 699 747 ON sd.buchungsart = artd.wert 700 748 JOIN ax_flurstueck f -- Flurstueck >istGebucht> B-Stelle dien 701 ON f.istgebucht = s d.gml_id749 ON f.istgebucht = substring(sd.gml_id,1,16) 702 750 JOIN ax_gemarkung k 703 751 ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer … … 722 770 FROM ax_gebaeude g 723 771 JOIN ax_lagebezeichnungmithausnummer l 724 ON l.gml_id = ANY(g.zeigtauf) 772 ON substring(l.gml_id,1,16) = ANY(g.zeigtauf) 773 WHERE g.endet IS NULL AND l.endet IS NULL 725 774 GROUP BY l.gml_id, l.gemeinde, l.lage, l.hausnummer 726 775 HAVING count(g.gml_id) > 1; … … 735 784 FROM ax_gebaeude g1 736 785 JOIN ax_lagebezeichnungmithausnummer l1 ON l1.gml_id = ANY(g1.zeigtauf) 737 WHERE g1.gml_id IN -- Subquery sucht GebÀude mit meherern Hausnummen 786 WHERE g1.endet IS NULL AND l1.endet IS NULL 787 AND g1.gml_id IN -- Subquery sucht GebÀude mit meherern Hausnummen 738 788 (SELECT g2.gml_id 739 789 FROM ax_gebaeude g2 740 JOIN ax_lagebezeichnungmithausnummer l2 ON l2.gml_id = ANY(g2.zeigtauf) 790 JOIN ax_lagebezeichnungmithausnummer l2 ON substring(l2.gml_id,1,16) = ANY(g2.zeigtauf) 791 WHERE g2.endet IS NULL AND l2.endet IS NULL 741 792 GROUP BY g2.gml_id 742 793 HAVING count(l2.gml_id) > 1) … … 754 805 FROM ax_buchungsstelle_buchungsart a 755 806 JOIN ax_buchungsstelle b ON a.wert = b.buchungsart 807 WHERE b.endet IS NULL 756 808 GROUP BY a.wert, a.bezeichner 757 809 ORDER BY a.wert, a.bezeichner; … … 772 824 JOIN doppelverbindung d -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von BS an BS 773 825 ON d.fsgml = f.gml_id 774 775 776 777 826 JOIN ax_buchungsstelle s -- Buchungs-Stelle 778 827 ON d.bsgml = s.gml_id 779 WHERE s.buchungsart = 2101; 780 781 782 828 WHERE s.buchungsart = 2101 AND f.endet IS NULL AND s.endet IS NULL; 783 829 784 830 COMMENT ON VIEW erbbaurechte_suchen … … 825 871 ON k.bezeichnung = o.unverschluesselt -- Gleiche Namen 826 872 JOIN ax_flurstueck fo -- Flurst. >zeigtAuf> Lage 827 ON o.gml_id= ANY(fo.zeigtauf)873 ON substring(o.gml_id,1,16) = ANY(fo.zeigtauf) 828 874 WHERE fo.gemeinde = k.gemeinde -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraÃenschlÃŒssel 875 AND k.endet IS NULL AND o.endet IS NULL AND fo.endet IS NULL 829 876 ORDER BY fo.gemarkungsnummer, fo.flurnummer, fo.zaehler, k.gemeinde, k.bezeichnung; 830 877 … … 841 888 a1.ort_post, a1.strasse AS strasse1, a2.strasse AS strasse2, a1.hausnummer 842 889 FROM ax_person p 843 JOIN ax_anschrift a1 ON a1.gml_id= ANY(p.hat)844 JOIN ax_anschrift a2 ON a2.gml_id= ANY(p.hat)890 JOIN ax_anschrift a1 ON substring(a1.gml_id,1,16) = ANY(p.hat) 891 JOIN ax_anschrift a2 ON substring(a2.gml_id,1,16) = ANY(p.hat) 845 892 WHERE a1.gml_id <> a2.gml_id 846 893 AND a1.ort_post = a2.ort_post … … 1011 1058 */ 1012 1059 1060 -- Anteile der Namensnummern am Blatt aufsummieren. 1061 -- BlÀtter mit RechtsverhÀltnis (Beschrieb) nicht beachten. 1062 -- Anzeigen, wenn die Summe nicht 1 ergibt. 1063 -- Keine Angabe in ZÀhler/Nenner wird als 1 gewertet. 1064 1065 -- Anlass zu dieser Auswertung war: 1066 -- Wenn mit PostNAS 0.8 und Trigger "kill" (ohne Historie) eine NBA-Abgabe mit Abgabeart "3100 fallbezogen (mit Historie)" 1067 -- konvertiert wird, dann wird Update nicht richtig verarbeitet. 1068 -- Update setzt z.B. das endet-Datum an einen Namensnummer. Alte Namen verbleiben auf dem Grundbuch. 1069 1070 CREATE OR REPLACE VIEW fehlersuche_namensanteile_je_blatt 1071 AS 1072 SELECT g.gml_id, g.bezirk || '-' || g.buchungsblattnummermitbuchstabenerweiterung AS kennzeichen, 1073 sum(coalesce(n.zaehler/n.nenner, 1.0))::double precision AS summe_der_anteile 1074 FROM ax_buchungsblatt g 1075 JOIN ax_namensnummer n ON substring(g.gml_id,1,16) = n.istbestandteilvon 1076 WHERE g.endet IS NULL AND n.endet IS NULL 1077 GROUP BY g.gml_id, g.bezirk || '-' || g.buchungsblattnummermitbuchstabenerweiterung 1078 HAVING sum(coalesce(n.zaehler/n.nenner, 1)) <> 1.0::double precision 1079 AND ( -- die FÀlle mit einer Rechtsgemeinschaft nicht verwenden 1080 SELECT gml_id 1081 FROM ax_namensnummer nr 1082 WHERE substring(g.gml_id,1,16) = nr.istbestandteilvon 1083 AND NOT nr.artderrechtsgemeinschaft IS NULL 1084 AND nr.endet IS NULL 1085 LIMIT 1 1086 ) IS NULL 1087 LIMIT 100; 1088 1089 COMMENT ON VIEW fehlersuche_namensanteile_je_blatt 1090 IS 'Suchen nach GB-BlÀttern bei denen die Summe der Anteile der Namensnummern nicht passt. 1091 Mit Ausnahme von RechtsverhÀltnissen sollte sie Summe der BrÃŒche immer 1/1 ergeben.'; 1013 1092 1014 1093 -- END -- -
trunk/mapbender/conf/alkisnav_conf.php
r330 r331 35 35 $ag_liste = "'2102','2105','2106','2107','2108','2110','2303','2307'"; 36 36 37 # Nur Personen anzeigen, die Eigentum in der Gemeinde (-liste) haben 38 # "true" setzt voraus, dass die Hilfstabelle "gemeinde_person" gefuellt ist 39 $persfilter=true; 40 41 # hausnummernohnegebaeude - sollen Hausnummern ohne Gebäude ausgegeben werden? 42 # 1 ja / 0 nein 43 $hausnummernohnegebaeude=1; 44 37 45 # Entwicklungsumgebung 38 46 $debug=0; // 0=Produktion, 1=mit Fehlermeldungen, 2=mit Informationen, 3=mit SQL
Note: See TracChangeset
for help on using the changeset viewer.