Index: trunk/import/norgis_alkis_pp/postprocessing.d/9_optimize.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postprocessing.d/9_optimize.sql	(revision 411)
+++ trunk/import/norgis_alkis_pp/postprocessing.d/9_optimize.sql	(revision 412)
@@ -10,5 +10,4 @@
 -- Anzeige der GrÃ¶Ãe der Datenbank vor der Optimierung.
 -- https://www.postgresql.org/docs/current/static/functions-admin.html
--- ++ Formatierung in besser lesbarem Zahlenformat mit . nach je 3 Stellen.
   SELECT pg_database_size(:'DBNAME') AS db_groesse_vorher;
 
@@ -23,5 +22,5 @@
 -- Der Konverter ogr2ogr/NAS liest in einem zweiten Durchlauf durch die NAS-Datei die 
 --  DatensÃ€tze mit den Operationen DELETE, REPLACE und UPDATE.
--- Diese SÃ€tze werden in die Tabelle "delete" eingefÃŒgt, wo sie ÃŒber einen Datenbank-Trigger die FortfÃŒhrung der Obejkt-Tabellen auslÃ¶sen.
+-- Diese SÃ€tze werden in die Tabelle "delete" eingefÃŒgt, wo sie ÃŒber einen Datenbank-Trigger die FortfÃŒhrung der Objekt-Tabellen auslÃ¶sen.
 -- Danach kÃ¶nnen die SÃ€tze der delete-Tabelle wieder gelÃ¶scht werden.
   TRUNCATE delete;
@@ -38,6 +37,5 @@
 
 -- Wie lange soll das Protokoll gespeichert bleiben?
--- Ggf. seletiv nur "alte" EintrÃ€ge entfernen: WHERE ... ?  
---TRUNCATE alkis_importlog;
+-- Selektiv "alte" EintrÃ€ge entfernen.
 --  ts timestamp without time zone DEFAULT now(),
   SELECT 'Importlog vom ' || date(min(ts)) || ' bis ' || date(max(ts)) AS vorher FROM alkis_importlog;
@@ -46,5 +44,5 @@
 
 
--- C l u s t e r n  einiger Tabellen wie im Schritt postcreate definiert.
+-- C l u s t e r n  einiger Tabellen wie im Schritt postcreate.d definiert.
 -- --------------------------------------------------------------------------
 -- https://www.postgresql.org/docs/9.4/static/sql-cluster.html
Index: trunk/import/norgis_alkis_pp/postcreate.d/9_optimize.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.d/9_optimize.sql	(revision 411)
+++ trunk/import/norgis_alkis_pp/postcreate.d/9_optimize.sql	(revision 412)
@@ -1,62 +1,23 @@
--- OSGeo4W64\apps\alkis-import-dev\postprocessing.d\9_optimize.sql
+-- OSGeo4W64\apps\alkis-import\postcreate.d\9_optimize.sql
 -- Optimieren von ALKIS-Datenbanken aus PostNAS.
 -- Optionaler Schritt nach dem Laden oder Aktualisieren.
--- Ziel ist die Reduzierung des Speicherplatzes und die Verbesserung der Verarbeitungs-Geschwindigkeit.
+-- Ziel ist die Verbesserung der Verarbeitungs-Geschwindigkeit.
 
--- 2018-10-29 krz Mi-Ra/Li: Idee "Clustering" aus der PostNAS-Sitzung.
+-- 2018-11-09 krz Mi-Ra/Li: Full-Schema
 
-  SELECT 'Optimierung der Datenbank lÃ€uft ...' AS info;
-
--- Anzeige der GrÃ¶Ãe der Datenbank vor der Optimierung.
--- https://www.postgresql.org/docs/current/static/functions-admin.html
-  SELECT pg_database_size(:'DBNAME') AS db_groesse_vorher;
-
-
--- Wenn keine historischen Objekte verwendet werden sollen, dann kÃ¶nnen alle Objekte gelÃ¶scht werden, 
---  die einen Eintrag in der Spalte "endet" haben (endet IS NULL).
--- Sollte auskommentiert werden, wenn im NBA-Verfahren bewusst die Abgabeart "3100 fallbezogen (mit Historie)" verwendet wird 
---  und die historischen Objekte von der Anwendung gefiltert angezeigt werden kÃ¶nnen.
-  SELECT alkis_delete_all_endet();
-
-
--- Der Konverter ogr2ogr/NAS liest in einem zweiten Durchlauf durch die NAS-Datei die 
---  DatensÃ€tze mit den Operationen DELETE, REPLACE und UPDATE.
--- Diese SÃ€tze werden in die Tabelle "delete" eingefÃŒgt, wo sie ÃŒber einen Datenbank-Trigger die FortfÃŒhrung der Objekt-Tabellen auslÃ¶sen.
--- Danach kÃ¶nnen die SÃ€tze der delete-Tabelle wieder gelÃ¶scht werden.
-  TRUNCATE delete;
-
-
--- Die Tabelle "alkis_beziehungen" hat in einer frÃŒhen Version des Konverters die Beziehungen zwischen ALKIS-Objekten abgebildet.
--- Sie wurde ersetzt durch direkte Relationn zwischen den Objekt-Tabellen.
--- Die Tabelle "alkis_beziehungen" sollte von auswertenden Programmen nicht mehr verwendet werden.
--- Falls sie vom Konverter (Importer) noch gefÃŒllt wird, kann der Inhalt gelÃ¶scht werden.
--- Der Befehl TRUNCATE ist schneller, kann aber nur vom EigentÃŒmer verwendet werden. Ggf. ersetzen durch "DELETE". 
-  TRUNCATE alkis_beziehungen;
---DELETE FROM alkis_beziehungen;
-
-
--- Wie lange soll das Protokoll gespeichert bleiben?
--- Selektiv "alte" EintrÃ€ge entfernen.
---  ts timestamp without time zone DEFAULT now(),
-  SELECT 'Importlog vom ' || date(min(ts)) || ' bis ' || date(max(ts)) AS vorher FROM alkis_importlog;
-  DELETE FROM alkis_importlog WHERE (current_timestamp - ts) > interval '62 days';  -- ca. 2 Monate
-  SELECT 'Importlog vom ' || date(min(ts)) || ' bis ' || date(max(ts)) AS nachher FROM alkis_importlog;
-
-
--- C l u s t e r n  einiger Tabellen wie im Schritt postcreate.d definiert.
--- --------------------------------------------------------------------------
+-- C l u s t e r n  der Darstellungstabellen mit dem geometrischen Index
+-- -------------------------------------------------------------------------
 -- https://www.postgresql.org/docs/9.4/static/sql-cluster.html
 -- CLUSTER [VERBOSE] table_name [ USING index_name ]
 
-  CLUSTER ; 
+  CLUSTER po_labels    USING po_labels_point_idx;  -- hat 2 Geometrie-Felder!
+  CLUSTER po_lines     USING po_lines_line_idx;
+  CLUSTER po_points    USING po_points_point_idx;
+  CLUSTER po_polygons  USING po_polygons_polygons_idx;
 
-
--- Reorganisation des Speichers.
--- Dauert je nach DB-GrÃ¶Ãe einen Weile. Die Datenbank is wÃ€hrend dieser Zeit nur eingeschrÃ€nkt benutzbar.
-  VACUUM full;
-
-
--- GrÃ¶Ãe der Datenbank nach der Optimierung anzeigen.
-  SELECT pg_database_size(:'DBNAME') AS db_groesse_nachher;
+-- Die Datenbank ist zum Zeitpunkt der Verarbeitung (postcreate) dieses Skriptes noch nicht gefÃŒllt,
+-- daher erfolgt hier noch keine wirkliche Sortierung der DatensÃ€tze.
+-- Die gewÃŒnschte Clusterung wird aber gespeichert. Nach der Aktualisierung der Daten (Schritt "postprocessing") 
+-- kann der SQL-Befehl "CLUSTER;" ohne weitere Parameter ausgefÃŒhrt werden. Es wird dann alles neu geclustert, so wie hier definiert.
 
 -- ENDE --
