Changeset 331 for trunk/import


Ignore:
Timestamp:
09/11/14 17:23:54 (10 years ago)
Author:
frank.jaeger
Message:

Kleinere Korrekturen an den Import-Scripten.

Location:
trunk/import
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/import/alkis-functions.sql

    r330 r331  
    1818 
    1919-- 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. 
    2024 
    2125-- Table/View/Sequence löschen, wenn vorhanden 
     
    162166 
    163167-- Übersicht erzeugen, die alle alkis_beziehungen mit den Typen der beteiligen ALKIS-Objekte versieht 
     168/* 
    164169SELECT alkis_dropobject('alkis_mviews'); 
    165170CREATE FUNCTION alkis_mviews() RETURNS varchar AS $$ 
     
    191196END; 
    192197$$ LANGUAGE plpgsql; 
     198*/ 
    193199 
    194200-- Indizes erzeugen 
     
    275281$$ LANGUAGE plpgsql; 
    276282 
     283-- Die folgende Trigger-Version kopiert aus  OSGeo4W / apps / alkis-import, Datei:alkis-functions.sql 
     284 
    277285-- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen 
    278286-- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur 
     
    280288 
    281289-- Löschsatz verarbeiten (MIT Historie) 
     290-- context='update'        => "endet" auf ÃŒbergebene Zeit setzen und anlass festhalten 
    282291-- context='delete'        => "endet" auf aktuelle Zeit setzen 
    283292-- context='replace'       => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen 
    284293CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 
    285294DECLARE 
    286         sql TEXT; 
    287         gml_id TEXT; 
     295        s TEXT; 
     296        alt_id TEXT; 
     297        neu_id TEXT; 
     298        beginnt TEXT; 
    288299        endete TEXT; 
    289300        n INTEGER; 
    290301BEGIN 
    291302        NEW.context := lower(NEW.context); 
    292         gml_id      := substr(NEW.featureid, 1, 16); 
    293  
    294303        IF NEW.context IS NULL THEN 
    295304                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; 
    296346        END IF; 
    297347 
     
    308358                END IF; 
    309359 
    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; 
    315444                        ELSE 
    316                                 RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy; 
     445                                RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid; 
    317446                        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 
    363448                        NEW.ignored := true; 
    364449                        RETURN NEW; 
    365450                ELSE 
    366                         RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 
     451                        RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 
    367452                END IF; 
    368453        END IF; 
     
    373458$$ LANGUAGE plpgsql; 
    374459 
    375 -- "delete" und "replace" verarbeiten (OHNE Historie). Historische Objekte werden sofort gelöscht. 
    376 -- Geaendert 2014-02-03 auf Vorschlag M.B. Krs. Unna 
    377  
    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 DECLARE 
    384         begsql TEXT; 
    385         aktbeg TEXT; 
    386         gml_id TEXT; 
    387 BEGIN 
    388         NEW.typename := lower(NEW.typename); -- Objektart = Tabellen-Name 
    389         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 abgeschnitten 
    391  
    392         IF NEW.context IS NULL THEN 
    393                 NEW.context := 'delete'; -- default 
    394         END IF; 
    395  
    396         IF NEW.context='delete' THEN -- ersatzloses Löschen des Objektes 
    397  
    398           -- In der Objekt-Tabelle 
    399                 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 ermitteln 
    409                 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 entfernen 
    413                 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 stammen 
    416                 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; 
    424460 
    425461-- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle 
     
    459495 
    460496-- BeziehungssÀtze aufrÀumen 
     497/* 
    461498CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$ 
    462499BEGIN 
     
    465502END; 
    466503$$ LANGUAGE plpgsql; 
     504*/ 
    467505 
    468506 
  • trunk/import/alkis-trigger-hist.sql

    r215 r331  
     1-- 2014-09-11 PostNAS 0.8 
     2 
    13CREATE TRIGGER delete_feature_trigger  
    24        BEFORE INSERT ON delete  
     
    46        EXECUTE PROCEDURE delete_feature_hist(); 
    57 
     8/* 
    69CREATE 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  
    130130-- B e z i e h u n g e n 
    131131-- ---------------------------------------------- 
    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. 
    133133-- 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. 
    135134-- ZusÀtzlich enthÀlt 'beziehungsart' noch ein Verb fÃŒr die Art der Beziehung. 
    136135/* 
     
    45674566SELECT AddGeometryColumn('ax_gemarkung','dummy',:alkis_epsg,'POINT',2); 
    45684567 
    4569 CREATE UNIQUE INDEX ax_gemarkung_gml ON ax_gemarkung USING btree (gml_id, beginnt);         -- Index fÃŒr alkis_beziehungen 
     4568CREATE UNIQUE INDEX ax_gemarkung_gml ON ax_gemarkung USING btree (gml_id, beginnt); 
    45704569CREATE INDEX ax_gemarkung_nr         ON ax_gemarkung USING btree (land, gemarkungsnummer); -- Such-Index, Verweis aus ax_Flurstueck 
    45714570 
  • trunk/import/konv_batch.sh

    r330 r331  
    3838##                   Entfernen der historischen Objekte nach Konvertierung. 
    3939##   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 
    4042 
    4143POSTNAS_HOME=$(dirname $0) 
     
    133135 
    134136# Import Eintrag erzeugen 
    135 # UrsprÃŒnglich fÃŒr Trigger-Steierung 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 
    137139 
    138140# Ordner abarbeiten 
     
    193195  fi 
    194196 
    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 
    210209 
    211210  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot" 
  • trunk/import/sichten.sql

    r330 r331  
    3030--  2014-01-31 Kommentar 
    3131--  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). 
    3438 
    3539-- Bausteine fÃŒr andere Views: 
     
    5054--           DROP VIEW public.doppelverbindung; 
    5155 
     56/*  -- korrekte Version, leider unertrÀglich langsam, z.B. beim Export von CSV aus der Auskunft 
     57 
    5258CREATE OR REPLACE VIEW public.doppelverbindung 
    5359AS 
    5460  -- FS >istGebucht> Buchungstelle 
    55   SELECT f1.gml_id             AS fsgml,    -- gml_id FlurstÃŒck 
    56          b1.gml_id             AS bsgml,    -- gml_id Buchungs 
    57          0                     AS ba_dien 
     61  SELECT f1.gml_id              AS fsgml,    -- gml_id FlurstÃŒck 
     62         b1.gml_id              AS bsgml,    -- gml_id Buchungs 
     63         0                      AS ba_dien 
    5864    FROM ax_flurstueck f1 
    59     JOIN ax_buchungsstelle b1   ON f1.istgebucht = b1.gml_id 
     65    JOIN ax_buchungsstelle b1   ON f1.istgebucht = substring(b1.gml_id,1,16) 
    6066 UNION 
    6167  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle 
    62   SELECT f2.gml_id              AS fsgml,   -- gml_id FlurstÃŒck 
    63          b2.gml_id              AS bsgml,   -- gml_id Buchung - (herrschendes GB) 
    64          dien.buchungsart       AS ba_dien  -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung 
     68  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 
    6571    FROM ax_flurstueck f2 
    66     JOIN ax_buchungsstelle dien ON f2.istGebucht = dien.gml_id 
    67     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 hier ausschließ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,  
    6975                               -- 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.   
     80CREATE OR REPLACE VIEW public.doppelverbindung 
     81AS 
     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. 
    7099 
    71100COMMENT 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. 
     102Dies ist ausschließlich gedacht zur Verwendung in anderen Views um diese einfacher zu machen.'; 
     103 
     104/* Test zur Zeitmessung 
     105 
     106SELECT dien.gml_id, herr.gml_id 
     107FROM ax_buchungsstelle dien  
     108JOIN ax_buchungsstelle herr  ON dien.gml_id = ANY (herr.an) 
     109WHERE dien.endet IS NULL AND herr.endet IS NULL 
     110LIMIT 300; 
     111-- 78 ms 
     112 
     113SELECT dien.gml_id, herr.gml_id 
     114FROM ax_buchungsstelle dien  
     115JOIN ax_buchungsstelle herr  ON substring(dien.gml_id,1,16) = ANY (herr.an) 
     116WHERE dien.endet IS NULL AND herr.endet IS NULL 
     117LIMIT 300; 
     118-- 19454 ms 
     119 
     120 
     121*/ 
    73122 
    74123-- Test-Ausgabe: Ein paar FÀlle mit "Recht an" 
    75124--   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 
    77126 
    78127-- Ein View, der die Verbindung von FlurstÃŒck zur Straßentabelle fÃŒr zwei verschiedene FÀlle herstellt. 
     
    81130 
    82131--           DROP VIEW public.flst_an_strasse; 
    83  
    84132CREATE OR REPLACE VIEW public.flst_an_strasse 
    85133AS 
     
    90138    FROM ax_flurstueck fm                    -- FlurstÃŒck Mit 
    91139    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)   
    93141    JOIN ax_lagebezeichnungkatalogeintrag sm 
    94       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  
    95    WHERE lm.endet IS NULL                    -- Verbinder nicht Historisch 
     142      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 
    96144 UNION 
    97145  -- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag 
     
    101149    FROM ax_flurstueck fo                    -- FlurstÃŒck OHNE 
    102150    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)   
    104152    JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE 
    105153      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 Historisch 
     154   WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches 
    107155 
    108156COMMENT ON VIEW public.flst_an_strasse  
     
    184232  FROM ax_flurstueck    f               -- FlurstÃŒck 
    185233  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 
    187235  JOIN ax_gemarkung g                   -- entschlÃŒsseln 
    188236    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer  
    189237  JOIN ax_buchungsstelle s              -- Buchungs-Stelle 
    190     ON d.bsgml = s.gml_id  
     238    ON d.bsgml = s.gml_id 
    191239  JOIN ax_buchungsstelle_buchungsart b  -- EnstschlÃŒsselung der Buchungsart 
    192240    ON s.buchungsart = b.wert  
    193241  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt 
    194     ON gb.gml_id = s.istbestandteilvon 
     242    ON substring(gb.gml_id,1,16) = s.istbestandteilvon 
    195243  JOIN ax_buchungsblattbezirk z  
    196244    ON gb.land=z.land AND gb.bezirk=z.bezirk  
    197245  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum 
    198     ON gb.gml_id = nn.istbestandteilvon 
     246    ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 
    199247  JOIN ax_person p                      -- NamNum >benennt> Person  
    200     ON p.gml_id = nn.benennt 
     248    ON substring(p.gml_id,1,16) = nn.benennt 
    201249  LEFT JOIN ax_anschrift a  
    202     ON a.gml_id = ANY (p.hat) 
     250    ON substring(a.gml_id,1,16) = ANY (p.hat) 
    203251 
    204252  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen: 
     
    209257       FROM ax_namensnummer r  
    210258       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)  
    212260      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft 
    213261   ON rg.gml_id = gb.gml_id  -- zum GB 
     
    292340    ON s.buchungsart = b.wert  
    293341  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt 
    294     ON gb.gml_id = s.istbestandteilvon 
     342    ON substring(gb.gml_id,1,16) = s.istbestandteilvon 
    295343  JOIN ax_buchungsblattbezirk z  
    296344    ON gb.land=z.land AND gb.bezirk=z.bezirk  
    297345  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum 
    298     ON gb.gml_id = nn.istbestandteilvon 
     346    ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 
    299347  JOIN ax_person p                      -- NamNum >benennt> Person  
    300     ON p.gml_id = nn.benennt 
     348    ON substring(p.gml_id,1,16) = nn.benennt 
    301349  LEFT JOIN ax_anschrift a  
    302     ON a.gml_id = ANY (p.hat) 
     350    ON substring(a.gml_id,1,16) = ANY (p.hat) 
    303351 
    304352  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen: 
     
    309357       FROM ax_namensnummer r  
    310358       JOIN ax_buchungsblatt gr 
    311          ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)  
    312       WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft 
     359         ON r.istbestandteilvon = substring(gr.gml_id,1,16) -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)  
     360      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg  -- Rechtsgemeinschaft 
    313361   ON rg.gml_id = gb.gml_id  -- zum GB 
    314362 
     
    345393     nn.beschriebderrechtsgemeinschaft 
    346394  FROM ax_buchungsblatt gb  
    347   JOIN ax_namensnummer  nn  ON gb.gml_id = nn.istbestandteilvon 
     395  JOIN ax_namensnummer  nn  ON substring(gb.gml_id,1,16) = nn.istbestandteilvon 
    348396  WHERE NOT nn.artderrechtsgemeinschaft IS NULL 
    349397    AND gb.endet IS NULL AND nn.endet IS NULL -- Historie weglassen 
     
    435483        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen 
    436484   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; 
    439487-- TIPP: mit zusÀtzlichem LIMIT auftrufen! 
    440488 
     
    447495        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen 
    448496 FROM   ax_flurstueck f  
    449    LEFT JOIN ap_pto p ON f.gml_id = ANY( p.dientzurdarstellungvon)  
    450   WHERE p.gml_id IS NULL 
    451     AND f.endet IS NULL; 
    452 -- TIPP: mit zusÀtzlichem LIMIT auftrufen! 
     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! 
    453501 
    454502COMMENT ON VIEW flstnr_ohne_manuelle_position  
     
    496544      ON r.artderfestlegung = a.wert 
    497545    LEFT JOIN ax_dienststelle d 
    498       ON r.land   = d.land  AND r.stelle = d.stelle  
     546      ON r.land=d.land AND r.stelle=d.stelle  
    499547  WHERE r.endet IS NULL AND d.endet IS NULL ; 
    500548 
     
    561609           l.hausnummer  
    562610      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) 
    564612      JOIN   ax_gemeinde g   ON l.kreis=g.kreis  AND l.gemeinde=g.gemeinde  
    565613      JOIN   ax_lagebezeichnungkatalogeintrag s  ON  l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage 
     
    623671   FROM   ax_person              p 
    624672     JOIN ax_namensnummer        n   -- Namennummer >benennt> Person 
    625        ON p.gml_id = n.benennt 
     673       ON substring(p.gml_id,1,16) = n.benennt 
    626674     JOIN ax_buchungsblatt       g   -- Namensnummer >istBestandteilVon> Grundbuch 
    627        ON n.istbestandteilvon = g.gml_id 
     675       ON n.istbestandteilvon = substring(g.gml_id,1,16) 
    628676     JOIN ax_buchungsblattbezirk b    ON g.land = b.land AND g.bezirk = b.bezirk  
    629677     JOIN ax_buchungsstelle      s   -- Buchungs-Stelle >istBestandteilVon> Grundbuch 
    630        ON s.istbestandteilvon = g.gml_id 
     678       ON s.istbestandteilvon = substring(g.gml_id,1,16) 
    631679     JOIN ax_buchungsstelle_buchungsart art  
    632680       ON s.buchungsart = art.wert  
    633681     JOIN ax_flurstueck          f  -- Flurstueck >istGebucht> Buchungs-Stelle 
    634        ON f.istgebucht = s.gml_id 
     682       ON f.istgebucht = substring(s.gml_id,1,16) 
    635683     JOIN ax_gemarkung           k     
    636684       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer  
     
    685733   FROM   ax_person              p 
    686734     JOIN ax_namensnummer        n    -- Namennummer >benennt> Person 
    687        ON p.gml_id = n.benennt 
     735       ON substring(p.gml_id,1,16) = n.benennt 
    688736     JOIN ax_buchungsblatt       g    -- Namensnummer >istBestandteilVon> Grundbuch 
    689        ON n.istBestandteilVon = g.gml_id 
     737       ON n.istBestandteilVon = substring(g.gml_id,1,16) 
    690738     JOIN ax_buchungsblattbezirk b     
    691739       ON g.land = b.land AND g.bezirk = b.bezirk  
    692740     JOIN ax_buchungsstelle      sh  -- B-Stelle herr >istBestandteilVon> Grundbuch 
    693        ON sh.istbestandteilvon = g.gml_id -- herrschende Buchung 
     741       ON sh.istbestandteilvon = substring(g.gml_id,1,16) -- herrschende Buchung 
    694742     JOIN ax_buchungsstelle_buchungsart arth  
    695743       ON sh.buchungsart = arth.wert  
    696744     JOIN ax_buchungsstelle      sd   -- B-Stelle herr.  >an/zu> B-Stelle dien. 
    697        ON (sd.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)) 
    698746     JOIN ax_buchungsstelle_buchungsart artd  
    699747       ON sd.buchungsart = artd.wert 
    700748     JOIN ax_flurstueck          f    -- Flurstueck  >istGebucht> B-Stelle dien      
    701        ON f.istgebucht = sd.gml_id 
     749       ON f.istgebucht = substring(sd.gml_id,1,16) 
    702750     JOIN ax_gemarkung           k     
    703751       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer  
     
    722770   FROM ax_gebaeude g 
    723771   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 
    725774  GROUP BY l.gml_id, l.gemeinde, l.lage, l.hausnummer 
    726775  HAVING count(g.gml_id) > 1; 
     
    735784   FROM ax_gebaeude g1 
    736785   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 
    738788   (SELECT g2.gml_id  
    739789      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 
    741792     GROUP BY g2.gml_id  
    742793   HAVING count(l2.gml_id) > 1) 
     
    754805    FROM ax_buchungsstelle_buchungsart a 
    755806    JOIN ax_buchungsstelle b  ON a.wert = b.buchungsart 
     807   WHERE b.endet IS NULL 
    756808GROUP BY a.wert, a.bezeichner 
    757809ORDER BY a.wert, a.bezeichner; 
     
    772824   JOIN doppelverbindung d     -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von BS an BS 
    773825     ON d.fsgml = f.gml_id  
    774  
    775  
    776  
    777826   JOIN ax_buchungsstelle s    -- Buchungs-Stelle 
    778827     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; 
    783829 
    784830COMMENT ON VIEW erbbaurechte_suchen 
     
    825871    ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen  
    826872   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)   
    828874 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  
    829876  ORDER BY fo.gemarkungsnummer, fo.flurnummer, fo.zaehler, k.gemeinde, k.bezeichnung; 
    830877 
     
    841888         a1.ort_post, a1.strasse AS strasse1, a2.strasse AS strasse2, a1.hausnummer 
    842889    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) 
    845892   WHERE a1.gml_id <> a2.gml_id 
    846893      AND a1.ort_post =  a2.ort_post 
     
    10111058*/ 
    10121059 
     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 
     1070CREATE OR REPLACE VIEW fehlersuche_namensanteile_je_blatt 
     1071AS 
     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 
     1089COMMENT ON VIEW fehlersuche_namensanteile_je_blatt 
     1090 IS 'Suchen nach GB-BlÀttern bei denen die Summe der Anteile der Namensnummern nicht passt. 
     1091Mit Ausnahme von RechtsverhÀltnissen sollte sie Summe der BrÃŒche immer 1/1 ergeben.'; 
    10131092 
    10141093-- END -- 
Note: See TracChangeset for help on using the changeset viewer.