Index: /trunk/import/sichten.sql
===================================================================
--- /trunk/import/sichten.sql	(revision 304)
+++ /trunk/import/sichten.sql	(revision 305)
@@ -25,4 +25,5 @@
 --  2014-01-17 View "exp_csv" fÃŒr den Export von CSV-Daten aus der Auskunft mit Modul alkisexport.php.
 --  2014-01-20 Erweiterung "exp_csv" fÃŒr alkisexport.php
+--  2014-01-21 In "exp_csv": Rechtsgemeinsachaft zu allen Personen statt als eigener Satz.
 
 
@@ -75,6 +76,6 @@
 
 
--- Generelle Export-Struktur FlurstÃŒck - Buchung - Grundbuch - Person
--- ------------------------------------------------------------------
+-- Generelle Export-Struktur "FlurstÃŒck - Buchung - Grundbuch - Person"
+-- --------------------------------------------------------------------
 -- Verwendet den gespeicherten View "doppelverbindung".
 -- Wird benÃ¶tigt im Auskunft-Modul "alkisexport.php":
@@ -87,10 +88,7 @@
 -- Diese Redundanzen mÃŒssen vom dem Programm gefiltert werden, das die Daten ÃŒber eine Schnittstelle einliest.
 
--- Durch LEFT-JOIN werden wahlweise Namennummern mit Person und Adresse erzeugt, 
--- oder auch Namensnummern einer einem Beschrieb der Rechtsgemeinschaft oder leere Felder zu einem fiktiven Grundbuch.
--- Auch mit diesen Zeilen-Varianten muss das weiter verarbeitende Programm klar kommen.
-
 -- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÃ€gen.
 
+-- 2014-01-21: "Rechtsgemeinschaft" in den Datensatz aller anderen Namen
 --           DROP VIEW exp_csv;
 CREATE OR REPLACE VIEW exp_csv
@@ -98,31 +96,33 @@
  SELECT
   -- FlurstÃŒck
-     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,
+    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,
 
   -- Grundbuch
-     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
+    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
 
   -- Buchungsstelle (GrundstÃŒck)
-     s.laufendenummer                     AS bu_lfd,      -- BVNR
+    s.laufendenummer                     AS bu_lfd,      -- BVNR
     --s.zaehler, s.nenner,                                -- Anteil des GB am FS, einzelne Felder
-     '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
-     s.buchungsart,                                       -- verschlÃŒsselt
-     b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
-
-   --NamensNummer
-     nn.laufendenummernachdin1421         AS nam_lfd, 
-     '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
-     nn.artderrechtsgemeinschaft          AS nam_adr,
-     nn.beschriebderrechtsgemeinschaft    AS nam_bes,
-
-     -- Person
+    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
+    s.buchungsart,                                       -- verschlÃŒsselt
+    b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
+
+  -- NamensNummer (Normalfall mit Person)
+    nn.laufendenummernachdin1421         AS nam_lfd, 
+    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
+
+  -- Rechtsgemeinsachaft (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
+    rg.artderrechtsgemeinschaft          AS nam_adr,
+    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
+
+  -- Person
      p.gml_id                             AS psgml,           -- mÃ¶glicher Filter Personen-GML-ID
      p.anrede,
@@ -133,9 +133,9 @@
      --p.geburtsname, p.akademischergrad 
  
-     -- Adresse 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
+  -- Adresse 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
@@ -151,5 +151,5 @@
     ON s.buchungsart = b.wert 
 
-  JOIN alkis_beziehungen v3              -- Buchung --> Grundbuchblatt
+  JOIN alkis_beziehungen v3             -- Buchung --> Grundbuchblatt
     ON s.gml_id = v3.beziehung_von AND v3.beziehungsart = 'istBestandteilVon'
   JOIN ax_buchungsblatt  gb 
@@ -159,13 +159,13 @@
     ON gb.land=z.land AND gb.bezirk=z.bezirk 
 
-  JOIN alkis_beziehungen v4              -- Blatt  --> NamNum
+  JOIN alkis_beziehungen v4             -- Blatt  --> NamNum
     ON v4.beziehung_zu = gb.gml_id AND v4.beziehungsart = 'istBestandteilVon'  
   JOIN ax_namensnummer nn 
     ON v4.beziehung_von = nn.gml_id
 
-  LEFT JOIN alkis_beziehungen v5         -- NamNum --> Person 
-   -- 2014-01-20: Mit LEFT ab hier werden auch NumNum-Zeilen mit "Beschreinbung der Rechtsgemeinschaft" geliefert (ohne Person)
+  JOIN alkis_beziehungen v5             -- NamNum --> Person 
+   -- 2014-01-20: Mit LEFT ab hier werden auch NumNum-Zeilen mit "Beschreibung der Rechtsgemeinschaft" geliefert (ohne Person)
     ON v5.beziehung_von = nn.gml_id AND v5.beziehungsart = 'benennt'
-  LEFT JOIN ax_person p
+  JOIN ax_person p
     ON v5.beziehung_zu = p.gml_id
 
@@ -174,5 +174,21 @@
   LEFT JOIN ax_anschrift a 
     ON v6.beziehung_zu = a.gml_id
- 
+
+  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery:
+
+  -- 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 v7.beziehung_zu,
+            rg.artderrechtsgemeinschaft, 
+            rg.beschriebderrechtsgemeinschaft 
+       FROM ax_namensnummer rg 
+       JOIN alkis_beziehungen v7              -- Blatt  --> NamNum (Rechtsgemeinschaft) 
+         ON v7.beziehung_von = rg.gml_id
+      WHERE v7.beziehungsart = 'istBestandteilVon'
+        AND NOT rg.artderrechtsgemeinschaft IS NULL
+   ) AS rg                         -- Rechtsgemeinschaft
+   ON rg.beziehung_zu = gb.gml_id  -- zum GB
+
   ORDER BY f.flurstueckskennzeichen, 
            gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
