Index: trunk/mapbender/http/nav/alkisnav_fls.php
===================================================================
--- trunk/mapbender/http/nav/alkisnav_fls.php	(revision 356)
+++ trunk/mapbender/http/nav/alkisnav_fls.php	(revision 376)
@@ -1,21 +1,12 @@
 <?php
-/* Version vom
-	2013-04-16	"import_request_variables" entfÃ€llt in PHP 5.4, 
-				Fehlerkorrektur Komma in SQL bei FS-Suche.
-	2013-04-26	Ersetzen View "gemeinde_gemarkung" durch Tabelle "pp_gemarkung"
-				ZurÃŒck-Link, Titel der Transaktion anzeigen
-	2013-04-29	Test mit IE
-	2013-05-07	Strukturierung des Programms, redundanten Code in Functions zusammen fassen
-	2013-05-14	Variablen-Namen geordnet, Hervorhebung aktuelles Objekt, Title auch auf Icon, IE zeigt sonst alt= als Title dar.
-	2013-10-15	missing Parameter
-	2014-09-03	PostNAS 0.8: ohne Tab. "alkis_beziehungen", mehr "endet IS NULL", Spalten varchar statt integer
-	2014-09-15	Bei Relationen den Timestamp abschneiden, mehr "endet IS NULL"
-	2014-12-11	Fehlerbehandlung bei Eingabe ungÃŒltiger Gemarkungsnummer. Tabellen pp_gemarkung und pp_flur verwenden.
-	2015-06-11	EineFlur, Limit fÃŒr Flurstuecke von 600 auf 900 erhoeht
-	2015-12-10	Umstellen .ico auf .png,
-				Vermeidung nicht initialisierter Variable. Somit ausfÃŒhrbar mit php.ini-Einstellungen:
-				- error_reporting = E_ALL | E_STRICT
-				- display_errors = on
-				.. ohne stÃ¶rende Meldungen.
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil FlurstÃŒck-Suche 
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+Hinweis: In der Mapbender-Konfiguration muss die Gemeindenummer nun 3stellig mit fÃŒhrenden 0 angegeben sein. 
+
+Version vom
+	2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+	2016-03-02 $gemeinde auf feste LÃ€nge korrigieren
+	2016-11-28 Gemeinsam genutzte Datenbanken ermÃ¶glichen
 */
 
@@ -25,17 +16,17 @@
 
 $cntget = extract($_GET);
+$gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT); // temporÃ€r bei Umstellung auf norGIS, besser im Mapbender 3stellig konfigurieren.
 include("../../conf/alkisnav_conf.php");
 include("alkisnav_fkt.php"); // Funktionen
-$con_string = "host=".$host." port=".$port." dbname=".$dbname.$dbvers.$gkz." user=".$user." password=".$password;
-$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$dbname.$dbvers.$gkz);
+$con = pg_connect ($dbconn) or die ("Fehler bei der Verbindung zur Datenbank ".$dbpre.$dbgkz);
 
 echo <<<END
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
+<!doctype html>
+<html lang="de">
 <head>
 	<meta http-equiv="cache-control" content="no-cache">
 	<meta http-equiv="pragma" content="no-cache">
 	<meta http-equiv="expires" content="0">
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<meta charset="utf-8">
 	<title>ALKIS-Suche Flurst&uuml;ck</title>
 	<link rel="stylesheet" type="text/css" href="alkisnav.css">
