Index: trunk/mapbender/http/nav/alkisnav_grd.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_grd.php	(revision 420)
+++ 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.