@@ -182,6 +198,57 @@
  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 exp_csv TO mb27;       -- User fÃŒr Auskunfts-Programme
+  GRANT SELECT ON TABLE exp_csv TO mb27;       -- User fÃŒr Auskunfts-Programme
 --GRANT SELECT ON TABLE exp_csv TO alkisbuch;  -- User fÃŒr Auskunfts-Programme RLP-Demo
+
+
+-- Analyse: Kann es mehr als 1 "Rechtsgemeinschaft" zu einem GB-Blatt geben? 
+-- (Diese Frage stellte sich beim Design des View "exp_csv".)
+-- Schritt 1: alle vorhandenen
+CREATE OR REPLACE VIEW rechtsgemeinschaften_zum_grundbuch
+AS
+ SELECT
+     gb.gml_id,
+     gb.bezirk,
+     gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
+     nn.artderrechtsgemeinschaft,
+     nn.beschriebderrechtsgemeinschaft
+  FROM ax_buchungsblatt  gb 
+  JOIN alkis_beziehungen v
+    ON v.beziehung_zu = gb.gml_id AND v.beziehungsart = 'istBestandteilVon'  
+  JOIN ax_namensnummer nn 
+    ON v.beziehung_von = nn.gml_id
+  WHERE NOT nn.artderrechtsgemeinschaft IS NULL
+  ORDER BY gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung,
+           nn.laufendenummernachdin1421;
+
+COMMENT ON VIEW rechtsgemeinschaften_zum_grundbuch 
+ IS 'Rechtsgemeinschaften zum Grundbuchblatt.';
+
+-- Schritt 2: Wo gibt es mehrere zu einem GB-Blatt
+CREATE OR REPLACE VIEW rechtsgemeinschaften_zaehlen
+AS
+ SELECT gml_id, bezirk, gb_blatt, count(artderrechtsgemeinschaft) AS anzahl
+   FROM rechtsgemeinschaften_zum_grundbuch
+   GROUP BY gml_id, bezirk, gb_blatt
+   HAVING count(artderrechtsgemeinschaft) > 1
+   ORDER BY bezirk, gb_blatt;
+
+COMMENT ON VIEW rechtsgemeinschaften_zaehlen 
+ IS 'Rechtsgemeinschaften zum Grundbuchblatt zaehlen. Anzeigen, wenn es mehrere gibt.';
+-- Ja, kann es geben
+
+-- Schritt 3: alle vorhandenen Zeilen anzeigen zu den GB-BlÃ€ttern, bei denen es mehrere gibt.
+CREATE OR REPLACE VIEW rechtsgemeinschaften_mehrfachzeilen
+AS
+ SELECT * 
+   FROM rechtsgemeinschaften_zum_grundbuch
+  WHERE gml_id IN (SELECT gml_id FROM rechtsgemeinschaften_zaehlen);
+
+COMMENT ON VIEW rechtsgemeinschaften_mehrfachzeilen 
+ IS 'GrundbuchblÃ€tter mit mehr als einer Zeile Rechtsgemeinschaft.';
+-- Fazit:
+-- Man findet einige wenige identische oder Ã€hnlich aussehende Zeilen zu einem Grundbuch.
+-- Das sieht also eher nach einem PostNAS-FortfÃŒhrungsproblem aus, als nach unabhÃ€ngigen Zeilen.
+-- Wurde hier eine Relation nicht sauber gelÃ¶scht?
 
 
Index: /trunk/info/info/alkis/alkisexport.php
===================================================================
--- /trunk/info/info/alkis/alkisexport.php	(revision 304)
+++ /trunk/info/info/alkis/alkisexport.php	(revision 305)
@@ -10,4 +10,6 @@
 	2014-01-17 krz f.j.
 	2014-01-20 weitere Spalten und verbesserte Formatierung