Index: trunk/import/norgis_alkis_pp/postcreate.d/6_views_exp_csv.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.d/6_views_exp_csv.sql	(revision 412)
+++ trunk/import/norgis_alkis_pp/postcreate.d/6_views_exp_csv.sql	(revision 412)
@@ -0,0 +1,554 @@
+
+-- ===================================================================
+--  ALKIS-PostGIS (Full-Schema) - Buchauskunft: Export von CSV-Dateien
+-- ===================================================================
+
+-- Aufgabe:       Views bereit stellen fÃŒr den CSV-Export in der ALKIS-Buch-Auskunft.
+-- 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"
+--  2017-12-20 Beseitigung des Fehlers: Mehrere Adressen zur Person fuehren zu mehrfachen Zeilen (Wiederholung FlurstÃŒck und Flaeche ..)
+--             Es wird je Persoon nur noch die "letzte" Adresse verwendet (subquery).
+--             Der View "exp_csv_str" ist jetzt direkt als 4fach-UNION (2x2) codiert statt mit eingebettetem gespeicherten 2fach-Union.
+--             Hauptvorteil: Keine undurchsichtigen AbhÃ€ngigkeiten. Ist auch etwas schneller.
+--  2017-12-20 Suche (Sortierung) 'letzte Adresse' nach "beginnt" statt nach "gml_id"
+--  2018-11-09 Umstellung auf Full-Schema
+
+-- 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).
+
+
+-- 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
+-- ============================
+
+-- 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 -- Fall: einfache Buchung (ohne "Recht an")
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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              -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+--LEFT JOIN alkis_wertearten wp ON cast(p.anrede AS character varying) = wp.k AND wp.element = 'ax_person' AND wp.bezeichnung = 'anrede'
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+--LEFT JOIN alkis_wertearten wb ON cast(s.buchungsart AS character varying) = wb.k AND wb.element = 'ax_buchungsstelle' AND wb.bezeichnung = 'buchungsart'
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  -- 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.beschreibung
+       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' 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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  -- Fall: "Recht an"
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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               -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  LEFT JOIN
+   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.beschreibung
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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 
+ 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 die Lagebezeichnung zum FlurstÃŒck angebunden in den Varianten MIT/OHNE Hausnummer.
+-- 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      -- Version mit 4fach-UNION (2x2 FÃ€lle) statt eingebauter View "flst_an_strasse"
+ SELECT -- Fall 1: einfache Buchung (ohne Recht an)  // Lagebezeichnung MIT Hausnummer
+    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck    f               -- FlurstÃŒck
+  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT
+    ON lm.gml_id = ANY (f.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 
+   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              -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  -- 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.beschreibung
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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 lm.endet IS NULL  
+---------
+  UNION
+---------
+ SELECT -- Fall 2: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung MIT Hausnummer
+    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck f                  -- FlurstÃŒck
+  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
+    ON lm.gml_id = ANY (f.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 
+  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              -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  LEFT JOIN
+   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.beschreibung
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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 AND lm.endet IS NULL  
+---------
+  UNION
+---------
+ SELECT -- Fall 3: einfache Buchung (ohne Recht an)  //  Lagebezeichnung OHNE Hausnummer
+    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck    f               -- FlurstÃŒck
+-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
+    ON lo.gml_id = ANY (f.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
+  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              -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  -- 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.beschreibung
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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 lo.endet IS NULL 
+---------
+  UNION
+---------
+ SELECT -- Fall 4: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung OHNE Hausnummer
+    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
+  -- 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.beschreibung                      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.beschreibung                      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.beschreibung                      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,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck f                  -- FlurstÃŒck
+-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
+    ON lo.gml_id = ANY (f.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
+  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              -- nur die "letzte" Anschrift zur Person verwenden
+    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN ax_anrede_person wp ON p.anrede = wp.wert
+  LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
+  LEFT JOIN
+   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.beschreibung
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wr ON r.artderrechtsgemeinschaft = wr.wert
+      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 AND lo.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
+  GRANT SELECT ON TABLE public.exp_csv          TO mb27;
+  GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;
+
+-- Ende --
Index: trunk/import/norgis_alkis_pp/postcreate.d/7_views_buchungsketten.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.d/7_views_buchungsketten.sql	(revision 412)
+++ trunk/import/norgis_alkis_pp/postcreate.d/7_views_buchungsketten.sql	(revision 412)
@@ -0,0 +1,267 @@
+
+-- ========================================================================================================
+--  ALKIS-PostGIS (Full-Schema) - FlurstÃŒcke Suchen, die eine Verkettung von mehreren Buchungsstellen haben
+-- ========================================================================================================
+
+-- Aufgaben:
+-- ---------
+-- FlurstÃŒcke ermitteln, die 2 bis 4 (oder mehr?) Buchungsstellen haben die jeweils ein "Recht an" einer anderen Buchungsstelle haben.
+-- Beispiel:
+--   "Wohnungs-/Teiluntererbbaurecht" >an> "Aufgeteiltes Untererbbaurecht WEG" >an> "Erbbaurecht" >an> "GrundstÃŒck" >Buchung> FlurstÃŒck 
+-- In einem WMS diese besonderen Buchungen hervorheben.
+-- Die betroffenen Buchungsarten auflisten. Auch einige EinzelfÃ€lle selektieren.
+-- Dies dient zunÃ€chst dazu, um TestfÃ€lle fÃŒr die Weiterentwicklung der Buchauskunft zu finden (Entwicklung). Vielleicht hat auch ein Anwender Verwendung dafÃŒr.
+
+-- AusfÃŒhrung in:
+-- Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.
+
+--Stand 
+--  2017-12-07 Prototyp
+--  2018-11-09 Umstellung auf Full-Schema.
+--			Die ehem. Tab. "alkis_wertearten" ist jetzt ein riesiger Union-View. Diesen View ersetzen durch die passende neue Tabelle.
+
+-- Views fÃŒr die Darstellung im WMS
+-- =================================
+
+-- 2 beteiligte Buchungsstellen
+-- "Erbbaurecht" und Ã€hnliches
+-- --------------------------
+-- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2
+-- --------------------------------------------------------------------
+   DROP VIEW IF EXISTS buchungsrechte_2arten;
+   DROP VIEW IF EXISTS buchungsrechte_2wms;
+CREATE OR REPLACE VIEW buchungsrechte_2wms
+AS
+ SELECT DISTINCT                    -- Ohne DISTINCT mehrfache Ãberlagerung
+    f.gml_id,                       -- Unique Key
+    s2.buchungsart,                 -- verschlÃŒsselt (Nummer)
+    f.wkb_geometry
+  FROM ax_flurstueck     f          -- FlurstÃŒck
+  JOIN ax_buchungsstelle s1         -- dienende Buchung
+    ON f.istgebucht = s1.gml_id
+  JOIN ax_buchungsstelle s2         -- herrschende Buchung
+    ON s1.gml_id = ANY(s2.an)       -- hat Recht an
+  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL;
+
+COMMENT ON VIEW buchungsrechte_2wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 2 beteiligten Buchungsstellen, z.B. Erbbaurecht.';
+GRANT SELECT ON TABLE public.buchungsrechte_2wms  TO ms6;
+
+
+-- 3 beteiligte Buchungsstellen
+-- "Untererbbaurecht" und Ã€hnliches
+-- --------------------------------
+-- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3
+-- ------------------------------------------------------------------------------------------------------------------
+   DROP VIEW IF EXISTS buchungsrechte_3arten;
+   DROP VIEW IF EXISTS buchungsrechte_3wms;
+CREATE OR REPLACE VIEW buchungsrechte_3wms
+AS
+ SELECT DISTINCT f.gml_id, s3.buchungsart, f.wkb_geometry
+   FROM ax_flurstueck     f  
+   JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
+   JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)    
+   JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an)  
+  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL;
+
+COMMENT ON VIEW buchungsrechte_3wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 3 beteiligten Buchungsstellen, z.B. Untererbbaurecht.';
+GRANT SELECT ON TABLE public.buchungsrechte_3wms  TO ms6;
+
+
+-- 4 beteiligte Buchungsstellen
+-- Teil-Untererbbaurecht
+-- --------------------------------
+-- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3 <an<  Buchungstelle 4
+-- ------------------------------------------------------------------------------------------------------------------
+   DROP VIEW IF EXISTS buchungsrechte_4arten;
+   DROP VIEW IF EXISTS buchungsrechte_4wms;
+CREATE OR REPLACE VIEW buchungsrechte_4wms
+AS
+ SELECT DISTINCT f.gml_id, s4.buchungsart, f.wkb_geometry
+  FROM ax_flurstueck     f  
+  JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
+  JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)    
+  JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an) 
+  JOIN ax_buchungsstelle s4 ON s3.gml_id = ANY(s4.an)  
+ WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL AND s4.endet IS NULL;
+
+COMMENT ON VIEW buchungsrechte_4wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 4 beteiligten Buchungsstellen.';
+GRANT SELECT ON TABLE public.buchungsrechte_4wms  TO ms6;
+
+
+-- Gibts das?  Nein!
+-- --------------------------------
+-- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3 <an<  Buchungstelle 4 <an<  Buchungstelle 5
+-- ------------------------------------------------------------------------------------------------------------------
+-- 5 beteiligte Buchungsstellen
+-- DROP VIEW IF EXISTS buchungsrechte_5wms;
+/*
+CREATE OR REPLACE VIEW buchungsrechte_5wms
+AS
+ SELECT DISTINCT f.gml_id, s5.buchungsart, f.wkb_geometry
+   FROM ax_flurstueck     f  
+   JOIN ax_buchungsstelle s1  ON f.istgebucht = s1.gml_id
+   JOIN ax_buchungsstelle s2  ON s1.gml_id = ANY (s2.an)    
+   JOIN ax_buchungsstelle s3  ON s2.gml_id = ANY (s3.an) 
+   JOIN ax_buchungsstelle s4  ON s3.gml_id = ANY (s4.an)  
+   JOIN ax_buchungsstelle s5  ON s4.gml_id = ANY (s5.an)  
+  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL AND s4.endet IS NULL AND s5.endet IS NULL;
+
+COMMENT ON VIEW buchungsrechte_5wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 5 beteiligten Buchungsstellen.';
+GRANT SELECT ON TABLE public.buchungsrechte_5wms  TO ms6;
+*/
+
+-- Views fÃŒr die Modellierung der Classes im WMS
+-- =============================================
+-- Buchungsart entschlÃŒsseln. Die Treffer der WMS-Views weiter verdichten:
+
+CREATE OR REPLACE VIEW buchungsrechte_2arten AS
+ SELECT DISTINCT s.buchungsart, wb.beschreibung AS bu_art
+   FROM buchungsrechte_2wms s
+   JOIN ax_buchungsart_buchungsstelle wb
+     ON s.buchungsart = wb.wert
+  ORDER BY s.buchungsart; 
+COMMENT ON VIEW buchungsrechte_2arten IS 'Vorkommende Buchungsarten bei der Verkettung von 2 Buchungsstellen.';
+-- 1301;"Wohnungs-/Teileigentum"
+-- 1302;"Miteigentum Par. 3 Abs. 4 GBO"
+-- 2101;"Erbbaurecht"
+-- 2201;"Aufgeteiltes Erbbaurecht WEG"
+
+CREATE OR REPLACE VIEW buchungsrechte_3arten AS
+ SELECT DISTINCT s.buchungsart, wb.beschreibung AS bu_art
+   FROM buchungsrechte_3wms s
+   JOIN ax_buchungsart_buchungsstelle wb
+     ON s.buchungsart = wb.wert
+  ORDER BY buchungsart; 
+COMMENT ON VIEW buchungsrechte_3arten IS 'Vorkommende Buchungsarten bei der Verkettung von 3 Buchungsstellen.';
+-- 2102;"Untererbbaurecht"
+-- 2202;"Aufgeteiltes Untererbbaurecht WEG"
+-- 2203;"Aufgeteiltes Recht Par. 3 Abs. 4 GBO"
+-- 2301;"Wohnungs-/Teilerbbaurecht"
+
+CREATE OR REPLACE VIEW buchungsrechte_4arten AS
+ SELECT DISTINCT s.buchungsart, wb.beschreibung AS bu_art
+   FROM buchungsrechte_4wms s
+   JOIN ax_buchungsart_buchungsstelle wb
+     ON s.buchungsart = wb.wert
+  ORDER BY buchungsart; 
+COMMENT ON VIEW buchungsrechte_4arten IS 'Vorkommende Buchungsarten bei der Verkettung von 4 Buchungsstellen.';
+-- 2302;"Wohnungs-/Teiluntererbbaurecht"
+-- 2303;"Erbbaurechtsanteil Par. 3 Abs. 4 GBO"
+
+
+-- Views um EinzelfÃ€lle zu suchen und aufzulisten
+-- ==============================================
+CREATE OR REPLACE VIEW buchungsrechte_4faelle
+AS
+ SELECT 
+    f.gml_id, f.flurstueckskennzeichen,
+    s1.laufendenummer AS bvnr1, s1.buchungsart AS buchunsart_1, w1.beschreibung AS ba1, b1.buchungsblattnummermitbuchstabenerweiterung AS blatt1,
+    s2.laufendenummer AS bvnr2, s2.buchungsart AS buchunsart_2, w2.beschreibung AS ba2, b2.buchungsblattnummermitbuchstabenerweiterung AS blatt2,
+    s3.laufendenummer AS bvnr3, s3.buchungsart AS buchunsart_3, w3.beschreibung AS ba3, b3.buchungsblattnummermitbuchstabenerweiterung AS blatt3,
+    s4.laufendenummer AS bvnr4, s4.buchungsart AS buchunsart_4, w4.beschreibung AS ba4, b4.buchungsblattnummermitbuchstabenerweiterung AS blatt4
+  -- FlurstÃŒck
+  FROM ax_flurstueck     f  
+  -- 1. Buchung
+  JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
+--LEFT JOIN alkis_wertearten  w1 ON cast(s1.buchungsart AS character varying)=w1.k AND w1.element='ax_buchungsstelle' AND w1.bezeichnung='buchungsart' 
+  LEFT JOIN ax_buchungsart_buchungsstelle w1 ON s1.buchungsart = w1.wert
+  JOIN ax_buchungsblatt  b1 ON s1.istbestandteilvon = b1.gml_id
+  -- 2. Buchung
+  JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w2 ON s2.buchungsart = w2.wert
+  JOIN ax_buchungsblatt  b2 ON s2.istbestandteilvon = b2.gml_id
+  -- 3. Buchung
+  JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w3 ON s3.buchungsart = w3.wert
+  JOIN ax_buchungsblatt  b3 ON s3.istbestandteilvon = b3.gml_id
+  -- 4. Buchung
+  JOIN ax_buchungsstelle s4 ON s3.gml_id = ANY(s4.an)  
+  LEFT JOIN ax_buchungsart_buchungsstelle w4 ON s4.buchungsart = w4.wert
+  JOIN ax_buchungsblatt  b4 ON s4.istbestandteilvon = b4.gml_id
+ -- nur frische Sachen
+ WHERE f.endet  IS NULL 
+   AND s1.endet IS NULL AND b1.endet IS NULL 
+   AND s2.endet IS NULL AND b2.endet IS NULL 
+   AND s3.endet IS NULL AND b3.endet IS NULL 
+   AND s4.endet IS NULL AND b4.endet IS NULL 
+ LIMIT 30;
+
+COMMENT ON VIEW buchungsrechte_4faelle IS 'FÃŒr Buchungsarten mit 4 beteiligten Buchungsstellen die einzelnen Kennzeichen tabellarisch auflisten.';
+
+
+CREATE OR REPLACE VIEW buchungsrechte_3text 
+AS
+ SELECT 
+    a3.beschreibung || ' (' || b3.blattart || ') ' || b3.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s3.laufendenummer || ') hat ' || w3.beschreibung || ' (' || s3.buchungsart || ') an ' AS stufe3,
+    a2.beschreibung || ' (' || b2.blattart || ') ' || b2.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s2.laufendenummer || ') hat ' || w2.beschreibung || ' (' || s2.buchungsart || ') an ' AS stufe2,
+    a1.beschreibung || ' (' || b1.blattart || ') ' || b1.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s1.laufendenummer || ') hat ' || w1.beschreibung || ' (' || s1.buchungsart || ') mit Buchung ' AS stufe1,
+    'FlurstÃŒck ' || f.flurstueckskennzeichen || ' (gml_id=' || f.gml_id || ')' AS flurstueck
+  -- FlurstÃŒck
+  FROM ax_flurstueck     f  
+  -- 1. Buchung
+  JOIN ax_buchungsstelle      s1 ON f.istgebucht = s1.gml_id
+  LEFT JOIN ax_buchungsart_buchungsstelle w1 ON s1.buchungsart = w1.wert
+  JOIN ax_buchungsblatt       b1 ON s1.istbestandteilvon = b1.gml_id
+--LEFT JOIN alkis_wertearten  a1 ON b1.blattart=a1.k AND a1.element='ax_buchungsblatt' AND a1.bezeichnung='blattart' 
+  LEFT JOIN ax_blattart_buchungsblatt a1 ON b1.blattart = a1.wert
+  -- 2. Buchung
+  JOIN ax_buchungsstelle      s2 ON s1.gml_id = ANY(s2.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w2 ON s2.buchungsart = w2.wert
+  JOIN ax_buchungsblatt       b2 ON s2.istbestandteilvon = b2.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a2 ON b2.blattart = a2.wert
+  -- 3. Buchung
+  JOIN ax_buchungsstelle      s3 ON s2.gml_id = ANY(s3.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w3 ON s3.buchungsart = w3.wert
+  JOIN ax_buchungsblatt       b3 ON s3.istbestandteilvon = b3.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a3 ON b3.blattart = a3.wert
+ -- nur frische Sachen
+ WHERE f.endet  IS NULL 
+   AND s1.endet IS NULL AND b1.endet IS NULL 
+   AND s2.endet IS NULL AND b2.endet IS NULL 
+   AND s3.endet IS NULL AND b3.endet IS NULL 
+ LIMIT 30;
+-- Dauert 25 Sec.
+COMMENT ON VIEW buchungsrechte_3text IS 'FÃŒr Buchungsarten mit 3 beteiligten Buchungsstellen die einzelnen Kennzeichen als beschreibenden Text auflisten.';
+
+
+CREATE OR REPLACE VIEW buchungsrechte_4text 
+AS
+ SELECT 
+    a4.beschreibung || ' (' || b4.blattart || ') ' || b4.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s4.laufendenummer || ') hat ' || w4.beschreibung || ' (' || s4.buchungsart || ') an ' AS stufe4,
+    a3.beschreibung || ' (' || b3.blattart || ') ' || b3.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s3.laufendenummer || ') hat ' || w3.beschreibung || ' (' || s3.buchungsart || ') an ' AS stufe3,
+    a2.beschreibung || ' (' || b2.blattart || ') ' || b2.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s2.laufendenummer || ') hat ' || w2.beschreibung || ' (' || s2.buchungsart || ') an ' AS stufe2,
+    a1.beschreibung || ' (' || b1.blattart || ') ' || b1.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s1.laufendenummer || ') hat ' || w1.beschreibung || ' (' || s1.buchungsart || ') mit Buchung ' AS stufe1,
+    'FlurstÃŒck ' || f.flurstueckskennzeichen || ' (gml_id=' || f.gml_id || ')' AS flurstueck
+  -- FlurstÃŒck
+  FROM ax_flurstueck     f  
+  -- 1. Buchung
+  JOIN ax_buchungsstelle      s1 ON f.istgebucht = s1.gml_id
+  LEFT JOIN ax_buchungsart_buchungsstelle w1 ON s1.buchungsart = w1.wert
+  JOIN ax_buchungsblatt       b1 ON s1.istbestandteilvon = b1.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a1 ON b1.blattart = a1.wert
+  -- 2. Buchung
+  JOIN ax_buchungsstelle      s2 ON s1.gml_id = ANY(s2.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w2 ON s2.buchungsart = w2.wert
+  JOIN ax_buchungsblatt       b2 ON s2.istbestandteilvon = b2.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a2 ON b2.blattart = a2.wert
+  -- 3. Buchung
+  JOIN ax_buchungsstelle      s3 ON s2.gml_id = ANY(s3.an)
+  LEFT JOIN ax_buchungsart_buchungsstelle w3 ON s3.buchungsart = w3.wert
+  JOIN ax_buchungsblatt       b3 ON s3.istbestandteilvon = b3.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a3 ON b3.blattart = a3.wert
+  -- 4. Buchung
+  JOIN ax_buchungsstelle      s4 ON s3.gml_id = ANY(s4.an)  
+  LEFT JOIN ax_buchungsart_buchungsstelle w4 ON s4.buchungsart = w4.wert
+  JOIN ax_buchungsblatt       b4 ON s4.istbestandteilvon = b4.gml_id
+  LEFT JOIN ax_blattart_buchungsblatt a4 ON b4.blattart = a4.wert
+ -- nur frische Sachen
+ WHERE f.endet  IS NULL 
+   AND s1.endet IS NULL AND b1.endet IS NULL 
+   AND s2.endet IS NULL AND b2.endet IS NULL 
+   AND s3.endet IS NULL AND b3.endet IS NULL 
+   AND s4.endet IS NULL AND b4.endet IS NULL 
+ LIMIT 30;
+-- Dauert 5 Min.!
+COMMENT ON VIEW buchungsrechte_4text IS 'FÃŒr Buchungsarten mit 4 beteiligten Buchungsstellen die einzelnen Kennzeichen als beschreibenden Text auflisten.';
+
+-- Ende --
Index: trunk/import/norgis_alkis_pp/postcreate.d/views_exp_csv.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.d/views_exp_csv.sql	(revision 411)
+++ 	(revision )
@@ -1,592 +1,0 @@
-
--- ===================================================================================
---  ALKIS-PostGIS   Mapbender-Navigation und Buchauskunft fÃŒr NorGIS-ALKIS-Importer
--- ===================================================================================
-
--- Aufgabe:       Views bereit stellen fÃŒr den CSV-Export in der ALKIS-Buch-Auskunft.
--- 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"
---  2017-12-20 Beseitigung des Fehlers: Mehrere Adressen zur Person fuehren zu mehrfachen Zeilen (Wiederholung FlurstÃŒck und Flaeche ..)
---             Es wird je Persoon nur noch die "letzte" Adresse verwendet (subquery).
---             Der View "exp_csv_str" ist jetzt direkt als 4fach-UNION (2x2) codiert statt mit eingebettetem gespeicherten 2fach-Union.
---             Hauptvorteil: Keine undurchsichtigen AbhÃ€ngigkeiten. Ist auch etwas schneller.
---  2017-12-20 Suche (Sortierung) 'letzte Adresse' nach "beginnt" statt nach "gml_id"
---  2018-05-02 Aufruf aus GrundstÃŒcksnahweis: tabtyp='buchung' $filter="gsgml" 
-
--- ToDo:
---  - Ãberdenken: Ist die UNION-Abfrage mit "Recht an" notwendig und sinnvoll?
---    -- Wenn ja, bei welchen Filtern?
---       Ein Erbbaurecht wird geliefert (1x "an") aber Untererbbaurecht nicht mehr (2x Recht "an")
-
-
--- I n d i c e s
--- ============================
-
--- 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
--- ============================
-
-
--- 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 -- Fall: einfache Buchung (ohne "Recht an")
-  -- 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.gml_id                             AS gsgml,       -- mÃ¶glicher Filter GrundstÃŒck-GML-ID
-    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              -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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  -- Fall: "Recht an"
-  -- 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)
-    dien.gml_id                          AS gsgml,       -- mÃ¶glicher Filter GrundstÃŒck-GML-ID
-    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               -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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.';
-
-GRANT SELECT ON TABLE public.exp_csv          TO mb27;
-
--- Eine Variante des View "exp_csv":
--- Hier wird zusÃ€tzlich die Lagebezeichnung zum FlurstÃŒck angebunden in den Varianten MIT/OHNE Hausnummer.
--- 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      -- Version mit 4fach-UNION (2x2 FÃ€lle) statt eingebauter View "flst_an_strasse"
- SELECT -- Fall 1: einfache Buchung (ohne Recht an)  // Lagebezeichnung MIT Hausnummer
-    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
-    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
-  -- 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,         -- Anschriftenzeile 1: PLZ+Ort
-    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
-    a.bestimmungsland                    AS land
-  FROM ax_flurstueck    f               -- FlurstÃŒck
-  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
-  JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT
-    ON lm.gml_id = ANY (f.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 
-   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              -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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 AND lm.endet IS NULL  
----------
-  UNION
----------
- SELECT -- Fall 2: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung MIT Hausnummer
-    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
-    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
-  -- 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,         -- Anschriftenzeile 1: PLZ+Ort
-    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
-    a.bestimmungsland                    AS land
-  FROM ax_flurstueck f                  -- FlurstÃŒck
-  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
-  JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
-    ON lm.gml_id = ANY (f.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 
-  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              -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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 AND lm.endet IS NULL  
----------
-  UNION
----------
- SELECT -- Fall 3: einfache Buchung (ohne Recht an)  //  Lagebezeichnung OHNE Hausnummer
-    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
-    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
-  -- 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,         -- Anschriftenzeile 1: PLZ+Ort
-    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
-    a.bestimmungsland                    AS land
-  FROM ax_flurstueck    f               -- FlurstÃŒck
--- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
-  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
-    ON lo.gml_id = ANY (f.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
-  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              -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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 AND lo.endet IS NULL 
----------
-  UNION
----------
- SELECT -- Fall 4: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung OHNE Hausnummer
-    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
-    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
-  -- 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,         -- Anschriftenzeile 1: PLZ+Ort
-    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
-    a.bestimmungsland                    AS land
-  FROM ax_flurstueck f                  -- FlurstÃŒck
--- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
-  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
-    ON lo.gml_id = ANY (f.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
-  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              -- nur die "letzte" Anschrift zur Person verwenden
-    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.beginnt DESC LIMIT 1)
-  -- 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 AND lo.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.';
-
-
-GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;
-
--- Ende --
Index: trunk/import/norgis_alkis_pp/postcreate.d/views_buchungsketten.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.d/views_buchungsketten.sql	(revision 411)
+++ 	(revision )
@@ -1,298 +1,0 @@
-
--- ====================================================================================================
---  ALKIS-PostGIS  FlurstÃŒcke Suchen, die eine Verkettung von mehreren Buchungsstellen haben
--- ====================================================================================================
-
--- Aufgaben:
--- ---------
--- FlurstÃŒcke ermitteln die 2 bis 4 (oder mehr?) Buchungsstellen haben die jeweils ein "Recht an" einer anderen Buchungsstelle haben.
--- Beispiel:
---   "Wohnungs-/Teiluntererbbaurecht" >an> "Aufgeteiltes Untererbbaurecht WEG" >an> "Erbbaurecht" >an> "GrundstÃŒck" >Buchung> FlurstÃŒck 
--- In einem WMS diese besonderen Buchungen hervorheben.
--- Die betroffenen Buchungsarten auflisten.
--- Auch einige EinzelfÃ€lle selektieren.
--- Dies dient zunÃ€chst dazu, um TestfÃ€lle fÃŒr die Weiterentwicklung der Buchauskunft zu finden (Entwicklung).
--- Vielleicht hat auch ein Anwender Verwendung dafÃŒr.
-
--- AusfÃŒhrung in:
--- Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.
-
---Stand 
---  2017-12-07 Prototyp
-
--- V i e w s
--- =================================
-
--- Views fÃŒr die Darstellung im WMS
--- =================================
-
--- 2 beteiligte Buchungsstellen
--- "Erbbaurecht" und Ã€hnliches
--- --------------------------
--- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2
--- --------------------------------------------------------------------
-   DROP VIEW IF EXISTS buchungsrechte_2arten;
-   DROP VIEW IF EXISTS buchungsrechte_2wms;
-CREATE OR REPLACE VIEW buchungsrechte_2wms
-AS
- SELECT DISTINCT                    -- Ohne DISTINCT maherfache Ãberlagerung
-    f.gml_id,                       -- Unique Key
-    s2.buchungsart,                 -- verschlÃŒsselt (Nummer)
-    f.wkb_geometry
- --, wb.v      AS bu_art            -- Buchungsart entschlÃŒsselt  -- Hier nicht!
-  FROM ax_flurstueck     f          -- FlurstÃŒck
-  JOIN ax_buchungsstelle s1         -- dienende Buchung
-    ON f.istgebucht = s1.gml_id
-  JOIN ax_buchungsstelle s2         -- herrschende Buchung
-    ON s1.gml_id = ANY(s2.an)       -- hat Recht an
---JOIN alkis_wertearten wb          -- EntschlÃŒsseln "Buchungsart"
---  ON cast(s2.buchungsart AS character varying) = wb.k 
--- AND wb.element = 'ax_buchungsstelle' AND wb.bezeichnung = 'buchungsart' 
-  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL;
-
-COMMENT ON VIEW buchungsrechte_2wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 2 beteiligten Buchungsstellen, z.B. Erbbaurecht.';
-GRANT SELECT ON TABLE public.buchungsrechte_2wms  TO ms6;
-
-
--- 3 beteiligte Buchungsstellen
--- "Untererbbaurecht" und Ã€hnliches
--- --------------------------------
--- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3
--- ------------------------------------------------------------------------------------------------------------------
-   DROP VIEW IF EXISTS buchungsrechte_3arten;
-   DROP VIEW IF EXISTS buchungsrechte_3wms;
-CREATE OR REPLACE VIEW buchungsrechte_3wms
-AS
- SELECT DISTINCT f.gml_id, s3.buchungsart, f.wkb_geometry
-   FROM ax_flurstueck     f  
-   JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
-   JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)    
-   JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an)  
-  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL;
-
-COMMENT ON VIEW buchungsrechte_3wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 3 beteiligten Buchungsstellen, z.B. Untererbbaurecht.';
-GRANT SELECT ON TABLE public.buchungsrechte_3wms  TO ms6;
--- z.B. 69 FlurstÃŒcke in Lage in 312 msec.
-
-
--- 4 beteiligte Buchungsstellen
--- Teil-Untererbbaurecht
--- --------------------------------
--- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3 <an<  Buchungstelle 4
--- ------------------------------------------------------------------------------------------------------------------
-   DROP VIEW IF EXISTS buchungsrechte_4arten;
-   DROP VIEW IF EXISTS buchungsrechte_4wms;
-CREATE OR REPLACE VIEW buchungsrechte_4wms
-AS
- SELECT DISTINCT f.gml_id, s4.buchungsart, f.wkb_geometry
-  FROM ax_flurstueck     f  
-  JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
-  JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)    
-  JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an) 
-  JOIN ax_buchungsstelle s4 ON s3.gml_id = ANY(s4.an)  
- WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL AND s4.endet IS NULL;
-
-COMMENT ON VIEW buchungsrechte_4wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 4 beteiligten Buchungsstellen.';
-GRANT SELECT ON TABLE public.buchungsrechte_4wms  TO ms6;
--- 6 FlurstÃŒcke im Kreis Minden-LÃŒbbecke,
--- 3 FlurstÃŒcke in Lage in 180 msec. ("DENW17AL0000VffJ" "DENW17AL0000VnuJ" "DENW17AL0000Vwe1")
-
-
--- Gibts das?  Nein!
--- --------------------------------
--- FS >istGebucht> Buchungstelle 1  <an<  Buchungstelle 2 <an<  Buchungstelle 3 <an<  Buchungstelle 4 <an<  Buchungstelle 5
--- ------------------------------------------------------------------------------------------------------------------
--- 5 beteiligte Buchungsstellen
--- DROP VIEW IF EXISTS buchungsrechte_5wms;
-/*
-CREATE OR REPLACE VIEW buchungsrechte_5wms
-AS
- SELECT DISTINCT f.gml_id, s5.buchungsart, f.wkb_geometry
-   FROM ax_flurstueck     f  
-   JOIN ax_buchungsstelle s1  ON f.istgebucht = s1.gml_id
-   JOIN ax_buchungsstelle s2  ON s1.gml_id = ANY (s2.an)    
-   JOIN ax_buchungsstelle s3  ON s2.gml_id = ANY (s3.an) 
-   JOIN ax_buchungsstelle s4  ON s3.gml_id = ANY (s4.an)  
-   JOIN ax_buchungsstelle s5  ON s4.gml_id = ANY (s5.an)  
-  WHERE f.endet IS NULL AND s1.endet IS NULL AND s2.endet IS NULL AND s3.endet IS NULL AND s4.endet IS NULL AND s5.endet IS NULL;
-
-COMMENT ON VIEW buchungsrechte_5wms IS 'FÃŒr WMS-Anzeige von FlurstÃŒcken mit Buchungsarten mit 5 beteiligten Buchungsstellen.';
-GRANT SELECT ON TABLE public.buchungsrechte_5wms  TO ms6;
-*/
-
--- Views fÃŒr die Modellierung der Classes im WMS
--- =============================================
--- Buchungsart entschlÃŒsseln. Die Treffer der WMS-Views weiter verdichten:
-
-CREATE OR REPLACE VIEW buchungsrechte_2arten AS
- SELECT DISTINCT s.buchungsart, wb.v AS bu_art
-   FROM buchungsrechte_2wms s
-   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' 
-  ORDER BY s.buchungsart; 
-COMMENT ON VIEW buchungsrechte_2arten IS 'Vorkommende Buchungsarten bei der Verkettung von 2 Buchungsstellen.';
--- 1301;"Wohnungs-/Teileigentum"
--- 1302;"Miteigentum Par. 3 Abs. 4 GBO"
--- 2101;"Erbbaurecht"
--- 2201;"Aufgeteiltes Erbbaurecht WEG"
-
-CREATE OR REPLACE VIEW buchungsrechte_3arten AS
- SELECT DISTINCT s.buchungsart, wb.v AS bu_art
-   FROM buchungsrechte_3wms s
-   JOIN alkis_wertearten wb
-     ON cast(s.buchungsart AS character varying) = wb.k 
-    AND wb.element = 'ax_buchungsstelle' AND wb.bezeichnung = 'buchungsart' 
-  ORDER BY buchungsart; 
-COMMENT ON VIEW buchungsrechte_3arten IS 'Vorkommende Buchungsarten bei der Verkettung von 3 Buchungsstellen.';
--- 2102;"Untererbbaurecht"
--- 2202;"Aufgeteiltes Untererbbaurecht WEG"
--- 2203;"Aufgeteiltes Recht Par. 3 Abs. 4 GBO"
--- 2301;"Wohnungs-/Teilerbbaurecht"
-
-CREATE OR REPLACE VIEW buchungsrechte_4arten AS
- SELECT DISTINCT s.buchungsart, wb.v AS bu_art
-   FROM buchungsrechte_4wms s
-   JOIN alkis_wertearten wb
-     ON cast(s.buchungsart AS character varying) = wb.k 
-    AND wb.element = 'ax_buchungsstelle' AND wb.bezeichnung = 'buchungsart' 
-  ORDER BY buchungsart; 
-COMMENT ON VIEW buchungsrechte_4arten IS 'Vorkommende Buchungsarten bei der Verkettung von 4 Buchungsstellen.';
--- 2302;"Wohnungs-/Teiluntererbbaurecht"
-
-
--- Views um EinzelfÃ€lle zu suchen und aufzulisten
--- ==============================================
-
-CREATE OR REPLACE VIEW buchungsrechte_4faelle
-AS
- SELECT 
-    f.gml_id, f.flurstueckskennzeichen,
-    s1.laufendenummer AS bvnr1, s1.buchungsart AS buchunsart_1, w1.v AS ba1, b1.buchungsblattnummermitbuchstabenerweiterung AS blatt1,
-    s2.laufendenummer AS bvnr2, s2.buchungsart AS buchunsart_2, w2.v AS ba2, b2.buchungsblattnummermitbuchstabenerweiterung AS blatt2,
-    s3.laufendenummer AS bvnr3, s3.buchungsart AS buchunsart_3, w3.v AS ba3, b3.buchungsblattnummermitbuchstabenerweiterung AS blatt3,
-    s4.laufendenummer AS bvnr4, s4.buchungsart AS buchunsart_4, w4.v AS ba4, b4.buchungsblattnummermitbuchstabenerweiterung AS blatt4
-
-  -- FlurstÃŒck
-  FROM ax_flurstueck     f  
-
-  -- 1. Buchung
-  JOIN ax_buchungsstelle s1 ON f.istgebucht = s1.gml_id
-  LEFT JOIN alkis_wertearten  w1 ON cast(s1.buchungsart AS character varying)=w1.k AND w1.element='ax_buchungsstelle' AND w1.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt  b1 ON s1.istbestandteilvon = b1.gml_id
-
-  -- 2. Buchung
-  JOIN ax_buchungsstelle s2 ON s1.gml_id = ANY(s2.an)
-  LEFT JOIN alkis_wertearten  w2 ON cast(s2.buchungsart AS character varying)=w2.k AND w2.element='ax_buchungsstelle' AND w2.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt  b2 ON s2.istbestandteilvon = b2.gml_id
-
-  -- 3. Buchung
-  JOIN ax_buchungsstelle s3 ON s2.gml_id = ANY(s3.an)
-  LEFT JOIN alkis_wertearten  w3 ON cast(s3.buchungsart AS character varying)=w3.k AND w3.element='ax_buchungsstelle' AND w3.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt  b3 ON s3.istbestandteilvon = b3.gml_id
-
-  -- 4. Buchung
-  JOIN ax_buchungsstelle s4 ON s3.gml_id = ANY(s4.an)  
-  LEFT JOIN alkis_wertearten  w4 ON cast(s4.buchungsart AS character varying)=w4.k AND w4.element='ax_buchungsstelle' AND w4.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt  b4 ON s4.istbestandteilvon = b4.gml_id
-
- -- nur frische Sachen
- WHERE f.endet  IS NULL 
-   AND s1.endet IS NULL AND b1.endet IS NULL 
-   AND s2.endet IS NULL AND b2.endet IS NULL 
-   AND s3.endet IS NULL AND b3.endet IS NULL 
-   AND s4.endet IS NULL AND b4.endet IS NULL 
- LIMIT 20;
-
-COMMENT ON VIEW buchungsrechte_4faelle IS 'FÃŒr Buchungsarten mit 4 beteiligten Buchungsstellen die einzelnen Kennzeichen tabellarisch auflisten.';
-
-
-CREATE OR REPLACE VIEW buchungsrechte_3text 
-AS
- SELECT 
-    a3.v || ' (' || b3.blattart || ') ' || b3.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s3.laufendenummer || ') hat ' || w3.v || ' (' || s3.buchungsart || ') an ' AS stufe3,
-    a2.v || ' (' || b2.blattart || ') ' || b2.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s2.laufendenummer || ') hat ' || w2.v || ' (' || s2.buchungsart || ') an ' AS stufe2,
-    a1.v || ' (' || b1.blattart || ') ' || b1.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s1.laufendenummer || ') hat ' || w1.v || ' (' || s1.buchungsart || ') mit Buchung ' AS stufe1,
-    'FlurstÃŒck ' || f.flurstueckskennzeichen || ' (gml_id=' || f.gml_id || ')' AS flurstueck
-
-  -- FlurstÃŒck
-  FROM ax_flurstueck     f  
-
-  -- 1. Buchung
-  JOIN ax_buchungsstelle      s1 ON f.istgebucht = s1.gml_id
-  LEFT JOIN alkis_wertearten  w1 ON cast(s1.buchungsart AS character varying)=w1.k AND w1.element='ax_buchungsstelle' AND w1.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b1 ON s1.istbestandteilvon = b1.gml_id
-  LEFT JOIN alkis_wertearten  a1 ON b1.blattart=a1.k AND a1.element='ax_buchungsblatt' AND a1.bezeichnung='blattart' 
-
-  -- 2. Buchung
-  JOIN ax_buchungsstelle      s2 ON s1.gml_id = ANY(s2.an)
-  LEFT JOIN alkis_wertearten  w2 ON cast(s2.buchungsart AS character varying)=w2.k AND w2.element='ax_buchungsstelle' AND w2.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b2 ON s2.istbestandteilvon = b2.gml_id
-  LEFT JOIN alkis_wertearten  a2 ON b2.blattart=a2.k AND a2.element='ax_buchungsblatt' AND a2.bezeichnung='blattart' 
-
-  -- 3. Buchung
-  JOIN ax_buchungsstelle      s3 ON s2.gml_id = ANY(s3.an)
-  LEFT JOIN alkis_wertearten  w3 ON cast(s3.buchungsart AS character varying)=w3.k AND w3.element='ax_buchungsstelle' AND w3.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b3 ON s3.istbestandteilvon = b3.gml_id
-  LEFT JOIN alkis_wertearten  a3 ON b3.blattart=a3.k AND a3.element='ax_buchungsblatt' AND a3.bezeichnung='blattart' 
-
- -- nur frische Sachen
- WHERE f.endet  IS NULL 
-   AND s1.endet IS NULL AND b1.endet IS NULL 
-   AND s2.endet IS NULL AND b2.endet IS NULL 
-   AND s3.endet IS NULL AND b3.endet IS NULL 
- LIMIT 20;
--- AusfÃŒhrung Stadt ca. 4 Sek.
-
-COMMENT ON VIEW buchungsrechte_3text IS 'FÃŒr Buchungsarten mit 3 beteiligten Buchungsstellen die einzelnen Kennzeichen als beschreibenden Text auflisten.';
-
-
-
-CREATE OR REPLACE VIEW buchungsrechte_4text 
-AS
- SELECT 
-    a4.v || ' (' || b4.blattart || ') ' || b4.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s4.laufendenummer || ') hat ' || w4.v || ' (' || s4.buchungsart || ') an ' AS stufe4,
-    a3.v || ' (' || b3.blattart || ') ' || b3.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s3.laufendenummer || ') hat ' || w3.v || ' (' || s3.buchungsart || ') an ' AS stufe3,
-    a2.v || ' (' || b2.blattart || ') ' || b2.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s2.laufendenummer || ') hat ' || w2.v || ' (' || s2.buchungsart || ') an ' AS stufe2,
-    a1.v || ' (' || b1.blattart || ') ' || b1.buchungsblattnummermitbuchstabenerweiterung || ' (lfd. ' || s1.laufendenummer || ') hat ' || w1.v || ' (' || s1.buchungsart || ') mit Buchung ' AS stufe1,
-    'FlurstÃŒck ' || f.flurstueckskennzeichen || ' (gml_id=' || f.gml_id || ')' AS flurstueck
-
-  -- FlurstÃŒck
-  FROM ax_flurstueck     f  
-
-  -- 1. Buchung
-  JOIN ax_buchungsstelle      s1 ON f.istgebucht = s1.gml_id
-  LEFT JOIN alkis_wertearten  w1 ON cast(s1.buchungsart AS character varying)=w1.k AND w1.element='ax_buchungsstelle' AND w1.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b1 ON s1.istbestandteilvon = b1.gml_id
-  LEFT JOIN alkis_wertearten  a1 ON b1.blattart=a1.k AND a1.element='ax_buchungsblatt' AND a1.bezeichnung='blattart' 
-
-  -- 2. Buchung
-  JOIN ax_buchungsstelle      s2 ON s1.gml_id = ANY(s2.an)
-  LEFT JOIN alkis_wertearten  w2 ON cast(s2.buchungsart AS character varying)=w2.k AND w2.element='ax_buchungsstelle' AND w2.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b2 ON s2.istbestandteilvon = b2.gml_id
-  LEFT JOIN alkis_wertearten  a2 ON b2.blattart=a2.k AND a2.element='ax_buchungsblatt' AND a2.bezeichnung='blattart' 
-
-  -- 3. Buchung
-  JOIN ax_buchungsstelle      s3 ON s2.gml_id = ANY(s3.an)
-  LEFT JOIN alkis_wertearten  w3 ON cast(s3.buchungsart AS character varying)=w3.k AND w3.element='ax_buchungsstelle' AND w3.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b3 ON s3.istbestandteilvon = b3.gml_id
-  LEFT JOIN alkis_wertearten  a3 ON b3.blattart=a3.k AND a3.element='ax_buchungsblatt' AND a3.bezeichnung='blattart' 
-
-  -- 4. Buchung
-  JOIN ax_buchungsstelle      s4 ON s3.gml_id = ANY(s4.an)  
-  LEFT JOIN alkis_wertearten  w4 ON cast(s4.buchungsart AS character varying)=w4.k AND w4.element='ax_buchungsstelle' AND w4.bezeichnung='buchungsart' 
-  JOIN ax_buchungsblatt       b4 ON s4.istbestandteilvon = b4.gml_id
-  LEFT JOIN alkis_wertearten  a4 ON b4.blattart=a4.k AND a4.element='ax_buchungsblatt' AND a4.bezeichnung='blattart' 
-
- -- nur frische Sachen
- WHERE f.endet  IS NULL 
-   AND s1.endet IS NULL AND b1.endet IS NULL 
-   AND s2.endet IS NULL AND b2.endet IS NULL 
-   AND s3.endet IS NULL AND b3.endet IS NULL 
-   AND s4.endet IS NULL AND b4.endet IS NULL 
- LIMIT 20;
--- AusfÃŒhrung Stadt ca. 2 Minuten. Wieso so lange?
-
-COMMENT ON VIEW buchungsrechte_4text IS 'FÃŒr Buchungsarten mit 4 beteiligten Buchungsstellen die einzelnen Kennzeichen als beschreibenden Text auflisten.';
-
--- Ende --
Index: trunk/info/info/alkisn/alkisfkt.php
===================================================================
--- trunk/info/info/alkisn/alkisfkt.php	(revision 411)
+++ trunk/info/info/alkisn/alkisfkt.php	(revision 412)
@@ -16,5 +16,7 @@
 	2018-04-23 Berechtigte Buchungen im FS-Nachw. verbessern. Neue Spalte statt Ãberschriften fÃŒr "EigentÃŒmer" und "Berechtigte Buchungen".
 	2018-05-03 GrundstÃŒcksnachweis
-++ ToDo: Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
+	2018-11-09 Umstellung Full-Schema
+
+	++ ToDo: Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
 */
 
@@ -93,10 +95,10 @@
 
 	$sqlbs="SELECT sh.gml_id AS hgml, sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, " // Buchungs-Stelle herrschend
-	."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, z.bezeichnung, a.v AS bart, a.d AS barttitle, w.v AS blattartv "
+	."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, z.bezeichnung, a.beschreibung AS bart, a.dokumentation AS barttitle, w.beschreibung AS blattartv "
 	."FROM ax_buchungsstelle sh "
 	."JOIN ax_buchungsblatt b ON b.gml_id=sh.istbestandteilvon "
 	."LEFT JOIN ax_buchungsblattbezirk z ON z.land=b.land AND z.bezirk=b.bezirk "
-	."LEFT JOIN alkis_wertearten a ON sh.buchungsart=cast(a.k AS integer) AND a.element='ax_buchungsstelle' and a.bezeichnung='buchungsart' " // entschl. Buchungsart
-	."LEFT JOIN alkis_wertearten w ON b.blattart=w.k AND w.element='ax_buchungsblatt' and w.bezeichnung='blattart' " // entschl. Blatt-Art
+	."LEFT JOIN ax_buchungsart_buchungsstelle a ON sh.buchungsart = a.wert " // entschl. Buchungsart
+	."LEFT JOIN ax_blattart_buchungsblatt w ON b.blattart = w.wert " // entschl. Blatt-Art
 	."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL;";
 
@@ -321,5 +323,5 @@
 		$v=array($gml_bs);
 	} else {
-		$sql.="AND f.kreis = $2 AND f.gemeinde = $3 "; // ZustÃ€ndiges Gebiet
+		$sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÃ€ndiges Gebiet
 		$v=array($gml_bs, $filtkreis, $filtgem);
 	}
