Index: /trunk/info/conf/alkisn_conf.php
===================================================================
--- /trunk/info/conf/alkisn_conf.php	(revision 425)
+++ /trunk/info/conf/alkisn_conf.php	(revision 425)
@@ -0,0 +1,93 @@
+<?php
+/*	alkis_conf.php
+	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
+	Zentrale Einstellungen
+....
+	2020-02-20 
+	2020-12-16 Sonderfall QWC2 API-Gateway-Umleitung bei Selbstverlinkung
+	2021-12-07 Neue Parameter $katAmtMix (Kataster-Amt-Mix) und $fsHistorie
+	2021-12-09 Neuer Parameter $PrntBtn (Drucken-Schaltfläche)
+*/
+
+//	Default Bundesland-Schlüssel, falls dieser bei Anfragen ausgelassen wird
+	$defland='05'; // NRW
+
+//	Datenbank-Zugangsdaten
+	$dbport = '5432';
+	$dbuser = '****';
+	$dbpass = '****';
+	$dbpre  = 'alkis0'; // Prefix des DB-Namens, dahinter das GKZ anhängen
+	$dbsuf  = '';       // Suffix des DB-Namens, z.B. Anhang "_neu"
+
+//	im Normalfall  ...
+	$dbgkz = $gkz;				// normalerweise eine Datenbank je Mandant
+	$dbhost = '10.0.**.**';		// Datenbank-Server aus Produktion
+
+//	Gebiets-Filter
+	$filtland=$defland;			// ax_gemeinde.land
+	$filtrgb='7';				// ax_gemeinde.regierungsbezirk
+	$filtkreis='';				// ax_gemeinde.kreis
+	$filtgem = '';				// ax_gemeinde.gemeinde
+
+	$katAmtMix = false;			// Sind Daten aus verschiedenen Katasteramts-Bezirken in der DB? (Default)
+								// Erzeugt kompliziertere Joins auf Schlüsseltabellen zur Unterdrückung doppelter Treffer.
+
+	$fsHistorie = true;			// Ist eine Flurstücks-Historie gefüllt? (Default)
+								// Einträge in den Tabellen: ax_historischesflurstueck, ax_historischesflurstueckohneraumbezug, ax_historischesflurstueckalb.
+								// Steuert den Link auf das Historie-Modul.
+
+	$PrntBtn = true;			// Drucken-Schaltfläche im Seitenfuß anzeigen? 
+								// Default = true. false wenn die Umgebung bereits eine Schaltfläche bietet.
+
+	switch ($gkz) {	// lokale und temporäre Besonderheiten je Mandant
+
+		// Kreisgebiet Lippe
+		case "150": // Lage
+			$filtkreis='66';
+			$filtgem = '040';
+			break;
+
+		// Kreisgebiet Herford
+		case "210": // Bünde
+			$filtkreis='58';
+			$filtgem = '004';
+			break;
+
+		// Kreisgebiet Minden-Lübbecke.
+		case "320": // Hüllhorst
+		//	$dbgkz = '300';  // Gemeinsame Kreis-Datenbank für mehrere Städte
+			$filtkreis='70';
+			$filtgem = '016';
+			break;
+
+		case "418":		// Stadtwerke
+			$katAmtMix = true;		// Katasteramt 18 und 15
+			$fsHistorie = false;	// keine Historie
+			break;
+	}
+
+//	Authentifizierung
+//	$auth="mapbender";
+	$auth=""; 				// deaktiviert
+	$mb_guest_user='gast';	// ausschließen
+
+//	Bei Verlinkung auf das gleiche Modul (mit anderen Parametern) den Pfad entfernen?
+//	0 = Normaler Webserver. Die Systemvariable zeigen den korrekten Pfad.
+//	1 = Umleitung über API-Gateway QWC2. Den Pfad entfernen bei Verlinkung weil Systemvariable $_SERVER['PHP_SELF'] nicht korrekt ist.
+	$pfadlos_selbstlink = 0;
+
+//	Entwicklungsumgebung
+	$debug = 0; // 0=Produktion 1=mit Fehlermeldungen, 2=mit Informationen, 3=mit SQL
+
+//	Link für Hilfe (cmsimpe_xh)
+	$hilfeurl = 'http://mapserver.krz.de/?Karten/ALKIS/ALKIS-Auskunft';
+
+//	Den Datenbank-Connection-String aus den oben konfigurierten Parametern bilden
+	$dbconn = "host=".$dbhost." port=" .$dbport." dbname=".$dbpre.$dbgkz.$dbsuf." user=".$dbuser." password=".$dbpass;
+
+//	Je Modul noch individuell anhängen: " options='--application_name=ALKIS-Auskunft_programmname.php'"
+//	In postgresql.conf:
+//		log_line_prefix = '%t [%a-%h] %q%u@%d '
+//	wobei %a = Application
+
+?>
Index: unk/info/conf/alkis_conf.php
===================================================================
--- /trunk/info/conf/alkis_conf.php	(revision 424)
+++ 	(revision )
@@ -1,75 +1,0 @@
-<?php
-/*	alkis_conf.php
-	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Zentrale Einstellungen - Muster
-*/
-
-//	Default Bundesland-SchlÃŒssel, falls dieser bei Anfragen ausgelassen wird
-	$defland='05'; // NRW
-
-//	Datenbank-Zugangsdaten
-	$dbport = '5432';
-	$dbuser = 'mbxx';
-	$dbpass = 'xxxx';
-	$dbpre  = 'alkis0'; // Prefix des DB-Namens, GKZ anhÃ€ngen
-	$dbsuf  = '';       // Suffix des DB-Namens, Anhang (_neu)
-
-//	im Normalfall  ...
-	$dbgkz = $gkz;				// Default: eine Datenbank je Mandant, alternativ je Kreis
-	$dbhost = '10.0.xxx.xxx';	// Datenbank-Server
-
-	// Gebiets-Filter
-	$filtland=$defland;			// ax_gemeinde.land
-	$filtrgb='7';				// ax_gemeinde.regierungsbezirk
-	$filtkreis='';				// ax_gemeinde.kreis
-	$filtgem = '';				// ax_gemeinde.gemeinde
-
-	switch ($gkz) {	// lokale und temporÃ€re Besonderheiten je Mandant
-
-		// Kreisgebiet xxx
-		case "070": 
-			$filtkreis='66';
-			$filtgem = '048';
-			break;
-		case "120":
-			$filtkreis='66';
-			$filtgem = '016';
-			break;
-
-		// Kreisgebiet xxx
-		case "210":
-			$filtkreis='58';
-			$filtgem = '004';
-			break;
-		case "240":
-			$filtkreis='58';
-			$filtgem = '016';
-			break;
-	}
-
-//	Authentifizierung (function "darf_ich()" in "alkisfkt.php")
-//	$auth="mapbender";		// aktuell
-//	$auth="qwc2";
-	$auth="";				// PrÃŒfung deaktiviert
-	$mb_guest_user='gast';	// ausschlieÃen, wie "nicht angemeldet"
-
-//	Bei Verlinkung auf das gleiche Modul (mit anderen Parametern) den Pfad entfernen?
-//	0 = Normaler Webserver. Die Systemvariablen zeigen den korrekten Pfad.
-//	1 = Umleitung ÃŒber API-Gateway QWC2. Den Pfad entfernen bei Verlinkung weil Systemvariable $_SERVER['PHP_SELF'] nicht korrekt ist.
-	$pfadlos_selbstlink = 0;
-
-//	Link fÃŒr Hilfe
-	$hilfeurl = 'http://mapserver.krz.de/?Karten/ALKIS/ALKIS-Auskunft';
-
-//	Entwicklungsumgebung
-	$debug = 1; // 0=Produktion 1=mit Fehlermeldungen, 2=mit Informationen, 3=mit SQL
-
-//	Den Datenbank-Connection-String aus den oben konfigurierten Parametern bilden
-	$dbconn = "host=".$dbhost." port=" .$dbport." dbname=".$dbpre.$dbgkz.$dbsuf." user=".$dbuser." password=".$dbpass;
-
-//	Je Modul noch individuell anhÃ€ngen: " options='--application_name=ALKIS-Auskunft_programmname.php'"
-//	In postgresql.conf:
-//		log_line_prefix = '%t [%a-%h] %q%u@%d '
-//	wobei %a = Application
-
-?>
Index: /trunk/info/info/alkisn/alkisbestnw.php
===================================================================
--- /trunk/info/info/alkisn/alkisbestnw.php	(revision 424)
+++ /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.'>"; 
Index: /trunk/info/info/alkisn/alkisausk.php
===================================================================
--- /trunk/info/info/alkisn/alkisausk.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisausk.php	(revision 425)
@@ -10,10 +10,10 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
 	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
 	2020-12-15 Input-Validation und Strict Comparisation (===)
 
-	H i n w e i s :  Dies Modul wird beim Entwickler nicht mehr produktiv eingesetzt.
+H i n w e i s :  Dies Modul wird beim Entwickler nicht mehr produktiv eingesetzt.
 		Statt dessen wird "alkisinlayausk.php" verwendet um von einer WMS-FeatureInfo in ein Fenster ÃŒberzuleiten.
 		Mangels Praxis bleiben Fehler mÃ¶glicherweise unerkannt.
@@ -45,4 +45,5 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisausk.php'");
@@ -59,5 +60,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Flurstuecksdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 
@@ -85,5 +86,5 @@
 if ( ($filtkreis != '' and $filtkreis != $fskrs) or ($filtgem != '' and $filtgem != $fsgem) ) {
 	// Einer der gesetzten Filter passt nicht
-	if ($debug > 2) {
+	if ($dbg > 2) {
 		echo "\n<p class='err'>Filter Kreis='".$filtkreis."', Gemeinde='".$filtgem."'</p>";
 		echo "\n<p class='err'>Flstk. Kreis='".$fskrs."', Gemeinde='".$fsgem."'</p>";
@@ -156,5 +157,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung mit Hausnummer.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 $j=0;
@@ -196,5 +197,5 @@
 if (!$resg) {
 	echo "\n<p class='err'>Keine Buchungen.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 
Index: /trunk/info/info/alkisn/alkisnamstruk.php
===================================================================
--- /trunk/info/info/alkisn/alkisnamstruk.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisnamstruk.php	(revision 425)
@@ -6,9 +6,10 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	...
 	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). Gruppenwechsel Bezirk.
 */
 ini_set("session.cookie_httponly", 1);
@@ -53,8 +54,9 @@
 <?php
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 echo "<p class='balken nakennz'>ALKIS Name id=".$gmlid."&nbsp;</p>\n" // Balken
@@ -73,5 +75,12 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Zugriff auf Namensnummer</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>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als eine Person!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -111,5 +120,5 @@
 	if (!$resa) {
 		echo "\n<p class='err'>Fehler bei Adressen</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>". str_replace("$1", "'".$gmlid."'", $sqla)."</p>";}
+		if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>". str_replace("$1", "'".$gmlid."'", $sqla)."</p>";}
 	}
 
@@ -130,5 +139,5 @@
 			echo "<table>\n";
 				if ($multiadress === "j" OR $showkey) {
-					if ($debug > 0) { // nur Entw.: Sortierung gml_id vs. beginnt?
+					if ($dbg > 0) { // nur Entw.: Sortierung gml_id vs. beginnt?
 						echo "\t<tr><td class='dbg'>gml_id:</td><td class='dbg'>".$rowa["gml_id"]."</td></tr>\n";
  					}
@@ -176,5 +185,5 @@
 	."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 ax_buchungsblattbezirk b ON g.land=b.land AND g.bezirk=b.bezirk ".UnqKatAmt("g","b")
 	."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 "
@@ -187,5 +196,5 @@
 	if (!$resg) {
 		echo "\n<p class='err'>Fehler bei Grundbuch</p>";
-		if ($debug > 2) {
+		if ($dbg > 2) {
 			echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sqlg ), ENT_QUOTES, "UTF-8")."</p>";
 		}
@@ -203,4 +212,5 @@
 	$i=0;
 	$zpaar=false;
+	$gwbeznam='';
 	while($rowg = pg_fetch_assoc($resg)) {
 		$gmln=$rowg["gml_n"];
@@ -211,10 +221,16 @@
 		$blattart=$rowg["blattartv"]; // Value
 		if ($zpaar) {$trclass='paa';} else {$trclass='unp';}
+		$beznam=$rowg["beznam"];
 		$zpaar=!$zpaar;
 		echo "\n<tr class='".$trclass."'>"
 			."\n\t<td>"; // GB-Bezirk <td class='gbl'>
 				if ($showkey) {echo "<span class='key'>".$rowg["bezirk"]."</span> ";}
-				echo $rowg["beznam"]
-			."</td>";
+				if ($gwbeznam != $beznam){
+					echo "<b>".$beznam."</b>";
+					$gwbeznam=$beznam;
+				} else {
+					echo $beznam;
+				}
+			echo "</td>";
 
 			echo "\n\t<td>"; // Blattart
@@ -259,16 +275,16 @@
 	if ($i === 0) {echo "\n<p class='err'>Kein Grundbuch.</p>";}
 } else {
-	echo "\n\t<p class='err'>Fehler! Kein Treffer f&uuml;r\n\t<a target='_blank' href='alkisrelationen.php?gkz=".$gkz."&amp;gmlid=".$gmlid."'>".$gmlid."</a>\n</p>\n\n";
-}
+	echo "\n\t<p class='err'>Fehler! Kein Treffer f&uuml;r Person".$gmlid."</p>\n";
+}
+pg_free_result($res);
+
+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;";}
+echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport()'><img src='ico/download.png' width='16' height='16' alt='Export'></a>&nbsp;"
+."\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
-
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-	<a title="Export als CSV" href='javascript:ALKISexport()'><img src="ico/download.png" width="16" height="16" alt="Export"></a>&nbsp;
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: /trunk/info/info/alkisn/alkisgebaeudenw.php
===================================================================
--- /trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 425)
@@ -4,5 +4,5 @@
 
 	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()
@@ -11,4 +11,5 @@
 	2021-03-09 Verschneidung mit weiteren Bauwerks-Tabellen.
 	2021-03-11 Adresse(n) des gehÃ¶rtZu-Haus zum Bauwerk nicht mehr hier anzeigen sondern im neuen Bauwerk-Modul.
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
 */
 
@@ -91,8 +92,9 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgebaeudenw.php'");
@@ -100,7 +102,7 @@
 
 // Flurstueck
-$sqlf="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung 
-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;";
+$sqlf ="SELECT f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, g.gemarkungsnummer, g.bezeichnung 
+FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+."WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL;";
 $v=array($gmlid);
 $resf=pg_prepare("", $sqlf);
@@ -108,6 +110,14 @@
 if (!$resf) {
 	echo "\n<p class='err'>Fehler bei Flurst&uuml;cksdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlf)."'</p>";}
-	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resf)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlf)."'</p>";}
+	if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resf)."</p>";}
+}
+
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($resf);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein Flurst&uuml;cks-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlf), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 if ($rowf = pg_fetch_assoc($resf)) {
@@ -124,4 +134,5 @@
 	echo "\n<p class='err'>Fehler! Kein Treffer fuer gml_id=".$gmlid."</p>";
 }
+
 echo "<p class='balken geb'>ALKIS Flurst&uuml;ck (Geb&auml;ude und Bauwerke) ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"; // Balken
 echo "\n<h2>Flurst&uuml;ck (Geb&auml;ude und Bauwerke)</h2>";
@@ -181,6 +192,6 @@
 if (!$resg) {
 	echo "\n<p class='err'>Fehler bei Geb&auml;ude-Verschneidung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlg)."'</p>";}
-	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resg)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlg)."'</p>";}
+	if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resg)."</p>";}
 }
 $gebnr=0;
@@ -270,6 +281,6 @@
 		if (!$resl) {
 			echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
-			if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqll)."'</p>";}
-			if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resl)."</p>";}
+			if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqll)."'</p>";}
+			if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resl)."</p>";}
 		}
 		while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
@@ -306,5 +317,5 @@
 if ($gebnr === 0) {
 	echo "<p><br>Kein Geb&auml;ude auf diesem Flurst&uuml;ck.<br>&nbsp;</p>";
-	//if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	//if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
 } else {
 	echo "\n<tr>"
@@ -425,6 +436,6 @@
 if (!$resb) {
 	echo "\n<p class='err'>Fehler bei Bauwerke-Verschneidung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."</p>";}
-	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."</p>";}
+	if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";}
 }
 $baunr=0; // ZÃ€hler
@@ -544,5 +555,5 @@
 if ($baunr === 0) {
 	echo "\n<p>Kein Bauwerk auf diesem Flurst&uuml;ck.</p><br>";
-	// if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlb."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	// if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sqlb."<br>$1 = gml_id = '".$gmlid."'</p>";}
 } else {
 	echo "\n<tr>"
@@ -554,14 +565,12 @@
 }
 pg_free_result($resb);
+
+echo "<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;";}
+echo "\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
- 
-<div class='buttonbereich noprint'>
-	<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
-
 </body>
 </html>
Index: /trunk/info/info/alkisn/alkislage.php
===================================================================
--- /trunk/info/info/alkisn/alkislage.php	(revision 424)
+++ /trunk/info/info/alkisn/alkislage.php	(revision 425)
@@ -6,9 +6,11 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
 	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)
+               Gemarkung und Flur bei Gruppenwechsel FETT anzeigen
 
 	ToDo:
@@ -67,8 +69,9 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkislage.php'");
@@ -90,9 +93,9 @@
 // "Left" weil: Bei sub-Typ "Gewanne" von Typ "o" sind keine SchlÃŒsselfelder gefÃŒllt!
 $sql.="FROM ".$tnam." l 
-LEFT JOIN ax_gemeinde g ON l.land=g.land AND l.regierungsbezirk=g.regierungsbezirk AND l.kreis=g.kreis AND l.gemeinde=g.gemeinde 
-LEFT JOIN ax_kreisregion k ON l.land=k.land AND l.regierungsbezirk=k.regierungsbezirk AND l.kreis=k.kreis 
-LEFT JOIN ax_regierungsbezirk r ON l.land=r.land AND l.regierungsbezirk=r.regierungsbezirk 
-LEFT JOIN ax_bundesland b ON l.land=b.land 
-LEFT JOIN ax_lagebezeichnungkatalogeintrag s 
+LEFT JOIN ax_gemeinde g ON l.land=g.land AND l.regierungsbezirk=g.regierungsbezirk AND l.kreis=g.kreis AND l.gemeinde=g.gemeinde ".UnqKatAmt("l","g")
+."LEFT JOIN ax_kreisregion k ON l.land=k.land AND l.regierungsbezirk=k.regierungsbezirk AND l.kreis=k.kreis ".UnqKatAmt("l","k")
+."LEFT JOIN ax_regierungsbezirk r ON l.land=r.land AND l.regierungsbezirk=r.regierungsbezirk ".UnqKatAmt("l","r")
+."LEFT JOIN ax_bundesland b ON l.land=b.land ".UnqKatAmt("l","b")
+."LEFT JOIN ax_lagebezeichnungkatalogeintrag s 
 ON l.land=s.land AND l.regierungsbezirk=s.regierungsbezirk AND l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage 
 WHERE l.gml_id= $1 AND l.endet IS NULL AND g.endet IS NULL AND k.endet IS NULL AND r.endet IS NULL AND b.endet IS NULL AND s.endet IS NULL;";
