
-- ===================================================================================
--  ALKIS-PostGIS   Mapbender-Navigation und Buchauskunft für NorGIS-ALKIS-Importer
-- ===================================================================================

-- Aufgabe:
-- Views bereit stellen für die ALKIS-Navigation für Mapbender 2 und die Buch-Auskunft und spezielle WMS.

-- Ausführung in:
-- Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.

--Stand 
--  2016-02-23
--  2016-11-24 Index auf ax.person.nachnameoderfirma für WMS Flurstuecke_kommunal
--  2016-12-01 exp_csv: Fehlerkorrektur bei Entschlüsselung der Buchungsart
--             Optimierte Version (ohne Doppelverbindung)
--  2017-02-23 Spalte "fall" aus View "flst_an_strasse" im View "exp_csv_str" ausgeben.
--             Darauf basiert ein neuer Filter im Programm "alkisexport.php".
--			Sortierung FS-Kennz. repariert in Views "exp_csv" und "exp_csv_str"
--  2017-10-10 Berechtigungen rausgenommen in getrennte Datei
--  2017-12-06 Umbenennung von "x_classic2norgis.sql" nach "views_exp_csv.sql"

-- ToDo:
--  - die alten Übersichten "pp_flur", "pp_gemarkung" und "pp_gemeinde" wieder erzeugen
--    Siehe Script: "pp_gebiete.sql" (Füllen) und Teile von "pp_definition.sql" (DB-Struktur).
--  - Statt den View "flst_an_strasse" im View "exp_csv_str" einzubinden könnte ein 4fach-UNION schneller sein. Testen.


-- I n d i c e s
-- ============================

-- Tabelle "ax_gemarkungsteilflur" sollte Such-Index erhalten auf "gemarkung".
-- Für Auflistung aller Fluren zur Gemarkung in Script "alkisnav_fls", Function "EineGemarkung".


-- Der WMS "Flurstuecke_Kommunal" (aus View "st_flurst[gkz][e|r]") wird langsam, wenn er in einer kreisweiten Datenbank ausgeführt wird.
-- Das Filter-Feld benötigt einen Index:
DROP INDEX if exists ax_person_nname;
CREATE INDEX ax_person_nname
  ON ax_person USING btree (nachnameoderfirma COLLATE pg_catalog."default");


-- V i e w s
-- ============================


-- Bausteine für andere Views:
-- ---------------------------

-- Ein View, der die Verbindung von Flurstück zur Straßentabelle für zwei verschiedene Fälle herstellt.
-- Einmal über die Lagebezeichnung MIT Hausnummer und einmal OHNE.
-- Dies kann als "Mittelstück" in den anderen Views eingefügt werden.

--           DROP VIEW public.flst_an_strasse;
CREATE OR REPLACE VIEW public.flst_an_strasse
AS
  -- Flurstück >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
  SELECT fm.gml_id AS fsgml,
         sm.gml_id AS stgml,                 -- Filter: gml_id der Straße
         'm' AS fall                         -- Sätze unterschieden: Mit HsNr
    FROM ax_flurstueck fm                    -- Flurstück Mit
    JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
      ON lm.gml_id = ANY (fm.weistauf)
    JOIN ax_lagebezeichnungkatalogeintrag sm
      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 
   WHERE lm.endet IS NULL AND fm.endet IS NULL -- nichts Historisches
 UNION
  -- Flurstück >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
  SELECT fo.gml_id AS fsgml,
         so.gml_id AS stgml,                 -- Filter: gml_id der Straße
         'o' AS fall                         -- Sätze unterschieden: Ohne HsNr
    FROM ax_flurstueck fo                    -- Flurstück OHNE
    JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
      ON lo.gml_id = ANY (fo.zeigtauf)
    JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
      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
   WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches

COMMENT ON VIEW public.flst_an_strasse 
 IS 'ALKIS-Beziehung von Flurstück zu Straßentabelle. UNION-Zusammenfassung der Fälle MIT und OHNE Hausnummer.';

-- Muss man noch dafür sorgen, dass Flurstück nicht doppelt vorkommt? z.B. mit DISTINCT
-- Oder müssen ggf. mehrfache FS im Programm übersprungen werden?


-- Generelle Export-Struktur "Flurstück - Buchung - Grundbuch - Person"
-- --------------------------------------------------------------------
-- Wird benötigt im Auskunft-Modul "alkisexport.php":
-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
-- Für Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".

-- Problem / Konflikt:
-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden. 
-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in 
-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt. 
-- Diese Redundanzen müssen vom dem Programm gefiltert werden, das die Daten über eine Schnittstelle einliest.
-- Anwendungs-Beispiel: Abrechnung von Anliegerbeiträgen.