@@ -415,8 +417,8 @@
 	}
 
-	$sqln="SELECT n.gml_id, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, n.artderrechtsgemeinschaft AS adr, n.beschriebderrechtsgemeinschaft as beschr, n.eigentuemerart, n.anlass, n.benennt, wn.v AS adrv, we.v AS eiartv "
+	$sqln="SELECT n.gml_id, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, n.artderrechtsgemeinschaft AS adr, n.beschriebderrechtsgemeinschaft as beschr, n.eigentuemerart, n.anlass, n.benennt, wn.beschreibung AS adrv, we.beschreibung AS eiartv "
 	."FROM ax_namensnummer n "
-	."LEFT JOIN alkis_wertearten wn ON cast(n.artderrechtsgemeinschaft AS character varying)=wn.k AND wn.element='ax_namensnummer' AND wn.bezeichnung='artderrechtsgemeinschaft' "
-	."LEFT JOIN alkis_wertearten we ON cast(n.eigentuemerart AS character varying)=we.k AND we.element='ax_namensnummer' AND we.bezeichnung='eigentuemerart' "
+	."LEFT JOIN ax_artderrechtsgemeinschaft_namensnummer wn ON n.artderrechtsgemeinschaft = wn.wert "
+	."LEFT JOIN ax_eigentuemerart_namensnummer we ON n.eigentuemerart = we.wert "
 	."WHERE n.istbestandteilvon= $1 AND n.endet IS NULL ORDER BY n.laufendenummernachdin1421;";
 	// +++	LEFT JOIN bis ax_Person statt Person als Schleife zu holen, 