+	2014-01-21 Der View liefert "Rechtsgemeinschaft" nun als Feld in allen Personen-Sätzen 
+			eines GB-Blattes statt als eigenen "Satz ohne Person".
 */
 
@@ -51,5 +53,5 @@
 
 // CSV-Ausgabe: Kopfzeile mit Feldnamen
-echo "FS-Kennzeichen;GmkgNr;Gemarkung;Flur;Flurstueck;Flaeche;Adressen;GB-BezNr;GB-Bezirk;GB-Blatt;BVNR;Anteil_am_FS;Buchungsart;Namensnummer;AnteilDerPerson;RechtsGemeinschaft;Person;GebDatum;Anschrift";
+echo "FS-Kennzeichen;GmkgNr;Gemarkung;Flur;Flurstueck;Flaeche;Adressen;GB-BezNr;GB-Bezirk;GB-Blatt;BVNR;Anteil_am_FS;Buchungsart;Namensnummer;AnteilDerPerson;RechtsGemeinschaft;Person;GebDatum;Anschrift;Anteil(berechnet)";
 
 // Datenbank-Verbindung
@@ -60,6 +62,6 @@
 pg_set_client_encoding($con, LATIN1); // Für Excel kein UTF8 ausgeben
 
-// Der Parameter "Tabellentyp" bestimmt den Namen des Filter-Feldes aus dem View
-switch ($tabtyp) { // zulaessige Erte fuer &tabtyp=
+// Der Parameter "Tabellentyp" bestimmt den Namen des Filter-Feldes aus dem View "exp_csv".
+switch ($tabtyp) { // zulaessige Werte fuer &tabtyp=
 	case 'flurstueck': $filter = "fsgml"; break;
 	case 'grundbuch':  $filter = "gbgml"; break;
@@ -73,12 +75,12 @@
 $res = pg_prepare("", $sql);
 $res = pg_execute("", $v);
-if (!$res) {
-	exit("Fehler bei Datenbankabfrage");
-}
-$i=0;
+if (!$res) {exit("Fehler bei Datenbankabfrage");}
+$i=1; // Kopfzeile zählt mit
 $fsalt='';
 
 // Datenfelder auslesen
 while($row = pg_fetch_array($res)) {
+	$i++; // Zeile der Tabelle
+	$rechnen=true; // Formel in letzte Spalte?
 
 	// Flurstueck
@@ -100,27 +102,28 @@
 	// Buchungsstelle (Grundstueck)
 	$bu_lfd=$row["bu_lfd"]; // BVNR
-	$bu_ant=$row["bu_ant"]; // '=zaehler/nenner' oder NULL wenn zaehler oder nenner NULL sind
-	$bu_key=$row["buchungsart"]; // Sxhlüssel
+	$bu_ant=$row["bu_ant"]; // '=zaehler/nenner' oder NULL
+	$bu_key=$row["buchungsart"]; // Schlüssel
 	$bu_art=$row["bu_art"]; // entschlüsselt (Umlaute in ANSI!)
-
-	// Für Berechnungen in der exportierten Tabelle wäre es nützlich, wenn "voller Anteil" als Faktor 1 
-	// statt eines leeren Feldes ausgegeben würde  - Ausnahmen?
-	if(($bu_ant == '') and ($bu_key == 1100)) { // Grundstück
-		$bu_ant = '1';
+	if($bu_ant == '') { // Keine Bruch-Zahl
+		$bu_ant = '1'; // "voller Anteil" (Faktor 1)
+	} else {
+		$bu_ant=str_replace(".", ",", $bu_ant); // Dezimalkomma statt -punkt.		
 	}
 
 	// Namensnummer
-	$nam_lfd="'".kurz_namnr($row["nam_lfd"])."'"; // In Hochkomma. Wird sonst als Datum dargestellt.
+	$nam_lfd="'".kurz_namnr($row["nam_lfd"])."'"; // In Hochkomma, sonst wie Datum dargestellt.
 	$nam_ant=$row["nam_ant"];
-	if ($nam_ant == '') {$nam_ant=1;} // Wann darf als Anteil "1" statt leer gesetzt werden?
-    // Das ist falsch, wenn z.B. eine Rechtsgemeinschaft verbal beschrieben ist (in anderem Datensatz).
 	$nam_adr=$row["nam_adr"]; // Art der Rechtsgemeischaft (Schlüssel)
-	$nam_bes=$row["nam_bes"]; // Beschrieb der Rechtsgemeinschaft
-
-	// Rechtsgemeinschaft (in einer eigene Zeile ohne Namen)
-	if ($nam_adr == 9999) { // sonstiges
-		$rechtsg=$nam_bes; // Beschreibung verwenden
+	if ($nam_adr == '') {     // keine Rechtsgemeinsachft
+		if ($nam_ant == '') { // und kein Bruch-Anteil
+			$nam_ant=1; // dann ganzer Anteil
+		}
 	} else {
-		$rechtsg=rechtsgemeinschaft($nam_adr); // Entschlüsseln
+		$rechnen=false; // bei Rechtsgemeinschaft manuell interpretieren
+		if ($nam_adr == 9999) { // sonstiges
+			$rechtsg=$row["nam_bes"]; // Beschrieb der Rechtsgemeinschaft
+		} else {
+			$rechtsg=rechtsgemeinschaft($nam_adr); // Entschlüsseln
+		}
 	}
 
@@ -162,14 +165,23 @@
 
 	// Den Ausgabe-Satz montieren aus Flurstücks-, Grundbuch- und Namens-Teil
+	//      A             B           C             D               E               F            G
 	$fsteil=$fs_kennz.";".$gmkgnr.";".$gemkname.";".$flurnummer.";".$flstnummer.";".$fs_flae.";".$lage.";";
+	//      H              I              J             K           L           M
 	$gbteil=$gb_bezirk.";".$gb_beznam.";".$gb_blatt.";".$bu_lfd.";".$bu_ant.";".$bu_art.";";
+	//       N            O            P            Q         R           S
 	$namteil=$nam_lfd.";".$nam_ant.";".$rechtsg.";".$name.";".$gebdat.";".$adresse;
 
+	// Anteile "GB am FS" und "Pers am GB" verrechnen
+	if ($rechnen) { // beide Anteile verwertbar
+		$formelteil=";=L".$i."*O".$i; // Spalte T
+	} else {
+		$formelteil=';';
+	}
+
 	// Ausgabe in CSV-Datei
-	echo "\n".$fsteil.$gbteil.$namteil;
-	$i++;
+	echo "\n".$fsteil.$gbteil.$namteil.$formelteil;
 }
 pg_free_result($res);
-if ($i == 0) {exit ("Kein Treffer fuer gml_id=".$gmlid);}
+if ($i == 1) {exit ("Kein Treffer fuer gml_id=".$gmlid);} // nur Kopfzeile
 pg_close($con);
 exit(0);