DROP VIEW IF EXISTS exp_csv;
CREATE OR REPLACE VIEW exp_csv
AS
 SELECT
  -- F l u r s t ü c k
    f.gml_id                             AS fsgml,       -- möglicher Filter Flurstücks-GML-ID
    f.flurstueckskennzeichen             AS fs_kennz,
    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
    f.flurnummer, f.zaehler, f.nenner, 
    f.amtlicheflaeche                    AS fs_flae,
    g.bezeichnung                        AS gemarkung,
  -- G r u n d b u c h
    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
    gb.bezirk                            AS gb_bezirk,
    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
  -- B u c h u n g s s t e l l e  (Grundstück)
    s.laufendenummer                     AS bu_lfd,      -- BVNR
    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN über 'Recht an')
    s.buchungsart,                                       -- verschlüsselt
    wb.v                                 AS bu_art,      -- Buchungsart entschlüsselt
  -- N a m e n s N u m m e r  (Normalfall mit Person)
    nn.laufendenummernachdin1421         AS nam_lfd, 
    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
    rg.artderrechtsgemeinschaft          AS nam_adr,
    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
  -- P e r s o n
    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
    p.anrede,                                            -- Anrede key
    wp.v                                 AS anrv,        -- Anrede Value zum Key
    p.vorname,
    p.namensbestandteil,
    p.nachnameoderfirma,                                 -- Familienname
    p.geburtsdatum,
  -- A d r e s s e  der Person
    a.postleitzahlpostzustellung         AS plz,
    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck    f               -- Flurstück
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
    ON f.istgebucht = s.gml_id
  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
    ON gb.gml_id = s.istbestandteilvon
  JOIN ax_buchungsblattbezirk z 
    ON gb.land=z.land AND gb.bezirk=z.bezirk 
  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
    ON gb.gml_id = nn.istbestandteilvon
  JOIN ax_person p                      -- NamNum >benennt> Person 
    ON p.gml_id = nn.benennt
  LEFT JOIN ax_anschrift a 
    ON a.gml_id = ANY (p.hat)
  -- E n t s c h l ü s s e l n:
  LEFT JOIN alkis_wertearten wp         -- Entschlüsseln "Person - Anrede"
    ON cast(p.anrede AS character varying) = wp.k 
   AND wp.element = 'ax_person' 
   AND wp.bezeichnung = 'anrede' 
  LEFT JOIN alkis_wertearten wb         -- Entschlüsseln "Buchungsart"
    ON cast(s.buchungsart AS character varying) = wb.k
 -- buchungsart = integer / .k  = char 4stellig
   AND wb.element = 'ax_buchungsstelle'
   AND wb.bezeichnung = 'buchungsart' 
  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
  -- Noch mal "GB -> NamNum", aber dieses Mal für "Rechtsgemeinschaft".
  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
  LEFT JOIN
   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
       FROM ax_namensnummer r 
       JOIN ax_buchungsblatt gr
         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
      LEFT JOIN alkis_wertearten wr
        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
   ON rg.gml_id = gb.gml_id  -- zum GB
  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
UNION
 SELECT
  -- F l u r s t ü c k
    f.gml_id                             AS fsgml,       -- möglicher Filter Flurstücks-GML-ID
    f.flurstueckskennzeichen             AS fs_kennz,
    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
    f.flurnummer, f.zaehler, f.nenner, 
    f.amtlicheflaeche                    AS fs_flae,
    g.bezeichnung                        AS gemarkung,
  -- G r u n d b u c h
    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
    gb.bezirk                            AS gb_bezirk,
    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
  -- B u c h u n g s s t e l l e  (Grundstück)
    s.laufendenummer                     AS bu_lfd,      -- BVNR
    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN über 'Recht an')
    s.buchungsart,                                       -- verschlüsselt
    wb.v                                 AS bu_art,      -- Buchungsart entschlüsselt
  -- N a m e n s N u m m e r  (Normalfall mit Person)
    nn.laufendenummernachdin1421         AS nam_lfd, 
    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
    rg.artderrechtsgemeinschaft          AS nam_adr,
    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
  -- P e r s o n
    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
    p.anrede,                                            -- Anrede key
    wp.v                                 AS anrv,        -- Anrede Value zum Key
    p.vorname,
    p.namensbestandteil,
    p.nachnameoderfirma,                                 -- Familienname
    p.geburtsdatum,
   -- A d r e s s e  der Person
    a.postleitzahlpostzustellung         AS plz,
    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck f                  -- Flurstück
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
 -- Variante mit 2 Buchungs-Stellen (Recht An)
  JOIN ax_buchungsstelle dien           -- dienende Buchung
    ON f.istgebucht = dien.gml_id
  JOIN ax_buchungsstelle s              -- herrschende Buchung
    ON dien.gml_id = ANY (s.an)         -- hat Recht an
  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
    ON gb.gml_id = s.istbestandteilvon
  JOIN ax_buchungsblattbezirk z 
    ON gb.land=z.land AND gb.bezirk=z.bezirk 
  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
    ON gb.gml_id = nn.istbestandteilvon
  JOIN ax_person p                      -- NamNum >benennt> Person 
    ON p.gml_id = nn.benennt
  LEFT JOIN ax_anschrift a 
    ON a.gml_id = ANY (p.hat)
  -- E n t s c h l ü s s e l n:
  LEFT JOIN alkis_wertearten wp         -- Entschlüsseln "Person - Anrede"
    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede' 
  LEFT JOIN alkis_wertearten wb         -- Entschlüsseln "Buchungsart"
    ON cast(s.buchungsart AS character varying) = wb.k 
   AND wb.element = 'ax_buchungsstelle' 
   AND wb.bezeichnung = 'buchungsart' 
  LEFT JOIN
   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
       FROM ax_namensnummer r 
       JOIN ax_buchungsblatt gr
         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
      LEFT JOIN alkis_wertearten wr
        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
   ON rg.gml_id = gb.gml_id  -- zum GB
  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
    AND dien.endet IS NULL