@@ -579,14 +581,21 @@
 
 function werteliste ($element, $bezeichnung ,$sqlin) {
-	// Eine oder mehrere EntschlÃŒsselungen aus "alkis_wertearten" in eine Zeile ausgeben.
+	// Eine oder mehrere EntschlÃŒsselungen in eine Zeile ausgeben.
 	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile mehrfach aufzulisten (JOIN)
 	// Anwendung: FS-Nachweis BodenschÃ€tzung "Klimastufe + WasserverhÃ€ltnisse"
+	// 2018-11-09: Umstellung von "alkis_wertearten" auf individuelle Tabellen
+
 	global $debug;
-	$sql="SELECT k, v FROM alkis_wertearten WHERE element = $1 AND bezeichnung = $2 AND k IN (".$sqlin.") ORDER BY k;";
-	$v = array($element, $bezeichnung);
+	if ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'entstehungsartoderklimastufewasserverhaeltnisse' ) {
+		$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';
+	} elseif ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'sonstigeangaben' ) {
+		$tabelle = 'ax_sonstigeangaben_bodenschaetzung';
+	}
+	$sql="SELECT wert, beschreibung FROM ".$tabelle." WHERE wert IN (".$sqlin.") ORDER BY wert LIMIT $1 ;";
+	$v = array(100);
 	$res = pg_prepare("", $sql);
 	$res = pg_execute("", $v);
 	if (!$res) {
-		echo "\n<p class='err'>Fehler bei Werteliste aus alkis_wertearten.</p>";
+		echo "\n<p class='err'>Fehler bei Werteliste.</p>";
 		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = '".$sqlin."'</p>";}
 		return;
@@ -594,9 +603,9 @@
 	$i=0;
 	while($row = pg_fetch_assoc($res)) {
-		echo " ".$row["v"];
+		echo " ".$row["beschreibung"];
 		$i++;	
 	}
 	pg_free_result($res);
-	if ($i == 0 ) {echo "(kein Treffer)";}
+	if ($i == 0) {echo "(kein Treffer)";}
 	return;
 }