@@ -103,7 +106,13 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
-}
-
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Lage-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+}
 if ($row = pg_fetch_assoc($res)) {
 	$strgml=$row["strgml"]; // gml_id des Katalogeintrag StraÃe
@@ -118,7 +127,7 @@
 	$lage=$row["lage"]; // Strassenschluessel
 	$snam=$row["snam"]; //Strassennamen
-//	$kennz=$land."-".$regbez."-".$kreis.  ...
+//	$kennz=$land."-".$regbez."-".$kreis. ..
 	$kennz=$gem."-".$lage."-"; // ToDo: Kompatibel machen als Eingabe in Navigation/Adresse 
-	
+
 	switch ($ltyp) {
 		case "m": // "Mit HsNr"
@@ -155,5 +164,5 @@
 } else {
 	echo "\n<p class='err'>Fehler! Kein Treffer fuer Lagebezeichnung mit gml_id='".$gmlid."'</p>";
-	if ($debug > 2) {
+	if ($dbg > 2) {
 		echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";
 	}
@@ -260,7 +269,7 @@
 	}
 
-	$sql="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche 
-	FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
-	WHERE $1 = ANY(f.".$bezart.") AND f.endet IS NULL AND g.endet IS NULL 
+	$sql ="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche 
+	FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+	."WHERE $1 = ANY(f.".$bezart.") AND f.endet IS NULL AND g.endet IS NULL 
 	ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
 
@@ -270,5 +279,5 @@
 	if (!$resf) {
 		echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
+		if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
 	}
 	echo "\n<table class='fs'>"
@@ -282,5 +291,8 @@
 	$j=0;
 	$zpaar=false;
+	$gwgmkg=""; // Gruppenwechsel
+	$gwflur="";
 	while($rowf = pg_fetch_assoc($resf)) {
+		$gmkg=$rowf["bezeichnung"];
 		$flur=str_pad($rowf["flurnummer"], 3, "0", STR_PAD_LEFT);
 		$fskenn=$rowf["zaehler"]; // Bruchnummer
@@ -294,7 +306,18 @@
 			."\n\t<td>";
 			if ($showkey) {echo "<span class='key'>".$rowf["gemarkungsnummer"]."</span> ";}
-			echo $rowf["bezeichnung"]."</td>"
-			."\n\t<td>".$flur."</td>"
-			."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
+			if ($gwgmkg != $gmkg) {
+				echo "<b>".$gmkg."</b></td>";
+				$gwgmkg=$gmkg;
+				$gwflur="";
+			} else {
+				echo $gmkg."</td>";
+			}
+			if ($gwflur != $flur) {
+				echo "\n\t<td><b>".$flur."</b></td>";
+				$gwflur=$flur;
+			} else {
+				echo "\n\t<td>".$flur."</td>";
+			}
+			echo "\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
 			."\n\t<td class='fla'>".$flae."</td>"
 			."\n\t<td>\n\t\t<p class='nwlink noprint'>"
@@ -333,5 +356,5 @@
 			if (!$res) {
 				echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.</p>";
-				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter
+				if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter
 			}
 			$neb=0;
@@ -369,5 +392,5 @@
 			if (!$res) {
 				echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.</p>";
-				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter		
+				if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter		
 			}
 			$neb=0;
@@ -405,5 +428,5 @@
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Geb&auml;ude.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+		if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	echo "\n<table class='geb'>"
@@ -445,13 +468,12 @@
 	echo "\n</table>";
 }
+
+echo "<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;";}
+echo "\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "&amp;ltyp=".$ltyp);
 ?>
-
-<div class='buttonbereich noprint'>
-	<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", "&amp;ltyp=".$ltyp); ?>
 
 </body>
Index: /trunk/info/info/alkisn/alkisfsnw.php
===================================================================
--- /trunk/info/info/alkisn/alkisfsnw.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisfsnw.php	(revision 425)
@@ -6,5 +6,5 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	.....
 	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
@@ -14,6 +14,8 @@
 	2020-12-16 Input-Validation und Strict Comparisation (===)
 	2021-03-09 Link zum GebÃ€udenachweis auch mit "Bauwerke" betiteln
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
 
 ToDo:
+	- Tabbelle "nutz_21" ist ein Relikt von NorGIS/ALB und kÃ¶nnte in spÃ€teren Versionen fehlen.
 	- Buchung auf "fiktives Blatt" ist nur mit debug zu sehen: die <tr> in .css grau hinterlegen
 	- "Umschalter" (gleiches Modul) anders darstellen als Links zu ANDEREN Nachweisen
@@ -69,8 +71,9 @@
 <?php
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // Mit URL-Parameter "&nodebug=j" kann man die Entwicklungsumgebung (in Conf definiert) ausschalten. Blendet z.B. "fiktives Blatt" aus.
-// Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
-if ($nodebug === "j") {$debug=0;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfsnw.php'");
@@ -99,9 +102,9 @@
 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.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;";
+LEFT JOIN ax_gemarkung g ON f.gemeindezugehoerigkeit_land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+."LEFT JOIN ax_regierungsbezirk r ON f.gemeindezugehoerigkeit_regierungsbezirk=r.regierungsbezirk ".UnqKatAmt("f","r")
+."LEFT JOIN ax_kreisregion k ON f.gemeindezugehoerigkeit_regierungsbezirk=k.regierungsbezirk AND f.gemeindezugehoerigkeit_kreis=k.kreis ".UnqKatAmt("f","k")
+."LEFT JOIN ax_gemeinde m ON m.regierungsbezirk=f.gemeindezugehoerigkeit_regierungsbezirk AND m.kreis=f.gemeindezugehoerigkeit_kreis AND m.gemeinde=f.gemeindezugehoerigkeit_gemeinde ".UnqKatAmt("f","m")
+."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
@@ -110,5 +113,12 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Flurstuecksdaten</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>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Flurst&uuml;cks-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -137,5 +147,5 @@
 } else {
 	echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Flurst&uuml;ck mit gml_id=".$gmlid."</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>";}
 	echo "\n</body>\n</html>";
 	return;
@@ -155,5 +165,5 @@
 if ( ($filtkreis != '' and $filtkreis != $kreis) or ($filtgem != '' and $filtgem != $gemeinde) ) {
 	// Einer der gesetzten Filter passt nicht
-	if ($debug > 2) { //++ SchÃ¶nes Bild? Stop-Zeichen?
+	if ($dbg > 2) { //++ SchÃ¶nes Bild? Stop-Zeichen?
 		echo "\n<p class='err'>Filter Kreis='".$filtkreis."', Gemeinde='".$filtgem."'</p>"
 		."\n<p class='err'>Flstk. Kreis='".$fskrs."', Gemeinde='".$fsgem."'</p>";
@@ -180,11 +190,11 @@
 
 echo "\n<hr>\n<table class='fs'>"; // FS-Teil 6 Spalten
-echo "\n<tr>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>\n\t\t<td></td>" // 1-5 in erster Zeile kein "colspan" verwenden
-	."\n\t\t<td>\n\t\t<p class='nwlink noprint'>weitere Auskunft:</p></td>" // 6
+echo "\n<tr>\n\t<td></td>\n\t<td></td>\n\t<td></td>\n\t<td></td>\n\t<td></td>" // 1-5 in erster Zeile kein "colspan" verwenden
+	."\n\t<td><p class='nwlink noprint'>weitere Auskunft:</p></td>"
 ."\n</tr>";
 
 echo "\n<tr>" // Zeile: G e b i e t s z u g e h o e r i g k e i t  Gemeinde / Kreis / Regierungsbezirk
-	."\n\t<td class='ll'><img title='Im Gebiet von' src='ico/Gemeinde.png' width='16' height='16' alt=''> Gebiet:</td>" // 1
-	."\n\t<td>Gemeinde<br>Kreis<br>Regierungsbezirk</td>" // 2
+	."\n\t<td class='ll'><img title='Im Gebiet von' src='ico/Gemeinde.png' width='16' height='16' alt=''> Gebiet:</td>"
+	."\n\t<td>Gemeinde<br>Kreis<br>Regierungsbezirk</td>"
 	."\n\t<td class='lr' colspan='3'>"; // 3-5
 		if ($showkey) {echo "<span class='key'>(".$gemeinde.")</span> ";}
@@ -195,6 +205,7 @@
 		echo $rbez
 	."</td>"
-	."\n\t<td class='nwlink'>" // 5
-		."\n\t\t<p class='nwlink noprint'>"
+	."\n\t<td class='nwlink'>";
+	if ($fsHistorie){ // conf
+		echo "\n\t\t<p class='nwlink noprint'>"
 		."\n\t\t\t<a href='alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$gmlid;
 		if ($showkey) {echo "&amp;showkey=j";}
@@ -202,6 +213,7 @@
 		."<img src='ico/Flurstueck_Historisch.png' width='16' height='16' alt=''>"
 		."</a>"
-		."\n\t\t</p>"
-	."\n\t</td>" // 6
+		."\n\t\t</p>\n\t";
+	}
+	echo "</td>"
 ."\n</tr>";
 
@@ -222,7 +234,7 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung mit Hausnummer</p>";
-	if ($debug > 1) {
+	if ($dbg > 1) {
 		echo "\n<p class='dbg'>Fehler:".pg_last_error()."</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>";}
 	}
 } else {
@@ -281,6 +293,6 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung ohne Hausnummer</p>";
-	//if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($res)."</p>";}
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	//if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($res)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $j=0;
@@ -353,5 +365,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Suche tats. Nutzung</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$fskennzalb."'",$sql), ENT_QUOTES, "UTF-8")."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$fskennzalb."'",$sql), ENT_QUOTES, "UTF-8")."'</p>";}
 }
 $j=0;
@@ -513,11 +525,11 @@
 
 // Gemeinsame FlÃ€che suchen: entweder (ST_Intersects and not ST_Touches) oder (2xST_Within OR ST_Overlaps), ST_Intersects liefert auch angrenzende
-$sql_boden="SELECT b.artderfestlegung AS wert, a.beschreibung 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_flurstueck f 
 JOIN ax_bauraumoderbodenordnungsrecht b ON ST_Within(b.wkb_geometry, f.wkb_geometry) OR ST_Within(f.wkb_geometry, b.wkb_geometry) OR ST_Overlaps(b.wkb_geometry, f.wkb_geometry)
 LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON b.artderfestlegung=a.wert 
-LEFT JOIN ax_dienststelle d ON b.stelle=d.stelle 
-WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL";
+LEFT JOIN ax_dienststelle d ON b.stelle=d.stelle ".UnqKatAmt("b","d")
+."WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL";
 
 pg_prepare($con, "bodeneuordnung", $sql_boden);
@@ -525,5 +537,5 @@
 if (!$res_bodeneuordnung) {
 	echo "\n<p class='err'>Fehler bei Bau-, Raum- oder Bodenordnungsrecht</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_boden)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_boden)."</p>";}
 }
 $sql_str="SELECT gml_id FROM ax_besondereflurstuecksgrenze WHERE endet IS NULL AND 1000 = ANY(artderflurstuecksgrenze) 
@@ -534,5 +546,5 @@
 if (!$res_strittigeGrenze) {
 	echo "\n<p class='err'>Fehler bei strittige Grenze</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_str)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_str)."</p>";}
 }
 if (pg_num_rows($res_bodeneuordnung) > 0 OR pg_num_rows($res_strittigeGrenze) > 0) {
@@ -609,5 +621,5 @@
 	$anzber=ber_bs_zaehl($gml_buchungsstelle);	// Anzahl berechtigte Buchungen (nÃ€chste Stufe) zu dieser Buchung ermitteln
 	$verf_next = array($gml_buchungsstelle);	// Start Recursion mit einem Element
-	//if ($debug > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
+	//if ($dbg > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
 
 	while ($anzber > 0 ) { // Stufe - recursiv in die Tiefe, solange es was zu verfolgen gibt
@@ -621,5 +633,5 @@
 				$verf_neu=ber_bs_anzg($gml_ber_bs, $eig, false, $gmlid, ""); // Anzeige ber. Buchungst., ggf. mit EigentÃŒmer.
 				$anz_neu=count($verf_neu); // Das Ergebnis zÃ€hlen
-			//	if ($debug > 2) {echo "<p class='dbg'>Weiter zu verfolgen: Stufe ".$stufe.", Element ".$i.", Anzahl: ".$anz_neu."</p>";}
+			//	if ($dbg > 2) {echo "<p class='dbg'>Weiter zu verfolgen: Stufe ".$stufe.", Element ".$i.", Anzahl: ".$anz_neu."</p>";}
 				if ($anz_neu > 0) { // wenn neue geliefert
 					$verf_next=array_merge($verf_next, $verf_neu); // die neuen an die Sammlung heften
@@ -628,9 +640,7 @@
 		} // Ende Buchungs-Array in der Stufe
 		$anzber=count($verf_next); // Sammlung auf Stufe zÃ€hlen, Steuert die Schleife.
-		//if ($debug > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
 	} // Ende Stufe
 
 	echo "\n</table>\n\n";
-	//if ($debug > 1) {echo "<p class='dbg'>Buchung gezeigt = ".$gezeigt."</p>";}
 
 	// Fehler aus "ModellschwÃ€che" erkennen.
@@ -641,5 +651,5 @@
 		echo "<p class='err'>Das Grundbuch zur Buchung '".$gml_buchungsstelle."' fehlt in der Datenbank.</p>";
 		
-		if ($debug > 1) { // fehlt die Buchung??
+		if ($dbg > 1) { // fehlt die Buchung??
 			echo "<p class='dbg'>Suchen mit SQL: SELECT * FROM ax_buchungsstelle WHERE gml_id='".$gml_buchungsstelle."'; </p>";
 		}
@@ -651,11 +661,8 @@
 
 pg_close($con);
-echo <<<END
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-END;
-echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"" . $gmlid . "\")'><img src='ico/download_fs.png' width='32' height='16' alt='Export'></a>&nbsp;\n</div>";
+echo "<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;";}
+echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_fs.png' width='32' height='16' alt='Export'></a>&nbsp;\n</div>";
 
 footer($gmlid, selbstverlinkung()."?", "&amp;eig=".$eig);
Index: /trunk/info/info/alkisn/alkisgsnw.php
===================================================================
--- /trunk/info/info/alkisn/alkisgsnw.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisgsnw.php	(revision 425)
@@ -11,6 +11,9 @@
 	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
 	2020-12-15 Input-Validation und Strict Comparisation (===)
-
-++ ToDo: Den Fall berÃŒcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht (ModellschwÃ€che). Meldungen ausgeben.
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
+
+ToDo: 
+- Den Fall berÃŒcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht (ModellschwÃ€che). Meldungen ausgeben.
+- bei Aufruf herrschende Buchung mit mehreren dienenden Buchungen: Links zu den dienenden Buchungen anzeigen
 */
 
@@ -18,9 +21,9 @@
 // Daten zur Buchungsstelle (GS = GrundstÃŒck) aus der DB lesen.
 // Suche wahlweise ÃŒber die GML-ID oder ÃŒber das GrundstÃŒcks-Kennzeichen (Bezirk-Blatt-LfdNr) aus der URL.
-	global $gkz, $showkey, $debug, $defland, $gsbez, $gsblatt, $gslfdnr, $gsbart;
+	global $gkz, $showkey, $dbg, $defland, $gsbez, $gsblatt, $gslfdnr, $gsbart;
 
 	$sqlgs="SELECT s.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, s.laufendenummer, s.buchungsart "
 		."FROM ax_buchungsstelle s JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id ";
-	// Falls das Buchungsblatt fehlt (ModellschwÃ€che) wÃ€re ein LEFT JOIN hier nÃŒtzlich. Das Fehlen aber kontrollieren! ++
+	// Falls das Buchungsblatt fehlt (ModellschwÃ€che) wÃ€re ein LEFT JOIN hier nÃŒtzlich. Das Fehlen aber kontrollieren!
 
 	if ($gskennz == '') { // normaler Link ÃŒber gmlid
@@ -66,47 +69,58 @@
 }
 
-function bs_dienend($gmlid_h) {
-// Eine ggf. vorhandene dienende Buchungsstelle suchen und dessen GML_ID liefern.
-	global $debug, $gerooted;
+function Back2theRoots($gmlid) {
+// Die Buchungsstelle aus dem Aufruf-Parameter wenn eindeutig mÃ¶glich iterativ zurÃŒck fÃŒhren auf die dienende Buchungsstelle, 
+// auf der die FlurstÃŒcke gebucht sind (Buchungsart="GrundstÃŒck" oder Blattart="fiktives Blatt").
+// Der GrundstÃŒcksnachweis wird aus anderen Modulen nur fÃŒr die "GrundstÃŒck"-Buchung aufgerufen, so dass diese Suche nicht notwendig ist.
+// Bei Aufrufen von auÃen kann dies aber sinnvoll sein.
+
+// ToDo: um Mehr als eine Stufe zurÃŒck fÃŒhren (max. 3)
+
+	global $gkz, $dbg, $showkey, $gerooted;
+	$gd=$gmlid; // gml dienend
+
 	// BS-herrschend (bekannt)  >an[]>  BS-dienend (gesucht)
-	$sqld="SELECT d.gml_id FROM ax_buchungsstelle d JOIN ax_buchungsstelle h ON d.gml_id=any(h.an) "
-		."WHERE h.gml_id = $1 and d.endet IS NULL AND h.endet IS NULL";
-	$v=array($gmlid_h);
-	$resd=pg_prepare("", $sqld);
-	$resd=pg_execute("", $v);
-	$cntd=0;
-	while($rowd=pg_fetch_assoc($resd)) {
-		$cntd++;
-		$gmlid_d=$rowd["gml_id"];
-	}
-	if ($cntd === 0) { // KEINE dienende BS
-		$gmlid_d="";
-	} elseif ($cntd > 1) { // Problem: mehrere dienende BS
-		$gmlid_d=""; // wennn mehrere (.an=Array[]), dann nicht eindeutig rÃŒckfÃŒhrbar.
-		$gerooted=false; // Root nicht erreicht
-		if ($debug > 2 ) { // Meldung? Auswahl?
-			echo "\n<p class='err'>Mehrere 'diendende' Buchungen zur Buchung '".$gmlid_h."'</p>";
-		}
-	}
-	pg_free_result($resd);
-	return $gmlid_d;
-}
-
-function Back2theRoots($gmlid_h) {
-// Eine Buchungsstelle (aus dem Aufruf-Parameter) zurÃŒck fÃŒhren auf die Basis-Buchungsstelle
-// Suchen bis Buchungsart="GrundstÃŒck" oder ggf. Blattart="fiktives Blatt"
-	global $debug;
-	$gh=$gmlid_h; // herrschend
-	$gd=$gh; // dienend
-	$gr=$gd; // root
+	$sql="SELECT d.gml_id, d.laufendenummer FROM ax_buchungsstelle d JOIN ax_buchungsstelle h ON d.gml_id=any(h.an) "
+		."WHERE h.gml_id = $1 and d.endet IS NULL AND h.endet IS NULL ORDER BY d.laufendenummer;";
+
 	while($gd != "") {
-		$gr=$gd; // sichern
-		$gd=bs_dienend($gh); // an?
-		$gh=$gd; // fuer weitere Loop
-	}
+		$gr=$gd; // gml Return
+		$v=array($gd);
+		$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		$zeianz=pg_num_rows($res);
+		if ($zeianz == 0){ // sollte nicht vorkommen, die Buchungsart "GrundstÃŒck" ruft dies NICHT auf
+			if ($dbg > 1 ) {echo "\n<p class='err'>Keine 'diendende' Buchung zur Buchung '".$gd."'</p>";}
+			$gd="";			
+		} elseif ($zeianz == 1){
+			if ($dbg > 1 ) {echo "\n<p class='dbg'>Eine 'diendende' Buchung zur Buchung '".$gd."'</p>";}
+			$row=pg_fetch_assoc($res);
+			$gd=$row["gml_id"];
+		} else { // > 1 // Seltener Sonderfall
+			if ($dbg > 1 ) {echo "\n<p class='dbg'>".$zeianz." 'diendende' Buchungen zur Buchung '".$gd."'</p>";}
+			$gerooted=false; // Root (GrundstÃŒck) wird nicht erreicht
+			$gd=""; // wenn mehrere (.an=Array[]), dann nicht eindeutig rÃŒckfÃŒhrbar
+			echo "\n<table class='fs'>\n<tr>\n\t<td class='heads'>Hinweis</td>"
+			."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>"
+			."\n</tr>";
+			echo "\n<tr>\n\t<td>Die angeforderte Buchung hat Rechte an ".$zeianz." anderen Buchungen."
+			."<br>F&uuml;r die Anzeige der Flurst&uuml;cke muss eine dieser Grundst&uuml;cks-Buchungen gew&auml;hlt werden.</td>"
+			."\n\t<td>\n\t\t<p class='nwlink noprint'>";
+			while($row=pg_fetch_assoc($res)) {
+				$gml_d=$row["gml_id"];
+				$bvnr=ltrim($row["laufendenummer"], '0');
+				echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_d;
+				if ($showkey) {echo "&amp;showkey=j";}
+				echo "' title='Grundst&uuml;cksnachweis'>Buchung ".$bvnr
+				." <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a><br>";
+			}
+			echo "\n\t\t</p>\n\t</td>\n</tr>\n</table>";
+		}
+	}
+	pg_free_result($res);
 	return $gr;
 }
 
-// H i e r   S t a r t
+// S t a r t
 ini_set("session.cookie_httponly", 1);
 session_start();
@@ -156,34 +170,32 @@
 <?php
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
-
-if ($nodebug === "j") {$debug=0;} 
+$dbg=$debug; // CONF in Arbeits-Variable
+if ($nodebug === "j") {$dbg=0;} 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgsnw.php'");
 if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
 
-$gmlid_p=$gmlid; // Wert aus Parameter merken
-$gerooted=true; // Auskunft beginnt mit dienendem GrundstÃŒck
-$gmlid=get_GS_Daten($gmlid, $gskennz); // nachschauen
-$gml_anfrd=$gmlid; // ursprÃŒngliche Anforderung aus URL merken
+$gml_anfrd=$gmlid;	// ursprÃŒngliche Anforderung aus URL merken
+$gerooted=true;		// Auskunft beginnt mit (dienendem) GrundstÃŒck
+$gmlid=get_GS_Daten($gmlid, $gskennz); // nachschauen, Variablen setzen, Keine Ausgabe
 if ($gmlid == "") { // nix gefunden
 	die("Kein Treffer");
-} else { // Treffer
-	if ($gsbart != "1100") { // Buchungsart "GrundstÃŒck"
-		$gmlid_r=Back2theRoots($gmlid);
-		if ($gmlid_r != $gmlid) { // wurde hoch gerÃŒckt
-			$gmlid=get_GS_Daten($gmlid_r, ""); // damit weiter arbeiten
-		}
-	}
 }
 echo "<p class='balken gskennz'>ALKIS Grundst&uuml;ck ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr."&nbsp;</p>\n\n<h2>Grundst&uuml;ck</h2>"; // Balken
 
-if ($gerooted) {
-	// F l u r s t u e c k e
-	echo "\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
-		."\n<table class='fs'>";
-	echo "\n<tr>" // Kopfzeile
+// F l u r s t ÃŒ c k e
+echo "\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>";
+
+if ($gsbart > 1102){ // Recht an ..
+	$gmlid_r=Back2theRoots($gmlid);
+	if ($gmlid_r != $gmlid) { // wurde hoch gerÃŒckt
+		$gmlid=get_GS_Daten($gmlid_r, ""); // damit weiter arbeiten
+	}
+}
+if ($gerooted) { // // Buchungsart (aufgeteiltes) GrundstÃŒck (nicht Recht an ..)
+	echo "\n<table class='fs'>\n<tr>" // Kopfzeile
 		."\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>";
@@ -191,7 +203,7 @@
 	//++ Tabelle hat noch Platz, SQL in der Loop oder Subquery wÃ€re mÃ¶glich, weil i.d.R. nur wenige FS je GS gebucht sind.
 
-	$sqlfs="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche 
-	FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
-	WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL ";
+	$sqlfs ="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche "
+	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+	."WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL ";
 	if ($filtgem === '' ) { // ungefiltert
 		$v=array($gmlid);
@@ -236,8 +248,4 @@
 	if ($j === 0) {echo "\n<tr class='unp'>\n\t<td colspan='5'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n</tr>";}
 	echo "\n</table>";
-} else { // konnte nicht bis zur Basis aufsteigen
-	echo "<p>Die angeforderte Buchung hat Rechte an mehreren anderen Buchungen."
-	."<br>F&uuml;r die Anzeige der Flurst&uuml;cke muss eine dieser Buchungen (Grundst&uuml;ck) gew&auml;hlt werden.</p>";
-	// Auswahl anbieten? Sonst ÃŒber den Link "Bestand" recherchieren. 
 }
 
@@ -268,14 +276,10 @@
 		$anzber=count($verf_next);
 	}
-echo "\n</table>\n\n";
-//if ($debug > 1) {echo "<p class='dbg'>Buchung gezeigt = ".$gezeigt."</p>";}
-
+echo "\n</table>\n";
 pg_close($con);
-echo <<<END
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-END;
+
+echo "<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 ($stufe < 3) {
 	echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_gs.png' width='32' height='16' alt='Export'></a>";
Index: /trunk/info/info/alkisn/alkisauszug.css
===================================================================
--- /trunk/info/info/alkisn/alkisauszug.css	(revision 424)
+++ /trunk/info/info/alkisn/alkisauszug.css	(revision 425)
@@ -10,4 +10,5 @@
 	2021-03-08  Gruppenwechsel-ZwischenÃŒberschrift
 	2021-03-17	Balken von Bauwerk Farbe wie im WMS
+	2021-12-30	Spalte nwlink breiter, Class td.flag entfÃ€llt, Tabellenkopf Hintergrund
 
 	https://wiki.selfhtml.org/wiki/Grafik/Farbpaletten#Farbnamen
@@ -100,27 +101,26 @@
 td.lr	{color: black; padding-left: 4px;}	/* Liste Rechts */
 td.re	{min-width: 80px; padding-right: 4px; text-align: right;}	/* RechtsbÃŒndig */
-td.fla	{width: 110px; padding-right: 4px; text-align: right;}		/* Flaechen rechtsbuendig (stellengerecht) */
-td.flag	{min-width: 110px; padding-right: 4px; text-align: right;}	/* .. im GB-Bestandsnachweis erweiterbar */
+td.fla	{width: 110px; padding-right: 4px; text-align: right;}		/* FlÃ€chen rechtsbuendig (stellengerecht) */
 td.fsnr	{padding-right: 4px; text-align: right;}					/* Flst.-Nr. rechtsbuendig */
 td.key	{width:  35px; padding-right: 4px; padding-left: 4px;}
-/* td.emz	{width: 45px; padding-right: 4px; padding-left: 4px; text-align: right;} Ertragsmesszahl der Bodenschaetzung */
+/* td.emz	{width: 45px; padding-right: 4px; padding-left: 4px; text-align: right;} Ertragsmesszahl der BodenschÃ€tzung */
 td.kurz	{width: 26px; padding-left: 4px;}
-td.nanu	{width: 50px;}									/* Namensnummer */
+td.nanu	{width: 50px;} /* Namensnummer */
 td.sond, p.sond	{font-size: 9pt; font-style: italic; background-color: white;
-		border: 1px dotted silver; padding: 6px;}		/* Sondereigentumsbeschreibung */
+		border: 1px dotted silver; padding: 6px;} /* Sondereigentumsbeschreibung */
 td.nrap, p.nrap	{font-size: 9pt; font-style: italic; background-color: white;}	/* Nummer im Aufteilungsplan */
 td.fett	{font-weight: bold;}
-td.nwlink {min-width: 80px;}							/* Link zum Nachweis */
+td.nwlink {min-width: 99px;} /* Link zum Nachweis */
 
 /* Kopfzeile, SpaltenÃŒberschrift, GW-Zwischenzeile */
-td.head, td.heads, td.gw{font-style: italic; padding-top: 2px;}	
+td.head, td.heads, td.gw{font-style: italic; padding-top: 2px; background-color: rgb(246,247,248);}	
 td.head		{border-bottom: 1px solid gray;}	
-td.heads	{border-bottom: 1px solid black;}			/* Kopf Sortierspalte */
-td.gw		{background-color: WhiteSmoke;} 			/* Gruppen-Wechsel */
+td.heads	{border-bottom: 1px solid black;}	/* Kopf Sortierspalte */
+td.gw		{background-color: WhiteSmoke;} 	/* Gruppen-Wechsel */
 
 td.sum {border-top: 2px dotted maroon;	border-bottom:3px solid maroon;
 	border-left:0px dotted maroon;	border-right:0px dotted maroon; font-weight: bold;}	/* unter dem Strich = Summenzeile */
-td.bez	{font-weight: bold;}		/* Beziehungen */
-td.nhd	{width: 150px;}				/* Namen - linke / rechte Spalte */
+td.bez	{font-weight: bold;}	/* Beziehungen */
+td.nhd	{width: 150px;}			/* Namen - linke / rechte Spalte */
 td.nam	{font-weight: bold;}
 /* td.gbl	{border-bottom: 1px dotted green;}	 Name: GB-Liste */
@@ -132,7 +132,7 @@
 
 /* Fallunterscheidung bei GebÃ€ude oder Bauwerk auf FlurstÃŒck: */
-td.gin {color: rgb(0,50,0);}			/* in FS */
-td.gtl {color: rgb(140,140,100);}		/* teilweise auf FS */
-td.gan {color: rgb(210,170,170);}		/* angrenzend an FS*/
+td.gin {color: rgb(0,50,0);}		/* in FS */
+td.gtl {color: rgb(140,140,100);}	/* teilweise auf FS */
+td.gan {color: rgb(210,170,170);}	/* angrenzend an FS*/
 
 /* Farbwechsel je Zeile pair/unpair */
Index: /trunk/info/info/alkisn/alkisexport.php
===================================================================
--- /trunk/info/info/alkisn/alkisexport.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisexport.php	(revision 425)
@@ -1,8 +1,9 @@
 <?php
 /*	Modul alkisexport.php
+
 	CSV-Export von ALKIS-Daten zu einem Flurstueck, Grundbuch, EigentÃŒmer oder StraÃe.
 	Es wird eine GML-ID ÃŒbergeben.
 	Es wird ein gespeicherter View verwendet, der nach der gml_id gefiltert wird. 
-	Der View verkettet Flurstueck - Buchungsstelle - Grundbuch - Eigentuemer
+	Der View verkettet Flurstueck - Buchungsstelle - Grundbuch - EigentÃŒmer
 	Die Lagebezeichnung des FlurstÃŒcks wird in ein Feld komprimiert.
 	Parameter Beispiele: 
@@ -21,11 +22,13 @@
 	Version:
 	--------
-	2016-02-23	Version fuer norGIS-ALKIS-Import
+	2016-02-23	Version fÃŒr norGIS-ALKIS-Import
 	....
 	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....
 	2020-12-16 Input-Validation und Strict Comparisation (===), BerechtigungsprÃŒfung vorÃŒbergehend deaktiviert
+	2021-12-01 Client-Encoding
 
 	ToDo:
+	- In den gespeicherten Views "exp_csv" und "exp_csv_str" den Fall Kataster-Amts-Mix berÃŒcksichtigen.
 	- Abruf FlurstÃŒck sollte auch mit "fskennz" (ggg-ff-zzz/nn) statt "gml-id" mÃ¶glich sein
 	- In Dateiname den StraÃennamen statt der gmlid verwenden? (Umlaute?)
@@ -53,9 +56,9 @@
 		$sneu=$row["bezeichnung"];
 		if ($sneu === $salt) { // gleiche Str.
-			$lagehsnr.=$row["hausnummer"]; // HsNr dran haengen
-		} else { // Name UND HsNr dranhaengen
+			$lagehsnr.=$row["hausnummer"]; // HsNr dran hÃ€ngen
+		} else { // Name UND HsNr dran hÃ€ngen
 			$lagehsnr.=$sneu." ".$row["hausnummer"];
 		}
-		$salt=$sneu; // Name f. naechste Runde
+		$salt=$sneu; // Name f. nÃ€chste Runde
 		$j++;
 	}
@@ -64,7 +67,7 @@
 }
 
-// HIER START //
-
-$tabtyp='';  $haus=''; // mÃ¶gliche Parameter initialisieren
+// HIER START
+
+$tabtyp='';  $haus=''; // Var. init.
 $cntget = extract($_GET); // Parameter in Variable umwandeln
 
@@ -99,9 +102,9 @@
 include "alkisfkt.php";
 
-// BerechtigungsprÃŒfung fuer CSV vorÃŒbergehend deaktiviert weil darin HTML-Meldungen ausgegeben werden.
+// BerechtigungsprÃŒfung fÃŒr CSV vorÃŒbergehend deaktiviert weil darin HTML-Meldungen ausgegeben werden.
 // ggf. dies per Option verhindern und wieder aktivieren.
 //$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('Abbruch'); }
 
-if ($tabtyp === '') { // Parameter (-kombinationen) pruefen
+if ($tabtyp === '') { // Parameter (-kombinationen) prÃŒfen
 	if ($gemarkung != '') { // Dieser Parameters bestimmt auch eindeutig den $tabtyp
 		$tabtyp = 'gemarkung';
@@ -176,5 +179,6 @@
 	echo "\n".$err; exit($err);
 }
-pg_set_client_encoding($con, 'LATIN1'); // FÃŒr Excel kein UTF8
+//pg_set_client_encoding($con, 'LATIN1'); // FÃŒr Excel kein UTF8
+pg_set_client_encoding($con, 'WIN1252'); // Auch Buchstaben z.B. mit "CARON", wie ÅŸ Åœ Å¡ Å 
 
 //$viewname="exp_csv"; // Standard-View, in der DB gespeichert
@@ -211,8 +215,5 @@
 
 	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)."')";
@@ -234,5 +235,7 @@
 //		// - Sonst ggf. Ausgabe Kreisgebiet
 //	} else { // als zusÃ€tzlicher Filter AND
+
 		$sql.=" AND fall='".$haus."' "; // m/o-Filter AnhÃ€ngen
+
 //	}
 }
Index: /trunk/info/info/alkisn/alkisstrasse.php
===================================================================
--- /trunk/info/info/alkisn/alkisstrasse.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisstrasse.php	(revision 425)
@@ -3,12 +3,13 @@
 
 	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Alle FlurstÃŒcke an einer Strasse anzeigen, egal ob "mit" oder "ohne" Hausnummer
+	Alle FlurstÃŒcke an einer StraÃe anzeigen, egal ob "mit" oder "ohne" Hausnummer
 	Parameter: "gml_id" aus der Tabelle "ax_lagebezeichnungkatalogeintrag"
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	...
 	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
 	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
 */
 ini_set("session.cookie_httponly", 1);
@@ -52,8 +53,9 @@
 <?php
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisstrasse.php'");
@@ -63,9 +65,9 @@
 b.bezeichnung AS bnam, r.bezeichnung AS rnam, k.bezeichnung AS knam, g.bezeichnung AS gnam, o.gml_id AS ogml 
 FROM ax_lagebezeichnungkatalogeintrag s 
-JOIN ax_bundesland b ON s.land=b.land 
-JOIN ax_regierungsbezirk r ON s.land=r.land AND s.regierungsbezirk=r.regierungsbezirk 
-JOIN ax_kreisregion k ON s.land=k.land AND s.regierungsbezirk=k.regierungsbezirk AND s.kreis=k.kreis 
-JOIN ax_gemeinde g ON s.land=g.land AND s.regierungsbezirk=g.regierungsbezirk AND s.kreis=g.kreis AND s.gemeinde=g.gemeinde 
-LEFT JOIN ax_lagebezeichnungohnehausnummer o ON s.land=o.land AND s.regierungsbezirk=o.regierungsbezirk AND s.kreis=o.kreis AND s.gemeinde=o.gemeinde AND s.lage=o.lage 
+JOIN ax_bundesland b ON s.land=b.land ".UnqKatAmt("s","b")
+."JOIN ax_regierungsbezirk r ON s.land=r.land AND s.regierungsbezirk=r.regierungsbezirk ".UnqKatAmt("s","r")
+."JOIN ax_kreisregion k ON s.land=k.land AND s.regierungsbezirk=k.regierungsbezirk AND s.kreis=k.kreis ".UnqKatAmt("s","k")
+."JOIN ax_gemeinde g ON s.land=g.land AND s.regierungsbezirk=g.regierungsbezirk AND s.kreis=g.kreis AND s.gemeinde=g.gemeinde ".UnqKatAmt("s","g")
+."LEFT JOIN ax_lagebezeichnungohnehausnummer o ON s.land=o.land AND s.regierungsbezirk=o.regierungsbezirk AND s.kreis=o.kreis AND s.gemeinde=o.gemeinde AND s.lage=o.lage 
 WHERE s.gml_id= $1 AND s.endet IS NULL AND b.endet IS NULL AND r.endet IS NULL AND k.endet IS NULL AND g.endet IS NULL AND o.endet IS NULL ;"; 
 
@@ -75,5 +77,12 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnungskatalogeintrag.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Stra&szlig;en-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -133,7 +142,6 @@
 echo "\n\t</td>\n</tr>\n</table>";
 pg_free_result($res);
-// Ende Seitenkopf
-
-// F L U R S T U E C K E
+
+// F L U R S T Ã C K E
 echo "\n\n<h3 id='fs'><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
 ."\n<p>Zusammenfassung von 'Lage mit Hausnummer' und 'Lage ohne Hausnummer' an dieser StraÃe</p>";
@@ -142,15 +150,15 @@
 // ax_Flurstueck >zeigtAuf> ax_LagebezeichnungOhneHausnummer > = s = Strasse
 // Suchkriterium: gml_id aus Katalog
-$sql="SELECT fh.gemarkungsnummer, gh.bezeichnung, fh.gml_id, fh.flurnummer, fh.zaehler, fh.nenner, fh.amtlicheflaeche, lh.gml_id AS lgml, lh.hausnummer, 'm' AS ltyp
+$sql ="SELECT fh.gemarkungsnummer, gh.bezeichnung, fh.gml_id, fh.flurnummer, fh.zaehler, fh.nenner, fh.amtlicheflaeche, lh.gml_id AS lgml, lh.hausnummer, 'm' AS ltyp
  FROM ax_flurstueck fh 
  JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(fh.weistAuf) 
- JOIN ax_gemarkung gh ON fh.land=gh.land AND fh.gemarkungsnummer=gh.gemarkungsnummer 
- JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.land=sh.land AND lh.regierungsbezirk=sh.regierungsbezirk AND lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage 
+ JOIN ax_gemarkung gh ON fh.land=gh.land AND fh.gemarkungsnummer=gh.gemarkungsnummer ".UnqKatAmt("fh","gh")
+."JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.land=sh.land AND lh.regierungsbezirk=sh.regierungsbezirk AND lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage 
  WHERE sh.gml_id = $1 AND fh.endet IS NULL AND lh.endet IS NULL AND gh.endet IS NULL AND sh.endet IS NULL
 UNION SELECT fs.gemarkungsnummer, gs.bezeichnung, fs.gml_id, fs.flurnummer, fs.zaehler, fs.nenner, fs.amtlicheflaeche, ls.gml_id AS lgml, '' AS hausnummer, 'o' AS ltyp
  FROM ax_flurstueck fs 
  JOIN ax_lagebezeichnungohnehausnummer ls ON ls.gml_id=ANY(fs.zeigtauf) 
- JOIN ax_gemarkung gs ON fs.land=gs.land AND fs.gemarkungsnummer=gs.gemarkungsnummer 
- JOIN ax_lagebezeichnungkatalogeintrag ss ON ls.land=ss.land AND ls.regierungsbezirk=ss.regierungsbezirk AND ls.kreis=ss.kreis AND ls.gemeinde=ss.gemeinde AND ls.lage=ss.lage 
+ JOIN ax_gemarkung gs ON fs.land=gs.land AND fs.gemarkungsnummer=gs.gemarkungsnummer ".UnqKatAmt("fs","gs")
+."JOIN ax_lagebezeichnungkatalogeintrag ss ON ls.land=ss.land AND ls.regierungsbezirk=ss.regierungsbezirk AND ls.kreis=ss.kreis AND ls.gemeinde=ss.gemeinde AND ls.lage=ss.lage 
  WHERE ss.gml_id = $1 AND fs.endet IS NULL AND ls.endet IS NULL AND gs.endet IS NULL AND ss.endet IS NULL
 ORDER BY gemarkungsnummer, flurnummer, zaehler, nenner;";
@@ -161,5 +169,5 @@
 if (!$resf) {
 	echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
 }
 
@@ -176,5 +184,5 @@
 $gwgmkg=""; // Gruppenwechsel
 $gwflur="";
-$cnths=0; // Count Haus-Lagebezeichnung
+$cnths=0; // Count Haus-Lagebez.
 
 $zpaar=false; // Zeilen-Farbwechsel
@@ -233,16 +241,15 @@
 }
 pg_free_result($resf);
+
+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;";}
+echo "\n\t<a title='Export als CSV' href=\"javascript:ALKISexport('')\">alle<img src='ico/download.png' width='16' height='16' alt='Export'></a>&nbsp;"
+	."\n\t<a title='CSV - nur Flurst&uuml;cke mit Hausnummer' href=\"javascript:ALKISexport('m')\">mit HsNr<img src='ico/download.png' width='16' height='16' alt='Export'></a>&nbsp;"
+	."\n\t<a title='CSV - nur Flurst&uuml;cke ohne Hausnummer' href=\"javascript:ALKISexport('o')\">ohne<img src='ico/download.png' width='16' height='16' alt='Export'></a>&nbsp;"
+."\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", ""); 
 ?>
-
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-	<a title="Export als CSV" href='javascript:ALKISexport("")'>alle<img src="ico/download.png" width="16" height="16" alt="Export"></a>&nbsp;
-	<a title="CSV - nur Flurst&uuml;cke mit Hausnummer" href='javascript:ALKISexport("m")'>mit HsNr<img src="ico/download.png" width="16" height="16" alt="Export"></a>&nbsp;
-	<a title="CSV - nur Flurst&uuml;cke ohne Hausnummer" href='javascript:ALKISexport("o")'>ohne<img src="ico/download.png" width="16" height="16" alt="Export"></a>&nbsp;
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: /trunk/info/info/alkisn/alkisfkt.php
===================================================================
--- /trunk/info/info/alkisn/alkisfkt.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisfkt.php	(revision 425)
@@ -6,5 +6,5 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import, "function linkgml" raus. Case-EntschlÃŒsselung raus.
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import, "function linkgml" raus. Case-EntschlÃŒsselung raus.
 	....
 	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF'] fÃŒr Einsatz hinter Gateway mit Ãnderung des Pfades (Docker/QWC2)
@@ -12,4 +12,10 @@
 	2020-12-15 Input-Validation und Strict Comparisation (===)
 	2020-12-16 Sonderfall QWC2 API-Gateway-Umleitung bei Selbstverlinkung
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che)
+			   Footer: Umschalter fÃŒr SchlÃŒssel und Debug unabhÃ€ngig benutzbar. Authentifizierung aus QWC2 nicht hier behandeln.
+	2021-12-30 Bestandsnachweis recursiv ÃŒber alle Buchungs-Ebenen
+
+++ ToDo:
+	- Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
 */
 
