Index: trunk/info/info/alkisn/alkisgsnw.php
===================================================================
--- trunk/info/info/alkisn/alkisgsnw.php	(revision 422)
+++ 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>";