Index: trunk/info/info/alkisn/alkisstrasse.php
===================================================================
--- trunk/info/info/alkisn/alkisstrasse.php	(revision 411)
+++ trunk/info/info/alkisn/alkisstrasse.php	(revision 412)
@@ -13,4 +13,5 @@
 	2017-10-09 Sauber filtern auf endet IS NULL
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
Index: trunk/info/info/alkisn/alkisinlaybaurecht.php
===================================================================
--- trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 411)
+++ trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 412)
@@ -9,4 +9,5 @@
 	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
 	2017-10-09 Sauber filtern auf endet IS NULL
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -42,5 +43,5 @@
 $sql ="SELECT r.ogc_fid, r.name, r.stelle, r.bezeichnung AS rechtbez, a.v AS adfbez, d.bezeichnung AS stellbez, round(st_area(r.wkb_geometry)::numeric,0) AS flae 
 FROM ax_bauraumoderbodenordnungsrecht r 
-LEFT JOIN alkis_wertearten a ON cast(r.artderfestlegung AS character varying)=a.k AND a.element='ax_bauraumoderbodenordnungsrecht' AND a.bezeichnung='artderfestlegung'
+LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON r.artderfestlegung = a.wert
 LEFT JOIN ax_dienststelle d ON r.land=d.land AND r.stelle=d.stelle 
 WHERE r.gml_id= $1 AND r.endet IS NULL AND d.endet IS NULL;";
Index: trunk/info/info/alkisn/alkisbaurecht.php
===================================================================
--- trunk/info/info/alkisn/alkisbaurecht.php	(revision 411)
+++ trunk/info/info/alkisn/alkisbaurecht.php	(revision 412)
@@ -9,4 +9,5 @@
 	2017-10-09 Sauber filtern auf endet IS NULL
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -44,11 +45,11 @@
 if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
 
-// Spalte "a.d" ist immer leer
+// Spalte "a.dokumentation" ist immer leer
 $sql ="SELECT r.ogc_fid, r.artderfestlegung as adfkey, r.name, r.stelle, r.bezeichnung AS rechtbez, 
-a.v AS adfbez, d.bezeichnung AS stellbez, d.stellenart, wd.v, wd.d, round(st_area(r.wkb_geometry)::numeric,0) AS flae 
+a.beschreibung AS adfbez, d.bezeichnung AS stellbez, d.stellenart, wd.beschreibung, wd.dokumentation, round(st_area(r.wkb_geometry)::numeric,0) AS flae 
 FROM ax_bauraumoderbodenordnungsrecht r 
-LEFT JOIN alkis_wertearten a ON cast(r.artderfestlegung AS character varying)=a.k AND a.element='ax_bauraumoderbodenordnungsrecht' AND a.bezeichnung='artderfestlegung'
+LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON r.artderfestlegung = a.wert
 LEFT JOIN ax_dienststelle d ON r.land=d.land AND r.stelle=d.stelle 
-LEFT JOIN alkis_wertearten wd ON cast(d.stellenart AS character varying)=wd.k AND wd.element='ax_dienststelle' AND wd.bezeichnung='stellenart'
+LEFT JOIN ax_behoerde wd ON d.stellenart = wd.wert
 WHERE r.gml_id= $1 AND r.endet IS NULL AND d.endet IS NULL;";
 
@@ -126,5 +127,5 @@
 	$v=array($gmlid);
 } else {
-	$sql.="AND f.kreis = $2 AND f.gemeinde = $3 "; // Zuständiges Gebiet
+	$sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // Zuständiges Gebiet
 	$v=array($gmlid, $filtkreis, $filtgem);
 }
Index: trunk/info/info/alkisn/alkisfshist.php
===================================================================
--- trunk/info/info/alkisn/alkisfshist.php	(revision 411)
+++ trunk/info/info/alkisn/alkisfshist.php	(revision 412)
@@ -12,4 +12,5 @@
 	2018-03-16 NULL-Werte in gemeinde und kreis in ax_historischesflurstueck berÃŒcksichtigen
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 */
 