@@ -17,6 +23,5 @@
 //	Aus der Server-Variable den Pfad entfernen.
 	global $pfadlos_selbstlink;
-	If ($pfadlos_selbstlink === 1) { // pfad-lose Selbstverlinkung hinter einer Umleitung. z.B. QWC2 API-Gateway
-		// Pfad entfernen
+	If ($pfadlos_selbstlink === 1) { // Selbstverlinkung ohne Pfad z.B. hinter QWC2 API-Gateway (Umleitung)
 		$mod=strrchr($_SERVER['PHP_SELF'], '/');
 		$mod=substr($mod, 1);
@@ -29,26 +34,21 @@
 function darf_ich() {
 //	Am Anfang jedes Moduls aufrufen um $customer zu fÃŒllen.	
-//	Nach EinfÃŒhrung eines automatisch einloggenden anonymen Mapbender-Gast-Benutzers muss dieser bei der Authentifizierung ausgeschlossen werden.
-	global $auth, $customer, $mb_guest_user, $debug;
-
-	if ($auth === "") {	// nicht prÃŒfen
-	//	if ($debug > 1) {echo "\n<p class='dbg'>keine Berechtigungs-PrÃŒfung</p>";}
-		$customer = "(unbekannt)";
-		return 1;	// alles erlaubt
-
+//	Der automatisch einloggende anonyme Gast-Benutzers muss bei der Authentifizierung ausgeschlossen werden.
+	global $auth, $customer, $mb_guest_user, $dbg;
+
+	if ($auth === "") {		// nicht prÃŒfen
+		$customer = "";		// dann anonym
+		return 1;			// alles erlaubt
 	} elseif ($auth === "mapbender") {
-
-	//	if ($debug > 1) {echo "\n<p class='dbg' Berechtigungs-Pr&uuml;fung Mapbender</p>";}
 		$customer = "";
 		include '/opt/gdi/mapbender/http/php/mb_validateSession.php';
-		
+
 		if (!isset($_SESSION)) { // keine (passende) Session
-			if ($debug > 1) {echo "\n<p class='dbg'>Session nicht gesetzt</p>";}
+			if ($dbg > 1) {echo "\n<p class='dbg'>Session nicht gesetzt</p>";}
 		} elseif ( !isset($_SESSION["mb_user_name"]) )  {
-			if ($debug > 1) {echo "\n<p class='dbg'>username nicht gesetzt</p>";}
+			if ($dbg > 1) {echo "\n<p class='dbg'>username nicht gesetzt</p>";}
 		} else {
 			$customer = $_SESSION["mb_user_name"]; // angemeldeter Benutzer	
 		}
-		//if ($debug > 1) {echo "\n<p class='dbg'>Customer '".$customer."'</p>";}
 		if ($customer == "") {	// Wer bin ich?
 			echo "<p class='stop2'>Aufruf nur aus Mapbender erlaubt.</p>";
@@ -60,19 +60,6 @@
 			return 1;	// echter User, ist erlaubt
 		}
-
-	} elseif ($auth === "qwc2") {
-
-		if ($debug > 1) {echo "\n<p class='dbg'>Berechtigungs-PrÃŒfung QWC2 -GEPLANT-</p>";}
-
-		// BAUSTELLE: Hier den Code einfÃŒgen um im QWC2 die Berechtigung zu prÃŒfen und den Benutzer auszulesen.
-		// Guggs du: https://git.sourcepole.ch/krz_dt/qwc2/-/issues/78
-
-		$customer = "(Unbekannt)";
-		echo "<p class='stop2'>Berechtigungspr&uuml;fung fÃŒr QWC2 ist noch nicht m&ouml;glich.</p>";
-		return 1;	// vorlÃ€ufig erlaubt
-
 	} else {
-
-		echo "\n<p class='stop2'>Die Berechtigungs-PrÃŒfung ist falsch konfiguriert</p>";
+		echo "\n<p class='stop2'>Die Berechtigungs-Pr&uuml;fung ist falsch konfiguriert</p>";
 		return 0;	// verboten
 	}
@@ -80,48 +67,74 @@
 
 function footer($gmlid, $link, $append) {
-	// Einen Seitenfuss ausgeben.
+	// Einen SeitenfuÃ ausgeben.
 	// Die Parameter &gkz= und &gmlid= kommen in allen Modulen einheitlich vor
 	// Den URL-Parameter "&showkey=j/n" umschalten lassen.
-	// $append wird angehaengt wenn gefuellt. Anwendung: &eig=j bei FS-NW, &ltyp=m/p/o bei Lage
-	global $gkz, $showkey, $hilfeurl, $debug, $customer;
-
-	echo "<footer>";
+	// $append wird angehÃ€ngt wenn gefÃŒllt. Anwendung: &eig=j bei FSNW, &ltyp=m/p/o bei Lage
+	global $gkz, $showkey, $hilfeurl, $debug, $dbg, $customer;
+
+	echo "\n<footer>";
 	// S c r e e n - F o o t
-	echo "\n<div class='confbereich noprint'>"
-	."\n\t<table class='outer'>\n\t<tr>";
+	echo "\n\t<div class='confbereich noprint'>"
+	."\n\t\t<table class='outer'>\n\t\t<tr>";
 
 	// Spalte 1: Info Benutzerkennung
-	if (isset($customer)) { // ÃŒber global von fkt. darf_ich()
-		echo "\n\t\t<td title='Info'><i>Benutzer:&nbsp;".$customer."</i></td>";
+	if (isset($customer) and $customer != '') { // ÃŒber global von fkt. darf_ich()
+		echo "\n\t\t\t<td title='Info'><i>Benutzer:&nbsp;".$customer."</i></td>";
 	} else {
-		echo "\n\t\t<td>&nbsp;</td>";
+		echo "\n\t\t\t<td>&nbsp;</td>";
 	}
 
 	// Spalte 2: Umschalter
-	echo "\n\t\t<td title='Konfiguration'>";
-		$mylink ="\n\t\t\t<a class='keyswitch' href='".$link."gkz=".$gkz."&amp;gmlid=".$gmlid.$append;
+	echo "\n\t\t\t<td title='Konfiguration'>";
+		$mylink ="\n\t\t\t\t<a class='keyswitch' href='".$link."gkz=".$gkz."&amp;gmlid=".$gmlid.$append;
+
 		if ($showkey) { // Umschalten SchlÃŒssel ein/aus
-			echo $mylink."&amp;showkey=n' title='Verschl&uuml;sselungen ausblenden'>Schl&uuml;ssel aus</a>";
+			echo $mylink."&amp;showkey=n";
+			if ($debug > 0 and $dbg == 0) {echo "&amp;nodebug=j";}
+			echo "' title='Verschl&uuml;sselungen ausblenden'>Schl&uuml;ssel aus</a>";
+			$mylink.="&amp;showkey=j";
 		} else {
-			echo $mylink."&amp;showkey=j' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
-		}
-		if ($debug > 0) { // FÃŒr Entwickler temporÃ€r eine Ansicht OHNE debug
-			echo "<br>".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
-		}
-	echo "\n\t\t</td>";
-
-	// Spalte 3
-	echo "\n\t\t<td title='Hilfe'>"
-		."\n\t\t\t<p class='nwlink'>\n\t\t\t\t<a target='_blank' href='".$hilfeurl."' title='Dokumentation'>Hilfe zur ALKIS-Auskunft</a>\n\t\t\t</p>\n\t\t</td>"
-		."\n\t</tr>\n\t</table>"
-	."\n</div>\n";
+			echo $mylink."&amp;showkey=j";
+			if ($debug > 0 and $dbg == 0) {echo "&amp;nodebug=j";}
+			echo "' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
+			$mylink.="&amp;showkey=n";
+		}
+
+		if ($debug > 0) {	// nur fÃŒr Entwicklung
+			if ($dbg > 0) {	// temporÃ€r eine Ansicht OHNE debug
+				echo "<br>".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Testausgaben aus</a>";
+			} else {		// Abschaltung beenden
+				echo "<br>".$mylink."' title='Debug-Ausgaben wie konfiguriert'>Testausgaben ein</a>";
+			}
+		}
+
+	echo "\n\t\t\t</td>";
+
+	// Spalte 3: Dokumentation
+	echo "\n\t\t\t<td title='Hilfe'>"
+		."\n\t\t\t\t<p class='nwlink'>\n\t\t\t\t\t<a target='_blank' href='".$hilfeurl."' title='Dokumentation'>Hilfe zur ALKIS-Auskunft</a>\n\t\t\t\t</p>\n\t\t\t</td>"
+		."\n\t\t</tr>\n\t\t</table>"
+	."\n\t</div>";
 
 	// P r i n t - F o o t
-	if (isset($customer)) {
-		echo "\n<p class='onlyprint'><i>Benutzer:&nbsp;".$customer."</i></p>";
-	}
-
-	echo "</footer>";
+	if (isset($customer) and $customer != '') {
+		echo "\n\t<p class='onlyprint'><i>Benutzer:&nbsp;".$customer."</i></p>";
+	}
+
+	echo "\n</footer>\n";
 	return 0;
+}
+
+function UnqKatAmt($t1, $t2){
+// Wenn der Datenbestand aus NBA-Verfahren mehrerer KatasterÃ€mter gemixt wurde, dann muss beim SQL-JOIN auf einige SchlÃŒsseltabellen
+// zusÃ€tzlich dafÃŒr gesort werden, dass nur die SchlÃŒssel des gleichen Katasteramtes verwendet werden. Sont bekommt man redundante Treffer.
+// BenÃ¶tigt den Alias der zu verbindenden Tabellen.
+// Liefert einen String zum EinfÃŒgen hinter "JOIN .. ON".
+	global $katAmtMix; // aus Conf
+	if ($katAmtMix){
+		return "AND substr(".$t1.".gml_id,1,6) = substr(".$t2.".gml_id,1,6) ";
+	} else {
+		return "";
+	}
 }
 
@@ -150,5 +163,5 @@
 	//  $gml_fs: GML-ID des FlurstÃŒcke (nur bei erstem Aufruf in einem FS-Nachweis notwendig)
 	//	$trtyp: Tabellen-Zeilen-Typ. Werte: 1="mit GS-Link", 2="ohne GS-Link", 3="ohne GS-Link +Zeile einfÃ€rben"
-	global $gkz, $debug, $showkey, $bartgrp, $barttypgrp, $stufe;
+	global $gkz, $dbg, $showkey, $bartgrp, $barttypgrp, $stufe, $katAmtMix;
 
 	$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
@@ -156,5 +169,5 @@
 	."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 ax_buchungsblattbezirk z ON z.land=b.land AND z.bezirk=b.bezirk ".UnqKatAmt("z","b")
 	."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
@@ -166,11 +179,17 @@
 	if (!$resbs) {
 		echo "\n<p class='err'>Fehler bei 'Buchungsstelle ausgeben'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlbs."'", $sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlbs."'", $sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	$gezeigt = 0; // Funktionswert default
-
-	if ($rowbs = pg_fetch_assoc($resbs)) { // ein Treffer
+	if ($dbg > 0) {
+		$zeianz=pg_num_rows($resbs);
+		if ($zeianz > 1){
+			echo "\n<p class='err'>Die Abfrage liefert mehr als eine (".$zeianz.") Buchung!</p>";
+			if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
+		}
+	}
+	if ($rowbs = pg_fetch_assoc($resbs)) { // EIN Treffer
 		$blattkeyber=$rowbs["blattart"]; // Schluessel von Blatt-Art des GB
-		if ($blattkeyber != '5000' or $debug > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
+		if ($blattkeyber != '5000' or $dbg > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
 			$gezeigt = 1; // Funktionswert nach Treffer
 			$hgml=$rowbs["hgml"]; // GML-ID der (herrschenden) BuchungsStelle
@@ -218,9 +237,9 @@
 				}
 
-				// +++ mehr Abstand oben zur Zeile in .css?
+				// ++ mehr Abstand oben zur Zeile in .css?
 				echo "\n\t<tr>" // Buchungsart als Zwischenzeile
 					."\n\t\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Buchungsart:</td>" // 1
 					."\n\t\t<td colspan='2' title='".$barttitle."'>"; // 2-3
-						if ($showkey) {echo "<span class='key'>(".$bartkey.")</span> ";}
+						if ($showkey) {echo "<span class='key' title='Buchungsart'>(".$bartkey.")</span> ";}
 						echo "<span class='wichtig'>".$bart."</span>"
 					."</td>"
@@ -232,5 +251,5 @@
 			echo "\n\t<tr>" // Zeile mit 4 Spalten fÃŒr Buchung und EigentÃŒmer
 				."\n\t\t<td class='ll'><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Buchung:"; // 1
-			if ($showkey and $debug > 2) {echo "<br><span class='key'>Stufe ".$stufe."<br>".$hgml."</span> ";}
+			if ($showkey and $dbg > 2) {echo "<br><span class='key'>Stufe ".$stufe."<br>".$hgml."</span> ";}
 			echo "</td>\n\t\t<td colspan='2'>"; // 2-3
 
@@ -244,5 +263,5 @@
 						."\n\t\t\t\t<td class='head'>Bezirk</td>"
 						."\n\t\t\t\t<td class='head'>";
-						if ($showkey) {echo "<span class='key'>".$blattkeyber."</span> ";}
+						if ($showkey) {echo "<span class='key' title='Blattart'>(".$blattkeyber.")</span> ";}
 						echo $blattartber."</td>"
 						."\n\t\t\t\t<td class='head'>Lfd-Nr</td>"
@@ -255,5 +274,5 @@
 					}
 					echo "\n\t\t\t\t<td title='Grundbuchbezirk'>";
-						if ($showkey) {echo "<span class='key'>".$rowbs["bezirk"]."</span><br>";}
+						if ($showkey) {echo "<span class='key' title='GB-Bezirk-Schl&uuml;ssel'>".$rowbs["bezirk"]."</span><br>";}
 						echo $beznam."</td>"
 						."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
@@ -275,6 +294,6 @@
 				echo "\n\t\t<td>"; // 4
 					echo "\n\t\t\t<p class='nwlink noprint'>";
-					// Bestand
-						if ($showkey) {echo "<span class='key'>".$blattkeyber."</span> ";}
+					//	Bestand
+						if ($showkey) {echo "<span class='key' title='Blattart'>(".$blattkeyber.")</span> ";}
 						$url="alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml;
 						if ($showkey) {$url.="&amp;showkey=j";}
@@ -283,8 +302,8 @@
 							." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''>"
 						."</a>";
-					// Buchung
+					//	Buchung
 						if ($trtyp === 1) {
 							echo "<br>";
-							if ($showkey) {echo "<span class='key'>".$bartkey."</span> ";}
+							if ($showkey) {echo "<span class='key' title='Buchungsart'>(".$bartkey.")</span> ";}
 							$url="alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$hgml;
 							if ($showkey) {$url.="&amp;showkey=j";}
@@ -305,5 +324,5 @@
 	pg_free_result($resbs);
 	
-	//if ($debug > 1) {echo "\n<p class='dbg'>Ende function buchung_anzg(), Return = ". $gezeigt ."</p>";}
+	//if ($dbg > 1) {echo "\n<p class='dbg'>Ende function buchung_anzg(), Return = ". $gezeigt ."</p>";}
 	
 	return $gezeigt; // 1 wenn eine Buchung ausgegeben wurde
@@ -318,5 +337,5 @@
 	//  $gml_fs: GML-ID des FlurstÃŒcke (nur bei erstem Aufruf in einem FS-Nachweis notwendig)
 	//	$gsanfrd: In einem GS-Nachw. die GML-ID der in de URL angeforderten Buchungsstelle (-> Hervorhebung)
-	global $debug, $gezeigt;
+	global $dbg, $gezeigt;
 
 	// sh=Buchungstelle herrschend >(Recht)an> sd=Buchungstelle dienend >istBestandteilVon> BLATT -> Bezirk
@@ -332,5 +351,5 @@
 	if (!$resber) {
 		echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmls."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmls."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	$an=0;
@@ -370,15 +389,146 @@
 }
 
-function bnw_fsdaten($lfdnr, $gml_bs, $ba, $anteil, $bvnraus, $bartkey, $bartstory) {
-/*	Bestandsnachweis - Flurstuecksdaten
-	Die Tabellenzeilen mit den Flurstuecksdaten zu EINER Buchungsstelle im Bestandsnachweis ausgeben.
-	Die Funktion wird je einmal aufgerufen fÃŒr die Buchungen direkt auf dem GB (Normalfall).
-	Weiterere Aufrufe ggf. bei Erbbaurecht fÃŒr die mit "an" verknuepften Buchungsstellen.
-	Tabellenkopf wird im aufrufenden Programm ausgegeben. */
-	global $debug, $gkz, $showkey, $filtkreis, $filtgem, $trclass;
-
-	// F L U R S T U E C K
+function bnw_bszeile_h() {
+/*	Bestandsnachweis - Buchungs-Stellen-Zeile ausgeben - herrschend.
+	Die GB-Daten hierzu stehen bereits im Kopf und bleiben in der Tab. leer */
+	global $dbg, $gkz, $showkey, $trclass, $lfdnr, $bartkey, $bart, $bartstory, $anteil;
+
+	$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
+	echo "\n<tr class='".$trclass."'>"
+	."\n\t<td id='bvnr".$bvnr."'><span class='wichtig'>".$bvnr."</span></td>" // Sprungmarke=BVNR auf dem GB-Blatt
+	."\n\t<td class='dien' title='".$bartstory."'>";
+	if ($showkey) {echo "<span class='key'>".$bartkey."</span> ";}
+	echo $bart."</td>"
+	."\n\t<td class='dien'>".$anteil."</td>"
+	."\n\t<td>&nbsp;</td>"
+	."\n\t<td>&nbsp;</td>"
+	."\n\t<td>&nbsp;</td>"
+	."\n\t<td>&nbsp;</td>"
+	."\n\t<td>&nbsp;</td>\n</tr>";
+}
+
+function bnw_bszeile_d($bezkey, $beznam, $blatt, $blattartkey, $blattart, $lfdnran, $gbgml, $gml_bsan, $ebene, $und) {
+/*	Bestandsnachweis - Buchungsstellen-Zeile ausgeben - dienend
+	Eine Folge-Zeile fÃŒr eine dienende Buchung ausgeben. */
+	global $gkz, $showkey, $trclass, $bartkey, $bart, $bartstory, $anteil;
+
+	$bvnr=str_pad($lfdnran, 4, "0", STR_PAD_LEFT);
+	$filler=str_repeat("&nbsp;", $ebene - 2); // 3 und 4 EinrÃŒcken
+	if ($und){$filler.="und ";}; // Unterscheidung Hierarchie (Ebene wechselt) von Liste (gleiche Ebene)
+	echo "\n<tr class='".$trclass."'>"
+	."\n\t<td title='Ebene ".$ebene."'>".$filler."an</td>"
+	."\n\t<td class='dien' title='".$bartstory."'>"; // Sp.2 Buchungsart
+	if ($showkey) {echo "<span class='key'>".$bartkey."</span> ";}
+	echo $bart."</td>"
+	."\n\t<td class='dien'>".$anteil."</td>"; // Sp.3 Anteil
+
+	// Sp.4 GB-Bezirk
+	echo "\n\t<td class='dien' title='Grundbuch-Bezirk'>"; 
+		if ($showkey) {echo "<span class='key'>".$bezkey."</span> ";}
+		echo htmlentities($beznam, ENT_QUOTES, "UTF-8")
+	."</td>"
+	."\n\t<td class='dien' title='".$blattart."'>".$blatt."</td>" // Sp.5
+	."\n\t<td class='dien' title='Bestandsverzeichnis-Nummer'>".$bvnr."</td>" // Sp.6
+	."\n\t<td class='dien'></td>"; 
+
+	echo "\n\t<td>\n\t\t<p class='nwlink noprint'>"; // Sp.8 Link
+
+	// Link Bestand Blatt
+	if ($showkey) {echo "<span class='key'>".$blattartkey."</span>";} // Blatt-Art
+	echo "\n\t\t\t<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "#bvnr".$lfdnran."' title='Zum Grundbuchnachweis des dienenden Blattes'>".$blattart
+	." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
+
+	if ($bartkey < 2000){
+		// Link Buchung BVNR nur fÃŒr GrundstÃŒck usw.
+		echo "<br>\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bsan;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>";	
+	}
+
+	echo "\n\t\t</p>"
+	."\n\t</td>\n</tr>";
+}
+
+function bnw_bsdaten($gml_h, $ebene) {
+/*	Bestandsnachweis - Buchungsstellen-Daten
+	"dienende" Buchungsstellen suchen. Miteigentumsanteil, Erbbaurecht usw. 
+	Return: gml_id der dienenden Buchungsstelle wenn gefunden? Sonst Leerstring */
+	global $dbg, $bartkey, $bart, $bartstory, $anteil;
+
+//	dann "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)
+//	- "zu" kommt in der Praxis (NRW) nicht vor, wird hier nicht berÃŒcksichtigt
+
+	if ($ebene > 5) {echo "\n<p class='err'>UngewÃ¶hnlich tiefe Schachtelung ".$ebene." der Buchungs-Stellen.</p>";}
+
+	$sql ="SELECT sd.gml_id, sd.buchungsart, sd.zaehler, sd.nenner, sd.laufendenummer AS lfd, sd.beschreibungdesumfangsderbuchung AS udb, "
+	."sd.nummerimaufteilungsplan AS nrap, sd.beschreibungdessondereigentums AS sond, "
+	."wb.beschreibung AS bart, wb.dokumentation, "
+	."b.gml_id as gbgml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, b.blattart, "
+	."bb.beschreibung AS blattartv, z.bezeichnung AS beznam "
+	."FROM ax_buchungsstelle sh "
+	."JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) "
+	."JOIN ax_buchungsblatt b ON b.gml_id=sd.istbestandteilvon "	
+	."LEFT JOIN ax_buchungsart_buchungsstelle wb ON sd.buchungsart = wb.wert "
+	."LEFT JOIN ax_buchungsblattbezirk z ON b.land=z.land AND b.bezirk=z.bezirk ".UnqKatAmt("b","z")
+	."LEFT JOIN ax_blattart_buchungsblatt bb ON b.blattart = bb.wert "
+	."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL "
+	."ORDER BY sd.laufendenummer;";
+	$v=array($gml_h); // gml_id "herrschende" B-Stelle
+	$resan=pg_prepare("", $sql);
+	$resan=pg_execute("", $v);
+	if (!$resan) {
+		echo "\n<p class='err'>Fehler bei 'dienende Buchungsstelle'.</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gml_bs."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+	$zeianz=pg_num_rows($resan); // Zeilen-Anzahl = Returnwert
+	//if ($dbg > 0) {echo "\n<p class='dbg'>Auf Ebene ".$ebene.": Anzahl diennende Buchungs-Stellen = ".$zeianz.".</p>";}
+	$und = false; // mehrfaches "Recht an" auf gleicher Ebene
+	while($row= pg_fetch_assoc($resan)) {
+		$gml_bsan=$row["gml_id"];	// id der dien. BS
+		$blatt=ltrim($row["blatt"], "0");		
+
+		// als Global-Var zur Sub-Function:
+		$bartkey=$row["buchungsart"];	
+		$bart=$row["bart"]; // Buchungsart, entschlÃŒsselt
+		$bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8");
+		if ($row["zaehler"] == "") {$anteil = "";} 
+		else {$anteil = $row["zaehler"]."/".$row["nenner"];}
+
+		// Zeile ausgeben Buchungsstelle dienend 
+		bnw_bszeile_d($row["bezirk"], $row["beznam"], $blatt, $row["blattart"], $row["blattartv"], $row["lfd"], $row["gbgml"], $gml_bsan, $ebene, $und);
+		$und = true;
+		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>";
+		}
+		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>";
+		}
+
+		// Rekursiver Aufruf der gleichen Function, weitere Ebene dienend?
+		$tiefer = bnw_bsdaten($gml_bsan, ($ebene + 1));
+		If ($tiefer == 0) {  // Wenn nicht, dann kann es FlurstÃŒcke dazu geben
+			$fscnt= bnw_fsdaten($gml_bsan, false); // FlurstÃŒcksdaten
+		}
+	}
+	pg_free_result($resan);
+	return $zeianz;
+}
+
+function bnw_fsdaten($gml_bs, $mit_buchung_link) {
+/*	Bestandsnachweis - FlurstÃŒcksdaten
+	Die Tabellenzeilen mit den FlurstÃŒcksdaten zu EINER Buchungsstelle im Bestandsnachweis ausgeben.
+	Die Funktion wird entweder aufgerufen fÃŒr die Buchungen direkt auf dem GB (Normalfall)
+	oder bei Erbbaurecht fÃŒr die mit "an" verknÃŒpften Buchungsstellen der untersten Ebene (dienende Buchung).
+	Der Tabellenkopf wird im aufrufenden Programm ausgegeben. 
+	Return: Anzahl der ausgegebenen FlurstÃŒcke */
+	global $dbg, $gkz, $showkey, $filtkreis, $filtgem, $trclass, $katAmtMix, $lfdnr, $altlfdnr, $bartkey, $bart, $bartstory, $anteil;
+
 	$sql="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche "
-	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
+	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
 	."WHERE f.endet IS NULL AND g.endet IS NULL AND f.istgebucht = $1 ";
 	if ($filtgem === '') { // ungefiltert
@@ -392,14 +542,6 @@
 	$resf = pg_execute("", $v);
 	if (!$resf) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck</p>";}
-
-	if($bvnraus) { // nur bei direkten Buchungen die lfdNr ausgeben
-		$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
-	} else {
-		$bvnr="";
-	}
-	$altbvnr=""; // ++ besser mit "$j === 0" steuern?
-	$j=0;
+	$zeianz=pg_num_rows($resf);
 	while($rowf = pg_fetch_assoc($resf)) {
-		$flur= $rowf["flurnummer"];
 		$fskenn=$rowf["zaehler"];
 		if ($rowf["nenner"] != "") { // Bruch
@@ -409,52 +551,47 @@
 
 		echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
-			// Sp. 1-3 der Tab. aus Buchungsstelle, nicht aus FS
-			if($bvnr === $altbvnr) { // gleiches Grundstueck, leer lassen
-				echo "\n\t<td>&nbsp;</td>"
-				."\n\t<td>&nbsp;</td>"
-				."\n\t<td>&nbsp;</td>";
-			} else { // Sprungmarke, BVNR
-				echo "\n\t<td id='bvnr".$bvnr."'>"; // Sprungmarke
-				//	echo "\n\t\t<a id='bvnr".$bvnr."'></a>";
-					echo "<span class='wichtig'>".$bvnr."</span>"
-				."\n\t</td>";
-
-				echo "\n\t<td title ='".$bartstory."'>"; // Buchungsart 
-					if ($showkey) {echo "<span class='key'>".$bartkey."</span>&nbsp;";} // Schluessel
-					echo $ba; // entschluesselt
-				echo "</td>"
-				."\n\t<td>&nbsp;</td>"; // Anteil
-			}
-
-			// Sp. 4-7 aus Flurstueck
-			echo "\n\t<td>";
-			if ($showkey) {echo "<span class='key'>".$rowf["gemarkungsnummer"]."</span> ";}
-			echo $rowf["bezeichnung"]."</td>"
-			."\n\t<td>".$flur."</td>"
-			."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span>"
-			."</td>"
-			."\n\t<td class='flag'>".$flae."</td>"; // "width" hier (flaG) erweiterbar, weil in andere Zeile die Buchungsart steht 
-			echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
-		//	if($bvnr != $altbvnr) {
-			if($j === 0) {
-				echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs;
-					if ($showkey) {echo "&amp;showkey=j";}
-					echo "' title='Grundst&uuml;cksnachweis'>Buchung "
-					."<img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''>"
-				."</a>";
-
-			}
-				echo "\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowf["gml_id"]."&amp;eig=n";
-					if ($showkey)   {echo "&amp;showkey=j";}
-					echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
-					."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
-				."</a>"
-			."\n\t\t</p>\n\t</td>"
-		."\n</tr>";
-		$altbvnr=$bvnr;
-		$j++;
+		
+		// Sp. 1-3 der Tab. Daten aus Buchungsstelle, nicht aus FS
+		if($lfdnr === $altlfdnr) { // gleiches GrundstÃŒck, leer lassen
+			echo "\n\t<td>&nbsp;</td>"
+			."\n\t<td>&nbsp;</td>"
+			."\n\t<td>&nbsp;</td>";
+		} else { // Sprungmarke, BVNR
+			$bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
+			echo "\n\t<td id='bvnr".$bvnr."'>"; // Sprungmarke
+				echo "<span class='wichtig'>".$bvnr."</span>"
+			."\n\t</td>";
+			echo "\n\t<td title ='".$bartstory."'>"; // Buchungsart 
+				if ($showkey) {echo "<span class='key'>".$bartkey."</span>&nbsp;";}
+				echo $bart;
+			echo "</td>"
+			."\n\t<td>&nbsp;</td>"; // Anteil
+			$altlfdnr=$lfdnr;
+		}
+
+		// Sp. 4-7 aus FlurstÃŒck
+		echo "\n\t<td>";
+		if ($showkey) {echo "<span class='key'>".$rowf["gemarkungsnummer"]."</span> ";}
+		echo $rowf["bezeichnung"]."</td>"
+		."\n\t<td>".$rowf["flurnummer"]."</td>\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
+		."\n\t<td class='fla'>".$flae."</td>";
+		echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
+
+		// Buchung BVNR
+		If ($mit_buchung_link == true) { // nur bei GrundstÃŒck
+			echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs;
+			if ($showkey) {echo "&amp;showkey=j";}
+			echo "' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>&nbsp;";			
+			$mit_buchung_link = false; // nur in erster Zeile
+		}
+		// Flurstk.
+		echo "\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowf["gml_id"]."&amp;eig=n";
+			if ($showkey)   {echo "&amp;showkey=j";}
+			echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
+			."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''></a>"
+		."\n\t\t</p>\n\t</td>\n</tr>";
 	}
 	pg_free_result($resf);
-	return $j;
+	return $zeianz;
 }
 
@@ -469,5 +606,5 @@
 	// Schleife 1: N a m e n s n u m m e r
 	// Beziehung: ax_namensnummer >istBestandteilVon> ax_buchungsblatt
-	global $debug, $gkz, $showkey;
+	global $dbg, $gkz, $showkey;
 
 	if ($lnkclass == "") {
@@ -484,6 +621,5 @@
 	."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, 
-	//		VerknÃŒpfungsfeld "benennt" ist leer bei "Beschrieb der Rechtsgemeinschaft".
+	// VerknÃŒpfungsfeld "benennt" ist leer bei "Beschrieb der Rechtsgemeinschaft".
 
 	$v = array($gmlid); // GB-Blatt
@@ -493,5 +629,5 @@
 	if (!$resn) {
 		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>"; // kein Fehler bei Blattarten > 1000
-		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sqln )."</p>";}
+		//if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sqln )."</p>";}
 	}
 
@@ -501,4 +637,8 @@
 		$namnum=kurz_namnr($rown["lfd"]);
 		$rechtsg=$rown["adr"];
+		$eiartkey=$rown["eigentuemerart"]; // Key
+		$eiart=$rown["eiartv"]; // Value
+	//	if ($dbg > 1) {echo "\n<p class='dbg'>Eigent&uuml:merart = '".$eiartkey."' = '".$eiart."'</p>";}
+
 		echo "\n\t<tr>";
 			if($n === 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
@@ -527,5 +667,4 @@
 
 		// Schleife 2: P e r s o n
-		// +++ bei SQL Namensnummer oben gleich mit JOIN dazu holen, statt dieser Schleife
 		// Beziehung: ax_person  <benennt<  ax_namensnummer
 		$sqlp="SELECT nachnameoderfirma, vorname, geburtsname, to_char(cast(geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, namensbestandteil, akademischergrad "
@@ -537,5 +676,5 @@
 		if (!$resp) {
 			echo "\n\t<p class='err'>Fehler bei Person</p>";
-			if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqlp)."</p>";}
+			if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqlp)."</p>";}
 		}
 
@@ -550,15 +689,13 @@
 			if ($rowp["geburtsname"] != "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
 			$diePerson=htmlentities($diePerson, ENT_QUOTES, "UTF-8"); // Umlaute
-			$eiartkey=$rown["eigentuemerart"]; // Key
-			$eiart=$rown["eiartv"]; // Value
 
 			echo "\n\t\t\t<p class='geig' title='Eigent&uuml;merart: ".$eiart."'>".$diePerson."</p>\n\t\t</td>"; // 3 - Person in Sp.3 hinter NamNum (Sp.2)
 			echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>"; // 4
-				if ($showkey AND $eiartkey != '') {echo "<span class='key' title='Eigent&uuml;merart'>".$eiartkey."</span> ";}
+				if ($showkey AND $eiartkey != '') {echo "<span class='key' title='Eigent&uuml;merart'>(".$eiartkey.")</span> ";}
 				echo "\n\t\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$gmlpers;
 				if ($showkey) {echo "&amp;showkey=j";}
-				if ($eiartkey === "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
+				if ($eiartkey == "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
 				echo $lnknach."' title='vollst&auml;ndiger Name und Adresse eines Eigent&uuml;mers'>".$eiart
-				." <img src='ico/Eigentuemer.png' width='16' height='16' alt=''></a>\n\t\t\t</p>"
+				." \n\t\t\t\t\t<img src='ico/Eigentuemer.png' width='16' height='16' alt=''>\n\t\t\t\t</a>\n\t\t\t</p>"
 			."\n\t\t</td>" // 4
 			."\n\t</tr>";
@@ -573,5 +710,5 @@
 				if (!$resa) {
 					echo "\n\t<p class='err'>Fehler bei Adressen</p>";
-					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqla)."</p>";}
+					if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqla)."</p>";}
 				}
 				$j=0;
@@ -628,7 +765,6 @@
 
 		if ($i === 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
-			if ($rechtsg === 9999) {
-				if ($debug > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
-			} else {
+			if ($dbg > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
+			if ($rechtsg !== '9999') {
 				echo "\n<p class='err'>(Die Person mit der ID '".$gmlpers."' fehlt im Datenbestand)</p>";
 			}
@@ -646,5 +782,5 @@
 	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile im JOIN mehrfach aufzulisten
 	// Anwendung: FS-Nachweis BodenschÃ€tzung
-	global $debug;
+	global $dbg;
 
 	if ($bez === 'e') {$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';} 
@@ -657,5 +793,5 @@
 	if (!$res) {
 		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")."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
 		return;
 	}
@@ -668,5 +804,5 @@
 	if ($i === 0) {
 		echo "(kein Treffer)";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	return;
@@ -676,7 +812,7 @@
 // Tabelle im Kopf von FlurstÃŒck und FS-Historie. 2 Z./Sp. Entstehung/FortfÃŒhrung
 // Parameter: Die DB-Spalten "zeitpunktderentstehung", "zeigtaufexternes_art" und "zeigtaufexternes_name"
-	global $debug, $showkey;
-
-//	if ($debug > 2) {echo "<p class='dbg'>function fortfuehrungen<br>1: ".$dbzeart."<br>2: ".$dbzename."</p>";}
+	global $dbg, $showkey;
+
+//	if ($dbg > 2) {echo "<p class='dbg'>function fortfuehrungen<br>1: ".$dbzeart."<br>2: ".$dbzename."</p>";}
  
 	echo "\n\t<table class='fsd'>" // FS-Daten 2 Spalten
Index: /trunk/info/info/alkisn/alkisinlaybaurecht.php
===================================================================
--- /trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 425)
@@ -5,9 +5,10 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
 	2020-02-03 Fenster-Weite
 	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
 	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2021-12-09 2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix)
 */
 ini_set("session.cookie_httponly", 1);
@@ -50,4 +51,5 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // Body des Inlay muss in Mapbender-Feature-Info-PopUp passen. Kleiner als 750 aus css.
@@ -59,6 +61,6 @@
 FROM ax_bauraumoderbodenordnungsrecht r 
 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;";
+LEFT JOIN ax_dienststelle d ON r.land=d.land AND r.stelle=d.stelle ".UnqKatAmt("r","d")
+."WHERE r.gml_id= $1 AND r.endet IS NULL AND d.endet IS NULL;";
 
 $v = array($gmlid);
@@ -68,8 +70,14 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Baurecht.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql)."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql)."</p>";}
 }
 echo "\n<h2><img src='ico/Gericht.png' width='16' height='16' alt=''> Bau-, Raum- oder Bodenordnungsrecht</h2>";
-
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauordnungs-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+}
 if ($row = pg_fetch_assoc($res)) {
 	echo "\n<table>"
Index: /trunk/info/info/alkisn/alkisbaurecht.php
===================================================================
--- /trunk/info/info/alkisn/alkisbaurecht.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisbaurecht.php	(revision 425)
@@ -4,9 +4,10 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
 	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)
 */
 ini_set("session.cookie_httponly", 1);
@@ -48,7 +49,8 @@
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) {die('<p class="stop1">Abbruch</p></body>');}
 
+$dbg=$debug; // CONF in Arbeits-Variable
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbaurecht.php'");
@@ -60,6 +62,6 @@
 FROM ax_bauraumoderbodenordnungsrecht r 
 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 ax_behoerde wd ON d.stellenart = wd.wert
+LEFT JOIN ax_dienststelle d ON r.land=d.land AND r.stelle=d.stelle ".UnqKatAmt("r","d")
+."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;";
 
@@ -69,5 +71,12 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Baurecht.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Baurecht-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -80,9 +89,6 @@
 	$behd=$row["dokumentation"];
 
-	// Balken
-	echo "<p class='balken recht'>ALKIS Bau-, Raum- oder Bodenordnungsrecht ".$artfest."-".$verfnr."&nbsp;</p>";
-
+	echo "<p class='balken recht'>ALKIS Bau-, Raum- oder Bodenordnungsrecht ".$artfest."-".$verfnr."&nbsp;</p>"; // Balken
 	echo "\n<h2><img src='ico/Gericht.png' width='16' height='16' alt=''> Bau-, Raum- oder Bodenordnungsrecht</h2>";
-
 	echo "\n<table>"
 		."\n<tr>"
@@ -133,8 +139,11 @@
 ."\n<p>Ermittelt durch geometrische Verschneidung. Nach Gr&ouml;&szlig;e absteigend.</p>";
 
-$sql ="SELECT f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, round(st_area(ST_Intersection(r.wkb_geometry,f.wkb_geometry))::numeric,1) AS schnittflae 
-FROM ax_flurstueck f, ax_bauraumoderbodenordnungsrecht r
+$sql ="SELECT f.gml_id, g.bezeichnung, f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche, round(st_area(ST_Intersection(r.wkb_geometry,f.wkb_geometry))::numeric,1) AS schnittflae 
+FROM ax_flurstueck f  
+JOIN ax_gemarkung g ON f.gemeindezugehoerigkeit_land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+."JOIN ax_bauraumoderbodenordnungsrecht r
+ON st_intersects(r.wkb_geometry,f.wkb_geometry) = true AND st_area(st_intersection(r.wkb_geometry,f.wkb_geometry)) > 0.05 
 WHERE r.gml_id= $1 AND f.endet IS NULL AND r.endet IS NULL ";
-if ($filtgem === '' ) { // ungefiltert
+if ($filtgem === '' ) {
 	$v=array($gmlid);
 } else {
@@ -142,9 +151,7 @@
 	$v=array($gmlid, $filtkreis, $filtgem);
 }
-$sql.="AND st_intersects(r.wkb_geometry,f.wkb_geometry) = true 
-AND st_area(st_intersection(r.wkb_geometry,f.wkb_geometry)) > 0.05 
-ORDER BY schnittflae DESC LIMIT 100;"; 
+$sql.="ORDER BY schnittflae DESC LIMIT 100;"; 
 // > 0.0 ist gemeint, Ungenauigkeit durch st_simplify
-// Limit: Flurbereinig. kann gross werden!
+// Limit: Flurbereinig. kann groÃ werden!
 // Trotz Limit lange Antwortzeit, wegen OrderBy -> intersection
 
@@ -153,10 +160,12 @@
 if (!$res) {
 	echo "\n<p class='err'>Keine Flurst&uuml;cke ermittelt.<br></p>";
-	//if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";} // ggf. mehrere Parameter!
+	//if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";} // ggf. mehrere Parameter!
 }
 
 echo "\n<table class='fs'>"
 	."\n<tr>"
-		."\n\t<td class='head' title='Flur- und Flurst&uuml;cksnummer'>Flurst&uuml;ck</td>"
+		."\n\t<td class='head' title='Gemarkung'>Gemarkung</td>"
+		."\n\t<td class='head' title='Flurnummer'>Flur</td>"
+		."\n\t<td class='head' title='Flurst&uuml;cksnummer Z&auml;hler / Nenner'>Flurst&uuml;ck</td>"
 		."\n\t<td class='heads fla' title='geometrische Schnittfl&auml;che'><img src='ico/sort.png' width='10' height='10' alt='' title='Sortierung'>Fl&auml;che</td>"
 		."\n\t<td class='head fla' title='amtliche Flurst&uuml;cksfl&auml;che, Buchfl&auml;che'>von</td>"
@@ -167,7 +176,13 @@
 	while($row = pg_fetch_assoc($res)) {
 		$fscnt++;
+		$gmkgnr=$row["gemarkungsnummer"];
+		$gemarkung=$row["bezeichnung"];
+		$nen=$row["nenner"];
 		echo "\n<tr>"
-			."\n\t<td>".$row["flurnummer"]."-<span class='wichtig'>".$row["zaehler"];
-				$nen=$row["nenner"];
+			."\n\t<td>";
+			if ($showkey) {echo "<span class='key'>(".$gmkgnr.")</span> ";}
+			echo $gemarkung."</td>"
+			."\n\t<td>".$row["flurnummer"]."</td>"
+			."\n\t<td><span class='wichtig'>".$row["zaehler"];
 				if ($nen != "") {echo "/".$nen;}
 			echo "</span></td>"
@@ -189,5 +204,5 @@
 	} else { // Wahrscheinliche Ursache = Filter
 		echo "\n<p class='err'>Kein Flurst&uuml;ck im berechtigten Bereich.</p>";
-	//	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = ".$gmlid." $2 = ".$filtkreis." $3 = ".$filtgem."</p>";}
+	//	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = ".$gmlid." $2 = ".$filtkreis." $3 = ".$filtgem."</p>";}
 	}
 } elseif ($fscnt === 100) {
@@ -196,15 +211,11 @@
 
 pg_close($con);
-echo <<<END
-
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck" /></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken" /></a>&nbsp;
-</div>
-END;
+echo "
+<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;";}
+echo "\n</div>";
 
 footer($gmlid, selbstverlinkung()."?", "");
-
 ?>
 
Index: /trunk/info/info/alkisn/alkisbauwerk.php
===================================================================
--- /trunk/info/info/alkisn/alkisbauwerk.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisbauwerk.php	(revision 425)
@@ -5,16 +5,24 @@
 	1 Bauwerk im Verkehrsbereich
 	2 Bauwerk im GewÃ€sserbereich
-	3 Sonstiges Bauwerk oder sonstige Einrichtung
-	4 Bauwerk oder Anlage fÃŒr Industrie und Gewerbe
-	5 Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung
-	6 Leitung
-	7 Transportanlage
-	8 Turm
-	9 VorratsbehÃ€lter, Speicherbauwerk
+	3 Sonstiges Bauwerk oder sonstige Einrichtung 51009
+	4 Bauwerk oder Anlage fÃŒr Industrie und Gewerbe 51002
+	5 Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung 51006
+	6 Leitung 51005
+	7 Transportanlage 51004
+	8 Turm 51001
+	9 VorratsbehÃ€lter, Speicherbauwerk 51003
 
 	Version:
 	2021-03-11 Neues Modul
 	2021-03-17 Korrekturen
-
+	2021-12-09 2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÃ€che). Debugging verbessert.
+
+ToDo:
+	- Icon fÃŒr "Bauwerk" machen! ggf. einzeln fÃŒr jede der 9 Arten?
+	- 4 weitere Objektarten, bisher nicht verwendet:
+	51007 'Historisches Bauwerk oder historische Einrichtung'
+	51008 'Heilquelle, Gasquelle'
+	51010 'Einrichtung in Ã¶ffentlichen Bereichen'
+	51011 'Besonderer Bauwerkspunkt'
 */
 
@@ -22,20 +30,21 @@
 // Ein Bauwerk "gehÃ¶rt zu" (Relation) einem GebÃ€ude. Zu diesem GebÃ€ude die Adresse(n) als Tabellen-Zeile ausgeben
 function bw_gz_lage($gmlgz) {
-	global $gkz, $debug, $showkey;
+	global $gkz, $dbg, $showkey;
 	
 	// HAUPTgebÃ€ude  Geb >zeigtAuf> lage (mehrere)
-	$sqlgz="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer "
+	$sqlgz ="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer, p.bezeichnung as gemeinde "
 	."FROM ax_gebaeude g JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf) "
-	."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
+	."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "	
+	."JOIN ax_gemeinde p ON s.land=p.land AND s.regierungsbezirk=p.regierungsbezirk AND s.kreis=p.kreis AND s.gemeinde=p.gemeinde ".UnqKatAmt("s","p")
 	."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
 
 	// ++ evtl. keine NEBEN-GebÃ€ude mÃ¶glich, nur Haupt-?
 	// UNION - oder NEBENgebÃ€ude  Geb >hat> Pseudo
-	$sqlgz.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer "
+	$sqlgz.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer, p.bezeichnung as gemeinde "
 	."FROM ax_gebaeude g JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat "
 	."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
-	."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL "; // ID des Hauses"
-
-	$sqlgz.="ORDER BY bezeichnung, hausnummer, laufendenummer;";
+	."JOIN ax_gemeinde p ON s.land=p.land AND s.regierungsbezirk=p.regierungsbezirk AND s.kreis=p.kreis AND s.gemeinde=p.gemeinde ".UnqKatAmt("s","p")	
+	."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL " // ID des Hauses"
+	."ORDER BY bezeichnung, hausnummer, laufendenummer;";
 	$v = array($gmlgz);
 	$resgz = pg_prepare("", $sqlgz);
@@ -43,6 +52,6 @@
 	if (!$resgz) {
 		echo "\n<p class='err'>Fehler bei Lage mit HsNr. zum Bauwerk</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlgz."'", $sqlgz)."</p>";}
-		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resgz)."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlgz."'", $sqlgz)."</p>";}
+		if ($dbg > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resgz)."</p>";}
 	} else {
 		echo "\n<tr>";
@@ -56,12 +65,12 @@
 			$hlfd=$rowgz["laufendenummer"];
 			$gmllag=$rowgz["lgml"];
+			$gemeinde=$rowgz["gemeinde"];
 
 			if ($ltyp === "p") {
 				$lagetitl="NebengebÃ€ude Nr. ".$hlfd;
-			//	$lagetxt="Nebengeb&auml;ude Nr. ".$hlfd; // alt
-				$lagetxt=$snam."&nbsp;".$hsnr." (".$hlfd.")";
+				$lagetxt=$snam." ".$hsnr." (".$hlfd."), ".$gemeinde;
 			} else {
 				$lagetitl="HauptgebÃ€ude - Hausnummer ".$hsnr;
-				$lagetxt=$snam."&nbsp;".$hsnr;
+				$lagetxt=$snam." ".$hsnr.", ".$gemeinde;
 			}
 
@@ -82,5 +91,5 @@
 // Eine Zeile der HTML-Tabelle ausgeben
 function tab_zeile($titel, $key, $inhalt, $ea, $ei) {
-	global $showkey, $allefelder, $debug;
+	global $showkey, $allefelder, $dbg;
 	if ($inhalt != "" OR $allefelder) {
 		echo "\n<tr>\n\t<td class='li'>".$titel."</td>\n\t<td class='fett'>";
@@ -96,5 +105,5 @@
 // Anwendung fÃŒr die DB-Spalten, die nicht bei jeder Bauwerks-Tabelle vorkommen
 function zusatz_spalte($col, $inhalt) { // Spalten-Name, Value
-	global $debug;
+	global $dbg;
 	$einh='';
 	switch ($col) {	
@@ -126,5 +135,5 @@
 	// Fehler
 		default: // noch nicht berÃŒcksichtigt
-			if ($debug > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function zusatz_spalte noch nicht ber&uuml;cksichtigt.</p>";}
+			if ($dbg > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function zusatz_spalte noch nicht ber&uuml;cksichtigt.</p>";}
 			$titel=$col;
 	}
@@ -144,6 +153,6 @@
 // inhalt = gml_id oder Array mit gml_id's
 function objektverweis($col, $inhalt) {
-	global $gkz, $showkey, $debug;
-//	if ($debug > 1) {echo "<p>Verweis Typ '".$col."' auf Objekt(e): '".$inhalt."'.</p>";}
+	global $gkz, $showkey, $dbg;
+//	if ($dbg > 1) {echo "<p>Verweis Typ '".$col."' auf Objekt(e): '".$inhalt."'.</p>";}
 	switch ($col) {
 		case 'hatdirektunten': // [] ++ Wie kann man dies Objekt finden?
@@ -168,16 +177,7 @@
 	// 'istabgeleitetaus';  'traegtbeizu': 'istteilvon': // -> Keine FÃ€lle vorhanden
 		default:
-			if ($debug > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function 'objektverweis' noch nicht ber&uuml;cksichtigt.</p>";}
-	}
-}
-// alle leer:
-//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT istabgeleitetaus IS NULL;
-//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT traegtbeizu IS NULL;
-//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT istteilvon IS NULL;
-// SELECT gml_id, hatdirektunten, st_asewkt( wkb_geometry ) as wkt FROM ax_bauwerkimgewaesserbereich WHERE NOT hatdirektunten IS NULL;
-//  1 Fall  in 290: 2 / DENW15AL360000N7 , 
-// SELECT gml_id, hatdirektunten, st_asewkt( wkb_geometry ) as wkt FROM ax_bauwerkimgewaesserbereich WHERE gml_id = 'DENW15AL360000N7';
-// 34 FÃ€lle in 200: 
-// 16 FÃ€lle in 300:
+			if ($dbg > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function 'objektverweis' noch nicht ber&uuml;cksichtigt.</p>";}
+	}
+}
 
 // S T A R T
@@ -185,5 +185,5 @@
 ini_set("session.cookie_httponly", 1);
 session_start();
-$allfld = "n"; $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
+$allfld = "n"; $showkey="n"; $nodebug=""; // Var. initalisieren
 $cntget = extract($_GET);	// Parameter in Variable umwandeln
 
@@ -224,8 +224,6 @@
 
 $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
+if ($nodebug === "j") {$dbg=0;} // Entwicklungsumgebung temporÃ€r ausschalten
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbauwerk.php'");
@@ -237,10 +235,4 @@
 
 /* in ALLEN Bauwerks-Typen folgende Spalten, bisher NICHT verwendet:
-    processstep_ax_li_processstep_mitdatenerhebung_description[] processstep_rationale[]
-    processstep_datetime[] processstep_individualname[] processstep_organisationname[] processstep_positionname[]
-    processstep_phone[] processstep_address[] processstep_onlineresource[] processstep_hoursofservice[]
-    processstep_contactinstructions[] processstep_role[] processstep_ax_datenerhebung[]
-    processstep_scaledenominator[] processstep_sourcereferencesystem[] processstep_sourceextent[] processstep_sourcestep[]
-
     herkunft_source_source_ax_datenerhebung[] herkunft_source_source_scaledenominator[] herkunft_source_source_sourcereferencesystem[]
     herkunft_source_source_sourceextent[]     herkunft_source_source_sourcestep[] */
@@ -414,12 +406,20 @@
 if (!$resb) {
 	echo "\n<p class='err'>Fehler bei Bauwerksdaten Standardfelder.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."'</p>";}
-	if ($debug > 1) {echo "\n<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";}
+	if ($dbg > 0) {
+		echo "\n<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";
+		if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."'</p>";}
+	}
 } else {
+	if ($dbg > 0) {
+		$zeianz=pg_num_rows($resb);
+		if ($zeianz > 1){
+			echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Standardfelder)</p>";
+			if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlb), ENT_QUOTES, "UTF-8")."</p>";}
+		}
+	}
 	if (!$rowb = pg_fetch_assoc($resb)) {
 		echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
 		die('<p class="stop1">Abbruch</p></body>'); // Das wÃŒrde sich sonst 2x wiederholen
-	} else {
-	// Treffer
+	} else { // Treffer
 		// Seitenkopf
 		echo "<p class='balken bauwerk".$btyp."'>ALKIS Bauwerk ".$btyp." - ".$gmlid."&nbsp;</p>"; // Balken, Farbe wie WMS
@@ -484,7 +484,16 @@
 	if (!$resk) {
 		echo "\n<p class='err'>Fehler bei Schl&uuml;sseltabelle ".$btyp."</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlk)."'</p>";}
-		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resk)."</p>";}
+		if ($dbg > 0) {
+			echo "<p class='dbg'>Fehler:".pg_result_error($resk)."</p>";
+			if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlk)."'</p>";}
+		}
 	} else {
+		if ($dbg > 0) {
+			$zeianz=pg_num_rows($resk);
+			if ($zeianz > 1){
+				echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Key-Value)</p>";
+				if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlk), ENT_QUOTES, "UTF-8")."</p>";}
+			}
+		}
 		if (!$rowk = pg_fetch_array($resk)) {
 			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
@@ -532,7 +541,16 @@
 	if (!$resz) {
 		echo "\n<p class='err'>Fehler bei Bauwerk Relation.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlz)."'</p>";}
-		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resz)."</p>";}
+		if ($dbg > 0) {
+			echo "<p class='dbg'>Fehler:".pg_result_error($resz)."</p>";
+			if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlz)."'</p>";}
+		}
 	} else {
+		if ($dbg > 0) {
+			$zeianz=pg_num_rows($resz);
+			if ($zeianz > 1){
+				echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Zusatz-Spalten)</p>";
+				if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlz), ENT_QUOTES, "UTF-8")."</p>";}
+			}
+		}
 		if (!$rowz = pg_fetch_array($resz)) {
 			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
@@ -540,5 +558,4 @@
 			// Die Spalten im Row abarbeiten
 			$anzcol=pg_num_fields($resz);
-		//	if ($debug > 1) {echo "<p class='dbg'>".$anzcol." Zusatz-Spalten vorhanden"."</p>";}
 			for ($i = 0; $i < $anzcol; $i++) {
 				$k=pg_field_name($resz, $i);
@@ -560,12 +577,20 @@
 	if (!$resr) {
 		echo "\n<p class='err'>Fehler bei Bauwerksdaten Zusatzfelder.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlr)."'</p>";}
-		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resr)."</p>";}
+		if ($dbg > 0) {
+			echo "<p class='dbg'>Fehler:".pg_result_error($resr)."</p>";
+			if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlr)."'</p>";}
+		}
 	} else {
+		if ($dbg > 0) {
+			$zeianz=pg_num_rows($resr);
+			if ($zeianz > 1){
+				echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Relationen)</p>";
+				if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlr), ENT_QUOTES, "UTF-8")."</p>";}
+			}
+		}
 		if (!$rowr = pg_fetch_array($resr)) {
 			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
 		} else { // Die Spalten im Row abarbeiten
 			$anzcol=pg_num_fields($resr);
-		//	if ($debug > 1) {echo "<p class='dbg'>".$anzcol." Relationen-Spalten vorhanden"."</p>";}
 			for ($i = 0; $i < $anzcol; $i++) {
 				$k=pg_field_name($resr, $i);
@@ -581,15 +606,10 @@
 
 echo "\n</table>\n";
-// +++ Test, ob ein zweiter Satz zum Bauwerk gefunden wird? Das sollte nicht sein.
+echo "<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;";}
+echo "\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "&amp;btyp=".$btyp);
 ?>
- 
-<div class='buttonbereich noprint'>
-	<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", "&amp;btyp=".$btyp); ?>
-
 </body>
 </html>
Index: /trunk/info/info/alkisn/alkisfshist.php
===================================================================
--- /trunk/info/info/alkisn/alkisfshist.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisfshist.php	(revision 425)
@@ -5,9 +5,10 @@
 	Flurstuecks-Historie fuer ein Flurstueckskennzeichen aus ALKIS PostNAS
 	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-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
 	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2021-12-09 Neuer Parameter $PrntBtn (Drucken-SchaltflÃ€che)
 */
 
@@ -45,5 +46,5 @@
 
 function gemkg_name($gkey) {
-//	Schluessel wird ÃŒbergeben, Name dazu in der DB nachschlagen
+//	SchlÃŒssel wird ÃŒbergeben, Name dazu in der DB nachschlagen
 	global $con;
 	$sql ="SELECT bezeichnung FROM ax_gemarkung g WHERE g.gemarkungsnummer= $1 AND g.endet IS NULL LIMIT 1;";
@@ -52,20 +53,23 @@
 	$res=pg_execute("", $v);
 	if (!$res) {echo "\n<p class='err'>Fehler bei Gemarkung.</p>";}
-	$zgmk=0;
-	while($row = pg_fetch_assoc($res)) { // eigentlich nur EINE
-		$gmkg=$row["bezeichnung"];
-		$zgmk++;
-	}
-	if ($zgmk === 0) {
+	$gmkg="";
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als eine (".$zeianz.") Gemarkung!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gkey."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	} elseif ($zeianz === 0) {
 		echo "\n<p class='err'>Gemarkung ".$gkey." ist unbekannt.</p>";
 		return;
 	}
+	if ($row = pg_fetch_assoc($res)) {
+		$gmkg=$row["bezeichnung"];
+	}
 	return $gmkg;
 }
 
 function such_vor_arr($fsk) {
-// Suchen Vorgaenger zum aktuellen Flurst. Ausgabe von Selbst-Links Zeilenweise in <td>.
-// Akt. FS und hist.FS hat keine Verweise auf Vorgaenger. Darum in den Nachfolger-Verweisen von Hist.-FS suchen.
-	global $gkz, $con, $debug, $showkey, $filtkreis, $filtgem;
+// Suchen VorgÃ€nger zum aktuellen Flurst. Ausgabe von Selbst-Links Zeilenweise in <td>.
+// Akt. FS und hist.FS hat keine Verweise auf VorgÃ€nger. Darum in den Nachfolger-Verweisen von Hist.-FS suchen.
+	global $gkz, $con, $dbg, $showkey, $filtkreis, $filtgem;
 
 	$sqlv="SELECT 'h' AS ftyp, h.gml_id, h.flurstueckskennzeichen FROM ax_historischesflurstueck h "
@@ -79,5 +83,5 @@
 	if (!$resv) {
 		echo "\n<p class='err'>Fehler bei Vorg&auml;nger-FS.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$fsk."'", $sqlv)."</p>";}
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$fsk."'", $sqlv)."</p>";}
 	}
 	$zv=0;
