Index: trunk/info/info/alkisn/alkisbestnw.php
===================================================================
--- trunk/info/info/alkisn/alkisbestnw.php	(revision 422)
+++ trunk/info/info/alkisn/alkisbestnw.php	(revision 425)
@@ -6,9 +6,12 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
-	2020-02-20 Authentifizierung ausgelegert in Function darf_ich()
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
 	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
 	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
+			   Tabellenstruktur verbessert und Title bei "Recht an".
+	2021-12-30 Bestandsnachweis recursiv ÃŒber alle Buchungs-Ebenen
 */
 ini_set("session.cookie_httponly", 1);
@@ -54,8 +57,8 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
-
-// Mit URL-Parameter "&nodebug=j" kann man die Entwicklungsumgebung (in Conf definiert) ausschalten.
-// Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
-if ($nodebug === "j") {$debug=0;} 
+$dbg=$debug; // CONF in Arbeits-Variable
+
+// Entwicklungsumgebung (in Conf definiert) ausschalten.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbestnw.php'");
@@ -64,9 +67,10 @@
 // G R U N D B U C H
 $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.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
+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 ".UnqKatAmt("g","b")
+."LEFT JOIN ax_dienststelle d ON b.land=d.land AND b.gehoertzu_stelle=d.stelle ".UnqKatAmt("b","d")
+."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 
@@ -77,5 +81,18 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Grundbuchdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+$zeianz=pg_num_rows($res);
+if ($dbg > 0) {
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Grundbuch-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+}
+if ($zeianz == 0){
+	echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r ein Grundbuch-Blatt mit gml_id=".$gmlid."</p>";
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	echo "\n</body>\n</html>";
+	return;
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -87,36 +104,36 @@
 	echo "\n<h2>Grundbuch</h2>";
 	echo "\n<table class='outer'>" // Blatt UND Eigent.
-		."\n<tr>\n\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Blatt:</td>"  // outer Links
-		."\n\t<td colspan='2'>"; // Outer Mitte, Kennz. im Rahmen
-		if ($blattkey == 1000) {
-			echo "\n\t\t<table class='kennzgb' title='Bestandskennzeichen'>";
-		} else {
-			echo "\n\t\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
-		}
-			echo "\n\t\t<tr>"
-				."\n\t\t\t<td class='head'>"; // .d nicht gefÃŒllt
+		."\n\t<tr>\n\t\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Blatt:</td>"
+		."\n\t\t<td colspan='2'>"; // Outer Mitte, Kennz. im Rahmen
+			if ($blattkey === "1000") {
+				echo "\n\t\t\t<table class='kennzgb' title='Bestandskennzeichen'>";
+			} else {
+				echo "\n\t\t\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
+			}
+			echo "\n\t\t\t<tr>"
+				."\n\t\t\t<td class='head'>";
 				if ($showkey) {echo "<span class='key'>".$row["stellenart"]."&nbsp;</span>";}
 				echo $row["stellev"]."</td>";
 				echo "\n\t\t\t<td class='head'>Bezirk</td>"
-				."\n\t\t\t<td class='head' title='".htmlentities($row["blattartd"], ENT_QUOTES, "UTF-8")."'>";
+				."\n\t\t\t\t<td class='head' title='".htmlentities($row["blattartd"], ENT_QUOTES, "UTF-8")."'>";
 				if ($showkey) {echo "<span class='key'>".$blattkey."&nbsp;</span>";}
 				echo $blattart."</td>"
-			."\n\t\t</tr>\n\t\t<tr>"
-				."\n\t\t\t<td title='Amtsgerichtsbezirk'>";
+			."\n\t\t\t</tr>\n\t\t\t<tr>"
+				."\n\t\t\t\t<td title='Amtsgerichtsbezirk'>";
 				if ($showkey) {echo "<span class='key'>".$row["stelle"]."</span><br>";}
 				echo htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8")."</td>"
-				."\n\t\t\t<td title='Grundbuchbezirk'>";
+				."\n\t\t\t\t<td title='Grundbuchbezirk'>";
 				if ($showkey) {echo "<span class='key'>".$row["bezirk"]."</span><br>";}
 				echo htmlentities($row["beznam"], ENT_QUOTES, "UTF-8")."</td>"
-				."\n\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
-			."\n\t\t</tr>"
-		."\n\t\t</table>"
-		."\n\t</td>\n\t<td>&nbsp;"
-	."\n\t</td>\n</tr>";
-}
-
-if ($blattkey == 5000) { // fikt. Blatt
+				."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
+			."\n\t\t\t</tr>"
+		."\n\t\t\t</table>"
+		."\n\t\t</td>\n\t\t<td>&nbsp;</td>\n\t</tr>";
+}
+pg_free_result($res);
+
+if ($blattkey === "5000") { // fikt. Blatt
 	echo "\n<p>Keine Angaben zum Eigentum bei fiktivem Blatt.</p>";
-} else { // E I G E N T U E M E R
+} else { // E I G E N T Ã M E R
 	$n = eigentuemer($gmlid, true, ""); // MIT Adressen.
 	if ($n === 0) { // keine NamensNr, kein Eigentuemer
@@ -127,243 +144,125 @@
 echo "\n</table>";
 
-// Vorab pruefen, ob der Fall "Rechte an .." vorliegt.
-// ToDo: +++ Es gibt auch den Fall, dass auf der nÃ€chsten Stufe "nur Rechte" angezeigt werden, noch keine FlurstÃŒcke
-// ++ Also 3 MÃ¶glichkeiten:
-// - Nur Rechte an  (+++ FEHLT NOCH ++)
-// - Rechte und FlurstÃŒcke
-// - FlurstÃŒcke
-
-// GB-Blatt  <istBestandteilVon<  sh=herrschend  >an/zu>  sd=dienend
-$sql="SELECT count(sd.laufendenummer) AS anzahl "
-."FROM ax_buchungsstelle sh JOIN ax_buchungsstelle sd ON (sd.gml_id=ANY(sh.an) OR sd.gml_id=ANY(sh.zu)) "
-."WHERE sh.istbestandteilvon= $1 AND sd.endet IS NULL AND sh.endet IS NULL;";
-
+// Vorab eine Tiefbohrung zur Sondierung von (potentiell) herrschend bis dienend ÃŒber max. 4 Buchungs-Stellen.
+// Diese ZÃ€hlung sagt nur aus, ob es "generell" solche FÃ€lle auf diesem Grundbuch gibt (ist selten).
+// In jedem einzelnen Zweig der Buchungen muss aber individuell danach gesucht werden. 
+// Die Relation "zu" ist hier einbezogen, wird aber spÃ€ter nicht ausgewertet. Hier kÃ¶nnte man die Differenz erkennen falls "zu" doch mal auftaucht.
+$sql ="SELECT count(s2.laufendenummer) AS anz2";
+if ($dbg > 1) {$sql.=", count(s3.laufendenummer) AS anz3, count(s4.laufendenummer) AS anz4";}
+$sql.=" FROM ax_buchungsstelle sh " // herrschend
+	."LEFT JOIN ax_buchungsstelle s2 ON (s2.gml_id=ANY(sh.an) OR s2.gml_id=ANY(sh.zu)) ";
+if ($dbg > 1) {
+	$sql.="LEFT JOIN ax_buchungsstelle s3 ON (s3.gml_id=ANY(s2.an) OR s3.gml_id=ANY(s2.zu)) "
+		."LEFT JOIN ax_buchungsstelle s4 ON (s4.gml_id=ANY(s3.an) OR s4.gml_id=ANY(s3.zu)) ";
+}
+$sql.="WHERE sh.istbestandteilvon= $1 AND sh.endet IS NULL AND s2.endet IS NULL ";
+if ($dbg > 1) {$sql.="AND s3.endet IS NULL AND s4.endet IS NULL";}
 $v=array($gmlid); // GB-Blatt
 $res=pg_prepare("", $sql);
 $res=pg_execute("", $v);
-if (!$res) echo "\n<p class='err'>Fehler bei Suche nach Buchungen.</p>";
+if (!$res) {
+	echo "\n<p class='err'>Fehler bei tiefer Suche nach Buchungen.</p>";
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
 $row=pg_fetch_assoc($res);
-$anz=$row["anzahl"];
-
+$anz2=$row["anz2"]; // steuert Tabellenform und Ãberschrift
+if ($dbg > 1) {
+	$anz3=$row["anz3"];
+	$anz4=$row["anz4"];
+	echo "\n<p class='dbg'>Anzahl dienende Buchungen Ebene 2: '".$anz2."', Ebene 3: '".$anz3."', Ebene 4: '".$anz4."'</p>";
+}
 echo "\n<hr>\n\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''>";
-if ($anz > 0) { // auch "Rechte an"
+if ($anz2 > 0) { // auch "Rechte an", also dienende B.
 	echo " Rechte und Flurst&uuml;cke</h3>\n<table class='fs'>";
-	// zusaetzliche Kopfzeile "Rechte"
-	echo "\n<tr>" 
-		."\n\t<td>&nbsp;</td>"
-		."\n\t<td class='dien' title='herrschendes Grundst&uuml;ck'>herrschende Buchungsart</td>"
-		."\n\t<td class='dien'>Anteil</td>"
-		."\n\t<td class='dien'>Bezirk</td>"
-		."\n\t<td class='dien'>Blatt</td>"
-		."\n\t<td class='dien'>BVNR</td>"
-		."\n\t<td class='dien' title='dienendes Grundst&uuml;ck'>Buchungsart</td>"
-		."\n\t<td>&nbsp;</td>"
+	echo "\n<tr>" // zus. Kopfz. "Rechte" vor FS
+		."\n\t<td class='heads' title='laufende Nummer Bestandsverzeichnis (BVNR) = Grundst&uuml;ck'>\n\t\t<span class='wichtig'>BVNR</span>"
+			."\n\t\t<img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'>\n\t</td>"
+		."\n\t<td class='head dien' title='herrschendes Grundst&uuml;ck'>Buchungsart</td>"
+		."\n\t<td class='head dien'>Anteil</td>"
+		."\n\t<td class='head dien'>Bezirk</td>"
+		."\n\t<td class='head dien'>Blatt</td>"
+		."\n\t<td class='head dien'>BVNR</td>"
+		."\n\t<td class='head dien'>&nbsp;</td>"
+		."\n\t<td class='head dien'>&nbsp;</td>"
 	."\n</tr>";
-} else { // keine Rechte an, nur FlurstÃŒcke gebucht
+} else { // keine Rechte an, nur FS
 	echo " Flurst&uuml;cke</h3>\n<table class='fs'>";
 }
-
-// gemeinsame Kopfzeile "Buchung + FlurstÃŒck"
-echo "\n<tr>"
-	."\n\t<td class='heads' title='laufende Nummer Bestandsverzeichnis (BVNR) = Grundst&uuml;ck'><span class='wichtig'>BVNR</span><img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'></td>"
-	."\n\t<td class='head'>Buchungsart</td>"
-	."\n\t<td class='head'>&nbsp;</td>"
+echo "\n<tr>"; // Kopfzeile "FlurstÃŒck"
+	if ($anz2 > 0) { // BS und FS
+		echo "\n\t<td class='head'>&nbsp;</td>"
+		."\n\t<td class='head'>&nbsp;</td>";
+	} else { // nur FS
+		echo "\n\t<td class='heads' title='laufende Nummer Bestandsverzeichnis (BVNR) = Grundst&uuml;ck'>\n\t\t<span class='wichtig'>BVNR</span>"
+			."\n\t\t<img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'>"
+		."\n\t</td>"
+		."\n\t<td class='head'>Buchungsart</td>";
+	}
+	echo "\n\t<td class='head'>&nbsp;</td>"
 	."\n\t<td class='heads'>Gemarkung</td>"
 	."\n\t<td class='heads'>Flur</td>"
 	."\n\t<td class='heads fsnr' title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>Flurst.</span></td>"
-	."\n\t<td class='head flag'>Fl&auml;che</td>"
+	."\n\t<td class='head fla'>Fl&auml;che</td>"
 	."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>"
 ."\n</tr>";
 
-// Blatt ->  B u c h u n g s s t e l l e
+// Blatt ->  B u c h u n g s s t e l l e (oberste Ebene 1, GrundstÃŒck oder herrschend). Relation istBestandteilVon
 // 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.beschreibung as bart, b.dokumentation
-FROM ax_buchungsstelle s LEFT JOIN ax_buchungsart_buchungsstelle b ON s.buchungsart = b.wert
+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
+$v=array($gmlid);
 $res=pg_prepare("", $sql);
 $res=pg_execute("", $v);
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Buchung.</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
-}
-$i=0;
-$fscnt=0;
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+$i=0;  // ZÃ€hler Buchungs-Stellen auf oberer Ebene
 $zpaar=false;
-while($row = pg_fetch_assoc($res)) { // Loop Buchungsstelle (GrundstÃŒck)
+$altlfdnr=''; // GW
+
+while($row = pg_fetch_assoc($res)) { // Loop Buchungsstellen der 1. Ebene (herrschend oder nur FS)
+	$i++;
+	$gml_bs=$row["gml_id"]; // gml der Buchungsstelle
 	$lfdnr=$row["lfd"];
-	$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
-	$gml_bs=$row["gml_id"]; // id der buchungsstelle
-	$bartkey=$row["buchungsart"]; // SchlÃŒsselwert
+	$bartkey=$row["buchungsart"]; // Key
 	$bart=$row["bart"]; // BuchungsART Text dazu
-	$bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet
-	if ($row["zaehler"] == "") {
-		$anteil = "";
-	} else {
-		$anteil = $row["zaehler"]."/".$row["nenner"];
-	}
-	if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel je GrundstÃŒck
+	$bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet	
+	if ($row["zaehler"] == "") {$anteil = "";} 
+	else {$anteil = $row["zaehler"]."/".$row["nenner"];}
+	if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel je Buchung auf Ebene 1
 	$zpaar=!$zpaar;
 
-	// F l u r s t u e c k s d a t e n  zur direkten Buchungsstelle
-	$j = bnw_fsdaten($lfdnr, $gml_bs, $bart, $anteil, true, $bartkey, $bartstory); // return=Anzahl der FS
-	$fscnt=$fscnt + $j;
-	if ($j === 0) { //  k e i n e  Flurstuecke gefunden (Miteigentumsnteil usw.)
-		// Bei "normalen" Grundstuecken wurden hier Flurstuecksdaten gefunden und ausgegeben.
-		// Bei Miteigentumsanteil, Erbbaurecht usw. muss nach den "dienenden" Buchungsstellen gesucht werden, darauf sind die FS gebucht.
-		//  Buchungsstelle >an/zu> (andere)Buchungsstelle >istBestandTeilVon> "FiktivesBlatt (ohne) Eigentuemer"
-
-		// dann andere "dienende" Buchungsstellen
-		//  sh=herrschend          sd=dienend
-		//  ax_buchungsstelle >zu> ax_buchungsstelle (des gleichen Blattes)
-		//  ax_buchungsstelle >an> ax_buchungsstelle (anderes Blatt, z.B Erbbaurecht an)
-
-		// Mit "UNION" um die FÃ€lle mit JOIN ÃŒber die Arrays "an" und "zu" unterscheiden zu kÃ¶nnen
-		$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) "
-		."WHERE sha.gml_id= $1 AND sha.endet IS NULL AND sda.endet IS NULL "
-		."UNION SELECT sdz.gml_id, sdz.buchungsart, sdz.laufendenummer AS lfd, sdz.beschreibungdesumfangsderbuchung AS udb, sdz.nummerimaufteilungsplan AS nrap, sdz.beschreibungdessondereigentums AS sond, 'zu' as anzu "
-		."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 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;
-	//	Die Relationen "zu" und "durch" kommen in der Praxis nicht vor.
-
-		$v=array($gml_bs); // gml_id der "herrschenden" Buchungs-Stelle
-		$resan=pg_prepare("", $sql); // Suche nach "dienender" Buchungsstelle
-		$resan=pg_execute("", $v);
-		if (!$resan) {
-			echo "\n<p class='err'>Fehler bei 'andere Buchungsstelle'.</p>";
-			if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gml_bs."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($bartkey <= 1102) { // (aufgeteiltes) GrundstÃŒck
+
+		$zeianz = bnw_fsdaten($gml_bs, true); // FlurstÃŒcksdaten zur direkten Buchungsstelle
+		if ($zeianz === 0) {echo "\n<tr class='".$trclass."'>\n\t<td></td>\n\t<td colspan='7'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n\t<td></td>\n</tr>";}
+
+	} else { // herrschende Buchung
+
+		bnw_bszeile_h(); // Die herrschende Buchung, aus Global
+
+		$altlfdnr=$lfdnr;
+
+		if ($row["nrap"] != "") { // Nr im Auft.Plan
+			echo "\n<tr>\n\t<td colspan=3></td><td class='nrap' colspan=4>Nummer <span class='wichtig'>".$row["nrap"]."</span> im Aufteilungsplan.</td><td></td>\n</tr>";
 		}
 
-		$a=0; // count
-		$altbvnr=""; // Gruppenwechsel
-		while($rowan= pg_fetch_assoc($resan)) {
-			$lfdnran=$rowan["lfd"];	// BVNR an
-			$gml_bsan=$rowan["gml_id"];	// id der buchungsstelle an
-			$baan=$rowan["bart"];	// Buchungsart an, entschluesselt
-			$anzu=$rowan["anzu"];	// Welche Relation? Recht an oder Recht zu ?
-
-			// dienende Buchungsstelle
-			$sql ="SELECT b.gml_id, b.land, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, b.blattart, wb.beschreibung AS blattartv, z.bezeichnung AS beznam "
-			."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 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);
-			$fbres=pg_prepare("", $sql);
-			$fbres=pg_execute("", $v);
-			if (!$fbres) {
-				echo "\n<p class='err'>Fehler bei fiktivem Blatt.</p>";
-				if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities( str_replace("$1", "'".$gml_bsan."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}			
-			}
-			$b=0;
-			while($fbrow = pg_fetch_assoc($fbres)) { // genau 1
-				$fbgml=$fbrow["gml_id"];
-				$fbland=$fbrow["land"];
-				$fbbez=$fbrow["bezirk"];
-				$beznam=$fbrow["beznam"];
-				$fbblatt=ltrim($fbrow["blatt"], "0");
-				$fbbartkey=$fbrow["blattart"]; // Key
-				$fbbart=$fbrow["blattartv"];  // Value
-				$b++;
-			}
-			if ($b != 1) { // Ãberwachen: genau 1?
-				echo "\n<p class='err'>Anzahl fiktive Bl&auml;tter zu anderer Buchungstelle = ".$b."</p>";
-			}
-			// Grundbuchdaten zur dienenden Buchungsstelle
-			echo "\n<tr class='".$trclass."'>"
-				."\n\t<td id='bvnr".$lfdnr."'>"; // Sp.1 Erbbau BVNR, Sprungmarke
-					if($bvnr === $altbvnr) {	// gleiches Grundstueck
-						echo "&nbsp;"; // dann Anzeige unterdruecken
-					} else {
-					//	echo "<a id='bvnr".$lfdnr."'></a>" // Sprungmarke
-						echo "<span class='wichtig'>".$bvnr."</span>"; 
-						$altbvnr = $bvnr; // Gruppenwechsel merken
-					}
-				echo "</td>"
-				."\n\t<td class='dien'>"; // Sp.2 Buchung
-					if ($showkey) {echo "<span class='key'>".$row["buchungsart"]."</span> ";}
-				echo $bart." an</td>"
-				."\n\t<td class='dien'>".$anteil."</td>" // Sp.3 Anteil
-				."\n\t<td class='dien' title='Grundbuch-Bezirk'>"; // Sp.4 Gemarkg., hier Bezirk
-					if ($showkey) {echo "<span class='key'>".$fbbez."</span> ";}
-					echo htmlentities($beznam, ENT_QUOTES, "UTF-8")
-				."</td>";
-				echo "\n\t<td class='dien' title='".$fbbart."'>".$fbblatt."</td>" // Sp. 5 Blatt
-					."\n\t<td class='dien' title='Bestandsverzeichnis-Nummer'>".str_pad($lfdnran, 4, "0", STR_PAD_LEFT)."</td>" // Sp.6 BVNR
-					."\n\t<td class='dien' title='Buchungsart'>"; // Sp.7 Buchungsart
-					if ($showkey) {echo "<span class='key'>".$rowan["buchungsart"]."</span> ";}
-					echo $baan." "
-				."</td>"
-				."\n\t<td>" // Sp.8 Link ("an" oder "zu"?)
-					."\n\t\t<p class='nwlink noprint'>".$anzu; // Recht "an" oder "zu"
-
-					// Buchung
-					// +++ <a  gsnachw 
-
-					// Bestand
-					if ($showkey) {echo " <span class='key'>".$fbbartkey."</span>";} // Blatt-Art SchlÃŒssel
-					echo "\n\t\t\t<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$fbgml;
-						if ($showkey) {echo "&amp;showkey=j";}
-						echo "#bvnr".$lfdnran // Sprungmarke auf der Seite
-						."' title='Zum Grundbuchnachweis des dienenden Blattes'>";
-						echo $fbbart // Blatt-Art entschlÃŒsselt
-					." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
-
-					echo "\n\t\t</p>"
-				."\n\t</td>"
-			."\n</tr>"; 
-
-			// Flurstuecksdaten zur dienenden Buchungsstelle
-			// Buchungsart wird nur in erster Zeile ausgegeben, hier leer
-			$aj = bnw_fsdaten($lfdnran, $gml_bsan, "", $anteil, false, "", ""); // return=Anz.FS
-			$fscnt=$fscnt + $aj;
-			if ($rowan["nrap"] != "") {
-				echo "\n<tr>"
-					."\n\t<td class='sond' colspan=8>Nr. im Aufteilungsplan: ".$rowan["nrap"]."</td>"
-				."\n</tr>";
-			}
-			if ($rowan["sond"] != "") {
-				echo "\n<tr>"
-					."\n\t<td class='sond' colspan=8>Verbunden mit dem Sondereigentum an: ".htmlentities($rowan["sond"], ENT_QUOTES, "UTF-8")."</td>"
-				."\n</tr>";
-			}
-			$a++;
+		if ($row["sond"] != "") { // Sondereigentumsbeschreibung
+			echo "\n<tr>\n\t<td></td><td class='sond' colspan=6 title='Sondereigentums-Beschreibung'>Verbunden mit dem Sondereigentum an: ".$row["sond"]."</td><td></td>\n</tr>";
 		}
-		if ($a === 0) {
-			echo "\n<tr class='".$trclass."'>"
-				."\n\t<td><span class='wichtig'>".$bvnr."</span></td>"
-				."\n\t<td colspan=7><p class='warn'>Keine Flurst&uuml;cke zu Buchung ".$bvnr." im berechtigten Bereich.</p></td>"
-			."\n</tr>";
-		}
-	}
-	$i++; 
-	if ($row["nrap"] != "") { // Nr im Auft.Plan
-		echo "\n<tr>"
-			."\n\t<td class='nrap' colspan=8>Nummer <span class='wichtig'>".$row["nrap"]."</span> im Aufteilungsplan.</td>"
-		."\n</tr>";
-	}
-	if ($row["sond"] != "") { // Sondereigentumsbeschreibung
-		echo "\n<tr>"
-			."\n\t<td class='sond' colspan=8>Verbunden mit dem Sondereigentum an: ".$row["sond"]."</td>"
-		."\n</tr>";
-	} // Ende Buchungsstelle/BVNR
-} // Ende Loop
+
+		$tiefer = bnw_bsdaten($gml_bs, 2);  // dienend, recursiv Ebenen 2,3,4
+
+	}
+}
 echo "\n</table>";
-
-if ($i === 0) {
-	echo "\n<p class='err'>Keine Buchung gefunden.</p>";
-} else {
-	if ($i > 5 and $fscnt > 5) { // nur wenn nicht auf einen Blick zu erkennen
-		echo "\n<p class='cnt'>".$i." Buchungen mit ".$fscnt." Flurst&uuml;cken</p>";
-	}
-}
-
-// B e r e c h t i g t e  Buchungsblaetter  mit Recht an/zu dem aktuellen (fiktiven?) Blatt
+if ($i === 0) {echo "\n<p class='err'>Keine Buchung gefunden.</p>";}
+pg_free_result($res);
+
+// B e r e c h t i g t e  BuchungsblÃ€tter mit Recht an dem aktuellen (fiktiven?) Blatt
 
 // bf                          sf            sb                               bb
@@ -374,7 +273,7 @@
 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.gehoertzu_stelle=d.stelle 
-LEFT JOIN ax_blattart_buchungsblatt wa ON bb.blattart = wa.wert
+LEFT JOIN ax_buchungsblattbezirk bz ON bb.land=bz.land AND bb.bezirk=bz.bezirk ".UnqKatAmt("bb","bz")
+."LEFT JOIN ax_dienststelle d ON bz.land=d.land AND bz.gehoertzu_stelle=d.stelle ".UnqKatAmt("bz","d")
+."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
@@ -387,5 +286,5 @@
 if (!$resb) {
 	echo "\n<p class='err'>Fehler bei 'Berechtigte Bl&auml;tter.</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $b=0; // count: Buchungen / BlÃ€tter
@@ -421,5 +320,5 @@
 	$zpaar=!$zpaar;
 
-	echo "\n<tr class='".$trclass."'>"; // Der Teil "berechtigte GrundbÃŒcher" ist sortiert wie oberer Teil "FlurstÃŒcke"
+	echo "\n<tr class='".$trclass."'>"; // Der Teil "berechtigte GrundbÃŒcher" ist nach BVNR sortiert wie oberer Teil "FlurstÃŒcke"
 		echo "\n\t<td><span class='wichtig'>".$anlfdnr0."</span></td>"
 		."\n\t<td>"; // Amtsgericht,Grundbuchamt
@@ -440,9 +339,10 @@
 		."\n\t<td>"
 			."\n\t\t<p class='nwlink noprint'>";
+
 			// Bestand
 			if ($showkey) {echo "<span class='key'>".$blart."</span> ";}
 			echo "\n\t\t\t<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gml_b;
 				if ($showkey) {echo "&amp;showkey=j";}
-				echo "#bvnr".$lfdnr."' title='Nachweis des berechtigten Blattes an einer Buchung auf ".$blattart."'>".$rowb["blattartv"]; // "an" ggf. durch "zu" ersetzen?
+				echo "#bvnr".$lfdnr."' title='Nachweis des berechtigten Blattes an einer Buchung auf ".$blattart."'>".$rowb["blattartv"];
 				echo " \n\t\t\t<img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
 			echo "\n\t\t</p>"
@@ -461,8 +361,9 @@
 	}
 }
-
-echo "\n<div class='buttonbereich noprint'><hr>"
-	."\n\t<a title='zur&uuml;ck' href='javascript:history.back()'><img src='ico/zurueck.png' width='16' height='16' alt='zur&uuml;ck'></a>&nbsp;"
-	."\n\t<a title='Drucken' href='javascript:window.print()'><img src='ico/print.png' width='16' height='16' alt='Drucken'></a>&nbsp;";
+pg_free_result($resb);
+
+echo "\n<div class='buttonbereich noprint'>\n<hr>"
+	."\n\t<a title='zur&uuml;ck' href='javascript:history.back()'><img src='ico/zurueck.png' width='16' height='16' alt='zur&uuml;ck'></a>&nbsp;";
+if ($PrntBtn==true){echo "\n\t<a title='Drucken' href='javascript:window.print()'><img src='ico/print.png' width='16' height='16' alt='Drucken'></a>&nbsp;";}
 if ($blattkey == 5000) { // Nicht bei "fiktives Blatt"
 	echo "\n\t<img src='ico/download_gb_no.png' width='32' height='16' alt='Export' title='F&uuml;r ein fiktives Blatt ohne Eigent&uuml;mer ist ein CSV-Export nicht sinnvoll.'>"; 
