source: trunk/import/sichten.sql @ 339

Revision 339, 53.7 KB checked in by frank.jaeger, 10 years ago (diff)

Rückbau von "substring(gml_id)" in Views und Programmen.
Namensänderung von Schlüsseltabellen von ax_* auf v_*.

RevLine 
[162]1-- =====
2-- ALKIS
3-- =====
4
[330]5--  PostNAS 0.8
6
[276]7--  -----------------------------------------
8--  Sichten fÃŒr Fehlersuche und Daten-Analyse
9--  -----------------------------------------
10
11--  Dieses SQL braucht nur bei Bedarf in einer PostNAS-DB verarbeitet werden.
[301]12--  Es werden zusÀtzliche Views eingerichtet, die nur bei Fehlersuche und Analyse (vom Entwickler) benötigt werden.
[276]13
[176]14--  2012-04-17 flstnr_ohne_position
[178]15--  2012-04-24 pauschal Filter 'endet IS NULL' um historische Objekte auszublenden
[183]16--  2012-10-29 Redundanzen in Beziehungen suchen (entstehen durch replace)
[265]17--  2013-02-20 Mehrfache Buchungsstellen zum FS suchen, dies sind Auswirkungen eines Fehlers bei Replace
[266]18--  2013-03-05 Beschriftungen aus ap_pto auseinander sortieren, neuer View "grenzpunkt"
[269]19--  2013-03-12 Optimierung Hausnummern, View "gebaeude_txt" (Funktion und Name)
[275]20--  2013-04-15 UnterdrÃŒcken doppelter Darstellung in den Views 'ap_pto_stra', 'ap_pto_nam', 'ap_pto_rest'
[276]21--  2013-04-16 Thema "BodenschÀtzung" und fehlernde Kommentare zum Views ergÀnzt.
22--             Diese Datei aufgeteilt in "sichten.sql" und "sichten_wms.sql"
[295]23--  2013-10-23 Fehlersuche GebÀude-Hausnummer-Relation
[298]24--  2013-11-26 Neue Views (doppelverbindung)
[301]25--  2014-01-17 View "exp_csv" fÃŒr den Export von CSV-Daten aus der Auskunft mit Modul alkisexport.php.
[303]26--  2014-01-20 Erweiterung "exp_csv" fÃŒr alkisexport.php
[305]27--  2014-01-21 In "exp_csv": Rechtsgemeinsachaft zu allen Personen statt als eigener Satz.
[308]28--  2014-01-27 Neuer Baustein "flst_an_strasse". Neuer View "exp_csv_str" fÃŒr CSV-Export von Flst. an einer Straße
[314]29--  2014-01-29 Neuer View "strasse_als_gewanne" zur Fehlersuche.
30--  2014-01-31 Kommentar
[315]31--  2014-02-06 nachmigration_aehnliche_anschriften
[331]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"
[332]34--  2014-09-12 Korrektur "doppelverbindung" (nach Patch der Indices fÃŒr Relation auf Substring(gml_id,1,16))
[336]35--  2014-09-17 View "fehler_gebaeude_zu_mehrfach_hsnr"
[337]36--  2014-09-22 Views zur Suche von Fehlern aus einem fehlerhaften Historie-Trigger (beginnt-endet-Paarungen)
[339]37--  2014-09-29 substring(gml_id,1,16) wieder entfernen, gml_id ist im Schema nun wieder fixe 16 Zeichen lang.
38--  2014-09-30 Umbenennung SchlÃŒsseltabellen (Prefix)
[162]39
[336]40
[298]41-- Bausteine fÃŒr andere Views:
42-- ---------------------------
43
44-- Ein View, der die Verbindung von FlurstÌck zur Buchung fÌr zwei verschiedene FÀlle herstellt.
45-- Einmal die "normalen" (direkten) Buchungen.
46-- Zweitens ÃŒber die Rechte von Buchungsstellen an anderen Buchungsstellen.
47-- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
48
49-- Einfach/Direkt:
50--   FlurstÃŒck   >istGebucht>                         (Buchungs-Stelle)
51--
52-- Mit "Recht an":
53--   FlurstÃŒck   >istGebucht>  Buchungs-Stelle  <an<  (Buchungs-Stelle)
54--                               (dienend)              (herrschend)
55
56--           DROP VIEW public.doppelverbindung;
57CREATE OR REPLACE VIEW public.doppelverbindung
58AS
[330]59  -- FS >istGebucht> Buchungstelle
[331]60  SELECT f1.gml_id              AS fsgml,    -- gml_id FlurstÃŒck
61         b1.gml_id              AS bsgml,    -- gml_id Buchungs
62         0                      AS ba_dien
[330]63    FROM ax_flurstueck f1
[339]64  --JOIN ax_buchungsstelle b1   ON f1.istgebucht = substring(b1.gml_id,1,16)
65    JOIN ax_buchungsstelle b1   ON f1.istgebucht = b1.gml_id
[298]66 UNION
[330]67  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
[331]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
[330]71    FROM ax_flurstueck f2
[339]72  --JOIN ax_buchungsstelle dien ON f2.istgebucht = substring(dien.gml_id,1,16)
73    JOIN ax_buchungsstelle dien ON f2.istgebucht = dien.gml_id
74  --JOIN ax_buchungsstelle b2   ON substring(dien.gml_id,1,16) = ANY (b2.an)
75    JOIN ax_buchungsstelle b2   ON dien.gml_id = ANY (b2.an)  -- auch "zu" ?
[331]76   WHERE dien.endet IS NULL;   -- FÃŒr das zusÀtzliche Verbindungselement die Historie HIER ausschließen,
[330]77                               -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet.
[298]78
79COMMENT ON VIEW public.doppelverbindung
[331]80 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.
81Dies ist ausschließlich gedacht zur Verwendung in anderen Views um diese einfacher zu machen.';
[298]82
[331]83
[301]84-- Test-Ausgabe: Ein paar FÀlle mit "Recht an"
85--   SELECT * FROM doppelverbindung WHERE ba_dien > 0 LIMIT 20;
[331]86-- Nach Umstellung auf PostNAS 0.8 - mit ANY() und Substring - sehr lange Antwortzeit in PG 8.4
[301]87
[308]88-- Ein View, der die Verbindung von FlurstÃŒck zur Straßentabelle fÃŒr zwei verschiedene FÀlle herstellt.
89-- Einmal ÃŒber die Lagebezeichnung MIT Hausnummer und einmal OHNE.
90-- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
91
92--           DROP VIEW public.flst_an_strasse;
93CREATE OR REPLACE VIEW public.flst_an_strasse
94AS
[330]95  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
96  SELECT fm.gml_id AS fsgml,
[308]97         sm.gml_id AS stgml,                 -- Filter: gml_id der Straße
98         'm' AS fall                         -- SÀtze unterschieden: Mit HsNr
[330]99    FROM ax_flurstueck fm                    -- FlurstÃŒck Mit
[308]100    JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
[339]101    --ON substring(lm.gml_id,1,16) = ANY (fm.weistauf)
102      ON lm.gml_id = ANY (fm.weistauf)
[330]103    JOIN ax_lagebezeichnungkatalogeintrag sm
[331]104      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
105   WHERE lm.endet IS NULL AND fm.endet IS NULL -- nichts Historisches
[308]106 UNION
[330]107  -- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
108  SELECT fo.gml_id AS fsgml,
[308]109         so.gml_id AS stgml,                 -- Filter: gml_id der Straße
110         'o' AS fall                         -- SÀtze unterschieden: Ohne HsNr
[330]111    FROM ax_flurstueck fo                    -- FlurstÃŒck OHNE
[308]112    JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
[339]113    --ON substring(lo.gml_id,1,16) = ANY (fo.zeigtauf)
114      ON lo.gml_id = ANY (fo.zeigtauf)
[308]115    JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
[330]116      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
[331]117   WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches
[308]118
119COMMENT ON VIEW public.flst_an_strasse
120 IS 'ALKIS-Beziehung von FlurstÃŒck zu Straßentabelle. UNION-Zusammenfassung der FÀlle MIT und OHNE Hausnummer.';
121
122-- Muss man noch dafÃŒr sorgen, dass FlurstÃŒck nicht doppelt vorkommt? z.B. mit DISTINCT
123-- Oder mÃŒssen ggf. mehrfache FS im Programm ÃŒbersprungen werden?
124
125-- Test-Ausgabe:
126--   SELECT * FROM flst_an_strasse WHERE stgml='DENW18AL000004Fl' LIMIT 40;
127
[298]128-- Ende "Bausteine"
129
130
[305]131-- Generelle Export-Struktur "FlurstÃŒck - Buchung - Grundbuch - Person"
132-- --------------------------------------------------------------------
[301]133-- Verwendet den gespeicherten View "doppelverbindung".
134-- Wird benötigt im Auskunft-Modul "alkisexport.php":
135-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
[308]136-- FÃŒr Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".
[301]137
138-- Problem / Konflikt:
139-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden.
140-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in
141-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt.
142-- Diese Redundanzen mÃŒssen vom dem Programm gefiltert werden, das die Daten ÃŒber eine Schnittstelle einliest.
143
144-- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÀgen.
145
146--           DROP VIEW exp_csv;
[330]147
[301]148CREATE OR REPLACE VIEW exp_csv
149AS
150 SELECT
[303]151  -- FlurstÃŒck
[305]152    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
153    f.flurstueckskennzeichen             AS fs_kennz,
154    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
155    f.flurnummer, f.zaehler, f.nenner,
156    f.amtlicheflaeche                    AS fs_flae,
157    g.bezeichnung                        AS gemarkung,
[301]158
[303]159  -- Grundbuch
[305]160    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
161    gb.bezirk                            AS gb_bezirk,
162    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
163    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
[301]164
[303]165  -- Buchungsstelle (GrundstÃŒck)
[305]166    s.laufendenummer                     AS bu_lfd,      -- BVNR
[330]167  --s.zaehler, s.nenner,                                 -- Anteil des GB am FS, einzelne Felder
[305]168    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
169    s.buchungsart,                                       -- verschlÃŒsselt
170    b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
[301]171
[305]172  -- NamensNummer (Normalfall mit Person)
173    nn.laufendenummernachdin1421         AS nam_lfd,
174    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
[301]175
[305]176  -- Rechtsgemeinsachaft (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
177    rg.artderrechtsgemeinschaft          AS nam_adr,
178    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
179
180  -- Person
[308]181    p.gml_id                             AS psgml,           -- möglicher Filter Personen-GML-ID
182    p.anrede,
183    p.vorname,
184    p.namensbestandteil,
185    p.nachnameoderfirma,                                     -- Familienname
186    p.geburtsdatum,
187    --p.geburtsname, p.akademischergrad
[303]188 
[305]189  -- Adresse der Person
190    a.postleitzahlpostzustellung         AS plz,
191    a.ort_post                           AS ort,             -- Anschreifenzeile 1: PLZ+Ort
192    a.strasse,  a.hausnummer,                                -- Anschriftenzeile 2: Straße+HsNr
193    a.bestimmungsland                    AS land
[303]194
[301]195  FROM ax_flurstueck    f               -- FlurstÃŒck
[303]196  JOIN doppelverbindung d               -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von Buchung an Buchung
[331]197    ON d.fsgml = f.gml_id
[303]198  JOIN ax_gemarkung g                   -- entschlÃŒsseln
199    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
[301]200  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
[331]201    ON d.bsgml = s.gml_id
[339]202  JOIN v_bs_buchungsart b  -- EnstschlÃŒsselung der Buchungsart
[301]203    ON s.buchungsart = b.wert
[330]204  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
[339]205  --ON substring(gb.gml_id,1,16) = s.istbestandteilvon
206    ON gb.gml_id = s.istbestandteilvon
[303]207  JOIN ax_buchungsblattbezirk z
208    ON gb.land=z.land AND gb.bezirk=z.bezirk
[330]209  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
[339]210  --ON substring(gb.gml_id,1,16) = nn.istbestandteilvon
211    ON  gb.gml_id = nn.istbestandteilvon
[330]212  JOIN ax_person p                      -- NamNum >benennt> Person
[339]213  --ON substring(p.gml_id,1,16) = nn.benennt
214    ON p.gml_id = nn.benennt
[303]215  LEFT JOIN ax_anschrift a
[339]216  --ON substring(a.gml_id,1,16) = ANY (p.hat)
217    ON a.gml_id = ANY (p.hat)
[305]218
[330]219  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
[305]220  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
221  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
222  LEFT JOIN
[330]223   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft
224       FROM ax_namensnummer r
225       JOIN ax_buchungsblatt gr
[339]226       --ON r.istbestandteilvon = substring(gr.gml_id,1,16)
227         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
[330]228      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
229   ON rg.gml_id = gb.gml_id  -- zum GB
[305]230
[330]231  WHERE f.endet IS NULL AND s.endet IS NULL and gb.endet IS NULL and nn.endet IS NULL AND p.endet IS NULL
232
[303]233  ORDER BY f.flurstueckskennzeichen,
234           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
235           nn.laufendenummernachdin1421;
[301]236
237COMMENT ON VIEW exp_csv
238 IS 'View fÃŒr einen CSV-Export aus der Buchauskunft mit alkisexport.php. Generelle Struktur. FÃŒr eine bestimmte gml_id noch den Filter setzen.';
239
240
[308]241-- Variante des View "exp_csv":
242-- Hier wird zusÀtzlich der Baustein "flst_an_strasse" verwendet.
243-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden
244-- um alle FlurstÃŒcke zu bekommen, die an einer Straße liegen.
[330]245
[308]246-- DROP           VIEW exp_csv_str;
[330]247
[308]248CREATE OR REPLACE VIEW exp_csv_str
249AS
250 SELECT
[330]251    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
252                                                         -- UNTERSCHIED zu exp_csv)
[308]253
254  -- FlurstÃŒck
255    f.gml_id                             AS fsgml,       -- Gruppenwechsel fÃŒr "function lage_zum_fs" in alkisexport.php
256    f.flurstueckskennzeichen             AS fs_kennz,
257    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
258    f.flurnummer, f.zaehler, f.nenner,
259    f.amtlicheflaeche                    AS fs_flae,
260    g.bezeichnung                        AS gemarkung,
261
262  -- Grundbuch
263  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
264    gb.bezirk                            AS gb_bezirk,
265    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
266    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
267
268  -- Buchungsstelle (GrundstÃŒck)
269    s.laufendenummer                     AS bu_lfd,      -- BVNR
[330]270  --s.zaehler, s.nenner,                                 -- Anteil des GB am FS, einzelne Felder
[308]271    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
272    s.buchungsart,                                       -- verschlÃŒsselt
273    b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
274
275  -- NamensNummer (Normalfall mit Person)
276    nn.laufendenummernachdin1421         AS nam_lfd,
277    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
278
279  -- Rechtsgemeinsachaft (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
280    rg.artderrechtsgemeinschaft          AS nam_adr,
281    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
282
283  -- Person
284  --p.gml_id                             AS psgml,           -- möglicher Filter Personen-GML-ID
285    p.anrede,
286    p.vorname,
287    p.namensbestandteil,
288    p.nachnameoderfirma,                                     -- Familienname
289    p.geburtsdatum,
290    --p.geburtsname, p.akademischergrad
291 
292  -- Adresse der Person
293    a.postleitzahlpostzustellung         AS plz,
294    a.ort_post                           AS ort,             -- Anschreifenzeile 1: PLZ+Ort
295    a.strasse,  a.hausnummer,                                -- Anschriftenzeile 2: Straße+HsNr
296    a.bestimmungsland                    AS land
297
298  FROM ax_flurstueck    f               -- FlurstÃŒck
299  JOIN flst_an_strasse  l               -- Lage (hier zusÀtzlicher JOIN gegenÃŒber Version "exp_csv")
300        ON l.fsgml = f.gml_id
301  JOIN doppelverbindung d               -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von Buchung an Buchung
302    ON d.fsgml = f.gml_id
303  JOIN ax_gemarkung g                   -- entschlÃŒsseln
304    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
305  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
306    ON d.bsgml = s.gml_id
[339]307  JOIN v_bs_buchungsart b  -- EnstschlÃŒsselung der Buchungsart
[308]308    ON s.buchungsart = b.wert
[330]309  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
[339]310  --ON substring(gb.gml_id,1,16) = s.istbestandteilvon
311    ON gb.gml_id = s.istbestandteilvon
[308]312  JOIN ax_buchungsblattbezirk z
313    ON gb.land=z.land AND gb.bezirk=z.bezirk
[330]314  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
[339]315  --ON substring(gb.gml_id,1,16) = nn.istbestandteilvon
316    ON gb.gml_id = nn.istbestandteilvon
[330]317  JOIN ax_person p                      -- NamNum >benennt> Person
[339]318  --ON substring(p.gml_id,1,16) = nn.benennt
319    ON p.gml_id = nn.benennt
[308]320  LEFT JOIN ax_anschrift a
[339]321  --ON substring(a.gml_id,1,16) = ANY (p.hat)
322    ON a.gml_id = ANY (p.hat)
[308]323
[330]324  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
[308]325  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
326  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
327  LEFT JOIN
[330]328   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft
329       FROM ax_namensnummer r
330       JOIN ax_buchungsblatt gr
[339]331       --ON r.istbestandteilvon = substring(gr.gml_id,1,16)
332         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
[331]333      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg  -- Rechtsgemeinschaft
[330]334   ON rg.gml_id = gb.gml_id  -- zum GB
[308]335
[330]336  WHERE f.endet IS NULL AND s.endet IS NULL and gb.endet IS NULL and nn.endet IS NULL AND p.endet IS NULL
337
[308]338  ORDER BY f.flurstueckskennzeichen,
339           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
340           nn.laufendenummernachdin1421;
341
342COMMENT ON VIEW exp_csv_str
343 IS 'View fÃŒr einen CSV-Export aus der Buchauskunft mit alkisexport.php. Liefert nur FlurstÃŒcke, die eine Lagebezeichnung MIT/OHNE Hausnummer haben. Dazu noch den Filter auf GML-ID der Straßentabelle setzen.';
344
[330]345-- Test: SELECT * FROM exp_csv_str WHERE stgml = 'DENW15AL100000Q8'; -- Veilchenstraße in Löhne
[308]346
347
[305]348-- Analyse: Kann es mehr als 1 "Rechtsgemeinschaft" zu einem GB-Blatt geben?
349-- (Diese Frage stellte sich beim Design des View "exp_csv".)
[330]350
351-- In umgekehrter Reihenfolge löschen (AbhÀngigkeiten).
352DROP VIEW IF EXISTS rechtsgemeinschaften_mehrfachzeilen;
353DROP VIEW IF EXISTS rechtsgemeinschaften_zaehlen;
354DROP VIEW IF EXISTS rechtsgemeinschaften_zum_grundbuch;
355
356-- Schritt 1: alle vorhandenen Rechtsgemeinschaften
357
[305]358CREATE OR REPLACE VIEW rechtsgemeinschaften_zum_grundbuch
359AS
360 SELECT
[330]361     gb.gml_id AS gb_gml,
[305]362     gb.bezirk,
363     gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
[330]364     nn.gml_id AS nn_gml, nn.beginnt, nn.laufendenummernachdin1421,
365     nn.artderrechtsgemeinschaft AS adr,
[305]366     nn.beschriebderrechtsgemeinschaft
[330]367  FROM ax_buchungsblatt gb
[339]368  JOIN ax_namensnummer  nn 
369  --ON substring(gb.gml_id,1,16) = nn.istbestandteilvon
370    ON gb.gml_id = nn.istbestandteilvon
[305]371  WHERE NOT nn.artderrechtsgemeinschaft IS NULL
[330]372    AND gb.endet IS NULL AND nn.endet IS NULL -- Historie weglassen
373  ORDER BY gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, nn.laufendenummernachdin1421;
[305]374
375COMMENT ON VIEW rechtsgemeinschaften_zum_grundbuch
376 IS 'Rechtsgemeinschaften zum Grundbuchblatt.';
377
378-- Schritt 2: Wo gibt es mehrere zu einem GB-Blatt
[330]379
[305]380CREATE OR REPLACE VIEW rechtsgemeinschaften_zaehlen
381AS
[330]382 SELECT gb_gml, bezirk, gb_blatt, count(adr) AS anzahl
[305]383   FROM rechtsgemeinschaften_zum_grundbuch
[330]384   GROUP BY gb_gml, bezirk, gb_blatt
385   HAVING count(adr) > 1
[305]386   ORDER BY bezirk, gb_blatt;
387
388COMMENT ON VIEW rechtsgemeinschaften_zaehlen
[330]389 IS 'Rechtsgemeinschaften zum Grundbuchblatt zÀhlen. Nur Anzeigen, wenn es mehrere gibt.';
390-- Ergebnis: Ja, kann es geben
[305]391
392-- Schritt 3: alle vorhandenen Zeilen anzeigen zu den GB-BlÀttern, bei denen es mehrere gibt.
393CREATE OR REPLACE VIEW rechtsgemeinschaften_mehrfachzeilen
394AS
395 SELECT *
396   FROM rechtsgemeinschaften_zum_grundbuch
[330]397  WHERE gb_gml IN (SELECT gb_gml FROM rechtsgemeinschaften_zaehlen);
[305]398
399COMMENT ON VIEW rechtsgemeinschaften_mehrfachzeilen
400 IS 'GrundbuchblÀtter mit mehr als einer Zeile Rechtsgemeinschaft.';
[330]401
[305]402-- Fazit:
403-- Man findet einige wenige identische oder Àhnlich aussehende Zeilen zu einem Grundbuch.
404-- Das sieht also eher nach einem PostNAS-FortfÌhrungsproblem aus, als nach unabhÀngigen Zeilen.
405-- Wurde hier eine Relation nicht sauber gelöscht?
406
[269]407-- Welche Karten-Typen ?
[276]408CREATE OR REPLACE VIEW kartentypen_der_texte_fuer_hnr
[162]409AS
[276]410   SELECT DISTINCT advstandardmodell
411   FROM ap_pto p
412   WHERE p.art = 'HNR';
[330]413
[276]414COMMENT ON VIEW kartentypen_der_texte_fuer_hnr
415  IS 'Datenanalyse: Kartentypen in Tabelle ap_pto fÃŒr Hausnummern.';
[162]416
[276]417-- Dies liefert:
418--  "{DKKM1000}"
419--  "{DKKM1000,DKKM500}"
420--  "{DKKM500}"
421--  NULL
[269]422
[275]423-- Texte, die NICHT dargestellt werden sollen.
424-- -------------------------------------------
425-- Texte und Text-Fragmente aus der Konvertierung ALK+ALB, die noch nicht gelöscht worden sind.
426CREATE OR REPLACE VIEW ap_pto_muell
427AS
428  SELECT p.ogc_fid,
429         p.schriftinhalt,
430         p.art,
431         p.drehwinkel * 57.296 AS winkel, -- * 180 / Pi
432         p.wkb_geometry
433    FROM ap_pto p
434   WHERE not p.schriftinhalt IS NULL
435     AND p.endet IS NULL
436     AND p.art IN ('AOG_AUG','PNR');
[330]437
[278]438COMMENT ON VIEW ap_pto_muell
439 IS 'Datenanalyse: Beschriftungen aus "ap_pto", die NICHT dargestellt werden sollen.';
[275]440
[162]441
[176]442-- FlurstÃŒcke mit Anzeige der FlurstÃŒcksnummer an der "Standardposition"
443
444-- Nach der Konvertierung aus ALK hat zunÀchst jedes FlurstÌck eine explizit gesetzte Position der FlurstÌcksnummer.
445
446-- Nach einer manuellen Teilung bekommen die neuen FlurstÃŒcke im ALKIS nur dann eine Position,
447-- wenn die Positioin manuell bestimmt (verschoben) wurde.
448-- Wenn die FlurstÃŒcksnummer an ihrer "Standardposition" angezeigt werden soll,
449-- dann wird diese in den Daten (DHK, NAS) nicht gesetzt.
450-- Der Konverter PostNAS konvertiert aber nur die Daten, die er bekommt, er setzt nicht die Standard-Position
451-- fÃŒr die FlurstÃŒcke, die ohne eine manuelle Position kommen.
452
[330]453-- Diese FÀlle identifizieren und unterscheiden:
454
455CREATE OR REPLACE VIEW flstnr_mit_manueller_position
[176]456AS
457 SELECT f.gml_id,
458        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen
[330]459   FROM ax_flurstueck f
[339]460   JOIN ap_pto p
461   --ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon)
462     ON f.gml_id = ANY(p.dientzurdarstellungvon)
[331]463  WHERE f.endet IS NULL AND p.endet IS NULL;
[330]464-- TIPP: mit zusÀtzlichem LIMIT auftrufen!
[176]465
[330]466COMMENT ON VIEW flstnr_mit_manueller_position
467  IS 'Sicht fÃŒr Datenanalyse: FlurstÃŒcke MIT manuell gesetzter Position fÃŒr die PrÀsentation der FS-Nr';
468
469CREATE OR REPLACE VIEW flstnr_ohne_manuelle_position
470AS
471 SELECT f.gml_id,
472        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen
473 FROM   ax_flurstueck f
[339]474 LEFT JOIN ap_pto p
475 --ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon)
476   ON f.gml_id = ANY(p.dientzurdarstellungvon)
[331]477 WHERE p.gml_id IS NULL
478   AND f.endet IS NULL;
479-- TIPP: mit zusÀtzlichem LIMIT aufrufen!
[330]480
481COMMENT ON VIEW flstnr_ohne_manuelle_position
482  IS 'Sicht fÃŒr Datenanalyse: FlurstÃŒcke OHNE manuell gesetzte Position fÃŒr die PrÀsentation der FS-Nr';
483
484
[266]485-- Umbruch im Label? z.B. "Schwimm-/nbecken"
[162]486-- Sind 2 Buchstaben in Mapfile bei "WRAP" möglich?
487CREATE OR REPLACE VIEW texte_mit_umbruch
488AS
489 SELECT ogc_fid, schriftinhalt, art
490   FROM ap_pto
[330]491  WHERE NOT schriftinhalt IS NULL AND schriftinhalt LIKE '%/n%';
492
[278]493COMMENT ON VIEW texte_mit_umbruch
494 IS 'Sicht fÃŒr Datenanalyse: Vorkommen eines Umbruchs im Label-Text.';
[162]495
[178]496-- EXTENT fÃŒr das Mapfile eines Mandanten ermitteln
[162]497CREATE OR REPLACE VIEW flurstuecks_minmax AS
498 SELECT min(st_xmin(wkb_geometry)) AS r_min,
499        min(st_ymin(wkb_geometry)) AS h_min,
500        max(st_xmax(wkb_geometry)) AS r_max,
501        max(st_ymax(wkb_geometry)) AS h_max
[178]502   FROM ax_flurstueck f
503   WHERE f.endet IS NULL;
[330]504
[278]505COMMENT ON VIEW flurstuecks_minmax
506 IS 'Sicht fÃŒr Datenanalyse: Maximale Ausdehnung von ax_flurstueck fuer EXTENT-Angabe im Mapfile.';
[162]507
508-- Nach Laden der Keytables:
509CREATE OR REPLACE VIEW baurecht
510AS
511  SELECT r.ogc_fid,
512         r.wkb_geometry,
513         r.gml_id,
[330]514         r.artderfestlegung AS adfkey, -- Art der Festlegung - Key
[162]515         r."name",                     -- Eigenname des Gebietes
516         r.stelle,                     -- Stelle Key
517         r.bezeichnung AS rechtbez,    -- Verfahrensnummer
518         a.bezeichner  AS adfbez,      -- Art der Festlegung - Bezeichnung
519         d.bezeichnung AS stellbez     -- Stelle Bezeichnung
520      -- , d.stellenart                -- weiter entschluesseln?
521    FROM ax_bauraumoderbodenordnungsrecht r
[339]522    LEFT JOIN v_baurecht_adf a
[162]523      ON r.artderfestlegung = a.wert
524    LEFT JOIN ax_dienststelle d
[331]525      ON r.land=d.land AND r.stelle=d.stelle
[276]526  WHERE r.endet IS NULL AND d.endet IS NULL ;
[330]527
[278]528COMMENT ON VIEW baurecht
529 IS 'Datenanalyse: EnstschlÃŒsselte Felder zu einer FlÀche des Baurechts.';
[162]530
531-- Man glaubt es kaum, aber im ALKIS haben Gemeinde und Gemarkung keinerlei Beziehung miteinander
532-- Nur durch Auswertung der FlurstÃŒcke kann man ermitteln, in welcher Gemeinde eine Gemarkung liegt.
533CREATE OR REPLACE VIEW gemarkung_in_gemeinde
534AS
535  SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer
536  FROM            ax_flurstueck
[178]537  WHERE           endet IS NULL
[276]538  ORDER BY        land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer;
[330]539
[278]540COMMENT ON VIEW gemarkung_in_gemeinde
[330]541 IS 'Welche Gemarkung liegt in welcher Gemeinde? Durch Verweise aus FlurstÃŒcken ermitteln.';
[162]542
543
544-- Untersuchen, welche Geometrie-Typen vorkommen
545CREATE OR REPLACE VIEW arten_von_flurstuecksgeometrie
546AS
547 SELECT   count(gml_id) as anzahl,
548          st_geometrytype(wkb_geometry)
549 FROM     ax_flurstueck
[178]550 WHERE    endet IS NULL
[162]551 GROUP BY st_geometrytype(wkb_geometry);
[330]552
[276]553COMMENT ON VIEW arten_von_flurstuecksgeometrie IS 'Datenanalyse: vorkommende Geometry-Typen in Tabelle ax_flurstueck.';
[162]554
555
556-- A d r e s s e n
557
[330]558-- Verschluesselte Lagebezeichnung (Strasse und Hausnummer) fÃŒr eine Gemeinde
559-- SchlÃŒssel der Gemeinde im Filter (WHERE) nach Bedarf anpassen!
[178]560CREATE OR REPLACE VIEW adressen_hausnummern
[162]561AS
562    SELECT
563        s.bezeichnung AS strassenname,
[276]564        g.bezeichnung AS gemeindename,
[330]565        l.land, l.regierungsbezirk, l.kreis, l.gemeinde,
566        l.lage        AS strassenschluessel, l.hausnummer
567    FROM ax_lagebezeichnungmithausnummer l 
568    JOIN ax_gemeinde g
569      ON l.kreis=g.kreis AND l.gemeinde=g.gemeinde
570    JOIN ax_lagebezeichnungkatalogeintrag s
571      ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage
572    WHERE l.gemeinde = '40';  -- '40' = Stadt Lage
573
[276]574COMMENT ON VIEW adressen_hausnummern IS 'Datenanalyse: VerschlÃŒsselte Lagebezeichnung (Straße und Hausnummer) fÃŒr eine Gemeinde. SchlÃŒssel der Gemeinde nach Bedarf anpassen.';
[162]575
[330]576-- Zuordnung Adressen zu Flurstuecken
[162]577-- Schluessel der Gemeinde nach Bedarf anpassen!
[178]578CREATE OR REPLACE VIEW adressen_zum_flurstueck
[162]579AS
580    SELECT
581           f.gemarkungsnummer,
582           f.flurnummer,
583           f.zaehler,
584           f.nenner,
585           g.bezeichnung AS gemeindename,
586           s.bezeichnung AS strassenname,
587           l.lage        AS strassenschluessel,
588           l.hausnummer
589      FROM   ax_flurstueck f
[339]590    --JOIN   ax_lagebezeichnungmithausnummer l   ON  substring(l.gml_id,1,16) = ANY (f.weistauf)
591      JOIN   ax_lagebezeichnungmithausnummer l   ON  l.gml_id = ANY(f.weistauf)
[330]592      JOIN   ax_gemeinde g   ON l.kreis=g.kreis  AND l.gemeinde=g.gemeinde
593      JOIN   ax_lagebezeichnungkatalogeintrag s  ON  l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage
594 --  WHERE l.gemeinde = '40'  -- ggf. Anpassen
[276]595     ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;
[330]596
[276]597COMMENT ON VIEW adressen_zum_flurstueck IS 'Datenanalyse: Zuordnung von Adressen zu Flurstuecken. SchlÃŒssel der Gemeinde nach Bedarf anpassen.';
[162]598
[298]599-- Punktförmige  P r À s e n t a t i o n s o b j e k t e  (ap_pto)
[269]600-- Ermittlung der vorkommenden Arten
601CREATE OR REPLACE VIEW beschriftung_was_kommt_vor
602AS
603  SELECT DISTINCT art, horizontaleausrichtung, vertikaleausrichtung
604    FROM ap_pto
605   WHERE not schriftinhalt is null
[330]606   ORDER BY art;
607
[269]608COMMENT ON VIEW beschriftung_was_kommt_vor IS 'Analyse der vorkommenden Kombinationen in ap_pto (Beschriftung)';
[162]609
610-- FlurstÃŒcke eines EigentÃŒmers
611-- ----------------------------
612
613-- Dieser View liefert nur die (einfache) Buchungsart "GrundstÃŒck"
614-- Solche FÀlle wie "Erbbaurecht an GrundstÌck" oder "Wohnungs-/Teileigentum an aufgeteiltes GrundstÌck"
[330]615-- oder "Miteigentum an aufgeteiltes GrundstÃŒck" fehlen in dieser Auswertung.
[162]616-- Dazu siehe: "rechte_eines_eigentuemers".
617
[330]618-- Das Ergebnis ist gedacht fÃŒr den Export als CSV und Weiterverarbeitung mit einer Tabellenkalkulation
[162]619-- oder einer einfachen Datenbank.
620
[330]621-- Auch ein Export als Shape ist moeglich (dafÃŒr: geom hinzugefÃŒgt, Feldnamen gekÃŒrzt)
[162]622-- Kommando:
623--  pgsql2shp -h localhost -p 5432 -f "/data/.../alkis_fs_gemeinde.shp"  [db-name]  public.flurstuecke_eines_eigentuemers
624
625-- Übersicht der Tabellen:
626--
627-- Person <benennt< NamNum. >istBestandteilVon> Blatt <istBestandteilVon< Stelle >istGebucht> Flurstueck
628--                                              *-> Bezirk                *-> Buchungsart     *-> Gemarkung
629
[178]630CREATE OR REPLACE VIEW flurstuecke_eines_eigentuemers
[162]631AS
632   SELECT
633      k.bezeichnung                AS gemarkung,
634      k.gemarkungsnummer           AS gemkg_nr,
635      f.flurnummer                 AS flur,
636      f.zaehler                    AS fs_zaehler,
637      f.nenner                     AS fs_nenner,
638      f.amtlicheflaeche            AS flaeche,
639      f.wkb_geometry               AS geom,  -- fuer Export als Shape
640   -- g.bezirk,
641      b.bezeichnung                AS bezirkname,
642      g.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
643      g.blattart,
644      s.laufendenummer             AS bvnr,
645      art.bezeichner               AS buchgsart,
646   -- s.zaehler || '/' || s.nenner AS buchg_anteil,
647      n.laufendenummernachdin1421  AS name_num,
648   -- n.zaehler || '/' || n.nenner AS nam_anteil,
649      p.nachnameoderfirma          AS nachname --,
650   -- p.vorname
[330]651   FROM   ax_person              p
652     JOIN ax_namensnummer        n   -- Namennummer >benennt> Person
[339]653     --ON substring(p.gml_id,1,16) = n.benennt
654       ON p.gml_id = n.benennt
[330]655     JOIN ax_buchungsblatt       g   -- Namensnummer >istBestandteilVon> Grundbuch
[339]656     --ON n.istbestandteilvon = substring(g.gml_id,1,16)
657       ON n.istbestandteilvon = g.gml_id
[330]658     JOIN ax_buchungsblattbezirk b    ON g.land = b.land AND g.bezirk = b.bezirk
659     JOIN ax_buchungsstelle      s   -- Buchungs-Stelle >istBestandteilVon> Grundbuch
[339]660     --ON s.istbestandteilvon = substring(g.gml_id,1,16)
661       ON s.istbestandteilvon = g.gml_id
662     JOIN v_bs_buchungsart art
[330]663       ON s.buchungsart = art.wert
664     JOIN ax_flurstueck          f  -- Flurstueck >istGebucht> Buchungs-Stelle
[339]665     --ON f.istgebucht = substring(s.gml_id,1,16)
666       ON f.istgebucht = s.gml_id
[330]667     JOIN ax_gemarkung           k   
668       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer
669   WHERE p.nachnameoderfirma LIKE 'Stadt %'   -- ** Bei Bedarf anpassen!
[276]670     AND p.endet IS NULL AND n.endet IS NULL AND g.endet IS NULL AND b.endet IS NULL
671     AND s.endet IS NULL AND f.endet IS NULL AND k.endet IS NULL
672   ORDER BY k.bezeichnung, f.flurnummer, f.zaehler, f.nenner, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer;
[162]673
[330]674COMMENT ON VIEW flurstuecke_eines_eigentuemers
675  IS 'Nur einfache Buchungsart "GrundstÃŒck". Muster fÃŒr Export: Suchkriterium nach Bedarf anpassen.';
676
677
[162]678-- Rechte eines EigentÃŒmers
679-- ------------------------
680-- Dieser View sucht speziell die FÀlle wo eine Buchungsstelle ein Recht "an" einer anderen Buchungsstelle hat.
681--  - "Erbbaurecht *an* GrundstÃŒck"
682--  - "Wohnungs-/Teileigentum *an* Aufgeteiltes GrundstÃŒck"
683--  - "Miteigentum *an* Aufteteiltes GrundstÃŒck"
684-- Suchkriterium ist der Name des EigentÃŒmers auf dem "herrschenden" Grundbuch, also dem Besitzer des Rechtes.
685
686-- Diese FÀlle fehlen im View "flurstuecke_eines_eigentuemers".
687
688-- Übersicht der Tabellen:
689-- Person <benennt< NamNum. >istBestandteilVon> Blatt <istBestandteilVon< Stelle-h >an> Stelle-d >istGebucht> Flurstueck
690-- Wobei ">xxx>" = JOIN ÃŒber die Verbindungs-Tabelle "alkis_beziehungen" mit der Beziehungsart "xxx".
691
[330]692-- DROP VIEW rechte_eines_eigentuemers;
[178]693CREATE OR REPLACE VIEW rechte_eines_eigentuemers
[162]694AS
695   SELECT
696      k.bezeichnung                AS gemarkung,
697      k.gemarkungsnummer           AS gemkg_nr,
698      f.flurnummer                 AS flur,
699      f.zaehler                    AS fs_zaehler,
700      f.nenner                     AS fs_nenner,
701      f.amtlicheflaeche            AS flaeche,
702      f.wkb_geometry               AS geom,  -- fuer Export als Shape
703   -- g.bezirk,
704      b.bezeichnung                AS bezirkname,
705      g.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
706   -- g.blattart,
707      sh.laufendenummer            AS bvnr_herr,
708      sh.zaehler || '/' || sh.nenner AS buchg_anteil_herr,
709      arth.bezeichner              AS buchgsa_herr,
710      artd.bezeichner              AS buchgsa_dien,
711      sd.laufendenummer            AS bvnr_dien,
712   -- sd.zaehler || '/' || sd.nenner AS buchg_anteil_dien,
713      n.laufendenummernachdin1421  AS name_num,
714   -- n.zaehler || '/' || n.nenner AS nam_anteil,
715      p.nachnameoderfirma          AS nachname --, 
716   -- p.vorname
[330]717   FROM   ax_person              p
718     JOIN ax_namensnummer        n    -- Namennummer >benennt> Person
[339]719     --ON substring(p.gml_id,1,16) = n.benennt
720       ON p.gml_id = n.benennt
[330]721     JOIN ax_buchungsblatt       g    -- Namensnummer >istBestandteilVon> Grundbuch
[339]722     --ON n.istBestandteilVon = substring(g.gml_id,1,16)
723       ON n.istBestandteilVon = g.gml_id
[330]724     JOIN ax_buchungsblattbezirk b   
725       ON g.land = b.land AND g.bezirk = b.bezirk
726     JOIN ax_buchungsstelle      sh  -- B-Stelle herr >istBestandteilVon> Grundbuch
[339]727     --ON sh.istbestandteilvon = substring(g.gml_id,1,16)
728       ON sh.istbestandteilvon = g.gml_id -- herrschende Buchung
729     JOIN v_bs_buchungsart arth
[330]730       ON sh.buchungsart = arth.wert
731     JOIN ax_buchungsstelle      sd   -- B-Stelle herr.  >an/zu> B-Stelle dien.
[339]732     --ON (substring(sd.gml_id,1,16) = ANY(sh.an) OR substring(sd.gml_id,1,16) = ANY(sh.zu))
733       ON (sd.gml_id = ANY(sh.an) OR sd.gml_id = ANY(sh.zu))
734     JOIN v_bs_buchungsart artd
[330]735       ON sd.buchungsart = artd.wert
736     JOIN ax_flurstueck          f    -- Flurstueck  >istGebucht> B-Stelle dien     
[339]737     --ON f.istgebucht = substring(sd.gml_id,1,16)
738       ON f.istgebucht = sd.gml_id
[330]739     JOIN ax_gemarkung           k   
740       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer
741   WHERE p.nachnameoderfirma LIKE 'Stadt %'   -- ** Bei Bedarf anpassen!   
[276]742     AND p.endet IS NULL AND n.endet IS NULL AND g.endet IS NULL AND b.endet IS NULL
743     AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND k.endet IS NULL
744   ORDER BY k.bezeichnung, f.flurnummer, f.zaehler, f.nenner, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung, sh.laufendenummer;
[330]745
[276]746COMMENT ON VIEW rechte_eines_eigentuemers IS 'Muster fÌr Export: Suchkriteriumnach Bedarf anpassen. Dies ergÀnzt "flurstuecke_eines_eigentuemers" um die FÀlle mit besonderen Buchungen.';
[162]747
[183]748
[336]749-- Suche nach Fehlern:
[295]750-- Eine Hausnummer darf nur einem Gebaeude zugeordnet werden.
[336]751-- Das Verschieben der Relation
752--   ax_gebaeude >zeigtAuf>z ax_lagebezeichnungmithausnummer
[295]753-- fuehrt möglicherweise dazu, dass die alte Relation nicht gelöscht wird.
754-- Die angezeigten FÀlle sind potentielle Fehler.
755
756CREATE OR REPLACE VIEW fehler_hausnummer_mehrfach_verwendet
757AS
758 SELECT l.gml_id, l.gemeinde, l.lage, l.hausnummer
759   FROM ax_gebaeude g
[330]760   JOIN ax_lagebezeichnungmithausnummer l 
[339]761   --ON substring(l.gml_id,1,16) = ANY(g.zeigtauf)
762     ON l.gml_id = ANY(g.zeigtauf)
[331]763  WHERE g.endet IS NULL AND l.endet IS NULL
[295]764  GROUP BY l.gml_id, l.gemeinde, l.lage, l.hausnummer
765  HAVING count(g.gml_id) > 1;
766
767COMMENT ON VIEW fehler_hausnummer_mehrfach_verwendet
[330]768 IS 'Fehlersuche: Nach replace von ax_lagebezeichnungmithausnummer mit einem neuen ax_gebaeude bleibt die alte Verbindung?';
[295]769
[336]770
771-- unter Verwendung dieses View weitere Information
772CREATE OR REPLACE VIEW fehler_gebaeude_zu_mehrfach_hsnr
773AS
774  SELECT f.gemeinde, f.lage, k.bezeichnung, f.hausnummer,
775         g.gml_id, g.beginnt
776  FROM ax_gebaeude g
777  JOIN fehler_hausnummer_mehrfach_verwendet f
[339]778  --ON substring(f.gml_id::text, 1, 16) = ANY(g.zeigtauf)
779    ON f.gml_id = ANY(g.zeigtauf)
[336]780  JOIN ax_lagebezeichnungkatalogeintrag k
781    ON f.gemeinde=k.gemeinde AND f.lage=k.lage
782    WHERE g.endet IS NULL
783  ORDER BY f.gemeinde, f.lage, f.hausnummer, g.gml_id;
784
785COMMENT ON VIEW fehler_hausnummer_mehrfach_verwendet
786 IS 'Fehlersuche: Adressen und GebÀude-Objekte zu den Fehlern aus dem View "fehler_hausnummer_mehrfach_verwendet"';
787
788
[330]789-- Ein GebÀude hat mehrere Nummern.
[295]790CREATE OR REPLACE VIEW adressen_zu_gebauede_mit_mehreren_hausnummern
791AS
[330]792 SELECT g1.gml_id, l1.gemeinde, l1.lage, l1.hausnummer -- Anzeige der Adressfelder
793   FROM ax_gebaeude g1
794   JOIN ax_lagebezeichnungmithausnummer l1 ON l1.gml_id = ANY(g1.zeigtauf)
[331]795  WHERE g1.endet IS NULL AND l1.endet IS NULL
796    AND g1.gml_id IN -- Subquery sucht GebÀude mit meherern Hausnummen
[295]797   (SELECT g2.gml_id
[330]798      FROM ax_gebaeude g2
[339]799    --JOIN ax_lagebezeichnungmithausnummer l2 ON substring(l2.gml_id,1,16) = ANY(g2.zeigtauf)
800      JOIN ax_lagebezeichnungmithausnummer l2 ON l2.gml_id = ANY(g2.zeigtauf)
[331]801     WHERE g2.endet IS NULL AND l2.endet IS NULL
[330]802     GROUP BY g2.gml_id
803   HAVING count(l2.gml_id) > 1)
804   ORDER BY l1.gemeinde, l1.lage, l1.hausnummer;
[295]805
806COMMENT ON VIEW adressen_zu_gebauede_mit_mehreren_hausnummern
807 IS 'GebÀude mit mehreren Hausnummern suchen (ist erlaubt) und dazu die Adressen anzeigen.';
808
[298]809
810-- Analyse der Buchungs-Arten im Bestand
811CREATE OR REPLACE VIEW buchungsarten_vorkommend
812AS
813  SELECT a.wert, a.bezeichner,
814         count(b.gml_id) AS anzahl_buchungen
[339]815    FROM v_bs_buchungsart a
[298]816    JOIN ax_buchungsstelle b  ON a.wert = b.buchungsart
[331]817   WHERE b.endet IS NULL
[298]818GROUP BY a.wert, a.bezeichner
819ORDER BY a.wert, a.bezeichner;
820
821COMMENT ON VIEW buchungsarten_vorkommend
822 IS 'Welche Arten von Buchungsart kommen in dieser Datenbank tÀtsÀchlich vor?.';
823
824
825-- Analyse: FÀlle mit Erbbaurecht
826-- Benutzt den Baustein-View "doppelverbindung"
[330]827
828--   +++ BESSER: analog doppelverbindung direkt codieren
829
[298]830CREATE OR REPLACE VIEW erbbaurechte_suchen
831AS
[330]832  SELECT f.gml_id, f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler AS fssuch, f.nenner
[298]833   FROM ax_flurstueck    f
834   JOIN doppelverbindung d     -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von BS an BS
835     ON d.fsgml = f.gml_id
836   JOIN ax_buchungsstelle s    -- Buchungs-Stelle
837     ON d.bsgml = s.gml_id
[331]838   WHERE s.buchungsart = 2101 AND f.endet IS NULL AND s.endet IS NULL;
[298]839
[330]840COMMENT ON VIEW erbbaurechte_suchen
841 IS 'Suche nach FÀllen mit Buchungsrt 2101=Erbbaurecht';
[301]842
843
[311]844-- Suchen von Gewannenbezeichnungen, die auch als Straßenname verwendet werden.
845-- Diese FÀlle fÃŒhren möglicherweise zu unvollstÀndiger Ausgabe beim Export "alle FlurstÃŒcke an einer Straße"
846-- weil nur Lagebezeichnung MIT und OHNE Hausnummer gesucht wird, aber keine gleich lautende Gewanne.
[330]847
848-- DROP VIEW strasse_als_gewanne;
[311]849CREATE OR REPLACE VIEW strasse_als_gewanne
850AS
851  SELECT k.gemeinde, k.lage AS strassenschluessel,
[330]852         o.unverschluesselt AS gewanne_und_strasse, -- = k.bezeichnung = Straßenname
853         count(f.gml_id) AS anzahl_fs_gewanne
[311]854  FROM ax_lagebezeichnungkatalogeintrag k   -- Straßentabelle
855  JOIN ax_lagebezeichnungohnehausnummer o   -- Gewanne
856    ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen
[330]857  -- Join Gewanne auf FlurstÃŒcke um nur solche FÀlle anzuzeigen, die hier verwendet werden.
[311]858  -- UND die auch in der gleichen Gemeinde liegen.
859  -- Sonst könnte zufÀllige Namensgleichheiten aus verschiedenen Gemeinden geben.
[330]860  JOIN ax_flurstueck f               --  Flurst. >zeigtAuf>  Lage
861    ON o.gml_id = ANY(f.zeigtauf) 
862 WHERE f.gemeinde = k.gemeinde  -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraßenschlÃŒssel
863  GROUP BY k.gemeinde, k.lage, o.unverschluesselt
864  ORDER BY k.gemeinde, k.lage, o.unverschluesselt;
[311]865
866COMMENT ON VIEW strasse_als_gewanne
867 IS 'Gewannenbezeichnungen, die auch als Straßenname verwendet werden. Mit FlurstÃŒcks-ZÀhler.';
868
869
870-- Wie zuvor, aber die FlurstÌcke werden hier nicht nur gezÀhlt sondern auch aufgelistet.
871-- das Format des FlusrtÃŒckskennzeichens kann in die Mapbender-Navigation eingegeben werden.
[330]872
[311]873CREATE OR REPLACE VIEW strasse_als_gewanne_flst
874AS
[330]875  SELECT fo.gemarkungsnummer || '-' || fo.flurnummer || '-' || fo.zaehler::text || COALESCE ('/' || fo.nenner::text, '') AS flstkennz,
[311]876         k.gemeinde,
877         o.unverschluesselt AS gewanne,
878         k.lage        -- AS strassen_schluessel
879  FROM ax_lagebezeichnungkatalogeintrag k   -- Straßentabelle
880  JOIN ax_lagebezeichnungohnehausnummer o   -- Gewanne
881    ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen
[330]882   JOIN ax_flurstueck fo                    --  Flurst. >zeigtAuf>  Lage
[339]883   --ON substring(o.gml_id,1,16) = ANY(fo.zeigtauf)
884     ON o.gml_id = ANY(fo.zeigtauf) 
[311]885 WHERE fo.gemeinde = k.gemeinde  -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraßenschlÃŒssel
[331]886   AND k.endet IS NULL AND o.endet IS NULL AND fo.endet IS NULL
[311]887  ORDER BY fo.gemarkungsnummer, fo.flurnummer, fo.zaehler, k.gemeinde, k.bezeichnung;
888
889COMMENT ON VIEW strasse_als_gewanne_flst
890 IS 'FlurstÃŒcke mit Gewannenbezeichnungen, die auch als Straßenname verwendet werden.';
891
892
[315]893-- Suche nach Fehlern in den Daten, die moeglicherweise aus der Migration stammen und
894-- im Rahmen der Nachmigration noch korrigiert werden muessen.
895
896CREATE OR REPLACE VIEW nachmigration_aehnliche_anschriften
897AS
898  SELECT DISTINCT p.gml_id, p.nachnameoderfirma, p.vorname,
[330]899         a1.ort_post, a1.strasse AS strasse1, a2.strasse AS strasse2, a1.hausnummer
900    FROM ax_person    p
[339]901  --JOIN ax_anschrift a1 ON substring(a1.gml_id,1,16) = ANY(p.hat)
902    JOIN ax_anschrift a1 ON a1.gml_id = ANY(p.hat)
903  --JOIN ax_anschrift a2 ON substring(a2.gml_id,1,16) = ANY(p.hat)
904    JOIN ax_anschrift a2 ON a2.gml_id = ANY(p.hat)
[330]905   WHERE a1.gml_id <> a2.gml_id
[339]906      AND a1.ort_post = a2.ort_post
[330]907      AND a1.strasse like trim(a2.strasse, '.') || '%'
908      AND a1.hausnummer = a2.hausnummer
909      AND p.endet IS NULL AND a1.endet IS NULL and a2.endet IS NULL
[315]910    ORDER BY p.nachnameoderfirma, p.vorname;
911
912COMMENT ON VIEW nachmigration_aehnliche_anschriften
[330]913 IS 'Nachmigration? Zu einer Person gibt es mehrere Anschriften, die in Ort und Hausnummer identisch sind und beim Straßennemen entweder auch identisch sind oder eine AbkÃŒrzung mit Punkt enthalten.';
[315]914
915
[330]916-- Bevor alle inversen Relationen im Schema auskommentiert werden,
917-- noch mal in die Datenbank schauen, ob nicht doch eine davon gefÃŒllt ist.
918-- Nach dem Entfernen dieser Spalten wird der View nicht mehr funktionieren
919-- und wird darum ebenfalls auskommentiert.
920
921/*
922CREATE OR REPLACE VIEW nicht_gefuellte_inverse_relationen_spalten
923AS
924  SELECT 'ax_flurstueck' AS tabelle, 'beziehtsichaufflurstueck' AS spalte,
925     count(gml_id) AS anzahl_eintraege
926  FROM ax_flurstueck WHERE NOT beziehtsichaufflurstueck IS NULL
927UNION
928  SELECT 'ax_flurstueck' AS tabelle, 'gehoertanteiligzu' AS spalte,
929     count(gml_id) AS anzahl_eintraege
930  FROM ax_flurstueck WHERE NOT gehoertanteiligzu IS NULL
931UNION
932  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'beschreibt' AS spalte,
933     count(gml_id) AS anzahl_eintraege
934  FROM ax_lagebezeichnungohnehausnummer WHERE NOT beschreibt IS NULL
935UNION
936  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'gehoertzu' AS spalte,
937     count(gml_id) AS anzahl_eintraege
938  FROM ax_lagebezeichnungohnehausnummer WHERE NOT gehoertzu IS NULL
939UNION
940  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'hat' AS spalte,
941     count(gml_id) AS anzahl_eintraege
942  FROM ax_lagebezeichnungmithausnummer WHERE NOT hat IS NULL
943UNION
944  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauf' AS spalte,
945     count(gml_id) AS anzahl_eintraege
946  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauf IS NULL
947UNION
948  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauchauf' AS spalte,
949     count(gml_id) AS anzahl_eintraege
950  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauchauf IS NULL
951UNION
952  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'gehoertzu' AS spalte,
953     count(gml_id) AS anzahl_eintraege
954  FROM ax_lagebezeichnungmithausnummer WHERE NOT gehoertzu IS NULL
955UNION
956  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'weistzum' AS spalte,
957     count(gml_id) AS anzahl_eintraege
958  FROM ax_lagebezeichnungmithausnummer WHERE NOT weistzum IS NULL
959UNION
960  SELECT 'ax_lagebezeichnungmitpseudonummer' AS tabelle, 'gehoertzu' AS spalte,
961     count(gml_id) AS anzahl_eintraege
962  FROM ax_lagebezeichnungmitpseudonummer WHERE NOT gehoertzu IS NULL
963--UNION
964--  -- ist gefÃŒllt!
965--  SELECT 'ax_georeferenziertegebaeudeadresse' AS tabelle, 'hatauch' AS spalte,
966--     count(gml_id) AS anzahl_eintraege
967--  FROM ax_georeferenziertegebaeudeadresse WHERE NOT hatauch IS NULL
968UNION
969  SELECT 'ax_sicherungspunkt' AS tabelle, 'beziehtsichauf' AS spalte,
970     count(gml_id) AS anzahl_eintraege
971  FROM ax_sicherungspunkt WHERE NOT beziehtsichauf IS NULL
972UNION
973  SELECT 'ax_sicherungspunkt' AS tabelle, 'gehoertzu' AS spalte,
974     count(gml_id) AS anzahl_eintraege
975  FROM ax_sicherungspunkt WHERE NOT gehoertzu IS NULL
976-- Punktort: ist gefÃŒllt (nicht invers)
977--UNION
978--  SELECT 'ax_punktortag' AS tabelle, 'istteilvon' AS spalte,
979--     count(gml_id) AS anzahl_eintraege
980--  FROM ax_punktortag WHERE NOT istteilvon IS NULL
981--UNION
982--  SELECT 'ax_punktortau' AS tabelle, 'istteilvon' AS spalte,
983--     count(gml_id) AS anzahl_eintraege
984--  FROM ax_punktortau WHERE NOT istteilvon IS NULL
985--UNION
986--  SELECT 'ax_punktortta' AS tabelle, 'istteilvon' AS spalte,
987--     count(gml_id) AS anzahl_eintraege
988--  FROM ax_punktortta WHERE NOT istteilvon IS NULL
989UNION
990  SELECT 'ax_person' AS tabelle, 'weistauf' AS spalte,
991     count(gml_id) AS anzahl_eintraege
992  FROM ax_person WHERE NOT weistauf IS NULL
993UNION
994  SELECT 'ax_person' AS tabelle, 'uebtaus' AS spalte,
995     count(gml_id) AS anzahl_eintraege
996  FROM ax_person WHERE NOT uebtaus IS NULL
997UNION
998  SELECT 'ax_person' AS tabelle, 'besitzt' AS spalte,
999     count(gml_id) AS anzahl_eintraege
1000  FROM ax_person WHERE NOT besitzt IS NULL
1001UNION
1002  SELECT 'ax_person' AS tabelle, 'zeigtauf' AS spalte,
1003     count(gml_id) AS anzahl_eintraege
1004  FROM ax_person WHERE NOT zeigtauf IS NULL
1005UNION
1006  SELECT 'ax_person' AS tabelle, 'benennt' AS spalte,
1007     count(gml_id) AS anzahl_eintraege
1008  FROM ax_person WHERE NOT benennt IS NULL
1009UNION
1010  SELECT 'ax_anschrift' AS tabelle, 'beziehtsichauf' AS spalte,
1011     count(gml_id) AS anzahl_eintraege
1012  FROM ax_anschrift WHERE NOT beziehtsichauf IS NULL
1013UNION
1014  SELECT 'ax_anschrift' AS tabelle, 'gehoertzu' AS spalte,
1015     count(gml_id) AS anzahl_eintraege
1016  FROM ax_anschrift WHERE NOT gehoertzu IS NULL
1017UNION
1018  SELECT 'ax_verwaltung' AS tabelle, 'beziehtsichauf' AS spalte,
1019     count(gml_id) AS anzahl_eintraege
1020  FROM ax_verwaltung WHERE NOT beziehtsichauf IS NULL
1021UNION
1022  SELECT 'ax_vertretung' AS tabelle, 'vertritt' AS spalte,
1023     count(gml_id) AS anzahl_eintraege
1024  FROM ax_vertretung WHERE NOT vertritt IS NULL
1025UNION
1026  SELECT 'ax_buchungsblatt' AS tabelle, 'bestehtaus' AS spalte,
1027     count(gml_id) AS anzahl_eintraege
1028  FROM ax_buchungsblatt WHERE NOT bestehtaus IS NULL
1029UNION
1030  SELECT 'ax_buchungsstelle' AS tabelle, 'grundstueckbestehtaus' AS spalte,
1031     count(gml_id) AS anzahl_eintraege
1032  FROM ax_buchungsstelle WHERE NOT grundstueckbestehtaus IS NULL
1033UNION
1034  SELECT 'ax_gebaeude' AS tabelle, 'haengtzusammenmit' AS spalte,
1035     count(gml_id) AS anzahl_eintraege
1036  FROM ax_gebaeude WHERE NOT haengtzusammenmit IS NULL
1037;
1038
1039COMMENT ON VIEW nicht_gefuellte_relationen_spalten
1040 IS 'ÜberprÃŒfung auf nicht gefÃŒllte Inverse Relationen.
1041Funktioniert nur, solange diese nicht entfernt wurden.';
1042
1043*/
1044
1045-- Daraus resultiert der folgende Patch fÃŒr bereits angelegte Datenbanken:
1046/*
1047        ALTER TABLE ax_flurstueck                    DROP COLUMN beziehtsichaufflurstueck;
1048        ALTER TABLE ax_flurstueck                    DROP COLUMN gehoertanteiligzu;
1049        ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN beschreibt;
1050        ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN gehoertzu;
1051        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN hat;
1052        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauf;
1053        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauchauf;
1054        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN gehoertzu;
1055        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN weistzum;
1056        ALTER TABLE ax_lagebezeichnungmitpseudonummer DROP COLUMN gehoertzu;
1057        ALTER TABLE ax_sicherungspunkt               DROP COLUMN beziehtsichauf;
1058        ALTER TABLE ax_sicherungspunkt               DROP COLUMN gehoertzu;
1059        ALTER TABLE ax_person                        DROP COLUMN weistauf;
1060        ALTER TABLE ax_person                        DROP COLUMN uebtaus;
1061        ALTER TABLE ax_person                        DROP COLUMN besitzt;
1062        ALTER TABLE ax_person                        DROP COLUMN zeigtauf;
1063        ALTER TABLE ax_person                        DROP COLUMN benennt;
1064        ALTER TABLE ax_anschrift                     DROP COLUMN beziehtsichauf;
1065        ALTER TABLE ax_anschrift                     DROP COLUMN gehoertzu;
1066        ALTER TABLE ax_verwaltung                    DROP COLUMN beziehtsichauf;
1067        ALTER TABLE ax_vertretung                    DROP COLUMN vertritt;
1068        ALTER TABLE ax_buchungsblatt                 DROP COLUMN bestehtaus;
1069        ALTER TABLE ax_buchungsstelle                DROP COLUMN grundstueckbestehtaus;
1070        ALTER TABLE ax_gebaeude                      DROP COLUMN haengtzusammenmit;
1071*/
1072
[331]1073-- Anteile der Namensnummern am Blatt aufsummieren.
1074-- BlÀtter mit RechtsverhÀltnis (Beschrieb) nicht beachten.
1075-- Anzeigen, wenn die Summe nicht 1 ergibt.
1076-- Keine Angabe in ZÀhler/Nenner wird als 1 gewertet.
[330]1077
[331]1078-- Anlass zu dieser Auswertung war:
1079-- Wenn mit PostNAS 0.8 und Trigger "kill" (ohne Historie) eine NBA-Abgabe mit Abgabeart "3100 fallbezogen (mit Historie)"
1080-- konvertiert wird, dann wird Update nicht richtig verarbeitet.
1081-- Update setzt z.B. das endet-Datum an einen Namensnummer. Alte Namen verbleiben auf dem Grundbuch.
1082
1083CREATE OR REPLACE VIEW fehlersuche_namensanteile_je_blatt
1084AS
1085  SELECT g.gml_id, g.bezirk || '-' || g.buchungsblattnummermitbuchstabenerweiterung AS kennzeichen,
1086         sum(coalesce(n.zaehler/n.nenner, 1.0))::double precision AS summe_der_anteile
1087  FROM ax_buchungsblatt g
[339]1088  JOIN ax_namensnummer n
1089  --ON substring(g.gml_id,1,16) = n.istbestandteilvon
1090    ON g.gml_id = n.istbestandteilvon
[331]1091  WHERE g.endet IS NULL AND n.endet IS NULL
1092  GROUP BY g.gml_id, g.bezirk || '-' || g.buchungsblattnummermitbuchstabenerweiterung
1093  HAVING sum(coalesce(n.zaehler/n.nenner, 1)) <> 1.0::double precision
1094     AND (  -- die FÀlle mit einer Rechtsgemeinschaft nicht verwenden
1095        SELECT gml_id
1096        FROM ax_namensnummer nr
[339]1097        --ERE substring(g.gml_id,1,16) = nr.istbestandteilvon
1098        WHERE g.gml_id = nr.istbestandteilvon
[331]1099          AND NOT nr.artderrechtsgemeinschaft IS NULL
1100          AND nr.endet IS NULL
1101        LIMIT 1
1102     ) IS NULL
1103  LIMIT 100;
1104
1105COMMENT ON VIEW fehlersuche_namensanteile_je_blatt
1106 IS 'Suchen nach GB-BlÀttern bei denen die Summe der Anteile der Namensnummern nicht passt.
1107Mit Ausnahme von RechtsverhÀltnissen sollte sie Summe der BrÌche immer 1/1 ergeben.';
1108
[337]1109
1110-- PrÃŒfen einer Konvertierung mit historischen Objekten
1111-- Abgabeart 3100, Trigger "delete_feature_hist()".
1112-- NICHT anzuwenden bei Abgabeart 1000
[338]1113-- Siehe auch: FUNCTION "alkis_hist_check()" in Datei "alkis-functions.sql"
[337]1114
[339]1115-- Spaltenformat kann nicht geÀndert werden, löschen und neu anlegen.
1116DROP VIEW fehlersuche_hist_beginnt_endet_mischmasch;
1117DROP VIEW fehlersuche_hist_endet_sortierung_fs;
1118DROP VIEW hist_mehrere_vorgaenger_fs;
1119
[337]1120-- Erst mal die betroffenen Objekte identifizieren
[338]1121CREATE OR REPLACE VIEW hist_mehrere_vorgaenger_fs
[337]1122AS
[339]1123  SELECT gml_id AS gml, count(beginnt) AS anzahl -- 16stellige ID
[337]1124  FROM ax_flurstueck
[339]1125  GROUP BY gml_id
[337]1126  HAVING count(beginnt) > 4 -- mindestens 3 Generationen zur PrÃŒfung notwendig
1127  ORDER BY count(beginnt) DESC -- die hÀufigsten zuerst
1128  LIMIT 20;  -- reicht zum gucken
1129-- bis zu 7 Versionen je FS gefunden
1130
[338]1131COMMENT ON VIEW hist_mehrere_vorgaenger_fs
[337]1132 IS 'ALKIS-FlurstÃŒcke suchen, zu denen es inzwischen mehrere Versionen gibt,
1133also mehrere inzwischen beendete (historische) VorgÀnger-Versionen';
1134
1135-- Im zweiten Schritt dazu alle Versionen auflisten.
1136-- Die Serial "ogc_fid" sollte die EinfÌge-Reihenfolge reprÀsentieren.
1137-- Je "gml_id" muss "beginnt" und "endet" aufsteigend sein.
1138-- Das "endet" muss jeweils das "beginnt" der folgenden Version sein.
1139CREATE OR REPLACE VIEW fehlersuche_hist_endet_sortierung_fs
1140AS
[339]1141  SELECT gml_id AS gml, ogc_fid, beginnt, endet
[337]1142  FROM ax_flurstueck f
[338]1143  JOIN hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter
[339]1144    ON f.gml_id = v.gml
1145  ORDER BY gml_id, ogc_fid;
[337]1146
1147COMMENT ON VIEW fehlersuche_hist_endet_sortierung_fs
1148 IS 'Zu den ALKIS-FlurstÃŒcken, zu denen es inzwischen mehrere Versionen gibt,
1149werden die beginnt- und  endet-Zeiten angezeigt. Diese sollten streng aufsteigend sein.
1150Der endet-Zeitstempel sollte jeweils dem beginnt-Zeitstempel der Folgeversion enstsprechen.
1151(Nur) das endet der letzten Version sollte leer sein.';
1152
1153-- Speziell die FÀlle suchen, bei denen die Kombination beginnt/endet-Datum nicht logisch ist
1154CREATE OR REPLACE VIEW fehlersuche_hist_beginnt_endet_mischmasch
1155AS
[339]1156  SELECT v1.gml_id AS gml,
[337]1157        v1.beginnt AS v1_beginnt,
1158        v2.beginnt AS v2_beginnt,
1159     v1.endet   AS v1_endet,
1160     v2.endet   AS v2_endet
1161  FROM ax_gebaeude v1 -- Version 1 -- oder eine andere Objekt-Tabelle
1162  JOIN ax_gebaeude v2 -- Version 2
[339]1163    ON v1.gml_id = v2.gml_id   -- gleiches Objekt
[337]1164   AND v2.beginnt > v1.beginnt -- aufsteigendes Beginn-Datum
1165   AND v2.endet   < v1.endet   -- aber absteigendes endet-Datum - Fehler!
[339]1166  ORDER BY v1.gml_id, v1.beginnt, v1.endet
[337]1167  LIMIT 10; -- Beispiele als Beweis der Fehlerhaftigkeit
1168
1169COMMENT ON VIEW fehlersuche_hist_beginnt_endet_mischmasch
1170 IS 'Suche nach verschiedenen historischen Versionen eines Objektes bei denen das beginn-Datum aufsteigend ist, aber das endet-Datum absteigend (Falsch!).';
1171
[331]1172-- END --
Note: See TracBrowser for help on using the repository browser.