@@ -96,4 +100,6 @@
 	return;
 }
+
+// Start
 
 ini_set("session.cookie_httponly", 1);
@@ -141,8 +147,9 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfshist.php'");
@@ -155,5 +162,5 @@
 	$whereclause="WHERE gml_id= $1 ";
 	$v = array($gmlid);
-} elseif ($fskennz != "") { // Alternativ: Flurst.-Kennz. uebergeben
+} elseif ($fskennz != "") { // Alternativ: Flurst.-Kennz. ÃŒbergeben
 		$parmtyp="Flurst&uuml;ckskennzeichen";
 		$parmval=$fskennz;
@@ -162,9 +169,9 @@
 } else { // Pfui!
 		$parmtyp="";
-		die("Fehlender Parameter"); // bereits geprÃŒft
+		die("Fehlender Parameter");
 }
 
 if ($parmtyp != "") { // einer der beiden erlaubten FÃ€lle
-	// UNION-Abfrage auf 3Ã€hnliche Tabellen, darin aber immer nur 1 Treffer.
+	// UNION-Abfrage auf 3 Ã€hnliche Tabellen, darin aber immer nur 1 Treffer.
 	$felder="gml_id, flurnummer, cast(zaehler AS character varying), cast(nenner AS character varying), flurstueckskennzeichen, amtlicheflaeche, to_char(cast(zeitpunktderentstehung AS date),'DD.MM.YYYY') AS zeitpunktderentstehung, gemarkungsnummer, ";
 
@@ -201,5 +208,5 @@
 		$zeart=$rowu["zart"];
 		$zename=$rowu["zname"];
-		if ($gmlid == "") {$gmlid=$rowu["gml_id"];} // fuer selbst-link-Umschalter ueber footer
+		if ($gmlid == "") {$gmlid=$rowu["gml_id"];} // fÃŒr selbst-link-Umschalter ÃŒber footer
 
 		switch ($ftyp) { // Diff. Hist./Akt.
@@ -226,7 +233,7 @@
 		}
 	} else {
-		if ($debug > 1) {
+		if ($dbg > 1) {
 			echo "<br><p class='err'>Fehler! Kein Treffer f&uuml;r ".$parmtyp." = '".$parmval."'</p><br>";
-			if ($debug > 2) {
+			if ($dbg > 2) {
 				echo "<p class='dbg'>SQL=<br>".str_replace("$1", "'".$v[0]."'", $sqlu)."</p>";
 			}
@@ -297,5 +304,5 @@
 ."\n</table>";
 
-if ($debug > 1) {
+if ($dbg > 1) {
 	$z=1;
 	while($rowu = pg_fetch_assoc($resu)) {
@@ -305,13 +312,11 @@
 	}
 }
+echo "<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;";}
+echo "\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
-
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: /trunk/info/info/alkisn/alkishaus.php
===================================================================
--- /trunk/info/info/alkisn/alkishaus.php	(revision 424)
+++ /trunk/info/info/alkisn/alkishaus.php	(revision 425)
@@ -4,5 +4,5 @@
 
 	Version:
-	2016-02-24 Version fuer norGIS-ALKIS-Import
+	2016-02-24 Version fÃŒr norGIS-ALKIS-Import
 	....
 	2020-12-01 Darstellung der Datenerhebung, Klammern um SchlÃŒsselwerte
@@ -10,4 +10,6 @@
 	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). Gemeinde in Adresse
+
 ToDo:
 	- Template im WMS auf Ebene GebÃ€ude hierhin verknÃŒpfen.
@@ -53,8 +55,9 @@
 
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // 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;} 
+// Wirkt temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$dbg=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkishaus.php'");
@@ -83,5 +86,12 @@
 if (!$resg) {
 	echo "\n<p class='err'>Fehler bei Geb&auml;ude.<br>".pg_last_error()."</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($resg);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Geb&auml;ude-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlg), ENT_QUOTES, "UTF-8")."</p>";}
+	}
 }
 
@@ -164,15 +174,19 @@
 
 // HAUPTgebÃ€ude
-$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer FROM ax_gebaeude gh
+$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer, ph.bezeichnung AS gemeinde
+FROM ax_gebaeude gh
 JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(gh.zeigtauf)
-JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage
-WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
+JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage 
+LEFT JOIN ax_gemeinde ph ON lh.land=ph.land AND lh.regierungsbezirk=ph.regierungsbezirk AND lh.kreis=ph.kreis AND lh.gemeinde=ph.gemeinde ".UnqKatAmt("lh","ph")
+."WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
+
 // oder NEBENgebÃ€ude
 $sqll.=" UNION 
-SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer
+SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer, pn.bezeichnung AS gemeinde
 FROM ax_gebaeude gn
 JOIN ax_lagebezeichnungmitpseudonummer ln ON ln.gml_id=gn.hat
-JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage
-WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
+JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage 
+LEFT JOIN ax_gemeinde pn ON ln.land=pn.land AND ln.regierungsbezirk=pn.regierungsbezirk AND ln.kreis=pn.kreis AND ln.gemeinde=pn.gemeinde ".UnqKatAmt("ln","pn")
+."WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
 
 $sqll.="ORDER BY bezeichnung, hausnummer ;";
@@ -183,5 +197,5 @@
 if (!$resl) {
 	echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 $zhsnr=0;
@@ -193,4 +207,5 @@
 	$hsnr=$rowl["hausnummer"];
 	$hlfd=$rowl["laufendenummer"];
+	$gemeinde=$rowl["gemeinde"];
 	$gmllag=$rowl["gmllag"];
 
@@ -206,5 +221,5 @@
 		echo "'>".$snam."&nbsp;".$hsnr;
 		if ($ltyp === "p") {echo ", lfd.Nr ".$hlfd;}
-	echo "</a><br>";
+	echo "</a>, ".$gemeinde."<br>";
 } // Ende Loop Lagezeilen m.H.
 if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
@@ -324,5 +339,5 @@
 			if (!$resw) {
 				echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
-				if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
+				if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
 			}
 			$zw=0;
@@ -433,5 +448,5 @@
 if (!$rese) {
 	echo "\n<p class='err'>Fehler bei Datenerhebung.<br>".pg_last_error()."</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqle."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqle."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 while($rowe = pg_fetch_assoc($rese)) { // Schleife weil array-Feld, meist aber leer
@@ -469,6 +484,6 @@
 $sqlf ="SELECT f.gml_id, round(st_area(ST_Intersection(g.wkb_geometry,f.wkb_geometry))::numeric,2) AS schnittflae, 
 st_within(g.wkb_geometry,f.wkb_geometry) as drin, o.gemarkungsnummer, o.bezeichnung, f.flurnummer, f.zaehler, f.nenner 
-FROM ax_gebaeude g, ax_flurstueck f LEFT JOIN ax_gemarkung o ON f.land=o.land AND f.gemarkungsnummer=o.gemarkungsnummer
-WHERE g.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL 
+FROM ax_gebaeude g, ax_flurstueck f LEFT JOIN ax_gemarkung o ON f.land=o.land AND f.gemarkungsnummer=o.gemarkungsnummer ".UnqKatAmt("f","o")
+."WHERE g.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL 
 AND st_intersects(g.wkb_geometry,f.wkb_geometry) = true ORDER BY schnittflae DESC;";
 
@@ -478,5 +493,5 @@
 if (!$resf) {
 	echo "\n<p class='err'>Fehler bei FS-Verschneidung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlf."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".$sqlf."<br>$1 = gml_id = '".$gmlid."'</p>";}
 }
 
@@ -535,14 +550,12 @@
 echo "\n<tr>\n\t<td class='fla sum'>".$gfla."</td>\n\t<td>Geb&auml;udefl&auml;che</td>\n\t<td></td>\n</tr>";
 echo "\n</table>"; // Ende FlurstÃŒcke
+
+echo "<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;";}
+echo "\n</div>";
+
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
-
-<div class='buttonbereich noprint'>
-<hr>
-	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
-	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
-</div>
-
-<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
-
 </body>
 </html>
Index: /trunk/info/info/alkisn/alkisinlayausk.php
===================================================================
--- /trunk/info/info/alkisn/alkisinlayausk.php	(revision 424)
+++ /trunk/info/info/alkisn/alkisinlayausk.php	(revision 425)
@@ -17,4 +17,5 @@
 	2020-12-15 Input-Validation und Strict Comparisation (===)
 	2021-03-09 Link zum GebÃ€udenachweis auch mit "Bauwerke" betiteln
+	2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix)
 */
 ini_set("session.cookie_httponly", 1);
@@ -56,6 +57,7 @@
 <body class ="mbfi">
 END;
-// <body style='width: 98%;'>
+
 $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+$dbg=$debug; // CONF in Arbeits-Variable
 
 // Body des Inlay muss in Mapbender-Feature-Info-PopUp passen. Kleiner als 750 aus css.
@@ -65,6 +67,6 @@
 // *** 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.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;";
+FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
+."WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL;";
 
 $v = array($gmlid);
@@ -73,7 +75,13 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Flurstuecksdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
-}
-
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+}
+if ($dbg > 0) {
+	$zeianz=pg_num_rows($res);
+	if ($zeianz > 1){
+		echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Flurst&uuml;cks-Objekt!</p>";
+		if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+}
 if ($row = pg_fetch_assoc($res)) {
 	$gemkname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");
@@ -97,5 +105,5 @@
 if ( ($filtkreis != '' and $filtkreis != $fskrs) or ($filtgem != '' and $filtgem != $fsgem) ) {
 	// Einer der gesetzten Filter passt nicht
-	if ($debug > 2) {
+	if ($dbg > 2) {
 		echo "\n<p class='err'>Filter Kreis='".$filtkreis."', Gemeinde='".$filtgem."'</p>";
 		echo "\n<p class='err'>Flstk. Kreis='".$fskrs."', Gemeinde='".$fsgem."'</p>";
@@ -125,12 +133,15 @@
 	."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
 ."</a><br>";
+
 // FS-Historie
-echo "\n\t\t\t\t<a href='javascript:imFenster(\"alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$gmlid."\")' "
-	."title='Vorg&auml;nger des Flurst&uuml;cks'>Historie&nbsp;"
-	."<img src='ico/Flurstueck_Historisch.png' width='16' height='16' alt=''>"
-."</a><br>";
-// Gebaeude-NW zum FS
+if ($fsHistorie){ // conf
+	echo "\n\t\t\t\t<a href='javascript:imFenster(\"alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$gmlid."\")' "
+		."title='Vorg&auml;nger des Flurst&uuml;cks'>Historie&nbsp;"
+		."<img src='ico/Flurstueck_Historisch.png' width='16' height='16' alt=''>"
+	."</a><br>";
+}
+// GebÃ€ude-NW zum FS
 echo "\n\t\t\t\t<a href='javascript:imFenster(\"alkisgebaeudenw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."\")' "
-	."title='Geb&auml;ude oder Bauwerke'>Geb&auml;ude/Bauw.&nbsp;"
+	."title='Geb&auml;ude oder Bauwerke auf oder an diesem Flurst&uuml;ck'>Geb&auml;ude/Bauw.&nbsp;"
 	."<img src='ico/Haus.png' width='16' height='16' alt=''>"
 ."</a>";
@@ -149,5 +160,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung mit Hausnummer.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $j=0;
@@ -192,5 +203,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung ohne Hausnummer.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
+	if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $kgmlalt='';
@@ -216,7 +227,7 @@
 	}
 	echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>";
-	if ($sname != "") { // Typ=Strasse
+	if ($sname != "") { // Typ=StraÃe
 		$kgml=$row["kgml"]; // Wiederholung vermeiden
-		if ($kgml != $kgmlalt) { // NEUE Strasse vor Lage-O
+		if ($kgml != $kgmlalt) { // NEUE StraÃe vor Lage-O
 			$kgmlalt=$kgml; // Katalog GML-ID
 			echo "\n\t\t\t<a class='noprint' title='Flurst&uuml;cke mit oder ohne Hausnummer".$slink."' "
Index: /trunk/mapbender/http/nav/alkisnav_grd.php
===================================================================
--- /trunk/mapbender/http/nav/alkisnav_grd.php	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav_grd.php	(revision 425)
@@ -10,4 +10,6 @@
 	2018-11-12 Full-Schema
 	2019-02-12 Sortierung FlurstÃŒcksnummer repariert
+	2021-11-24 Neue Var. $katamtmix  (Kataster-Amt-Mix).
+	           SchlÃŒsseltabellen sind mehrfach belegt. Dadurch doppelte Treffer bei der Suche.
 */
 
@@ -107,5 +109,5 @@
 	$linelimit=40;
 
-	$sql="SELECT stelle, bezeichnung AS ag FROM ax_dienststelle "
+	$sql="SELECT DISTINCT stelle, bezeichnung AS ag FROM ax_dienststelle "
 	."WHERE stelle IN (".$liste_ag.") AND stellenart = 1000 AND endet IS NULL ORDER BY bezeichnung LIMIT $1 ;";
 	$res = pg_prepare("", $sql);
@@ -138,5 +140,5 @@
 	// Auch wenn BlÃ€tter vorhanden sind, kann es eine "Sackgasse" sein.
 	// Manchmal haben die BlÃ€tter keine FlurstÃŒcke im Filter-Bereich (Gemeinde).
-	global $debug;
+	global $debug, $katamtmix;
 	$linelimit=100; // Bezirke/AG
 
@@ -146,6 +148,7 @@
 	// Body
 	// Die Subquery stellt sicher, dass nur Bezirke aufgelistet werden, die auch BlÃ€tter enthalten
-	$sql ="SELECT g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle "
-	."WHERE a.stelle = $1 AND a.stellenart = 1000 AND a.endet IS NULL AND g.endet IS NULL "
+	$sql ="SELECT DISTINCT g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle ";
+	if ($katamtmix){$sql.="AND substr(g.gml_id,1,6) = substr(a.gml_id,1,6) ";}
+	$sql.="WHERE a.stelle = $1 AND a.stellenart = 1000 AND a.endet IS NULL AND g.endet IS NULL "
 	."AND NOT (SELECT gml_id FROM ax_buchungsblatt b WHERE b.land=g.land AND b.bezirk=g.bezirk AND b.endet IS NULL LIMIT 1) IS NULL "
 	."ORDER BY g.bezeichnung LIMIT $2 ;";
@@ -180,7 +183,9 @@
 	// Zu einem Grundbuchbezirks-SchlÃŒssel die Zeilen "AG" und "Bezirk" ausgeben
 	// Parameter = SchlÃŒssel des Bezirks
-	#global $debug;
+	global $katamtmix;
 	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezeichnung FROM ax_buchungsblattbezirk g "
-	."JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle WHERE g.bezirk= $1 AND g.endet IS NULL AND a.endet IS NULL LIMIT 1;";
+	."JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle ";
+	if ($katamtmix){$sql.="AND substr(g.gml_id,1,6) = substr(a.gml_id,1,6) ";}
+	$sql.="WHERE g.bezirk= $1 AND g.endet IS NULL AND a.endet IS NULL LIMIT 1;";
 	$v=array($gbbez);
 	$res=pg_prepare("", $sql);
@@ -209,10 +214,11 @@
 function SuchGBBezName() {
 	// Grundbuch-Bezirk suchen nach Name(-nsanfang)
-	global $gkz, $gemeinde, $debug, $gbkennz;
+	global $gkz, $gemeinde, $debug, $gbkennz, $katamtmix;
 	$linelimit=80;
 
-	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g "
-	."JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle "
-	."WHERE g.bezeichnung ILIKE $1 AND g.endet IS NULL AND a.endet IS NULL "
+	$sql ="SELECT DISTINCT a.stelle, a.bezeichnung AS ag, g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g "
+	."JOIN ax_dienststelle a ON g.gehoertzu_stelle = a.stelle ";
+	if ($katamtmix){$sql.="AND substr(g.gml_id,1,6) = substr(a.gml_id,1,6) ";}
+	$sql.="WHERE g.bezeichnung ILIKE $1 AND g.endet IS NULL AND a.endet IS NULL "
 	."ORDER BY a.bezeichnung, g.bezeichnung LIMIT $2 ;"; // "AND a.stellenart=1000 " Amtsgericht
 	if ( $gbkennz == "") {
@@ -307,5 +313,4 @@
 function gml_blatt() {
 	// Kennzeichen "Bezirk + Blatt" eingegeben. Dazu die gml_id des Blattes ermitteln.
-	// 2018-10: Sonderfall Buchstabe: Auch finden wenn der nicht eingegeben wurde.
 	global $debug, $zgbbez, $zblatt, $zblattn, $zblattz;
 	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b "
@@ -380,5 +385,5 @@
 		$gef_blatt=$row["blatt"];	// gefunden ggf. mit Buchstabe (Wildcard)
 		if ($zblatt != $gef_blatt) {
-			echo "\n<p class='dbg'>Blatt mit Buchstabenerweiterung gefunden.</p>";
+		//	echo "\n<p class='dbg'>Blatt mit Buchstabenerweiterung gefunden.</p>";
 			$zblatt=$gef_blatt;
 			$zblattz=substr($zblatt, strlen($zblatt)-1, 1);
@@ -397,5 +402,5 @@
 	// Die gml_id der Buchungsstelle (BVNR, GrundstÃŒck) ist bekannt = $buchunggml
 	// Die gebuchten FlurstÃŒcke und dienende/herrschenden Buchungen werden ausgegeben.
-	global $debug, $gemeinde, $epsg, $buchunggml, $zgbbez, $zblatt, $zblattn, $zblattz, $zbvnr, $gfilter;
+	global $debug, $gemeinde, $epsg, $buchunggml, $zgbbez, $zblatt, $zblattn, $zblattz, $zbvnr, $gfilter, $katamtmix;
 	// NoLimit?
 
@@ -409,5 +414,4 @@
 			echo "<p class='err'>Kennzeichen Bezirk und Blatt nicht gesetzt</p>";
 		} // ++ suchen!
-	//	zeile_buchung($buchunggml, $zbvnr, $zgbbez."-".$zblattn.$zblattz, false, true);
 		zeile_buchung($buchunggml, $zbvnr, $zgbbez."-".$zblatt, false, true); // $zblatt wird aktualisiert, wenn Buchstabe gefunden wurde
 	}
@@ -445,4 +449,5 @@
 	// Direkte Buchungen (Flurst.)
 	$sql =$sqlanf."FROM ax_flurstueck f JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ";
+	if ($katamtmix){$sql.="AND substr(g.gml_id,1,6) = substr(f.gml_id,1,6) ";}
 	$sql.="WHERE f.istgebucht = $1 AND f.endet IS NULL ".$sqlfilter."ORDER BY f.gemarkungsnummer, f.flurnummer, cast(f.zaehler AS integer), cast(f.nenner AS integer);";
 
@@ -482,8 +487,10 @@
 	."FROM ax_buchungsstelle sh JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) "
 	."JOIN ax_flurstueck f ON f.istgebucht=sd.gml_id "
-	."JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
-	."JOIN ax_buchungsblatt bd ON sd.istbestandteilvon=bd.gml_id "
-	."JOIN ax_buchungsblattbezirk gd ON bd.land=gd.land AND bd.bezirk=gd.bezirk "
-	."WHERE sh.gml_id = $1 AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND bd.endet IS NULL AND gd.endet IS NULL "
+	."JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ";
+	if ($katamtmix){$sql.="AND substr(f.gml_id,1,6) = substr(g.gml_id,1,6) ";}
+	$sql.="JOIN ax_buchungsblatt bd ON sd.istbestandteilvon=bd.gml_id "
+	."JOIN ax_buchungsblattbezirk gd ON bd.land=gd.land AND bd.bezirk=gd.bezirk ";
+	if ($katamtmix){$sql.="AND substr(bd.gml_id,1,6) = substr(gd.gml_id,1,6) ";}
+	$sql.="WHERE sh.gml_id = $1 AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND bd.endet IS NULL AND gd.endet IS NULL "
 
 	.$sqlfilter."ORDER BY gd.bezeichnung, bd.buchungsblattnummermitbuchstabenerweiterung, cast(sd.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, cast(f.zaehler AS integer), cast(f.nenner AS integer);";
@@ -494,7 +501,5 @@
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Buchungsstelle (gml, Recht an).</p>";
-		if ($debug >= 3) {
-			echo "\n<p class='err'>'".$sql."'<br>\nmit $1 ='".$buchunggml."'</p>";
-		}
+		if ($debug >= 3) {echo "\n<p class='err'>'".$sql."'<br>\nmit $1 ='".$buchunggml."'</p>";}
 	}
 	$zfs2=0;
@@ -544,7 +549,5 @@
 }
 
-// ===========
 // Start hier!
-// ===========
 
 // Validation: Eingabefeld aus Formular.
Index: /trunk/mapbender/http/nav/alkisnav.css
===================================================================
--- /trunk/mapbender/http/nav/alkisnav.css	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav.css	(revision 425)
@@ -5,21 +5,23 @@
 	2014-02-06 kosmetische Ãberarbeitung
 	2015-12-10 Rahmen breiter, mehr HsNr je Zeile
+	2021-12-29 Abstand vor .hn
 */
-body,p,a,.textfield,.sbutton	{font-family: Verdana, Arial, Helvetica, sans-serif;}
+body,p,a,.textfield,.sbutton {font-family: Verdana, Arial, Helvetica, sans-serif;}
 body {font-size: 11px; color: #000000; margin: 0px; border: 0px;}
 p {font-size: 10px;}
-p.hilfe 	{font-size:  9px; text-align: right; color: gray; padding-right: 3px;} /* Programmier-Hilfsfelder */
-p.start 	{font-size:  9px; color: gray; padding: 2px; margin: 2px; border: 0px;}
+p.hilfe {font-size:  9px; text-align: right; color: gray; padding-right: 3px;} /* Programmier-Hilfsfelder */
+p.start {font-size:  9px; color: gray; padding: 2px; margin: 2px; border: 0px;}
 p.nam {font-size: 10px; border: 1px solid navy; padding: 3px; margin: 0px; color: maroon;}
 p.err {font-size: 11px; color: red;} /* Fehler -> Anwender */
 p.dbg {font-size: 10px; color: gray;} /* Debug -> Entwickler */
-p.ein, p.anz, p.blt	{font-size: 9px; text-align: right;} /* Einleitung, Anzahl am Ende, BlÃ€ttern weitere ... */
-p.ein  {color: navy; font-weight: bold;}
+p.ein, p.anz, p.blt {font-size: 9px; text-align: right;} /* Einleitung, Anzahl am Ende, BlÃ€ttern weitere ... */
+p.ein {color: navy; font-weight: bold;}
 p.anz, p.blt {color: purple;}
+p.hn {color: gray; margin-left: 28px; margin-top: 8px; margin-bottom: 2px;} /* Hist.-Nachf. Ãberschr. */
 
 a {text-decoration: none;}
 a:hover, a:active {color: red;}
 a.hislnk {color: gray; font-style: italic; text-align: right; padding-left: 50px;} /* Link zur Historie */
-a.hsnro	{color: gray; font-style: italic;} /* HsNr ohne Haus */
+a.hsnro {color: gray; font-style: italic;} /* HsNr ohne Haus */
 a.blt {color: maroon; background-color: yellow;} /* Link weitere ... */
 
@@ -37,5 +39,5 @@
 div.fs {color: navy; margin-left: 28px; margin-top: 0px;} /* Flurstueck */
 div.hi {color: gray; margin-left: 28px; margin-top: 0px;} /* Historie */
-div.hn, p.hn	{color: gray; margin-left: 28px; margin-top: 0px;} /* Historie-Nachfolger */
+div.hn {color: gray; margin-left: 28px; margin-top: 0px;} /* Historie-Nachfolger */
 
 div.stu {color: maroon; font-size: 13px;} /* Strasse - Ueberschrift */
Index: /trunk/mapbender/http/nav/alkisnav_fls.php
===================================================================
--- /trunk/mapbender/http/nav/alkisnav_fls.php	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav_fls.php	(revision 425)
@@ -10,4 +10,10 @@
 	2018-11-12 Full-Schema
 	2019-02-12 Sortierung FlurstÃŒcksnummer wieder hergestellt (kaputt gegangen bei Umstellung Full-Schema)
+	2021-11-24 fÃŒhrende '0' Trimmen bei Flur, ZÃ€hler, Nenner in der Zerlegung
+	2021-12-29 Sortierung der Nachfolger eines hist. FS
+	
+ToDo:
+	Vermeiden der Tabellen "gema_shl" und "gem_shl". Das sind NorBIT/ALB-Relikte, die irgendwann entfallen werden.
+	Besser primÃ€re ax_*-Tabellen verwenden.
 */
 
@@ -129,5 +135,5 @@
 
 	if (count($arr) > 1) {
-		$zflur=h_hinten($arr[1]);
+		$zflur=ltrim(h_hinten($arr[1]), '0');
 		if (count($arr) > 2) {
 			$zfsnr=trim($arr[2]);
@@ -172,6 +178,11 @@
 	} else {
 		$zn=explode("/", $zfsnr, 2); // Bruchnummer?
-		$zzaehler=h_hinten(trim($zn[0]));
-		if (count($zn) > 1) {$znenner=h_hinten(trim($zn[1]));} else {$znenner="";}
+		$zzaehler=ltrim(h_hinten(trim($zn[0])), '0');
+		if (count($zn) > 1) {
+			$znenner=ltrim(h_hinten(trim($zn[1])), '0');
+		} else {
+			$znenner="";
+		}
+	//	if ($debug > 1) {echo "<p class='dbg'>Gemkg: '".$gemkg."' Flur: '".$zflur."' Zaehler: '".$zzaehler."' Nenner: '".$znenner."'</p>";}
 		if ( ! is_ne_zahl($zzaehler)) {
 			echo "<p class='err'>FlurstÃŒcksnummer '".$zzaehler."' ist nicht numerisch</p>";
@@ -283,6 +294,6 @@
 		echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath.$auskprog.".php?gkz=".$gkz."&amp;gmlid=".$gml."\")'>";
 			echo "\n\t\t<img class='nwlink' src='ico/".$ico."' width='16' height='16' alt='FS' title='Nachweis'>";
-		echo "\n\t</a> ";		
-		echo "Flst. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fs.$hisparm."'>".$fskenn."</a>";					
+		echo "\n\t</a>&nbsp;";		
+		echo "hist. Flst. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fs.$hisparm."'>".$fskenn."</a>";					
 	echo "\n</div>";
 	return;
@@ -418,10 +429,8 @@
 		echo "\n<p class='anz'>Keine Gemarkung.</p>";
 		if ($debug > 1) {
-/*
-			// Nach Umstellung auf NorGIS-Struktur muss im Mapbender die Gemeinde 3stellig konfiguriert werden
+/*			// Nach Umstellung auf NorGIS-Struktur muss im Mapbender die Gemeinde 3stellig konfiguriert werden
 			if (strlen($gemeinde) < 3) {
 				echo "<p class='err'>URL-Parameter &gemeinde=nnn im Mapbender gazetteer_alkis.SRC muss 3stellig sein!<br>Ist aber '".$gemeinde."'.</p>";
-			}
-*/
+			} */
 			if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1 = ".$match."</p>";}
 		}
@@ -473,5 +482,5 @@
 	if ($AuchGemkZeile) { // Kopf davor ausgeben
 		if (! gg_head($zgemkg6, true)) {
-			if ($debug >= 1) {echo "\n<p class='dbg'>Gem.-Gemkg.-Kopf abgebrochen</p>";}	
+			if ($debug > 0) {echo "\n<p class='dbg'>Gem.-Gemkg.-Kopf abgebrochen</p>";}	
 			return false;
 		} 
@@ -479,4 +488,5 @@
 
 	// Body
+	// ++ ToDo: (optional) nur Fluren ausgeben, in denen auch FlurstÃŒcke enthalten sind.
 	$sql ="SELECT gemarkungsteilflur AS flur FROM ax_gemarkungsteilflur f WHERE gemarkung= $1 ORDER BY gemarkungsteilflur LIMIT $2 ;";
 	$v=array($zgemkg4, $linelimit);
@@ -621,10 +631,6 @@
 	}
 	$sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND f.zaehler= $3 ";
-
 	If ($znenner != "") {
-		$suchnenn = ltrim($znenner, '0');
-		If ($suchnenn != "") {
-			$sql.="AND f.nenner='".$suchnenn."' ";
-		}
+		$sql.="AND f.nenner='".$znenner."' ";
 	}
 	$sql.="AND endet IS NULL ORDER BY cast(f.zaehler AS integer), cast(f.nenner AS integer);";
@@ -732,5 +738,6 @@
 			$nasql ="SELECT 'a' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_flurstueck ".$nawhcl
 			."UNION SELECT 'h' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueck ".$nawhcl
-			."UNION SELECT 'o' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueckohneraumbezug ".$nawhcl;
+			."UNION SELECT 'o' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueckohneraumbezug ".$nawhcl
+			."ORDER BY gemarkungsnummer, flurnummer, zaehler, nenner";
 
 			$v=array();
@@ -773,8 +780,7 @@
 }
 
-// ===========
 // Start hier!
-// ===========
-if ($debug >= 1) {echo "\n<p class='dbg'>gemeinde='".$gemeinde."'. gfilter='".$gfilter."'</p>";}
+
+// if ($debug >= 1) {echo "\n<p class='dbg'>gemeinde='".$gemeinde."'. gfilter='".$gfilter."'</p>";}
 
 // Validation: Eingabefeld aus Formular.
@@ -800,5 +806,5 @@
 } else { // Die Formular-Eingabe interpretieren (kann auch ein Link sein)
 	$retzer=ZerlegungFsKennz($fskennz);
-	if ($debug >= 1) {echo "\n<p class='dbg'>Return Zerlegung: ".$retzer."</p>";}	
+	if ($debug > 1) {echo "\n<p class='dbg'>Return Zerlegung: ".$retzer."</p>";}	
 	switch ($retzer) { // Returnwert der Zerlegung des FS-Kennz.
 	case 0: // leere Eingabe
Index: /trunk/mapbender/http/nav/alkisnav_fkt.php
===================================================================
--- /trunk/mapbender/http/nav/alkisnav_fkt.php	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav_fkt.php	(revision 425)
@@ -11,4 +11,6 @@
 	2018-11-09 Full-Schema
 	2019-02-12 Sortierung FlurstÃŒcksnummer repariert
+	2021-11-23 Neue Var. $katamtmix  (Kataster-Amt-Mix).
+	           SchlÃŒsseltabellen sind mehrfach belegt. Dadurch doppelte Treffer bei der Suche.
 */
 
@@ -316,5 +318,5 @@
 	// Zu einem Grundbuch-Blatt (identifiziert ÃŒber seine gml_id) suchen der 
 	// Buchungen (Gruppenwechsel) und FlurstÃŒcke (Links)
-	global $gemeinde, $blattgml, $epsg, $gfilter, $debug;
+	global $gemeinde, $blattgml, $epsg, $gfilter, $debug, $katamtmix;
 
 	// SQL-Bausteine
@@ -337,6 +339,7 @@
 
 	// hinten gleich
-	$sql2="JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
-		."WHERE s1.istbestandteilvon = $1 AND f.endet IS NULL AND s1.endet IS NULL ";
+	$sql2 ="JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ";
+	if ($katamtmix){$sql2.="AND substr(f.gml_id, 1, 6) = substr(g.gml_id, 1, 6) ";}
+	$sql2.="WHERE s1.istbestandteilvon = $1 AND f.endet IS NULL AND s1.endet IS NULL ";
 
 	switch ($gfilter) {
Index: /trunk/mapbender/http/nav/alkisnav_eig.php
===================================================================
--- /trunk/mapbender/http/nav/alkisnav_eig.php	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav_eig.php	(revision 425)
@@ -11,4 +11,7 @@
 	2018-11-12 Full-Schema
 	2019-02-12 Sortierung FlurstÃŒcksnummer repariert
+	2021-12-01 Fehlerkorrektur "benennt". Neue Var. $katamtmix  (Kataster-Amt-Mix).
+	           SchlÃŒsseltabellen sind mehrfach belegt. Dadurch doppelte Treffer bei der Suche.
+			   Weitere Buchstaben fÃŒr Namen-Suche zugelassen.
 */
 
@@ -110,5 +113,5 @@
 function personendaten() { 
 	// Adresse und Geburtsdatum der aktuellen Person ausgeben
-	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath; // $debug
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath;
 	$sql ="SELECT p.nachnameoderfirma, p.vorname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, p.namensbestandteil, "
 	."a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer "
@@ -162,5 +165,5 @@
 	$linelimit=150;
 	$arr = explode(",", $name);
-	$name0 = trim($arr[0]);	// Nachname
+	$name0 = trim($arr[0]);		// Nachname
 	if (count($arr) > 1) {
 		$name1=trim($arr[1]);	// Vorname
@@ -245,5 +248,5 @@
 // Alternativ wÃŒrde eine Hilfstabelle benÃ¶tigt, in der im PostProcessing 
 // das GB-zu-Gemeinde-VerhÃ€ltnis vorbereitet wird.
-	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $debug, $bltbez, $bltblatt, $bltseite, $kennztyp, $zgbbez;
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $debug, $bltbez, $bltblatt, $bltseite, $kennztyp, $zgbbez, $katamtmix;
 	$linelimit=150;
 
@@ -256,10 +259,11 @@
 	$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
 	."FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id "
-	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
-	."WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;";
+	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
+	if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
+	$sql.="WHERE n.benennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL ";
 
 	// Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk"
 	if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
-		#if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
+		#if ($debug > 1) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
 		$sql.="AND b.bezirk='".$zgbbez."' ";
 		$bezirkaktuell = true;
@@ -333,5 +337,5 @@
 // Im zweiten Schritt wird gesucht nach Rechten einer Buchungstelle des durchsuchten Blattes an anderen
 // Buchungstellen.
-	global $gkz, $gemeinde, $name, $person, $blattgml, $epsg, $gfilter, $debug;
+	global $gkz, $gemeinde, $name, $person, $blattgml, $epsg, $gfilter, $debug, $katamtmix;
 	if($backlink) { // Erneuter Ansatz bei Person oder GB mÃ¶glich.
 
@@ -347,6 +351,7 @@
 		// Grundbuch-Daten ermitteln
 		$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
-		."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
-		."WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
+		."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
+		if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
+		$sql.="WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
 		$v=array($blattgml);
 		$res=pg_prepare("", $sql);
@@ -376,5 +381,5 @@
 // weil "ungefiltert" in "2+3" zu lange Listen entstehen wÃŒrden, die durchblÃ€ttert werden mÃŒssen. 
 
-	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $gfilter, $debug, $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht, $kennztyp, $zgbbez;
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $gfilter, $debug, $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht, $kennztyp, $zgbbez, $katamtmix;
 	$linelimit=80; // als Limit "Anzahl FlurstÃŒcke" in den beiden folgenden Abfragen
 	// darf nun etwas knapper sein, weil man jetzt blÃ€ttern kann
@@ -406,6 +411,7 @@
 	$sql1.="FROM ax_namensnummer nn "
 	."JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon "
-	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
-	."JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
+	."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
+	if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
+	$sql1.="JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
 
 	// Baustein A: Auswahl 1 oder 2
@@ -621,7 +627,6 @@
 }
 
-// ===========
 // Start hier!
-// ===========
+
 // Parameter:  
 // 1. name   = Suche nach Namensanfang oder -bestandteil.
@@ -633,5 +638,5 @@
 // Hier formatierte Meldung und html-Foot.
 if (isset($name) and $name != "" ) { 
-	if (!preg_match('#^[a-zA-Z0-9Ã€Ã¶ÃŒÃÃÃÃ*,. \-&/]{1,50}$#', $name)) {
+	if (!preg_match('#^[a-zA-Z0-9Ã€Ã¶ÃŒÃÃÃÃÅŸÅœÅ¡Å *,. \-&/]{1,50}$#', $name)) {
 		echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
 	//	if ($debug > 1) {echo "<p class='err'>Name='".$name."' LÃ€nge='".strlen($name)."</p>";}
Index: /trunk/mapbender/http/nav/alkisnav_adr.php
===================================================================
--- /trunk/mapbender/http/nav/alkisnav_adr.php	(revision 424)
+++ /trunk/mapbender/http/nav/alkisnav_adr.php	(revision 425)
@@ -8,4 +8,7 @@
 	2018-02-15 Strikte Input-Validation der Parameter
 	2018-11-12 Full-Schema
+	2021-11-24 Neue Var. $katamtmix  (Kataster-Amt-Mix).
+	           SchlÃŒsseltabellen sind mehrfach belegt. Dadurch doppelte Treffer bei der Suche.
+
 ToDo:
 	-	Gruppierung (mit Zeile) der StraÃenliste nach Gemeinde
@@ -47,5 +50,4 @@
 	$gfilter = 0;
 }
-// // http://skrzmaptest01.asp.krzwan.de/mapbender/nav/alkisnav_adr.php?gkz=210&gemeinde=004&epsg=25832&str_schl=0575800401798
 if (isset($str_schl) ) {
 	if (!preg_match('#^[0-9]{4,13}$#', $str_schl)) {die("Eingabefehler Stra&zlig;enschl&uuml;ssel");}
@@ -90,9 +92,9 @@
 function suchStrName() {
 	// Strassen nach Name(-nsanfang)
-	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath, $katamtmix;
 	//if ($debug > 1) {echo "<p class='dbg'>function suchStrName()<p>";} // Ablauf-Verfolgung
 
 	$linelimit=120;  // -> in Conf?
-	$str_schl=""; // Loeschen vorh. Ergebnis
+	$str_schl=""; // LÃ¶schen vorh. Ergebnis
 	preg_match("/^(\D+)(\d*)(\D*)/",$street,$matches); # 4 matches name/nr/zusatz 
 	//echo "match: 1='".$matches[1]."', 2='".$matches[2]."', 3='".$matches[3]."'";
@@ -108,6 +110,7 @@
 	$sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage "
 	."FROM ax_lagebezeichnungkatalogeintrag k "
-	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
-	."WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
+	if ($katamtmix){$sql.="AND substr(k.gml_id,1,6) = substr(g.gml_id,1,6) ";}
+	$sql.="WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
 
 	switch ($gfilter) {
@@ -143,5 +146,5 @@
 			$gwgem=$gemname;
 		}
-		$gkey=$row["schluesselgesamt"]; // Land-RegBez-Kreis-Gem-Strasse - fÃŒr weitere Suche
+		$gkey=$row["schluesselgesamt"]; // Land-RegBez-Kreis-Gem-StraÃe - fÃŒr weitere Suche
 		$skey=$row["lage"]; // Nur Str.-schl. daraus
 		$kgml=$row["gml_id"]; // ID von Katalog
@@ -164,6 +167,6 @@
 }
 
-function suchStrKey() { // Strassen nach num. Schluessel
-	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+function suchStrKey() { // StraÃen nach num. SchlÃŒssel
+	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath, $katamtmix;
 	//if ($debug > 1) {echo "<p class='dbg'>function suchStrKey()<p>";} // Ablauf-Verfolgung
 	$linelimit=60;
@@ -174,8 +177,10 @@
 		$match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten 
 	}
+
 	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage "
 	."FROM ax_lagebezeichnungkatalogeintrag as k "
-	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
-	."WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
+	if ($katamtmix){$sql.="AND substr(k.gml_id,1,6) = substr(g.gml_id,1,6) ";}
+	$sql.="WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
 	switch ($gfilter) {
 		case 1: // Einzelwert
@@ -217,16 +222,17 @@
 }
 
-function suchHausZurStr($showParent) { // Haeuser zu einer Strasse
-	global $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+function suchHausZurStr($showParent) { // HÃ€user zu einer StraÃe
+	global $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug, $auskpath, $katamtmix;
 	//if ($debug > 1) {echo "<p class='dbg'>function suchHausZurStr()<p>";} // Ablauf-Verfolgung
 
 	// Head
-	// Strasse zum Strassenschluessel
+	// StraÃe zum StrassenschlÃŒssel
 	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage "
 	."FROM ax_lagebezeichnungkatalogeintrag as k "
-	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde "
-	."WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1"; 
-
-  	$v=array($str_schl);	// Schluessel-Gesamt ..
+	."JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
+	if ($katamtmix){$sql.="AND substr(k.gml_id,1,6) = substr(g.gml_id,1,6) ";}
+	$sql.="WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1"; 
+
+  	$v=array($str_schl);	// SchlÃŒssel-Gesamt ..
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
@@ -238,5 +244,5 @@
 
 	if($row = pg_fetch_array($res)) { // .. gefunden
-		$kgml=$row["kgml"]; // ID aus Katalog
+		$kgml=$row["kgml"]; 	// ID aus Katalog
 		$sname=$row["bezeichnung"];
 		$land =$row["land"];	// Einzel-Felder fÃŒr JOIN _lagebezeichnung_
@@ -247,5 +253,5 @@
 		$gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
 		if ($showParent) {
-			// EINE Koordinate zur Strasse besorgen
+			// EINE Koordinate zur StraÃe besorgen
 			// ax_Flurstueck >zeigtAuf> ax_LagebezeichnungOhneHausnummer
 			$sqlko ="SELECT ";
@@ -300,5 +306,5 @@
 
 		// Body
-		// Haeuser zum Strassenschluessel
+		// HÃ€user zum StraÃenschlÃŒssel
 		$sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, ";
 		if($epsg == "25832") { // Transform nicht notwendig
@@ -348,5 +354,5 @@
 			$cnt++;
 			$count++;
-			if($count == 7) { // Max. Hausnummern je Zeile (Test: 3stellige HsNr mit Zusatz)
+			if($count == 7) { // Max. HausNr je Zeile (Test: 3stellige HsNr mit Zusatz)
 				echo "\n</tr>";
 				$count = 0;
@@ -363,10 +369,9 @@
 	return;
 }
-// ===========
+
 // Start hier!
-// ===========
 
 // Validation: Eingabefeld aus Formular.
-// Suchbegriff (StraÃenname) oder StraÃenschlÃŒssel.
+// Suchbegriff StraÃenname oder StraÃenschlÃŒssel.
 // Hier formatierte Meldung und html-Foot.
 if (isset($street) and $street != "" ) {
@@ -398,6 +403,5 @@
 }
 
-// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
-//  im Kopf des Ergebnisrahmens anzeigen.
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion im Kopf des Ergebnisrahmens anzeigen.
 // Dazu die im HTML-Header definierte Javascript-Function benutzen.
 // Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
Index: /trunk/mapbender/conf/alkisnav_conf.php
===================================================================
--- /trunk/mapbender/conf/alkisnav_conf.php	(revision 424)
+++ /trunk/mapbender/conf/alkisnav_conf.php	(revision 425)
@@ -6,4 +6,5 @@
 	2016-08-17 GKZ in ALKIS-DB-Name 4stellig
 	2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen (mehrere Gemeinden in Kreis-Datenbank)
+	2021-11-22 Parameter $katamtmix (Kataster-Amt-Mix)
 */
 
@@ -11,4 +12,6 @@
 	$dbgkz = $gkz;				// eine Datenbank je Mandant
 	$dbhost = '10.0.___';	// Datenbank-Server aus Produktion
+
+	$katamtmix = false;	// Default. Sind Daten aus verschiedenen Katasteramts-Bezirken in der DB?
 
 	switch ($gkz) {	// lokale und temporäre Besonderheiten je Mandant
@@ -27,4 +30,9 @@
 			$filtgem = '16';	// Gebiets-Filter kommen derzeit noch aus der Mapbender-Konfiguration
 			break;
+
+		case "418":
+			$katamtmix = true;	// Katasteramt Mix
+			break;
+
 	}
 