ORDER BY fs_kennz,   -- f.flurstueckskennzeichen, 
      -- fsgml,      
         gb_bezirk,  -- gb.bezirk, 
         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
         bu_lfd,     -- s.laufendenummer,
         nam_lfd;    -- nn.laufendenummernachdin1421

COMMENT ON VIEW exp_csv 
 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.';


-- Eine Variante des View "exp_csv":
-- Hier wird zusätzlich der Baustein "flst_an_strasse" verwendet.
-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden
-- um nur die Flurstücke zu bekommen, die an einer Straße liegen.

DROP VIEW IF EXISTS exp_csv_str;

CREATE OR REPLACE VIEW exp_csv_str
AS
 SELECT
    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
                                                         -- UNTERSCHIED zu exp_csv
    l.fall,                                              -- mit/ohne Hausnummer zur Lage
  -- F l u r s t ü c k
    f.gml_id                             AS fsgml,       -- möglicher Filter Flurstücks-GML-ID
    f.flurstueckskennzeichen             AS fs_kennz,
    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
    f.flurnummer, f.zaehler, f.nenner, 
    f.amtlicheflaeche                    AS fs_flae,
    g.bezeichnung                        AS gemarkung,
  -- G r u n d b u c h
  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
    gb.bezirk                            AS gb_bezirk,
    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
  -- B u c h u n g s s t e l l e  (Grundstück)
    s.laufendenummer                     AS bu_lfd,      -- BVNR
    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN über 'Recht an')
    s.buchungsart,                                       -- verschlüsselt
    wb.v                                 AS bu_art,      -- Buchungsart entschlüsselt
  -- N a m e n s N u m m e r  (Normalfall mit Person)
    nn.laufendenummernachdin1421         AS nam_lfd, 
    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
    rg.artderrechtsgemeinschaft          AS nam_adr,
    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
  -- P e r s o n
  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
    p.anrede,                                            -- Anrede key
    wp.v                                 AS anrv,        -- Anrede Value zum Key
    p.vorname,
    p.namensbestandteil,
    p.nachnameoderfirma,                                 -- Familienname
    p.geburtsdatum,
  -- A d r e s s e  der Person
    a.postleitzahlpostzustellung         AS plz,
    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck    f               -- Flurstück
  JOIN flst_an_strasse  l               -- Lage (hier zusätzlicher JOIN gegenüber Version "exp_csv") 
    ON l.fsgml = f.gml_id               -- ToDo: ++ Durch UNION ersetzen! Oder durch Subquery? ++
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
    ON f.istgebucht = s.gml_id
  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
    ON gb.gml_id = s.istbestandteilvon
  JOIN ax_buchungsblattbezirk z 
    ON gb.land=z.land AND gb.bezirk=z.bezirk 
  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
    ON gb.gml_id = nn.istbestandteilvon
  JOIN ax_person p                      -- NamNum >benennt> Person 
    ON p.gml_id = nn.benennt
  LEFT JOIN ax_anschrift a 
    ON a.gml_id = ANY (p.hat)
  -- E n t s c h l ü s s e l n:
  LEFT JOIN alkis_wertearten wp         -- Entschlüsseln "Person - Anrede"
    ON cast(p.anrede AS character varying) = wp.k 
   AND wp.element = 'ax_person' 
   AND wp.bezeichnung = 'anrede' 
  LEFT JOIN alkis_wertearten wb         -- Entschlüsseln "Buchungsart"
    ON cast(s.buchungsart AS character varying) = wb.k
 -- buchungsart = integer / .k  = char 4stellig
   AND wb.element = 'ax_buchungsstelle'
   AND wb.bezeichnung = 'buchungsart' 
  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
  -- Noch mal "GB -> NamNum", aber dieses Mal für "Rechtsgemeinschaft".
  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
  LEFT JOIN
   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
       FROM ax_namensnummer r 
       JOIN ax_buchungsblatt gr
         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
      LEFT JOIN alkis_wertearten wr
        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
   ON rg.gml_id = gb.gml_id  -- zum GB
  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