@@ -62,5 +53,5 @@
 function h_hinten($zahl) {
 	// Testen: Wurde an eine Zahl ein "h" angehÃ€ngt?
-	// Wenn ja, dann Schalter setzen und nur numerischen Teil zurÃŒck geben.
+	// Wenn ja, dann Schalter setzen und nur den numerischen Teil zurÃŒck geben.
 	global $phist, $debug;
 	$zahl=trim($zahl);
@@ -80,9 +71,16 @@
 
 function ZerlegungFsKennz($fskennz) {
-	// Das eingegebene FlurstÃŒcks-Kennzeichen auseinander nehmen. Erwartet wird gggg-fff-zzzz/nnn
-	// Teile der Zerlegung in global-Vars "$z..."
-	global $debug, $zgemkg, $zflur, $zzaehler, $znenner;	
+	// Das eingegebene FlurstÃŒcks-Kennzeichen auseinander nehmen. Erwartet wird (ll)gggg-fff-zzzz/nnn
+	// Die Teile der *Z*erlegung werden ÃŒber die Global-Variablen "$z..." allen Functions bereit gestellt.
+	// Der Returncode dieser Function steuert die weitere Verarbeitung.
+	global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;	
 	$arr = explode("-", $fskennz, 4); // an den Trenn-Strichen aufteilen
-	$zgemkg=trim($arr[0]);
+
+	// Gemarkung mit oder ohne Land davor? In der Eingabe soll beides zulÃ€ssig sein.
+	// Bei den SQL-Abfragen in der norGIS-ALKIS-Importer Datenbankstruktur werden abwechselnd beide
+	// Formate benÃ¶tigt: z.B. ax_gemarkungsteilflur.gemarkung -> 4stellig, gema_shl.gemashl -> 6stellig
+	// Also gleich beide Formate vorhalten.
+	$gemkg=trim($arr[0]);
+
 	if (count($arr) > 1) {
 		$zflur=h_hinten($arr[1]);
@@ -96,18 +94,37 @@
 		$zfsnr="";
 	}
-	if ($debug > 1) {echo "<p class='dbg'>Gemkg: '".$zgemkg."' Flur: '".$zflur."' NR: '".$zfsnr."'</p>";}
-	if ($zgemkg == "") {
+	if ($debug > 1) {echo "<p class='dbg'>Gemkg: '".$gemkg."' Flur: '".$zflur."' NR: '".$zfsnr."'</p>";}
+
+	if ($gemkg == "") {
 		return 0; // Gemeinden oder Gemarkungen listen
-	} elseif ( ! is_ne_zahl($zgemkg)) {
+	} elseif ( ! is_ne_zahl($gemkg)) {
 		return 1; // Such Name
-	} elseif ($zflur == "") {
-		return 2; // G-Nr
+	}
+
+	// Gemarkungs-NUMMER wurde eingegeben. Mit oder ohne Land davor?
+	if (strlen($gemkg) == 4 ) { // Eingabe ohne Land
+		$zgemkg4=$gemkg;		// 4stellige Version ohne Land
+		$zgemkg6=$land.$gemkg;	// 6stellige Version mit  Land
+	} elseif (strlen($gemkg) == 6 ) { // Eingabe mit Land
+		$zgemkg4=substr($gemkg, 2);
+		$zgemkg6=$gemkg;
+		if (substr($gemkg, 0, 2) != $land) { // Passt Eingabe zu Conf?
+			echo "<p class='err'>Die 6-stellige Gemarkungsnummer '".$zgemkg6."' sollte mit Land '".$land."' beginnen.</p>";
+		}
+	} else { // weder noch
+		$zgemkg4=$gemkg; // kann eigentlich nicht funktionieren
+		$zgemkg6=$gemkg; // Nullen davor setzen?
+		echo "<p class='err'>Die Gemarkungsnummer kann 4- oder 6-stellig (mit Land '".$land."') eingegeben werden.</p>";
+	}
+
+	if ($zflur == "") { // keine Eingabe Flur-Nummer
+		return 2; // also nur Gemarkungs-Nr eingegeben
 	} elseif ( ! is_ne_zahl($zflur)) {
 		echo "<p class='err'>Die Flurnummer '".$zflur."' ist nicht numerisch</p>";
 		return 9;
-	} elseif ($zfsnr == "") {
+	} elseif ($zfsnr == "") { // Flur eingegeben, aber keine FlurstÃŒcksnummer mehr
 		return 3; // Flur				
 	} else {
-		$zn=explode("/", $zfsnr, 2);
+		$zn=explode("/", $zfsnr, 2); // Bruchnummer?
 		$zzaehler=h_hinten(trim($zn[0]));
 		if (count($zn) > 1) {$znenner=h_hinten(trim($zn[1]));} else {$znenner="";}
@@ -149,32 +166,8 @@
 }
 
-function zeile_gemarkung($gkgnr, $gkgname, $aktuell) {
-// Eine Zeile zu Gemarkung ausgeben
-	global $con, $gkz, $gemeinde, $epsg, $gfilter;
-
-	if ($gkgname == "") { // Falls Gem.-Name fehlt, in DB nachschlagen
-		$sql ="SELECT g.gemarkungsname FROM pp_gemarkung g WHERE g.gemarkung = $1 LIMIT 1;";
-		$v=array($gnr);
-		$res=pg_prepare("", $sql);
-		$res=pg_execute("", $v);
-		if (!$res) {echo "\n<p class='err'>Fehler bei Gemarkungsname.</p>";}
-		$row = pg_fetch_array($res);
-		$gkgname=$row["gemarkungsname"];
-	}
-
-	if ($gkgname == "") {$gkgname = "(unbekannt)";}
-	$gnam=htmlentities($gkgname, ENT_QUOTES, "UTF-8");
-	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
-
-	echo "\n<div class='gk".$cls."' title='Gemarkung'>";
-	echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
-	echo " OT <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."'>";		
-	echo  " ".$gnam."</a> (".$gkgnr.")";
-	echo "\n</div>";
-	return;
-}
-
-function zeile_flur($gkgnr, $flurnr, $histlnk, $aktuell) { // Eine Zeile zur Flur ausgeben
+function zeile_flur($gkgnr, $flurnr, $histlnk, $aktuell) { 
+	// Eine Kopf-Zeile zur Flur ausgeben
 	global $gkz, $gemeinde, $epsg;
+
 	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
 	echo "\n<div class='fl".$cls."' title='Flur'>";
@@ -182,4 +175,5 @@
 	$url=$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."-".$flurnr;
 	echo "<a title='Aktuelle Flurst&uuml;cke suchen' href='".$url."'>Flur ".$flurnr." </a>"; 
+
 	if ($histlnk) { // Link zur Historie-Suche anbieten
 		echo " <a class='hislnk' title='Historische Flurst&uuml;cke der Flur suchen' href='".$url."&amp;hist=j'>Hist.</a>";
@@ -217,6 +211,7 @@
 
 function zeile_nachf_fs($gml, $gknr, $flur, $fskenn, $ftyp) {
-	// Eine Zeile fÃŒr ein Nachfolger-FlurstÃŒck eines hist. Fs. ausgeben 
+	// Eine Zeile fÃŒr ein Nachfolger-FlurstÃŒck eines hist. Fs. ausgeben
 	global $gkz, $gemeinde, $epsg, $auskpath;
+
 	$fs=$gknr."-".$flur."-".$fskenn;
 	switch ($ftyp) {
@@ -250,28 +245,28 @@
 
 function ListGemeinden() {
-	// Bei Leereingabe im Formular die Gemeinden auflisten
+	// Bei Leereingabe im Formular die berechtigte(n) Gemeinde(n) auflisten
 	global $con, $gkz, $gemeinde, $epsg, $debug, $gfilter;
 	$linelimit=60;
 
-	$sql ="SELECT gemeinde, gemeindename FROM pp_gemeinde ";
+	$sql ="SELECT trim(trailing from gemshl) as gemshl, gemname FROM gem_shl ";
 	switch ($gfilter) {
 		case 1: // Einzelwert
-			$sql.="WHERE gemeinde='".$gemeinde."' "; break;
+			$sql.="WHERE substring(gemshl from 6 for 3) = '".$gemeinde."' "; break;
 		case 2: // Liste
-			$sql.="WHERE gemeinde in ('".str_replace(",", "','", $gemeinde)."') "; break;
+			$sql.="WHERE substring(gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
 		default: break;
 	}
-	$sql.=" AND endet IS NULL ORDER BY gemeindename LIMIT $1 ;";
+	$sql.=" AND endet IS NULL ORDER BY gemname LIMIT $1 ;";
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", array($linelimit));
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Gemeinde</p>";
-		#if ($debug >= 3) {echo "\n<p class='dbg'>".$sql."</p>";}
+		if ($debug >= 3) {echo "\n<p class='dbg'>".$sql."</p>";} // ++Nur Entw.
 		return 0;
 	}
 	$cnt = 0;
 	while($row = pg_fetch_array($res)) {
-		$gnr=$row["gemeinde"];
-		$gemeindename=$row["gemeindename"];
+		$gnr=$row["gemshl"];
+		$gemeindename=$row["gemname"];
 		zeile_gemeinde($gnr, $gemeindename);
 		$cnt++;
@@ -299,5 +294,5 @@
 
 	// Body
-	$sql ="SELECT gemarkung, gemarkungsname FROM pp_gemarkung WHERE gemeinde= $1 ORDER BY gemarkungsname LIMIT $2 ;";
+	$sql ="SELECT gemashl, trim(trailing from gemarkung) AS gemarkung FROM gema_shl WHERE substring(gemshl from 1 for 8) = $1 ORDER BY gemarkung LIMIT $2 ;";
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", array($gkey, $linelimit));
@@ -308,6 +303,6 @@
 	$cnt = 0;
 	while($row = pg_fetch_array($res)) {
-		$gnr=$row["gemarkung"];
-		$gnam=$row["gemarkungsname"];
+		$gnr=$row["gemashl"]; // 6stellig
+		$gnam=$row["gemarkung"];
 		zeile_gemarkung($gnr, $gnam, false);
 		$cnt++;
@@ -334,14 +329,19 @@
 	} else {
 		$match = trim($fskennz)."%";
-	}	
-	$sql ="SELECT g.gemeinde, g.gemarkung, g.gemarkungsname, s.gemeindename 
-	FROM pp_gemarkung g JOIN pp_gemeinde s ON g.gemeinde=s.gemeinde WHERE g.gemarkungsname ILIKE $1 ";
+	}
+
+	// Pass auf! GemeindeschlÃŒssel ist in den beiden SchlÃŒsseltabellen linksbÃŒndig gefÃŒllt,
+	// aber unterschiedlich lang hinten mit Leerstellen aufgefÃŒllt.
+	$sql ="SELECT substring(g.gemshl from 1 for 8) AS gemshl, g.gemashl, trim(trailing from g.gemarkung) AS gemarkung, trim(trailing from s.gemname) AS gemname 
+	FROM gema_shl g JOIN gem_shl s ON substring(g.gemshl from 1 for 8) = substring(s.gemshl from 1 for 8) WHERE g.gemarkung ILIKE $1 ";
+
 	switch ($gfilter) {
 		case 1: // Einzelwert
-			$sql.="AND g.gemeinde='".$gemeinde."'"; break;
+			$sql.="AND substring(g.gemshl from 6 for 3)='".$gemeinde."'"; break;
 		case 2: // Liste
-			$sql.="AND g.gemeinde in ("."'".str_replace(",", "','", $gemeinde)."'".") "; break;
-	}
-	$sql.=" ORDER BY s.gemeindename, g.gemarkungsname LIMIT $2 ;";
+			$sql.="AND substring(g.gemshl from 6 for 3) in ("."'".str_replace(",", "','", $gemeinde)."'".") "; break;
+	}
+	$sql.=" ORDER BY s.gemname, g.gemarkung LIMIT $2 ;";
+
 	$v=array($match, $linelimit);
 	$res=pg_prepare("", $sql);
@@ -354,12 +354,12 @@
 	$gwgem="";
 	while($row = pg_fetch_array($res)) {
-		$gemeindename=$row["gemeindename"];
+		$gemeindename=$row["gemname"];
 		if ($gwgem != $gemeindename) { // Gruppierung Gemeinde
 			$gwgem = $gemeindename;
-			$skey=$row["gemeinde"];
+			$skey=$row["gemshl"];
 			zeile_gemeinde($skey, $gemeindename, false);
 		}
-		$gnam=$row["gemarkungsname"];
-		$gnr=$row["gemarkung"];
+		$gnam=$row["gemarkung"];
+		$gnr=$row["gemashl"]; // 6stellig
 		zeile_gemarkung($gnr, $gnam, false); // wenn am Ende nur ein Treffer, dann aktuell=true
 		$cnt++;
@@ -368,8 +368,17 @@
 	if($cnt == 0){ 
 		echo "\n<p class='anz'>Keine Gemarkung.</p>";
+		if ($debug > 1) {
+/*
+			// 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>";}
+		}
 	} elseif($cnt >= $linelimit) {
 		echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemarkungen ... und weitere</p>";
 	} elseif($cnt == 1) { // Eindeutig!
-		return $gnr; 
+		return $gnr; // 6stellige Gemarkungsnummer!
 	} else {
 		echo "\n<p class='anz'>".$cnt." Gemarkungen</p>";
@@ -378,13 +387,13 @@
 }
 
-function gg_head($gkgnr, $gkgaktuell) {
-	// Kopf-Zeilen Gemeinde und Gemarkung ausgeben
-	// Parameter: Gemarkungsnummer, aktuell hervorzuhebende Zeile
+function gg_head($gkgnr6, $gkgaktuell) {
+	// Gemeinde und Gemarkung (G+G) Kopf-Zeilen ausgeben
+	// Parameter: Gemarkungsnummer (6stellig), aktuell hervorzuhebende Zeile
 	// Return: true/false ob gefunden 
 
-	$sqlh ="SELECT g.gemarkungsname, s.gemeinde, s.gemeindename FROM pp_gemarkung g 
-	JOIN pp_gemeinde s ON g.gemeinde=s.gemeinde AND g.land=s.land WHERE g.gemarkung = $1 ;";
-
-	$v=array($gkgnr);
+	$sqlh ="SELECT g.gemarkung, substring(s.gemshl from 1 for 8) AS gemshl, trim(trailing from s.gemname) AS gemname 
+	FROM gema_shl g JOIN gem_shl s ON g.gemshl=s.gemshl WHERE g.gemashl = $1 ;";
+
+	$v=array($gkgnr6);
 	$resh=pg_prepare("", $sqlh);
 	$resh=pg_execute("", $v);
@@ -393,14 +402,14 @@
 
 	if ($rowh = pg_fetch_array($resh)) {
-		$gmkg=$rowh["gemarkungsname"];
-		$skey=$rowh["gemeinde"];
-		$snam=$rowh["gemeindename"];
+		$gmkg=$rowh["gemarkung"];
+		$skey=$rowh["gemshl"];
+		$snam=$rowh["gemname"];
 		zeile_gemeinde($skey, $snam, false);
-		zeile_gemarkung($gkgnr, $gmkg, $gkgaktuell);
+		zeile_gemarkung($gkgnr6, $gmkg, $gkgaktuell);
 		return true;
     } else {
 		echo "\n<div class='gk' title='Gemarkung'>";
 		echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
-		echo " Gemarkung ".$gkgnr." nicht gefunden!\n</div>";
+		echo " Gemarkung ".$gkgnr6." nicht gefunden!\n</div>";
 		return false;
 	}
@@ -409,10 +418,10 @@
 function EineGemarkung($AuchGemkZeile) {
 	// Kennzeichen bestehend nur aus Gemarkung-SchlÃŒssel wurde eingegeben
-	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg;
+	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6;
 	$linelimit=120; // max.Fluren/Gemkg
 
 	// Head
 	if ($AuchGemkZeile) { // Kopf davor ausgeben
-		if (! gg_head($zgemkg, true)) {
+		if (! gg_head($zgemkg6, true)) {
 			if ($debug >= 1) {echo "\n<p class='dbg'>Gem.-Gemkg.-Kopf abgebrochen</p>";}	
 			return false;
@@ -421,7 +430,6 @@
 
 	// Body
-	// Tabelle pp_flur verwenden um nur Fluren aufzulisten, die tatsÃ€chlich FlurstÃŒcke enthalten
-	$sql ="SELECT flurnummer AS flur FROM pp_flur f WHERE gemarkung= $1 ORDER BY flurnummer LIMIT $2 ;";
-	$v=array($zgemkg, $linelimit);
+	$sql ="SELECT gemarkungsteilflur AS flur FROM ax_gemarkungsteilflur f WHERE gemarkung= $1 ORDER BY gemarkungsteilflur LIMIT $2 ;";
+	$v=array($zgemkg4, $linelimit);
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
@@ -431,5 +439,5 @@
 	while($row = pg_fetch_array($res)) {	
 		$zflur=$row["flur"];
-		zeile_flur($zgemkg, $zflur, false, false);
+		zeile_flur($zgemkg4, $zflur, false, false);
 		$zfl++;
 	}
@@ -448,10 +456,10 @@
 function EineFlur() {
 	// Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, dazu aktuelle FlurstÃŒcke suchen
-	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg, $zflur;
+	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6, $zflur;
 	$linelimit=900; // Wie groÃ kann eine Flur sein?
 
 	// Head
-	if (gg_head($zgemkg, false)) {
-		zeile_flur($zgemkg, $zflur, true, true);
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, true);
 	} else {
 		return false;
@@ -467,7 +475,8 @@
 		$sql.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
 	}
+
 	$sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND endet IS NULL 
 	ORDER BY f.zaehler, f.nenner LIMIT $3 ;";
-	$v=array($zgemkg, $zflur, $linelimit);
+	$v=array($zgemkg4, $zflur, $linelimit);
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
@@ -495,12 +504,12 @@
 
 function HistFlur() {
-	// Kennzeichen aus Gemarkung und FlurNr wurde eingegeben.
+	// Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, "h" dahinter.
 	// Die Flur nach historischen FlurstÃŒcken durchsuchen
-	global $con, $gkz, $gemeinde, $epsg, $debug, $scalefs, $auskpath, $land, $zgemkg, $zflur;
+	global $con, $gkz, $gemeinde, $epsg, $debug, $scalefs, $auskpath, $land, $zgemkg4, $zgemkg6, $zflur;
 	$linelimit=500;
 
 	// Head	
-	if (gg_head($zgemkg, false)) {
-		zeile_flur($zgemkg, $zflur, true, true);
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, true);
 	} else {
 		return false;
@@ -509,8 +518,13 @@
 	// Body
 	$whcl="WHERE flurstueckskennzeichen like $1 AND endet IS NULL ";
-	$sql ="SELECT 'h' AS ftyp, gml_id, zaehler, nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
-	$sql.="UNION SELECT 'o' AS ftyp, gml_id, zaehler, nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
+
+	$sql ="SELECT 'h' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
+	$sql.="UNION SELECT 'o' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
 	$sql.="ORDER BY zaehler, nenner LIMIT $2 ;"; 
-	$fskzwhere =$land.$zgemkg.str_pad($zflur, 3, "0", STR_PAD_LEFT)."%";
+	// "zaehler" und "nenner" sind in der Classic-Datenbank Integer-Werte aber in der Struktur 
+	// des norGIS-ALKIS-Importers sind das Character-Strings, die linksbÃŒndig ohne fÃŒhrende Nullen gefÃŒllt sind.
+	// Der Anwender erwartet aber eine "numerische" Sortierung.
+
+	$fskzwhere=$zgemkg6.str_pad($zflur, 3, "0", STR_PAD_LEFT)."%";
 	$v=array($fskzwhere, $linelimit);
 	$res=pg_prepare("", $sql);
@@ -523,5 +537,5 @@
 		$fskenn=$row["zaehler"];
 		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // Bruchnummer
-		zeile_hist_fs($fs_gml, $fskenn, $ftyp, $zgemkg, $zflur, false);
+		zeile_hist_fs($fs_gml, $fskenn, $ftyp, $zgemkg4, $zflur, false);
 		$zfs++;
 	}
@@ -542,9 +556,9 @@
 	// FlurstÃŒckskennzeichen wurde komplett bis zum Zaehler (oder Nenner) eingegeben
 	// Sonderfall: bei Bruchnummer, mehrere Nenner zum Zaehler suchen wenn kein Nenner eingegeben wurde.
-	global $con, $gkz, $debug, $epsg, $gemeinde, $fskennz, $zgemkg, $zflur, $zzaehler, $znenner;
+	global $con, $gkz, $debug, $epsg, $gemeinde, $fskennz, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
 
 	// Head
-	if (gg_head($zgemkg, false)) {
-		zeile_flur($zgemkg, $zflur, true, false);
+	if (gg_head($zgemkg6, false)) { // Kopfzeilen: Gemeinde, Gemerkung, ..
+		zeile_flur($zgemkg4, $zflur, true, false); // .., Flur
 	} else {
 		return false;
@@ -561,10 +575,24 @@
 	}
 	$sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND f.zaehler= $3 ";
-	If ($znenner != "") {$sql.="AND f.nenner=".$znenner." ";} // wie prepared?
-	$sql.="AND endet IS NULL ORDER BY f.zaehler, f.nenner;";
-	$v=array($zgemkg, $zflur, $zzaehler);
+
+//	If ($znenner != "") {$sql.="AND f.nenner=".$znenner." ";}
+
+	// norGIS: "zaehler" ist integer in der DB, aber "nenner" ist character, linksbÃŒndig ohne fÃŒhrende '0'
+	If ($znenner != "") {
+		$suchnenn = ltrim($znenner, '0');
+		If ($suchnenn != "") {
+			$sql.="AND f.nenner='".$suchnenn."' ";
+		}
+	}
+	$sql.="AND endet IS NULL ORDER BY f.zaehler, cast(f.nenner AS integer);";
+	$v=array($zgemkg4, $zflur, $zzaehler);
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
-	if (!$res) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";}
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
+		if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<br>Parameter $1='".$zgemkg4."' $2='".$zflur."' $3='".$zzaehler."'<p>";}
+	}
+
+
 	$zfs=0;
 	while($row = pg_fetch_array($res)) {	
@@ -582,5 +610,5 @@
 			echo "\n\t\t<img class='nwlink' src='ico/Flurstueck_Historisch.png' width='16' height='16' alt='Historisches Flurst&uuml;ck'>&nbsp;";
 			echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fskennz."&amp;hist=j'>";
-			echo $zgemkg."-".$zflur."-".$zzaehler;
+			echo $zgemkg4."-".$zflur."-".$zzaehler;
 			if ($znenner != "") {echo "/".$znenner;}
 			echo " h - suchen</a>";
@@ -592,9 +620,9 @@
 function HistFlurstueck() {
 	// Die Nachfolger-FS-Kennzeichen zu einem Historischen FS sollen recherchiert werden.
-	global $debug, $land, $zgemkg, $zflur, $zzaehler, $znenner;
+	global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
 
 	// Head
-	if (gg_head($zgemkg, false)) {
-		zeile_flur($zgemkg, $zflur, true, false);
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, false);
 	} else {
 		return false;
@@ -604,5 +632,5 @@
 	// Body
 	// Suche ueber das Flurstueckskennzeichen, gml unbekannt
-	$fskzwhere =$land.$zgemkg; // Flurst-Kennz. f. Where
+	$fskzwhere=$zgemkg6; // Flurst-Kennz. f. Where
 	$fskzwhere.=str_pad($zflur, 3, "0", STR_PAD_LEFT);
 	$fskzwhere.=str_pad($zzaehler, 5, "0", STR_PAD_LEFT);
@@ -639,5 +667,5 @@
 		$ftyp=$row["ftyp"];
 		$fs_gml=$row["gml_id"];
-		$gknr=$row["gemarkungsnummer"];
+		$gknr=$land.$row["gemarkungsnummer"]; // Land davor
 		$flur=$row["flurnummer"];
 		$fskenn=$row["zaehler"];
@@ -646,4 +674,5 @@
 
 		zeile_hist_fs($fs_gml, $fskenn, $ftyp, $gknr, $flur, true);
+
 		if ($nachf == "") {
 			echo "\n<p class='anz'>keine Nachfolger</p>";	
@@ -659,5 +688,6 @@
 			$nawhcl="WHERE flurstueckskennzeichen IN ( ".$stri." ) AND endet IS NULL ";
 
-			$nasql ="SELECT 'a' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_flurstueck ".$nawhcl;
+			// Pass auf! Spalte zaehler hat unterschiedliches Format in den 3 Tabellen
+			$nasql ="SELECT 'a' AS ftyp, gml_id, gemarkungsnummer, flurnummer, cast(zaehler AS character varying), nenner FROM ax_flurstueck ".$nawhcl;
 			$nasql.="UNION SELECT 'h' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueck ".$nawhcl;
 			$nasql.="UNION SELECT 'o' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueckohneraumbezug ".$nawhcl;
@@ -677,5 +707,5 @@
 				$naftyp=$narow["ftyp"];
 				$nagml=$narow["gml_id"];
-				$nagknr=$narow["gemarkungsnummer"];
+				$nagknr=$land.$narow["gemarkungsnummer"]; // Land davor, 4 auf 6 Stellen
 				$naflur=$narow["flurnummer"];
 				$nafskenn=$narow["zaehler"];
@@ -692,5 +722,4 @@
 			echo "\n<hr>";
 		}
-		#} // aktuell ...
 		$zfs++;
 	}
@@ -712,4 +741,6 @@
 	$epsg=$gui_epsg; // Conf
 }
+
+// Filter aus Mapbender-GUI-Einbindung
 if ($gemeinde == "") {
 	$gfilter = 0;
@@ -725,5 +756,6 @@
 	$gnr=ListGmkgInGemeinde($gm, $bez);
 	if ($gnr > 0) {
-		$zgemkg=$gnr;
+		$zgemkg4=$gnr;
+		$zgemkg6=$land.$zgemkg4;
 		EineGemarkung(false);
 	}
@@ -731,5 +763,5 @@
 	$retzer=ZerlegungFsKennz($fskennz);
 	if ($debug >= 1) {echo "\n<p class='dbg'>Return Zerlegung: ".$retzer."</p>";}	
-	switch ($retzer) { // Return der Zerlegung
+	switch ($retzer) { // Returnwert der Zerlegung des FS-Kennz.
 	case 0: // leere Eingabe
 		if ($gfilter == 1) { // Die GUI ist bereits auf EINE Gemeinde gefiltert
@@ -746,5 +778,6 @@
 		if ($gnr > 0) {
 			$trans="1 Gemarkung, Fluren dazu";
-			$zgemkg=$gnr;
+			$zgemkg6=$gnr;
+			$zgemkg4=substr($zgemkg6, 2);
 			EineGemarkung(false);
 		}