@@ -172,5 +173,5 @@
 		$whereo='';
 	} else { // ZusÃ€tze zur WHERE-Clausel
-		$wheref=" AND f.kreis = '".$filtkreis."' AND f.gemeinde = '".$filtgem."' ";
+		$wheref=" AND f.gemeindezugehoerigkeit_kreis = '".$filtkreis."' AND f.gemeindezugehoerigkeit_gemeinde = '".$filtgem."' ";
 		$whereh=" AND (h.kreis IS NULL OR h.kreis = '".$filtkreis."' ) AND (h.gemeinde IS NULL OR h.gemeinde = '".$filtgem."') ";
 		$whereo=" AND (o.gemeinde IS NULL OR o.gemeinde = '".$filtgem."') ";
Index: trunk/info/info/alkisn/alkishaus.php
===================================================================
--- trunk/info/info/alkisn/alkishaus.php	(revision 411)
+++ trunk/info/info/alkisn/alkishaus.php	(revision 412)
@@ -11,4 +11,5 @@
 	2017-10-09 Sauber filtern auf endet IS NULL
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 
 	ToDo:
@@ -59,16 +60,18 @@
 
 // G e b a e u d e
-
+// ... g.qualitaetsangaben, 
 $sqlg ="SELECT g.gml_id, g.name, g.bauweise, g.gebaeudefunktion, g.anzahlderoberirdischengeschosse AS aog, g.anzahlderunterirdischengeschosse AS aug, 
-g.lagezurerdoberflaeche, g.dachgeschossausbau, g.zustand, array_to_string(g.weiteregebaeudefunktion, ',') AS wgf, g.dachform, g.hochhaus, g.objekthoehe, g.geschossflaeche, g.grundflaeche, g.umbauterraum, g.baujahr, g.dachart, g.qualitaetsangaben, 
-h.v AS bbauw, h.d AS dbauw, u.v AS bfunk, u.d AS dfunk, z.v AS zustandv, z.d AS zustandd, d.v AS bdach, a.v AS dgaus, o.v AS oflv, o.d AS ofld,
+g.lagezurerdoberflaeche, g.dachgeschossausbau, g.zustand, array_to_string(g.weiteregebaeudefunktion, ',') AS wgf, g.dachform, g.hochhaus, g.objekthoehe, 
+g.geschossflaeche, g.grundflaeche, g.umbauterraum, g.baujahr, g.dachart, 
+h.beschreibung AS bbauw, h.dokumentation AS dbauw, u.beschreibung AS bfunk, u.dokumentation AS dfunk, z.beschreibung AS zustandv, z.dokumentation AS zustandd, d.beschreibung AS bdach, 
+a.beschreibung AS dgaus, o.beschreibung AS oflv, o.dokumentation AS ofld,
 round(st_area(g.wkb_geometry)::numeric,2) AS gebflae
 FROM ax_gebaeude g 
-LEFT JOIN alkis_wertearten h ON cast(g.bauweise AS character varying)=h.k AND h.element='ax_gebaeude' AND h.bezeichnung='bauweise'
-LEFT JOIN alkis_wertearten u ON cast(g.gebaeudefunktion AS character varying)=u.k AND u.element='ax_gebaeude' AND u.bezeichnung='gebaeudefunktion'
-LEFT JOIN alkis_wertearten z ON cast(g.zustand AS character varying)=z.k AND z.element='ax_gebaeude' AND z.bezeichnung='zustand'
-LEFT JOIN alkis_wertearten d ON cast(g.dachform AS character varying)=d.k AND d.element='ax_gebaeude' AND d.bezeichnung='dachform'
-LEFT JOIN alkis_wertearten a ON cast(g.dachgeschossausbau AS character varying)=a.k AND a.element='ax_gebaeude' AND a.bezeichnung='dachgeschossausbau'
-LEFT JOIN alkis_wertearten o ON cast(g.lagezurerdoberflaeche AS character varying)=o.k AND o.element='ax_gebaeude' AND o.bezeichnung='lagezurerdoberflaeche'
+LEFT JOIN ax_bauweise_gebaeude h ON g.bauweise = h.wert
+LEFT JOIN ax_gebaeudefunktion u ON g.gebaeudefunktion = u.wert
+LEFT JOIN ax_zustand_gebaeude z ON g.zustand = z.wert
+LEFT JOIN ax_dachform d ON g.dachform = d.wert
+LEFT JOIN ax_dachgeschossausbau_gebaeude a ON g.dachgeschossausbau = a.wert
+LEFT JOIN ax_lagezurerdoberflaeche_gebaeude o ON g.lagezurerdoberflaeche = o.wert
 WHERE g.gml_id= $1 AND g.endet IS NULL;";
 
@@ -149,5 +152,5 @@
 	$bja=$rowg["baujahr"];
 	$daa=$rowg["dachart"];
-	$qag=$rowg["qualitaetsangaben"];
+//	$qag=$rowg["qualitaetsangaben"];
 
 	if (($nam != "") OR $allefelder) {
@@ -287,6 +290,5 @@
 	}
 
-	// Dachgeschossausbau
-	// nichts dazu in alkis_wertearten.d
+	// Dachgeschossausbau, Spalte dokumentation ist immer leer
 	if ($dga != "" OR $allefelder) {
 		echo "\n<tr>"
@@ -316,12 +318,11 @@
 
 	// Weitere GebÃ€udefunktionen
-	// Suche Testfall: SELECT * FROM ax_gebaeude WHERE NOT weiteregebaeudefunktion IS NULL;
-	// Keiner zu finden. Das folgende ungetestet:
-	if ($wgf != "" OR $allefelder) { // "weiteregebaeudefunktion" ist ein Array
+	// Suche Testfall: SELECT gml_id, gebaeudefunktion, weiteregebaeudefunktion FROM ax_gebaeude WHERE (NOT weiteregebaeudefunktion IS NULL) AND cardinality(weiteregebaeudefunktion) > 1 liMIT 10;
+	if ($wgf != "" OR $allefelder) { // ... ist ein Array
 		echo "\n<tr>"
 			."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
 			."\n\t<td>";
 			if ($wgf != "") { // Kommagetrennte Liste aus Array
-				$sqlw="SELECT k, v, d FROM alkis_wertearten WHERE k IN ( $1 ) AND element='ax_gebaeude' AND bezeichnung='weiteregebaeudefunktion' ORDER BY k;";
+				$sqlw="SELECT wert, beschreibung, dokumentation FROM ax_gebaeudefunktion WHERE wert IN ( $1 ) ORDER BY wert;";
 				$v = array($wgf);
 				$resw = pg_prepare("", $sqlw);
@@ -332,8 +333,8 @@
 				}
 				$zw=0;
-				while($roww = pg_fetch_assoc($resw)) { // LOOP: w.Funktion
+				while($roww = pg_fetch_assoc($resw)) { // LOOP Funktion
 					if ($zw > 0) {echo "<br>";}
-					if ($showkey) {echo "<span class='key'>".$roww["k"]."</span>&nbsp;";}
-					echo "<span title='".$roww["d"]."'>".$roww["v"]."</span>";
+					if ($showkey) {echo "<span class='key'>".$roww["wert"]."</span>&nbsp;";}
+					echo "<span title='".$roww["dokumentation"]."'>".$roww["beschreibung"]."</span>";
 					$zw++;
 			   }
@@ -346,6 +347,5 @@
 	}
 
-	// Dachform
-	// nichts dazu in alkis_wertearten.d
+	// Dachform, Spalte dokumentation ist immer leer
 	if ($daf != "" OR $allefelder) {
 		echo "\n<tr>"
@@ -430,5 +430,5 @@
 
 	// QualitÃ€tsangaben
-	if ($qag != "" OR $allefelder) {
+/*	if ($qag != "" OR $allefelder) {
 		echo "\n<tr>"
 			."\n\t<td class='li'>Qualit&auml;tsangaben</td>"
@@ -438,11 +438,10 @@
 			."\n\t</td>"
 		."\n</tr>";
-	}
+	} */
 	echo "\n</table>";
 }
 if ($gebnr == 0) {echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden<br>&nbsp;</p>";}
 
-// ++ ToDo: Verschnitt mit FS?
-
+// ++ ToDo:  -Verschnitt mit FS?  -Ausgeben ax_georeferenziertegebaeudeadresse dazz, wenn gefÃŒllt.
 ?>
 
Index: trunk/info/info/alkisn/alkisinlayausk.php
===================================================================
--- trunk/info/info/alkisn/alkisinlayausk.php	(revision 411)
+++ trunk/info/info/alkisn/alkisinlayausk.php	(revision 412)
@@ -19,4 +19,5 @@
 	2018-04-24 Feinschliff
 	2018-05-03 neuer GrundstÃŒcksnachweis
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -53,7 +54,8 @@
 
 // *** F L U R S T U E C K ***
-$sql ="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung, f.regierungsbezirk, f.kreis, f.gemeinde, f.istgebucht
+$sql ="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung, f.gemeindezugehoerigkeit_regierungsbezirk, f.gemeindezugehoerigkeit_kreis, f.gemeindezugehoerigkeit_gemeinde, f.istgebucht
 FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
 WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL;";
+
 $v = array($gmlid);
 $res = pg_prepare("", $sql);
@@ -73,7 +75,7 @@
 	$flae=$row["amtlicheflaeche"];
 	$flae=number_format($flae,0,",",".") . " m&#178;";
-	$fsreg=$row["regierungsbezirk"]; // Filter ZustÃ€ndigkeit
-	$fskrs=$row["kreis"];
-	$fsgem=$row["gemeinde"];
+	$fsreg=$row["gemeindezugehoerigkeit_regierungsbezirk"]; // Filter ZustÃ€ndigkeit
+	$fskrs=$row["gemeindezugehoerigkeit_kreis"];
+	$fsgem=$row["gemeindezugehoerigkeit_gemeinde"];
 	$gml_buchungsstelle=$row["istgebucht"];
 } else {
Index: trunk/info/info/alkisn/alkisbestnw.php
===================================================================
--- trunk/info/info/alkisn/alkisbestnw.php	(revision 411)
+++ trunk/info/info/alkisn/alkisbestnw.php	(revision 412)
@@ -13,4 +13,5 @@
 	2018-04-23 Blatt und EigentÃŒmer in eine Tabelle.
 	2018-05-03 Anpassung an GrundstÃŒcksnachweis, kein Export fÃŒr fiktives Blatt
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -53,10 +54,10 @@
 
 // G R U N D B U C H
-$sql="SELECT g.gml_id, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung AS blatt, g.blattart, wb.v AS blattartv, wb.d AS blattartd, 
-b.gml_id, b.bezirk, b.bezeichnung AS beznam, d.gml_id, d.land, d.bezeichnung, d.stelle, d.stellenart, wd.v AS stellev FROM ax_buchungsblatt g 
+$sql="SELECT g.gml_id, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung AS blatt, g.blattart, wb.beschreibung AS blattartv, wb.dokumentation AS blattartd, 
+b.gml_id, b.bezirk, b.bezeichnung AS beznam, d.gml_id, d.land, d.bezeichnung, d.stelle, d.stellenart, wd.beschreibung AS stellev FROM ax_buchungsblatt g 
 LEFT JOIN ax_buchungsblattbezirk b ON g.land=b.land AND g.bezirk=b.bezirk 
-LEFT JOIN ax_dienststelle d ON b.land=d.land AND b.stelle=d.stelle 
-LEFT JOIN alkis_wertearten wb ON cast(g.blattart AS character varying)=wb.k AND wb.element='ax_buchungsblatt' AND wb.bezeichnung='blattart'
-LEFT JOIN alkis_wertearten wd ON cast(d.stellenart AS character varying)=wd.k AND wd.element='ax_dienststelle' AND wd.bezeichnung='stellenart'
+LEFT JOIN ax_dienststelle d ON b.land=d.land AND b.gehoertzu_stelle=d.stelle 
+LEFT JOIN ax_blattart_buchungsblatt wb ON g.blattart = wb.wert
+LEFT JOIN ax_behoerde wd ON d.stellenart = wd.wert
 WHERE g.gml_id= $1 AND g.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL;";
 // .. AND d.stellenart=1000 
@@ -168,6 +169,7 @@
 // Blatt ->  B u c h u n g s s t e l l e
 // aktuelles ax_buchungsblatt <istBestandteilVon< ax_buchungsstelle 
-$sql ="SELECT s.gml_id, s.buchungsart, s.laufendenummer AS lfd, s.beschreibungdesumfangsderbuchung AS udb, s.zaehler, s.nenner, s.nummerimaufteilungsplan AS nrap, s.beschreibungdessondereigentums AS sond, b.v as bart, b.d
-FROM ax_buchungsstelle s LEFT JOIN alkis_wertearten b ON cast(s.buchungsart AS character varying)=b.k AND b.element='ax_buchungsstelle' and b.bezeichnung='buchungsart'
+$sql ="SELECT s.gml_id, s.buchungsart, s.laufendenummer AS lfd, s.beschreibungdesumfangsderbuchung AS udb, s.zaehler, s.nenner, 
+s.nummerimaufteilungsplan AS nrap, s.beschreibungdessondereigentums AS sond, b.beschreibung as bart, b.dokumentation
+FROM ax_buchungsstelle s LEFT JOIN ax_buchungsart_buchungsstelle b ON s.buchungsart = b.wert
 WHERE s.istbestandteilvon= $1 AND s.endet IS NULL ORDER BY cast(s.laufendenummer AS integer);";
 $v=array($gmlid); // Rel. istBestandteilVon
@@ -187,5 +189,5 @@
 	$bartkey=$row["buchungsart"]; // SchlÃŒsselwert
 	$bart=$row["bart"]; // BuchungsART Text dazu
-	$bartstory=htmlentities($row["d"], ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet
+	$bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet
 	if ($row["zaehler"] == "") {
 		$anteil = "";
@@ -210,5 +212,5 @@
 
 		// Mit "UNION" um die FÃ€lle mit JOIN ÃŒber die Arrays "an" und "zu" unterscheiden zu kÃ¶nnen
-		$sql="SELECT uni.*, wb.v AS bart FROM "
+		$sql="SELECT uni.*, wb.beschreibung AS bart FROM "
 		."(SELECT sda.gml_id, sda.buchungsart, sda.laufendenummer AS lfd, sda.beschreibungdesumfangsderbuchung AS udb, sda.nummerimaufteilungsplan AS nrap, sda.beschreibungdessondereigentums AS sond, 'an' as anzu "
 		."FROM ax_buchungsstelle sha JOIN ax_buchungsstelle sda ON sda.gml_id=ANY(sha.an) "
@@ -217,5 +219,5 @@
 		."FROM ax_buchungsstelle shz JOIN ax_buchungsstelle sdz ON sdz.gml_id=ANY(shz.zu) "
 		."WHERE shz.gml_id= $1 AND shz.endet IS NULL AND sdz.endet IS NULL "
-		.") AS uni LEFT JOIN alkis_wertearten wb ON cast(uni.buchungsart AS character varying)=wb.k AND wb.element='ax_buchungsstelle' AND wb.bezeichnung='buchungsart' "
+		.") AS uni LEFT JOIN ax_buchungsart_buchungsstelle wb ON uni.buchungsart = wb.wert "
 		."ORDER BY uni.lfd;";
 	//	Testfall suchen: SELECT gml_id, zu, durch FROM ax_buchungsstelle WHERE NOT zu IS NULL OR NOT durch IS NULL;
@@ -242,5 +244,5 @@
 			."FROM ax_buchungsblatt b JOIN ax_buchungsstelle s ON b.gml_id=s.istbestandteilvon "
 			."LEFT JOIN ax_buchungsblattbezirk z ON b.land=z.land AND b.bezirk=z.bezirk "
-			."LEFT JOIN alkis_wertearten wb ON cast(b.blattart AS character varying)=wb.k AND wb.element='ax_buchungsblatt' AND wb.bezeichnung='blattart' "
+			."LEFT JOIN ax_blattart_buchungsblatt wb ON b.blattart = wb.wert "
 			."WHERE s.gml_id= $1 AND b.endet IS NULL AND s.endet IS NULL AND z.endet IS NULL ORDER BY b.land, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung;";
 			$v=array($gml_bsan);
@@ -359,13 +361,13 @@
 // Blatt   <istBestandteilVon< Stelle  <an<  Stelle      >istBestandteilVon>  Blatt
 // Fiktiv                      Fiktiv  <zu<  Berechtigt                       Berechtigt
-$sql="SELECT sf.laufendenummer AS anlfdnr, bb.gml_id, bb.land, bb.bezirk, bb.buchungsblattnummermitbuchstabenerweiterung AS blatt, bb.blattart, wa.v AS blattartv, 
-sb.gml_id AS gml_s, sb.laufendenummer AS lfdnr, sb.buchungsart, wb.v AS bart, wb.d AS bartd, bz.bezeichnung AS beznam, d.bezeichnung, d.stelle, d.stellenart, wd.v AS stellev 
+$sql="SELECT sf.laufendenummer AS anlfdnr, bb.gml_id, bb.land, bb.bezirk, bb.buchungsblattnummermitbuchstabenerweiterung AS blatt, bb.blattart, wa.beschreibung AS blattartv, 
+sb.gml_id AS gml_s, sb.laufendenummer AS lfdnr, sb.buchungsart, wb.beschreibung AS bart, wb.dokumentation AS bartd, bz.bezeichnung AS beznam, d.bezeichnung, d.stelle, d.stellenart, wd.beschreibung AS stellev 
 FROM ax_buchungsstelle sf JOIN ax_buchungsstelle sb ON (sf.gml_id=ANY(sb.an) OR sf.gml_id=ANY(sb.zu)) 
 JOIN ax_buchungsblatt bb ON bb.gml_id=sb.istbestandteilvon 
 LEFT JOIN ax_buchungsblattbezirk bz ON bb.land=bz.land AND bb.bezirk=bz.bezirk 
-LEFT JOIN ax_dienststelle d ON bz.land=d.land AND bz.stelle=d.stelle 
-LEFT JOIN alkis_wertearten wa ON cast(bb.blattart AS character varying)=wa.k AND wa.element='ax_buchungsblatt' AND wa.bezeichnung='blattart'
-LEFT JOIN alkis_wertearten wb ON cast(sb.buchungsart AS character varying)=wb.k AND wb.element='ax_buchungsstelle' AND wb.bezeichnung='buchungsart'
-LEFT JOIN alkis_wertearten wd ON cast(d.stellenart AS character varying)=wd.k AND wd.element='ax_dienststelle' AND wd.bezeichnung='stellenart'
+LEFT JOIN ax_dienststelle d ON bz.land=d.land AND bz.gehoertzu_stelle=d.stelle 
+LEFT JOIN ax_blattart_buchungsblatt wa ON bb.blattart = wa.wert
+LEFT JOIN ax_buchungsart_buchungsstelle wb ON sb.buchungsart = wb.wert
+LEFT JOIN ax_behoerde wd ON d.stellenart = wd.wert
 WHERE sf.istbestandteilvon = $1 AND sf.endet IS NULL AND sb.endet IS NULL AND bb.endet IS NULL AND bz.endet IS NULL AND d.endet IS NULL 
 ORDER BY cast(sf.laufendenummer AS integer), bz.bezeichnung, bb.buchungsblattnummermitbuchstabenerweiterung, cast(sb.laufendenummer AS integer);";
Index: trunk/info/info/alkisn/alkisausk.php
===================================================================
--- trunk/info/info/alkisn/alkisausk.php	(revision 411)
+++ trunk/info/info/alkisn/alkisausk.php	(revision 412)
@@ -13,4 +13,5 @@
 	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen (Berechtigung fÃŒr Gemeinde prÃŒfen)
 	2017-10-11 Sauber filtern auf endet IS NULL
+	2018-11-09 Umstellung Full-Schema
 
 	H i n w e i s :  Dies Modul wird beim Entwickler nicht mehr produktiv eingesetzt.
@@ -41,5 +42,5 @@
 
 // *** F L U R S T U E C K ***
-$sql ="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung, f.regierungsbezirk, f.kreis, f.gemeinde
+$sql ="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung, f.gemeindezugehoerigkeit_regierungsbezirk, f.gemeindezugehoerigkeit_kreis, f.gemeindezugehoerigkeit_gemeinde
 FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
 WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL;";
@@ -62,7 +63,7 @@
 	$flae=$row["amtlicheflaeche"];
 	$flae=number_format($flae,0,",",".") . " m&#178;";
-	$fsreg=$row["regierungsbezirk"]; // Filter ZustÃ€ndigkeit
-	$fskrs=$row["kreis"];
-	$fsgem=$row["gemeinde"];
+	$fsreg=$row["gemeindezugehoerigkeit_regierungsbezirk"]; // Filter ZustÃ€ndigkeit
+	$fskrs=$row["gemeindezugehoerigkeit_kreis"];
+	$fsgem=$row["gemeindezugehoerigkeit_gemeinde"];
 } else {
 	echo "\n<p class='err'>Kein Treffer fuer gml_id=".$gmlid."</p>";
@@ -171,12 +172,12 @@
 echo "\n<h2><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Grundbuch</h2>";
 // ALKIS: FS >istgebucht> GS >istBestandteilVon> GB.
-$sql ="SELECT b.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, wa.v AS blattartv, 
-s.gml_id AS s_gml, s.buchungsart, s.laufendenummer, s.zaehler, s.nenner, z.bezeichnung, wb.v AS bart 
+$sql ="SELECT b.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, wa.beschreibung AS blattartv, 
+s.gml_id AS s_gml, s.buchungsart, s.laufendenummer, s.zaehler, s.nenner, z.bezeichnung, wb.beschreibung AS bart 
 FROM ax_flurstueck f 
 JOIN ax_buchungsstelle s ON f.istgebucht=s.gml_id 
 JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id 
 LEFT JOIN ax_buchungsblattbezirk z ON z.land=b.land AND z.bezirk=b.bezirk 
-LEFT JOIN alkis_wertearten wa ON cast(b.blattart AS character varying)=wa.k AND wa.element='ax_buchungsblatt' AND wa.bezeichnung='blattart' 
-LEFT JOIN alkis_wertearten wb ON cast(s.buchungsart AS character varying)=wb.k AND wb.element='ax_buchungsstelle' AND wb.bezeichnung='buchungsart' 
+LEFT JOIN ax_blattart_buchungsblatt wa ON b.blattart = wa.wert
+LEFT JOIN ax_buchungsart_buchungsstelle wb ON s.buchungsart = wb.wert
 WHERE f.gml_id= $1 AND f.endet IS NULL AND s.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL 
 ORDER BY b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer;";
Index: trunk/info/info/alkisn/alkisnamstruk.php
===================================================================
--- trunk/info/info/alkisn/alkisnamstruk.php	(revision 411)
+++ trunk/info/info/alkisn/alkisnamstruk.php	(revision 412)
@@ -13,4 +13,5 @@
 	2017-12-20 Anlass und Datum zur Adresse ausgeben, wenn es mehrere gibt oder SchlÃŒssel angefordert werden
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -57,7 +58,7 @@
 if (!$con) "\n<p class='err'>Fehler beim Verbinden der DB</p>";
 
-$sql="SELECT p.nachnameoderfirma, p.anrede, p.vorname, p.geburtsname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, p.namensbestandteil, p.akademischergrad, a.v AS anrv
-FROM ax_person p LEFT JOIN alkis_wertearten a ON cast(p.anrede AS character varying)=a.k AND a.element='ax_person' AND a.bezeichnung='anrede' 
-WHERE gml_id= $1 AND p.endet IS NULL;";
+$sql="SELECT p.nachnameoderfirma, p.anrede, p.vorname, p.geburtsname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, 
+p.namensbestandteil, p.akademischergrad, a.beschreibung AS anrv
+FROM ax_person p LEFT JOIN ax_anrede_person a ON p.anrede = a.wert WHERE gml_id= $1 AND p.endet IS NULL;";
 
 $v = array($gmlid);
@@ -94,9 +95,8 @@
 	echo "\n\n<h3><img src='ico/Strasse_mit_Haus.png' width='16' height='16' alt=''> Adresse".$plural."</h3>";
 	// Es kÃ¶nnen redundante Adressen vorhanden sein, z.B. aus Migration, temporÃ€r aus LBESAS.
-	// Im Normalfall nur die "letzte" davon anzeigen. Auf Wunsch alle anzigen, dazu den Anlass und das Datum.
-
-	$sqla ="SELECT a.gml_id, w.v AS anltxt, a.anlass, to_char(cast(a.beginnt AS date),'DD.MM.YYYY') AS datum, a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer, a.bestimmungsland "
+	// Im Normalfall nur die "letzte" davon anzeigen. Auf Wunsch alle anzeigen, dazu den Anlass und das Datum um das zu bewerten.
+	$sqla ="SELECT a.gml_id, w.value AS anltxt, a.anlass, to_char(cast(a.beginnt AS date),'DD.MM.YYYY') AS datum, a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer, a.bestimmungsland "
 	."FROM ax_anschrift a JOIN ax_person p ON a.gml_id=ANY(p.hat) "
-	."LEFT JOIN alkis_wertearten w ON w.k = ANY(a.anlass) AND element='ax_benutzergruppemitzugriffskontrolle' AND w.bezeichnung='zugriffsartfortfuehrungsanlass' "
+	."LEFT JOIN aa_anlassart w ON w.id = ANY(a.anlass) "
 	."WHERE p.gml_id= $1 AND a.endet IS NULL AND p.endet IS NULL ORDER BY a.beginnt DESC ;";
 
@@ -168,12 +168,11 @@
 	//                               >bestehtAusRechtsverhaeltnissenZu> namensnummer   (Nebenzweig/SonderfÃ€lle?)
 
-	$sqlg ="SELECT n.gml_id AS gml_n, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, g.gml_id AS gml_g, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung as nr, g.blattart, wb.v AS blattartv, b.bezeichnung AS beznam "
+	$sqlg ="SELECT n.gml_id AS gml_n, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, g.gml_id AS gml_g, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung as nr, g.blattart, wb.beschreibung AS blattartv, b.bezeichnung AS beznam "
 	."FROM ax_person p JOIN ax_namensnummer n ON p.gml_id=n.benennt "
 	."JOIN ax_buchungsblatt g ON g.gml_id=n.istbestandteilvon "
 	."LEFT JOIN ax_buchungsblattbezirk b ON g.land=b.land AND g.bezirk=b.bezirk "
-	."LEFT JOIN alkis_wertearten wb ON cast(g.blattart AS character varying)=wb.k AND wb.element='ax_buchungsblatt' AND wb.bezeichnung='blattart' "
+	."LEFT JOIN ax_blattart_buchungsblatt wb ON g.blattart = wb.wert "
 	."WHERE p.gml_id= $1 AND p.endet IS NULL AND n.endet IS NULL AND b.endet IS NULL "
 	."ORDER BY b.bezeichnung, g.buchungsblattnummermitbuchstabenerweiterung, n.laufendenummernachdin1421;";
-	// buchungsblatt... mal mit und mal ohne fuehrende Nullen, bringt die Sortierung durcheinander
 
 	$v = array($gmlid);
Index: trunk/info/info/alkisn/alkisgebaeudenw.php
===================================================================
--- trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 411)
+++ trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 412)
@@ -10,4 +10,5 @@
 	2017-06-19 Tool-Tip GebÃ€udefunktion
 	2018-04-23 Kennzeichen eingerÃŒckt, &nodebug
+	2018-11-09 Umstellung Full-Schema
 */
 session_start();
@@ -106,12 +107,12 @@
 
 // G e b a e u d e
-$sqlg ="SELECT g.gml_id, g.name, g.bauweise, g.gebaeudefunktion, h.v AS bauweise_beschreibung, u.v AS bezeichner, u.d AS gfktd, g.zustand, z.v AS bzustand, 
+$sqlg ="SELECT g.gml_id, g.name, g.bauweise, g.gebaeudefunktion, h.beschreibung AS bauweise_beschreibung, u.beschreibung AS bezeichner, u.dokumentation AS gfktd, g.zustand, z.beschreibung AS bzustand, 
 round(st_area(g.wkb_geometry)::numeric,2) AS gebflae, "; // GEB-Flaeche komplett auch die Fl. ausserhalb des FS
 $sqlg.="round(st_area(ST_Intersection(g.wkb_geometry,f.wkb_geometry))::numeric,2) AS schnittflae, "; // wie viel vom GEB liegt im FS?
 $sqlg.="st_within(g.wkb_geometry,f.wkb_geometry) as drin "; // liegt das GEB komplett im FS?
 $sqlg.="FROM ax_flurstueck f, ax_gebaeude g 
-LEFT JOIN alkis_wertearten h ON cast(g.bauweise AS character varying) = h.k AND h.element='ax_gebaeude' and h.bezeichnung='bauweise'
-LEFT JOIN alkis_wertearten u ON cast(g.gebaeudefunktion AS character varying) = u.k AND u.element='ax_gebaeude' and u.bezeichnung='gebaeudefunktion'
-LEFT JOIN alkis_wertearten z ON cast(g.zustand AS character varying) = z.k AND z.element='ax_gebaeude' and z.bezeichnung='zustand'
+JOIN ax_bauweise_gebaeude h ON g.bauweise = h.wert
+LEFT JOIN ax_gebaeudefunktion u ON g.gebaeudefunktion = u.wert
+LEFT JOIN ax_zustand_gebaeude z ON g.zustand = z.wert
 WHERE f.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL "; // ID des akt. FS
 
Index: trunk/info/info/alkisn/alkislage.php
===================================================================
--- trunk/info/info/alkisn/alkislage.php	(revision 411)
+++ trunk/info/info/alkisn/alkislage.php	(revision 412)
@@ -12,4 +12,5 @@
 	2017-10-09 Sauber filtern auf endet IS NULL
 	2018-04-23 &nodebug
+	2018-11-09 Umstellung Full-Schema
 
 	ToDo:
@@ -382,11 +383,11 @@
 
 	$sql ="SELECT g.gml_id, g.gebaeudefunktion, array_to_string(g.name, ',') AS name, g.bauweise, g.grundflaeche, g.zustand, round(st_area(g.wkb_geometry)::numeric,2) AS flaeche,
-	h.v AS hv, h.d AS hd, u.v AS uv, u.d AS ud, z.v AS zv, z.d AS zd FROM ax_gebaeude g 
-	LEFT JOIN alkis_wertearten h ON cast(g.bauweise AS character varying)=h.k AND h.element='ax_gebaeude' AND h.bezeichnung='bauweise'
-	LEFT JOIN alkis_wertearten u ON cast(g.gebaeudefunktion AS character varying)=u.k AND u.element='ax_gebaeude' AND u.bezeichnung='gebaeudefunktion'
-	LEFT JOIN alkis_wertearten z ON cast(g.zustand AS character varying)=z.k AND z.element='ax_gebaeude' AND z.bezeichnung='zustand'
+	h.beschreibung AS hv, h.dokumentation AS hd, u.beschreibung AS uv, u.dokumentation AS ud, z.beschreibung AS zv, z.dokumentation AS zd FROM ax_gebaeude g 
+	LEFT JOIN ax_bauweise_gebaeude h ON g.bauweise = h.wert
+	LEFT JOIN ax_gebaeudefunktion u ON g.gebaeudefunktion = u.wert
+	LEFT JOIN ax_zustand_gebaeude z ON g.zustand = z.wert
 	WHERE $1 = ".$bezart." AND g.endet IS NULL;";
 	// Keine Sortierung (ORDER BY) notwendig weil i.d.R. nur ein (Haupt-)GebÃ€ude diese Hausnummer hat.
-	// FÃŒr weiter "alkis_wertearten" (EnstschlÃŒsselungen) zum GebÃ€ude dem Link "Haus" folgen.
+	// FÃŒr weiter Eigenschaften dem Link "Haus" folgen.
 
 	$v = array($gmlid);
Index: trunk/info/info/alkisn/alkisfsnw.php
===================================================================
--- trunk/info/info/alkisn/alkisfsnw.php	(revision 411)
+++ trunk/info/info/alkisn/alkisfsnw.php	(revision 412)
@@ -21,4 +21,5 @@
 	2018-04-23 Umfangreiche Ãberarbeitung der "Buchungsstellen"
 	2018-05-03 Anpassung fÃŒr GrundstÃŒcksnachweis
+	2018-11-09 Umstellung Full-Schema
 
 ++ToDo:
@@ -128,13 +129,14 @@
 
 // F L U R S T U E C K  m. Gebiet
-$sql ="SELECT f.name, f.flurnummer, f.zaehler, f.nenner, f.regierungsbezirk, f.kreis, f.gemeinde, f.amtlicheflaeche, st_area(f.wkb_geometry) AS fsgeomflae, 
+$sql ="SELECT f.zeigtaufexternes_name, f.flurnummer, f.zaehler, f.nenner, f.gemeindezugehoerigkeit_regierungsbezirk, f.gemeindezugehoerigkeit_kreis, f.gemeindezugehoerigkeit_gemeinde, f.amtlicheflaeche, st_area(f.wkb_geometry) AS fsgeomflae, 
 to_char(cast(f.zeitpunktderentstehung AS date),'DD.MM.YYYY') AS zeitpunktderentstehung, f.istgebucht, g.gemarkungsnummer, g.bezeichnung, 
 r.bezeichnung AS rbez, k.bezeichnung AS kbez, m.bezeichnung AS mbez 
 FROM ax_flurstueck f 
-LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
-LEFT JOIN ax_regierungsbezirk r ON f.regierungsbezirk=r.regierungsbezirk 
-LEFT JOIN ax_kreisregion k ON f.regierungsbezirk=k.regierungsbezirk AND f.kreis=k.kreis 
-LEFT JOIN ax_gemeinde m ON m.regierungsbezirk=f.regierungsbezirk AND m.kreis=f.kreis AND m.gemeinde=f.gemeinde
+LEFT JOIN ax_gemarkung g ON f.gemeindezugehoerigkeit_land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
+LEFT JOIN ax_regierungsbezirk r ON f.gemeindezugehoerigkeit_regierungsbezirk=r.regierungsbezirk 
+LEFT JOIN ax_kreisregion k ON f.gemeindezugehoerigkeit_regierungsbezirk=k.regierungsbezirk AND f.gemeindezugehoerigkeit_kreis=k.kreis 
+LEFT JOIN ax_gemeinde m ON m.regierungsbezirk=f.gemeindezugehoerigkeit_regierungsbezirk AND m.kreis=f.gemeindezugehoerigkeit_kreis AND m.gemeinde=f.gemeindezugehoerigkeit_gemeinde
 WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL AND m.endet IS NULL AND k.endet IS NULL AND r.endet IS NULL;";
+
 $v = array($gmlid); // mit gml_id suchen
 $res = pg_prepare("", $sql);
@@ -147,9 +149,9 @@
 	$gemkname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");
 	$gmkgnr=$row["gemarkungsnummer"];
-	$bezirk=$row["regierungsbezirk"];
+	$bezirk=$row["gemeindezugehoerigkeit_regierungsbezirk"];
 	$rbez=htmlentities($row["rbez"], ENT_QUOTES, "UTF-8");
-	$kreis=$row["kreis"];
+	$kreis=$row["gemeindezugehoerigkeit_kreis"];
 	$kbez=htmlentities($row["kbez"], ENT_QUOTES, "UTF-8");
-	$gemeinde=$row["gemeinde"];
+	$gemeinde=$row["gemeindezugehoerigkeit_gemeinde"];
 	$mbez=htmlentities($row["mbez"], ENT_QUOTES, "UTF-8");
 	$flurnummer=$row["flurnummer"];
@@ -165,6 +167,6 @@
 	$entsteh=$row["zeitpunktderentstehung"];
 	$gml_buchungsstelle=$row["istgebucht"]; // wird erst im GB-Teil benÃ¶tigt
-	$name=$row["name"]; // Fortfuehrungsnummer(n)
-	$arrn = explode(",", trim($name, "{}") ); // PHP-Array
+	$ffnr=$row["zeigtaufexternes_name"]; // Fortfuehrungsnummer(n)
+	$arrn=explode(",", trim($ffnr, "{}") ); // PHP-Array
 } else {
 	echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Flurst&uuml;ck mit gml_id=".$gmlid."</p>";
@@ -462,7 +464,6 @@
 
 // BodenschÃ€tzungs-Abschnitte mit FlurstÃŒcken verschneiden, Spalten entschlÃŒsseln
-$sql="SELECT kulturart.k AS kulturartk, kulturart.v AS kulturartv,
- bodenart.k  AS bodenartk,  bodenart.v  AS bodenartv,
- zustbod.v AS zustbodv,
+$sql="SELECT b.kulturart AS kulturartk, kulturart.beschreibung AS kulturartv,
+ b.bodenart AS bodenartk, bodenart.beschreibung AS bodenartv, zustbod.beschreibung AS zustbodv,
  b.entstehungsartoderklimastufewasserverhaeltnisse AS entsteh, b.sonstigeangaben,
  b.bodenzahlodergruenlandgrundzahl as bodenzahl, b.ackerzahlodergruenlandzahl AS ackerzahl,
@@ -470,7 +471,7 @@
 FROM ax_flurstueck f
 JOIN ax_bodenschaetzung b ON st_intersects(b.wkb_geometry, f.wkb_geometry) AND st_area(st_intersection(b.wkb_geometry, f.wkb_geometry)) > 0.05
-LEFT JOIN alkis_wertearten AS bodenart  ON cast(b.bodenart  AS character varying) = bodenart.k  AND bodenart.element='ax_bodenschaetzung'  AND bodenart.bezeichnung='bodenart'
-LEFT JOIN alkis_wertearten AS kulturart ON cast(b.kulturart AS character varying) = kulturart.k AND kulturart.element='ax_bodenschaetzung' AND kulturart.bezeichnung='kulturart'
-LEFT JOIN alkis_wertearten AS zustbod   ON cast(b.zustandsstufeoderbodenstufe AS character varying) = zustbod.k AND zustbod.element='ax_bodenschaetzung' AND zustbod.bezeichnung='zustandsstufeoderbodenstufe'
+LEFT JOIN ax_bodenart_bodenschaetzung bodenart ON b.bodenart = bodenart.wert
+LEFT JOIN ax_kulturart_bodenschaetzung kulturart ON b.kulturart = kulturart.wert
+LEFT JOIN ax_zustandsstufeoderbodenstufe_bodenschaetzung zustbod ON b.zustandsstufeoderbodenstufe = zustbod.wert
 WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL ORDER BY schnittflae DESC";
 
@@ -558,8 +559,8 @@
 
 // H i n w e i s  auf Bodenneuordnung oder eine strittige Grenze
-$sql_boden ="SELECT a.k AS wert, a.v AS art_verf, b.gml_id AS verf_gml, b.bezeichnung AS verf_bez, 
+$sql_boden ="SELECT b.artderfestlegung AS wert, a.beschreibung AS art_verf, b.gml_id AS verf_gml, b.bezeichnung AS verf_bez, 
 b.name AS verf_name, d.bezeichnung AS stelle_bez, d.stelle AS stelle_key 
 FROM ax_bauraumoderbodenordnungsrecht b 
-LEFT JOIN alkis_wertearten a ON cast(b.artderfestlegung AS character varying)=a.k AND a.element='ax_bauraumoderbodenordnungsrecht' AND a.bezeichnung='artderfestlegung'
+LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON b.artderfestlegung = a.wert
 LEFT JOIN ax_dienststelle d ON b.stelle=d.stelle 
 WHERE b.endet IS NULL AND d.endet IS NULL  
Index: trunk/info/info/alkisn/alkisgsnw.php
===================================================================
--- trunk/info/info/alkisn/alkisgsnw.php	(revision 411)
+++ trunk/info/info/alkisn/alkisgsnw.php	(revision 412)
@@ -7,4 +7,5 @@
 	Version:
 	2018-05-03 Neues Modul "gsnw" abgeleitet aus "fsnw"
+	2018-11-09 Umstellung Full-Schema
 */
 
@@ -184,5 +185,5 @@
 		$v=array($gmlid);
 	} else {
-		$sqlfs.="AND f.kreis = $2 AND f.gemeinde = $3 "; // ZustÃ€ndiges Gebiet
+		$sqlfs.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÃ€ndiges Gebiet
 		$v=array($gmlid, $filtkreis, $filtgem);
 	}
Index: trunk/info/info/alkisn/alkisexport.php
===================================================================
--- trunk/info/info/alkisn/alkisexport.php	(revision 411)
+++ trunk/info/info/alkisn/alkisexport.php	(revision 412)
@@ -12,4 +12,5 @@
 		?gkz=mandant&tabtyp=strasse&haus=m&gmlid=DE...   Filter &haus=m/o = mit oder ohne Hausnummer
 		?gkz=mandant&tabtyp=strasse&haus=o               bei Strasse auch ohne gmlid zulÃ€ssig - nicht verwenden wenn aus NBA unscharf geladen
+		?gkz240,tabtyp=flstliste&gmlliste=DE...,DE....
 	Beispiele fÃŒr Fehler:
 		?gkz=270&tabtyp=gemarkung&gmlid=2662
@@ -29,4 +30,5 @@
 	2017-12-20 Nur eine Adresse zur Person (Siehe Views in "views_exp_csv.sql")
 	2018-05-03 Aufruf aus neuem GrundstÃŒcksnachweis: tabtyp='buchung', angepasster View "exp_csv" notwendig
+	2018-10-16 Neuer Aufruf-Typ aus der rÃ€umlichen Selektion, &tabtyp=flstliste&prefix=DENW15&gmlliste=AL...,AL....
 
 	ToDo:
@@ -73,5 +75,18 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+if ( isset($gmlid) ) {
+	if ( !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	$gmlid="";
+}
+
+// FS-Limit? x (16+1) = 
+if ( isset($gmlliste) ) {
+	if (!preg_match("#^[0-9A-Za-z,]{16,2000}$#", $gmlliste)) {
+	//	echo "\n<p>gmlliste=".$gmlliste."</p>\n";   // NUR TEST
+		die("Eingabefehler gmlliste");
+	}
+}
+
 if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
 if (isset($gemarkung)) {
@@ -118,5 +133,5 @@
 		$filename='alkis_'.$tabtyp.'_'.$gemarkung.'.csv';
 
-/* 	// $gmlid zu strasse noch notwendig solange kein Filter auf "Gemeinde" verwendet wird.
+/* 	// $gmlid zu strasse ist noch notwendig solange kein Filter auf "Gemeinde" verwendet wird.
 	} elseif ($haus == 'm' or $haus == 'o') { // Sonderfall 2 - alle mit/ohne Hausnummer, nur ÃŒber View "exp_csv_str" mÃ¶glich
 		if ($tabtyp != 'strasse') {
@@ -130,4 +145,14 @@
 		}
 */
+	} elseif ($gmlliste != '') { // Sonderfall 3 - FlurstÃŒcke aus rÃ€umlicher Selection
+		if ($tabtyp != 'flstliste') {
+			$err = "Fehler: Falsche Kombination Parameter tabtyp='".$tabtyp."' mit Liste der GML-ID.";
+			echo "\n".$err; exit ($err);
+		}
+		if (!isset($prefix) or !preg_match("#^[A-Z0-9,]{6}$#", $prefix)) {
+			die("Eingabefehler prefix");
+		}
+		$filename='alkis_gebiet.csv'; // RÃ€umliche Selection
+
 	} else {
 		$err="\nFehler: Kein passender Wert fuer die Suche angegeben.";
@@ -151,29 +176,46 @@
 pg_set_client_encoding($con, 'LATIN1'); // FÃŒr Excel kein UTF8
 
-$viewname="exp_csv"; // Standard-View, in der DB gespeichert
+//$viewname="exp_csv"; // Standard-View, in der DB gespeichert
 $v=array($gmlid); // Standard-Filter-Feld
 
 // Der Parameter "Tabellentyp" bestimmt den Namen des Filter-Feldes aus dem View "exp_csv".
 switch ($tabtyp) { // zulaessige Werte fuer &tabtyp=
+
 	case 'flurstueck': // ax_flurstueck.gml_id
-		$filter = "fsgml";
-		break;
+		$sql="SELECT * FROM exp_csv WHERE fsgml = $1 ";
+		break;
+
 	case 'grundbuch': // ax_buchungsblatt.gml_id
-		$filter = "gbgml";
-		break;
+		$sql="SELECT * FROM exp_csv WHERE gbgml = $1 ";
+		break;
+
 	case 'buchung': // ax_buchungsstelle.gml_id
-		$filter = "gsgml";
-		break;
+		$sql="SELECT * FROM exp_csv WHERE gsgml = $1 ";
+		break;
+
 	case 'person': // ax_person.gml_id
-		$filter = "psgml";
-		break;
+		$sql="SELECT * FROM exp_csv WHERE psgml = $1 ";
+		break;
+
 	case 'strasse': // ax_lagebezeichnungkatalogeintrag.gml_id = StraÃe-GML-ID
-		$filter = "stgml";
-		$viewname="exp_csv_str"; // alternativer View mit "_str", ist in der Datenbank gespeichert  
-		break;
+		// alternativer View mit "_str", ist in der Datenbank gespeichert
+		$sql="SELECT * FROM exp_csv_str WHERE stgml = $1 ";
+		break;
+
 	case 'gemarkung': // SONDERfall als Parameter wird "Gemarkungsnummer" und nicht "gml_id" geliefert
-		$filter = "gemarkungsnummer";
-		$v=array($gemarkung); // anderes Filter-Feld, anderer Parameter
-		break;
+		$sql="SELECT * FROM exp_csv WHERE gemarkungsnummer = $1 ";
+		$v=array($gemarkung);
+		break;
+
+	case 'flstliste':
+	// Ganze IN-Liste als $1 in SQL bringt kein Ergebnis.
+	// GML-ID aufgeteilt: 6 Byte konstant, 10 Byte variabel in Liste
+	//$prefix vor JEDES Element setzen oder mit Substrings suchen?
+	//	$sql="SELECT * FROM exp_csv WHERE fsgml IN ('".str_replace(",", "','", $gmlliste)."')"; // komplette GML-ID in Liste
+		$sql="SELECT * FROM exp_csv WHERE substring(fsgml from 1 for 6) = $1 "
+			." AND substring(fsgml from 7 for 10) IN ('".str_replace(",", "','", $gmlliste)."')";
+		$v=array($prefix);
+		break;
+
 	default:
 		$err="\nFalscher Parameter '".$tabtyp."'";
@@ -182,17 +224,14 @@
 }
 
-// Daten aus gespeichertem View, zusaetzlich Filter: "feld"='wert' mitgeben
-$sql="SELECT * FROM ".$viewname." WHERE ".$filter." = $1 ";
-
 if ($haus == 'm' or $haus == 'o') { // nur FS mit/ohne verschl. Lagebez.
-	if ($gmlid == '') { // m/o-Filter als einziger Filter
-		$sql="SELECT * FROM ".$viewname." WHERE fall='".$haus."' "; // Ersetzen
-		$v=array(); // kein Filter-Feld
-		// ToDo: Filter auf Gemeinde notwendig, wenn nicht auf strasse gefiltert wird.
-		// - Sonst Ausgabe von Rand-FlurstÃŒcken (bei geometrischer Filterung des NBA-Verfahrens)
-		// - Sonst ggf. Ausgabe Kreisgebiet
-	} else { // als zusÃ€tzlicher Filter AND
-		$sql.="AND fall='".$haus."' "; // m/o-Filter AnhÃ€ngen
-	}
+//	if ($gmlid == '') { // m/o-Filter als einziger Filter
+//		$sql="SELECT * FROM ".$viewname." WHERE fall='".$haus."' "; // Ersetzen
+//		$v=array(); // kein Filter-Feld
+//		// ToDo: Filter auf Gemeinde notwendig, wenn nicht auf strasse gefiltert wird.
+//		// - Sonst Ausgabe von Rand-FlurstÃŒcken (bei geometrischer Filterung des NBA-Verfahrens)
+//		// - Sonst ggf. Ausgabe Kreisgebiet
+//	} else { // als zusÃ€tzlicher Filter AND
+		$sql.=" AND fall='".$haus."' "; // m/o-Filter AnhÃ€ngen
+//	}
 }
 
@@ -311,5 +350,10 @@
 pg_free_result($res);
 if ($i == 1) { // nur Kopf
-	$err="\nKein Treffer fuer gml_id='".$gmlid."'";
+	if ( $gmlid == '' ) {
+		$err="\nKein Treffer";
+	//	echo "\n".$sql."\n".$v[0]."\n".$dbconn."\n";
+	} else {
+		$err="\nKein Treffer fuer gml_id='".$gmlid."'";
+	}
 	exit ($err);
 }