UNION
 SELECT
    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
                                                         -- UNTERSCHIED zu exp_csv
    l.fall,                                              -- mit/ohne Hausnummer zur Lage
  -- F l u r s t ü c k
    f.gml_id                             AS fsgml,       -- möglicher Filter Flurstücks-GML-ID
    f.flurstueckskennzeichen             AS fs_kennz,
    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
    f.flurnummer, f.zaehler, f.nenner, 
    f.amtlicheflaeche                    AS fs_flae,
    g.bezeichnung                        AS gemarkung,
  -- G r u n d b u c h
  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
    gb.bezirk                            AS gb_bezirk,
    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
  -- B u c h u n g s s t e l l e  (Grundstück)
    s.laufendenummer                     AS bu_lfd,      -- BVNR
    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN über 'Recht an')
    s.buchungsart,                                       -- verschlüsselt
    wb.v                                 AS bu_art,      -- Buchungsart entschlüsselt
  -- N a m e n s N u m m e r  (Normalfall mit Person)
    nn.laufendenummernachdin1421         AS nam_lfd, 
    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
    rg.artderrechtsgemeinschaft          AS nam_adr,
    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
  -- P e r s o n
  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
    p.anrede,                                            -- Anrede key
    wp.v                                 AS anrv,        -- Anrede Value zum Key
    p.vorname,
    p.namensbestandteil,
    p.nachnameoderfirma,                                 -- Familienname
    p.geburtsdatum,
   -- A d r e s s e  der Person
    a.postleitzahlpostzustellung         AS plz,
    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck f                  -- Flurstück
  JOIN flst_an_strasse  l               -- Lage (hier zusätzlicher JOIN gegenüber Version "exp_csv") 
    ON l.fsgml = f.gml_id 
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
 -- Variante mit 2 Buchungs-Stellen (Recht An)
  JOIN ax_buchungsstelle dien           -- dienende Buchung
    ON f.istgebucht = dien.gml_id
  JOIN ax_buchungsstelle s              -- herrschende Buchung
    ON dien.gml_id = ANY (s.an)         -- hat Recht an
  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
    ON gb.gml_id = s.istbestandteilvon
  JOIN ax_buchungsblattbezirk z 
    ON gb.land=z.land AND gb.bezirk=z.bezirk 
  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
    ON gb.gml_id = nn.istbestandteilvon
  JOIN ax_person p                      -- NamNum >benennt> Person 
    ON p.gml_id = nn.benennt
  LEFT JOIN ax_anschrift a 
    ON a.gml_id = ANY (p.hat)
  -- E n t s c h l ü s s e l n:
  LEFT JOIN alkis_wertearten wp         -- Entschlüsseln "Person - Anrede"
    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede' 
  LEFT JOIN alkis_wertearten wb         -- Entschlüsseln "Buchungsart"
    ON cast(s.buchungsart AS character varying) = wb.k 
   AND wb.element = 'ax_buchungsstelle' 
   AND wb.bezeichnung = 'buchungsart' 
  LEFT JOIN
   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
       FROM ax_namensnummer r 
       JOIN ax_buchungsblatt gr
         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
      LEFT JOIN alkis_wertearten wr
        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
   ON rg.gml_id = gb.gml_id  -- zum GB
  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
    AND dien.endet IS NULL

ORDER BY fs_kennz,   -- f.flurstueckskennzeichen, 
         gb_bezirk,  -- gb.bezirk, 
         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
         bu_lfd,     -- s.laufendenummer,
         nam_lfd;    -- nn.laufendenummernachdin1421

COMMENT ON VIEW exp_csv_str 
 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.';


-- Berechtigung fuer Views
-- ============================

  GRANT SELECT ON TABLE public.flst_an_strasse  TO mb27;
  GRANT SELECT ON TABLE public.exp_csv          TO mb27;
  GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;

-- Ende --