source: trunk/mapbender/http/nav/alkisnav_eig.php @ 431

Revision 425, 27.8 KB checked in by frank.jaeger, 2 years ago (diff)

Web-GIS-Auskunft und Mapbender2-Navigation: neue Konfigurations-Parameter und verbessertes Grundbuch-Modul

Line 
1<?php
2/*      Navigation mit ALKIS-Daten im Mapbender 2 - Teil EigentÃŒmer-Suche
3        Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
4Version vom
5        2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
6        2016-03-02 $gemeinde auf feste LÀnge korrigieren
7        2016-07-18 Personendaten: Zeilen getauscht. Wie Brief-Anschrift.
8        2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen
9        2018-02-15 Strikte Input-Validation der Parameter
10        2018-04-24 Geburtsdatum formatieren
11        2018-11-12 Full-Schema
12        2019-02-12 Sortierung FlurstÃŒcksnummer repariert
13        2021-12-01 Fehlerkorrektur "benennt". Neue Var. $katamtmix  (Kataster-Amt-Mix).
14                   SchlÃŒsseltabellen sind mehrfach belegt. Dadurch doppelte Treffer bei der Suche.
15                           Weitere Buchstaben fÃŒr Namen-Suche zugelassen.
16*/
17
18$cntget = extract($_GET);
19
20// Input-Validation
21// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten.
22// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen.
23if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss!
24
25if(isset($epsg)) { // SRS, kann. Wenn als Parameter ...
26        if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe
27                $epsg = str_replace("EPSG:", "" , $epsg);
28        } elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer
29                die("Eingabefehler epsg");
30        }
31} else { // Nichts ÃŒbergeben
32        $epsg=$gui_epsg; // dann default aus Conf
33}
34
35// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration
36if (isset($gemeinde) AND trim($gemeinde, '0') != "") {
37        if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");}
38        $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT);
39        if(strpos($gemeinde, ",") === false) {
40                $gfilter = 1; // Einzelwert
41        } else {
42                $gfilter = 2; // Liste
43        }
44} else { // Kein Filter
45        $gemeinde = "";
46        $gfilter = 0;
47}
48if (isset($blattgml) and $blattgml != "" ) {
49        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $blattgml)) {die("Eingabefehler GML-ID Blatt");}
50} else {
51        $blattgml="";
52}
53if (isset($person) and $person != "" ) {
54        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $person)) {die("Eingabefehler GML-ID Person");}
55} else {
56        $person="";
57}
58if (isset($gbkennz) and $gbkennz != "" ) { // gggg-bbbbbbA-0001
59        if (!preg_match('#^[0-9A-E -]{4,17}$#', $gbkennz)) {die("Eingabefehler Grundbuch-Kennzeichen");}
60} else {
61        $gbkennz="";
62}
63
64include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
65include("alkisnav_fkt.php"); // Funktionen
66$con = pg_connect ($dbconn) or die ("<p class='err'>Fehler bei der Verbindung zur Datenbank</p>".$dbpre.$dbgkz);
67
68echo <<<END
69<!doctype html>
70<html lang="de">
71<head>
72        <meta http-equiv="cache-control" content="no-cache">
73        <meta http-equiv="pragma" content="no-cache">
74        <meta http-equiv="expires" content="0">
75        <meta charset="utf-8">
76        <title>ALKIS-Suche Eigent&uuml;mer</title>
77        <link rel="stylesheet" type="text/css" href="alkisnav.css">
78        <script type="text/javascript">
79                function imFenster(dieURL) {
80                        var link = encodeURI(dieURL);
81                        window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
82                }
83                function transtitle(trans) {
84                        document.getElementById('transaktiontitle').innerHTML = trans;
85                }
86        </script>
87</head>
88<body>
89<a href='javascript:history.back()'>
90        <img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
91</a>&nbsp;
92<span title='zuletzt ausgef&uuml;hrte Aktion'>
93        <dfn class='title' id='transaktiontitle'></dfn>
94</span>
95
96END;
97
98function familiensuche() {
99        // Einen Link generieren, um nach anderen Personen mit gleichem Familiennamen (Nachnamen) zu suchen.
100        // Bei versehendlich falschem Vornamen muss somit nicht von vorn begonnen werden.
101        global $gkz, $gemeinde, $epsg, $name;
102        $lnknam=urlencode(substr($name,0,50));
103        $dspnam=htmlentities($name, ENT_QUOTES, "UTF-8");
104        if(isset($name)) {
105                echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>"
106                        ."\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> "
107                        ."\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$lnknam."'>\"".$dspnam."\"</a>"
108                ."\n</div>\n<br>";     
109        }
110        return;
111}
112
113function personendaten() {
114        // Adresse und Geburtsdatum der aktuellen Person ausgeben
115        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath;
116        $sql ="SELECT p.nachnameoderfirma, p.vorname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, p.namensbestandteil, "
117        ."a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer "
118        ."FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) "
119        ."WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";
120        // Es wird nur EINE Zeile ausgewertet
121
122        $v=array($person);
123        $res=pg_prepare("", $sql);
124        $res=pg_execute("", $v);
125        if (!$res) {echo "\n<p class='err'>Fehler bei Name</p>\n";}
126        $row = pg_fetch_array($res);
127
128        $zeil1=$row["nachnameoderfirma"].", ".$row["vorname"];
129        $gebdat=$row["geburtsdatum"];
130        if ($gebdat != "") {$zeil1.= ", geb. ".$gebdat;}
131        $best=$row["namensbestandteil"];
132        if ($best != "") {$zeil1.= ", ".$best;}
133        $zeil1=htmlentities($zeil1, ENT_QUOTES, "UTF-8");
134        $zeil2= trim($row["strasse"]." ".$row["hausnummer"]);
135        if ($zeil2 != "") {
136                $zeil2= "\n\t<br>".htmlentities($zeil2, ENT_QUOTES, "UTF-8");
137        }
138        $zeil3=trim($row["plz"]." ".$row["ort_post"]);
139        if ($zeil3 != "") {
140                $zeil3="\n\t<br>".htmlentities($zeil3, ENT_QUOTES, "UTF-8");
141        }
142
143// Tabelle: Sp.1=Icon, Link zur Auskunft Person, Sp.2=Rahmen
144        echo "
145<div class='pe aktuell'>
146<table>
147<tr>
148        <td valign='top'>
149                <a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$person."\")'>
150                        <img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>
151                </a>
152        </td>
153        <td>
154                <p class='nam'>".$zeil1.$zeil2.$zeil3."</p>
155        </td>
156</tr>
157</table>
158</div>";
159        return;
160}
161
162function getEigByName() {
163        // 1 // Eigentuemer nach Name(-nsanfang)
164        global $gkz, $debug, $gemeinde, $epsg, $name, $person, $gfilter;
165        $linelimit=150;
166        $arr = explode(",", $name);
167        $name0 = trim($arr[0]);         // Nachname
168        if (count($arr) > 1) {
169                $name1=trim($arr[1]);   // Vorname
170        } else {
171                $name1="";
172        }
173        if(preg_match("/\*/",$name0)){
174                $match = trim(preg_replace("/\*/i","%", strtoupper($name0)));
175        } else {
176                $match = trim($name0)."%";
177        }       
178        if(preg_match("/\*/",$name1)){
179                $match1 = trim(preg_replace("/\*/i","%", strtoupper($name1)));
180        } else {
181                $match1 = trim($name1)."%";
182        }
183       
184        $sql ="SELECT p.nachnameoderfirma, p.vorname, p.gml_id FROM ax_person p ";
185
186// Der Filter auf "Gemeinde" bleibt hier zunÀchst unberÌcksichtigt, bis im NorGIS-ALKIS-Importer ein Ersatz
187// geschaffen wurde fÃŒr die Tabelle "gemeinde_person" aus dem Post-Processing der "klassischen" Datenstruktur.
188// Es können somit Personen gefunden werden, die kein GrundstÌck im berechtigten Bereich haben.
189// Wenn eine Gemeinde-DB aus eigenem NBA geladen wurde, ist das unkritisch.
190// Wenn eine Gemeinde aus einer kreisweiten DB beauskunftet wird, ist das so noch nicht einsetzbar.
191
192/*      if ($gfilter > 0) {
193                $sql.="JOIN gemeinde_person g ON p.gml_id=g.person WHERE p.endet IS NULL AND ";
194                switch ($gfilter) {
195                        case 1: // Einzel
196                                $sql.="g.gemeinde='".$gemeinde."' AND "; break;
197                        case 2: // Liste
198                                $sql.="g.gemeinde in ('".str_replace(",", "','", $gemeinde)."') AND "; break;
199                }
200        } else { */
201                $sql.="WHERE p.endet IS NULL AND ";
202//      }
203
204        if($match1 != '%'){
205                $sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 "
206                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;";
207                $v=array($match, $match1, $linelimit);
208        }else{
209                $sql.="nachnameoderfirma ILIKE $1 "
210                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;";
211                $v=array($match, $linelimit);
212        }
213        $res=pg_prepare("", $sql);
214        $res=pg_execute("", $v);
215        if (!$res) {
216                echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";
217                if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1='".$match."'</p>";}
218                return;
219        }
220        $cnt = 0;
221        while($row = pg_fetch_array($res)) {
222                $nachname=$row["nachnameoderfirma"];
223                $vorname=$row["vorname"];
224                $persongml=$row["gml_id"];
225                zeile_person($persongml, $nachname, $vorname);
226                $cnt++;
227        }
228        if($cnt == 0){
229                echo "\n<p class='anz'>Kein Eigent&uuml;mer gefunden.</p>";
230        } elseif($cnt >= $linelimit) { // das Limit war zu knapp
231                echo "\n<p class='anz' title='Bitte den Namen eindeutiger qualifizieren'>... und weitere</p>";
232        } elseif($cnt == 1){ // Eindeutig!
233                $person = $persongml;
234                $name = $nachname; // familiensuche() verwendet sonst den Suchbegriff
235        } else {
236                echo "\n<p class='anz'>".$cnt." Eigent&uuml;mer mit '".$name."'</p>";   // im Limit
237        }
238        return;
239}
240
241function getGBbyPerson() {
242        // 2 // GrundbÃŒcher zur gewÀhlten Person
243// Es wird in dieser Function nicht geprÃŒft, ob die gefundenen GrundbÃŒcher auch FlurstÃŒcke
244// haben, die im gefilterten Bereich (Gemeinde) liegen. Es können daher "Sackgassen" entstehen,
245// also GrundbÌcher, die in der nÀchsten Stufe bei Filterung nicht zu Treffern fÌhren.
246// Das Joinen bis zum FS unter BerÌcksichtigung von speziellen Buchungen ist aber zu aufwÀndig.
247// Dann kann entweder das FS gleich mit ausgegeben werden -> getGBuFSbyPerson.
248// Alternativ wÌrde eine Hilfstabelle benötigt, in der im PostProcessing
249// das GB-zu-Gemeinde-VerhÀltnis vorbereitet wird.
250        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $debug, $bltbez, $bltblatt, $bltseite, $kennztyp, $zgbbez, $katamtmix;
251        $linelimit=150;
252
253        // Head
254        familiensuche();
255        personendaten();
256
257        // Body
258        // Suche nach GrundbÃŒchern der Person
259        $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
260        ."FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id "
261        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
262        if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
263        $sql.="WHERE n.benennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL ";
264
265        // Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk"
266        if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
267                #if ($debug > 1) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
268                $sql.="AND b.bezirk='".$zgbbez."' ";
269                $bezirkaktuell = true;
270        } else {
271                $bezirkaktuell = false;
272        }
273
274        if ($bltbez.$bltblatt != "") { // BlÀttern, Fortsetzen bei ...
275                $sql.="AND ((b.bezeichnung > '".$bltbez."') ";
276                $sql.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."')) ";
277        }
278
279        $sql.="ORDER BY b.bezeichnung, gb.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
280
281        if ($bltseite == "") { // Seite 1
282                $bltseite = 1;
283        } else { // Folgeseite
284                echo "\n<p class='ein'>Teil ".$bltseite;
285        }
286        $v=array($person, $linelimit);
287        $res=pg_prepare("", $sql);
288        $res=pg_execute("", $v);
289        if (!$res) {
290                echo "\n<p class='err'>Fehler bei Grundbuch</p>";
291                return;
292        }
293        $cnt = 0;
294        $gwbez="";
295        while($row = pg_fetch_array($res)) {
296                $beznr=$row["bezirk"];
297                if ($gwbez != $beznr) { // Gruppenwechsel Bezirk
298                        $beznam=$row["beznam"];
299                        $gwbez=$beznr;
300                        zeile_gbbez ($beznam, $beznr, $bezirkaktuell);
301                }
302                $gml=$row["gml_g"];
303                $blatt=$row["blatt"];
304                zeile_blatt($zgbbez, "", $gml, $blatt, false, $person, false);
305                $cnt++;
306        }
307/*      if ($cnt == 0) { // Nur Entwicklg.
308                if ($debug > 1) {echo "\n<p class='err'>keine Buchung</p>";}
309                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."',<br>$1 = '".$person."'<p>";}
310        } */
311
312        // Foot
313        if($cnt == 0) {
314                echo "\n<p class='anz'>Kein Grundbuch zum Eigent&uuml;mer</p>";
315        } elseif($cnt >= $linelimit) {
316                echo "\n<p class='blt'>".$cnt." Grundb. zum Eigent.";
317
318                // BlÀttern
319                $nxtbltbez=urlencode($beznam);
320                $nxtbltblatt=urlencode($blatt);
321                $nxtbltseite=$bltseite + 1;
322                echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltseite=".$nxtbltseite."' "
323                ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>"
324                ."</p>";
325        } elseif($cnt == 1) { // Eindeutig!
326                $blattgml=$gml; // dann Stufe 3 gleich nachschieben
327        } else {
328                echo "\n<p class='anz'>".$cnt." Grundb&uuml;cher zum Eigent&uuml;mer</p>";
329        }
330        return;
331}
332
333function getFSbyGB($backlink) {
334        // 3 // FlurstÃŒcke zum Grundbuch
335// Zu einem Grundbuch (gml_id als Parameter) werden alle darauf gebuchten FlurstÃŒcke gesucht.
336// Im ersten Schritt sind das direkt gebuchten FlurstÃŒcke.
337// Im zweiten Schritt wird gesucht nach Rechten einer Buchungstelle des durchsuchten Blattes an anderen
338// Buchungstellen.
339        global $gkz, $gemeinde, $name, $person, $blattgml, $epsg, $gfilter, $debug, $katamtmix;
340        if($backlink) { // Erneuter Ansatz bei Person oder GB möglich.
341
342                // Namen ermitteln
343                $sql ="SELECT nachnameoderfirma, vorname FROM ax_person WHERE gml_id = $1 AND endet IS NULL;";
344                $v=array($person);
345                $res=pg_prepare("", $sql);
346                $res=pg_execute("", $v);
347                if (!$res) {echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";}
348                $row = pg_fetch_array($res); // nur eine Zeile
349                zeile_person($person, $row["nachnameoderfirma"], $row["vorname"]);
350
351                // Grundbuch-Daten ermitteln
352                $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
353                ."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
354                if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
355                $sql.="WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
356                $v=array($blattgml);
357                $res=pg_prepare("", $sql);
358                $res=pg_execute("", $v);
359                if (!$res) {echo "\n<p class='err'>Fehler bei Grundbuch</p>";}
360                $row = pg_fetch_array($res); // eine Zeile
361                $gml=$row["gml_g"];
362                $bezirk=$row["bezirk"];
363                $beznam=$row["beznam"];
364                $blatt=$row["blatt"];
365                zeile_gbbez ($beznam, $bezirk, false);
366                zeile_blatt($bezirk, "", $blattgml, $blatt, false, $person, true);     
367        }
368        GB_Buchung_FS(250, ""); // Blatt > Grundst. > FS, max. 250, ohne Link "Buchung"
369        return;
370}
371
372function getGBuFSbyPerson() {
373        // 2 + 3 // GrundbÃŒcher UND FlurstÃŒcke zur gewÀhlten Person
374// Dies ist die Kombination von Stufe 2 (GrundbÃŒcher zur Person) und 3 (FlurstÃŒcke zum Grundbuch)
375// in einem einzelnen Schritt. Wenn auf Gemeinde gefiltert wird, dann können in Stufe 2 (noch ohne Filter)
376// auch GrundbÃŒcher gefunden werden, die dann auf Stufe 3 (mit Filter) keine FS liefern ("Sackgasse"!).
377// Wenn aber per JOIN "GB -> FS -> Gemarkung -> Gemeinde" geprÌft wird, dann können
378// die Daten ja auch gleich ausgegeben werden.
379// FÌr FÀlle in denen nicht nach Gemeinde gefiltert wird (z.B. ganzer Kreis) kann weiter
380// Stufe 2 und 3 nacheinander verwendet werden. Dies ist wahrscheinlich ÃŒbersichtlicher,
381// weil "ungefiltert" in "2+3" zu lange Listen entstehen wÌrden, die durchblÀttert werden mÌssen.
382
383        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $gfilter, $debug, $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht, $kennztyp, $zgbbez, $katamtmix;
384        $linelimit=80; // als Limit "Anzahl FlurstÃŒcke" in den beiden folgenden Abfragen
385        // darf nun etwas knapper sein, weil man jetzt blÀttern kann
386        familiensuche();
387        personendaten();
388
389        // Wenn das Limit ÃŒberschritten wurde: zusÀtzliche Parameter "blt"=BlÀttern:
390        // - $bltbez   = Bezirk-Name 
391        // - $bltblatt = BlattMitBuchstabe
392        // - $bltbvnr  = lfd.Nr der Buchungsstelle
393        // - $bltseite = fortlaufende Seiten-Nr
394        // - $bltrecht = "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
395
396        // SQL-Bausteine vorbereiten
397        //  Direkte Buchungen suchen mit:  $sql1 + $sqla1 + $sql2
398        //  SonderfÀlle suchen mit:        $sql1 + $sqla2 + $sql2
399
400        // Baustein 1: SQL-Anfang fuer beide Varianten
401        $sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, "
402        ."s1.gml_id as bsgml, s1.laufendenummer AS lfd, f.gml_id, f.flurnummer, f.zaehler, f.nenner, ot.gemashl, trim(trailing from ot.gemarkung) AS gemarkungsname, "; // f.gemeindezugehoerigkeit_gemeinde,
403        if($epsg == "25832") { // Transform nicht notwendig
404                $sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, st_y(st_centroid(f.wkb_geometry)) AS y ";
405        } else { 
406                $sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, "
407                        ."st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";                   
408        }
409
410        // NamenNummer >istbestandteilvon> buchungsblatt <istbestandteilvon< buchungsstelle-1
411        $sql1.="FROM ax_namensnummer nn "
412        ."JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon "
413        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
414        if ($katamtmix){$sql.="AND substr(gb.gml_id,1,6) = substr(b.gml_id,1,6) ";}
415        $sql1.="JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
416
417        // Baustein A: Auswahl 1 oder 2
418        // buchungsstelle-1 <istGebucht< FS
419        $sqla1 ="JOIN ax_flurstueck f ON s1.gml_id=f.istgebucht ";
420
421        // buchungsStelle1 (herr.) >an> buchungsStelle2 (dien.) <istGebucht< FS
422        $sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) "
423                ."JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht ";
424
425        // Baustein 2: SQL-Ende fuer beide Varianten
426        $sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl "  // Ortsteil
427                ."WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL ";
428        $sqlw2="AND s2.endet IS NULL ";
429
430        // Parameter $gbkennz nach Klick auf Zeile "Bezirk"
431        if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
432                #if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
433                $sql2.="AND b.bezirk = '".$zgbbez."' ";
434                $bezirkaktuell = true;
435        } else {
436                $bezirkaktuell = false;
437        }
438
439        switch ($gfilter) { // Gemeinde-Filter
440                case 1: // Einzelwert
441                        $sql2.="AND substring(ot.gemshl from 6 for 3)='".$gemeinde."' "; break;
442                case 2: // Liste
443                        $sql2.="AND substring(ot.gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
444        }
445
446        $sql3 ="ORDER BY b.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, cast(s1.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, cast(f.zaehler AS integer), cast(f.nenner AS integer) LIMIT $2 ;";
447        // Sortier-Problem: laufendenummer in varchar linksbÃŒndig
448
449        // Die Bausteine in 2 Varianten kombinieren
450
451        // BlÀttern mit folgenden Parametern: $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht
452        if ($bltbez.$bltblatt.$bltbvnr == "") {
453                $bltwhere ="";
454        } else { // BlÀttern, Fortsetzen bei ...
455                $bltwhere ="AND ((b.bezeichnung > '".$bltbez."') "
456                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') "
457                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) ";
458        } // FlurstÃŒcke in der angeblÀtterten BVNR werden ggf. wiederholt
459
460        if ($bltseite == "") { // auf Seite 1 beide Teile ausgegeben
461                $bltseite = 1;
462        } else { // Folgegeseite: nur Teil 1 *oder* 2
463                echo "\n<p class='ein'>Teil ".$bltseite." - ";
464                switch ($bltrecht) {
465                        case "nur":
466                                echo "nur Rechte an .. Buchungen</p>"; break;
467                        case "ohne":
468                                echo "nur direkte Buchungen</p>"; break;
469                        default:
470                                echo "</p>"; break;
471                }
472        }
473
474        // FÀlle ohne "Rechte an"
475        if ($bltrecht != "nur") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
476                // Blatt <istBestandteilVon<  Buchungsstelle <istGebucht< Flurstck.
477                $sql=$sql1.$sqla1.$sql2.$bltwhere.$sql3; // Direkte Buchungen
478
479                $v=array($person, $linelimit);
480                $res=pg_prepare("", $sql);
481                $res=pg_execute("", $v);
482                if (!$res) {
483                        echo "\n<p class='err'>Fehler bei Buchung und Flurst&uuml;ck.</p>";
484                        if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."', $1 = '".$person."'<p>";}
485                        return;
486                }
487
488                $zfs1=0;
489                $gwbez="";
490                while($row = pg_fetch_array($res)) {
491                        $bezirk=$row["bezirk"];
492                        if ($gwbez != $bezirk) { // Gruppierung Bezirk
493                                $gwbez=$bezirk;
494                                $beznam=$row["beznam"];
495                                $gwgb="";
496                                zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
497                        }
498                        $gb_gml=$row["gml_g"];
499                        if ($gwgb != $gb_gml) { // Gruppierung Blatt (Grundbuch)
500                                $blatt=$row["blatt"];
501                        //      zeile_blatt($bezirk, $beznam, $gb_gml, $blatt, false, $person, false);
502                                zeile_blatt($bezirk, "", $gb_gml, $blatt, false, $person, false);
503                                $gwgb = $gb_gml;        // Steuerg GW GB
504                                $gwbv = "";             // Steuerg GW BVNR
505                        }
506                        $bvnr=$row["lfd"];
507                        if ($gwbv != $bvnr) { // Gruppierung Buchung (BVNR)
508                                $gwbv = $bvnr;
509                                $bsgml=$row["bsgml"];
510                                zeile_buchung($bsgml, $bvnr, "", false, false); //ohne Link
511                        }
512                        $fs_gml=$row["gml_id"];
513                        $gmkg=$row["gemarkungsname"];
514                        $flur=$row["flurnummer"];
515                        $fskenn=$row["zaehler"];
516                        if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
517                        zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], $gmkg, $flur, false);
518                        $zfs1++;
519                }
520
521                if($zfs1 == 0) {
522                        if ($bltrecht == "ohne") {echo "\n<p class='anz'>Keine direkte Buchung gefunden.</p>";}
523                        /* nur Entw.
524                        if ($debug > 1) {
525                                echo "\n<p class='dbg'>Keine direkte Buchung gefunden.</p>";
526                                if ($debug > 2) {echo "<p class='err'>SQL = '".$sql."', $1 = '".$person."'<p>";}
527                        } */
528                } elseif($zfs1 >= $linelimit) { // das Limit war zu knapp
529                        echo "\n<p class='blt'>";
530                        if ($bltseite > 1) {echo "weitere ";}
531                        echo $zfs1." Flurst&uuml;cke";
532
533                        // B l À t t e r n  (eine Folgeseite anbieten)
534                        $nxtbltbez=urlencode($beznam);
535                        $nxtbltblatt=urlencode($blatt);
536                        $nxtbltseite=$bltseite + 1;
537                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
538                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk
539                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' "
540                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
541                        ."</p>";
542                } elseif($zfs1 > 1) { // Meldung (Plural) ab 2, im Limit
543                        echo "\n<p class='anz'>";
544                        if ($bltseite > 1) {echo "weitere ";}
545                        echo $zfs1;
546                        if ($kennztyp > 1) {
547                                echo " Flurst. zum Eigent. im GB-Bezirk</p>";
548                        } else {
549                                echo " Flurst&uuml;cke zum Eigent&uuml;mer</p>";
550                        }
551                }
552        }
553
554        if ($bltrecht == "" and $zfs1 > 0) { // beides
555                echo "<hr>"; // dann Trenner
556        }
557
558        // FÀlle mit "Rechte an"
559        if ($bltrecht != "ohne") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
560                // Zweite Abfrage (Variante) aus den Bausteinen zusammen bauen
561                // buchungsStelle2 <an< buchungsStelle1
562                $sql=$sql1.$sqla2.$sql2.$bltwhere.$sqlw2.$sql3; // Rechte an
563                $v=array($person, $linelimit);
564                $res=pg_prepare("", $sql);
565                $res=pg_execute("", $v);
566                if (!$res) {
567                        echo "\n<p class='err'>Fehler bei Recht an Buchung.</p>";
568                        return;
569                }
570                $zfs2=0;
571                $gwbez="";
572                while($row = pg_fetch_array($res)) {   
573                        $bezirk=$row["bezirk"];
574                        if ($gwbez != $bezirk) { // Gruppierung Bezirk
575                                $gwbez=$bezirk;
576                                $beznam=$row["beznam"];
577                                $gwgb="";
578                                zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
579                        }
580                        $gb_gml=$row["gml_g"];
581                        if ($gwgb != $gb_gml) {  // Gruppierung Blatt (Grundbuch)
582                                $beznam=$row["beznam"];
583                                $blatt=$row["blatt"];
584                                zeile_blatt ($bezirk, "", $gb_gml, $blatt, false, $person, false);
585                                $gwgb = $gb_gml;        // Steuerg GW GB
586                                $gwbv = "";             // Steuerg GW BVNR
587                        }
588                        $bvnr=$row["lfd"];
589                        if ($gwbv != $bvnr) { // Gruppierung Buchungs (BVNR)
590                                $gwbv = $bvnr;
591                                $bsgml=$row["bsgml"];
592                                zeile_buchung($bsgml, $bvnr, "", true, false); // Recht an ... // ohne Link!
593                        }
594                        $fs_gml=$row["gml_id"];
595                        $gmkg=$row["gemarkungsname"];
596                        $flur=$row["flurnummer"];
597                        $fskenn=$row["zaehler"];
598                        if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
599                        $x=$row["x"];
600                        $y=$row["y"];
601                        zeile_flurstueck ($fs_gml, $fskenn, $x, $y, $gmkg, $flur, false);
602                        $zfs2++;
603                }
604                if($zfs2 == 0) {
605                        if ($zfs1 == 0 or $bltrecht == "nur") { // keine Meldung wenn schon in Teil 1 eine Ausgabe
606                                echo "\n<p class='anz'>Keine Rechte an Buchungen.</p>";
607                        }
608                } elseif($zfs2 >= $linelimit) { // das Limit war zu knapp, das  B l À t t e r n  anbieten
609                        echo "\n<p class='blt'>";
610                        if ($bltseite > 1) {echo "weitere ";}
611                        echo $zfs2." Rechte an Flurst.";
612                        $nxtbltbez=urlencode($beznam);
613                        $nxtbltblatt=urlencode($blatt);
614                        $nxtbltseite=$bltseite + 1;
615                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
616                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk
617                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' "
618                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
619                        ."</p>";
620                } elseif($zfs2 > 1) { // ab 2
621                        echo "\n<p class='anz'>";
622                        if ($bltseite > 1) {echo "weitere ";}
623                        echo $zfs2." Rechte an Flurst.</p>"; // im Limit               
624                }
625        } // ENDE FÀlle mit "Rechte an"
626        return;
627}
628
629// Start hier!
630
631// Parameter: 
632// 1. name   = Suche nach Namensanfang oder -bestandteil.
633// 2. person = gml_id der Person      -> Suche nach GrundbÃŒchern
634// 3. gb     = gml_id des Grundbuches -> Suche nach FlurstÃŒcken
635
636// Validation: Eingabefeld aus Formular. Wird aber auch an Link angehÀngt (LÀnge!)
637// Suchbegriff (EigentÃŒmer)
638// Hier formatierte Meldung und html-Foot.
639if (isset($name) and $name != "" ) {
640        if (!preg_match('#^[a-zA-Z0-9ÀöÌÄÖÜßşŜšŠ*,. \-&/]{1,50}$#', $name)) {
641                echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
642        //      if ($debug > 1) {echo "<p class='err'>Name='".$name."' LÀnge='".strlen($name)."</p>";}
643                $name="";
644        }
645} else {
646        $name="";
647}
648
649$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen
650// 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
651
652// Quo Vadis?
653if($blattgml != "") { // FlurstÃŒcke zum Grundbuch
654
655        // Das Programm hat sich selbst verlinkt aus einer Liste der GB zu einem EigentÃŒmer.
656        // Wenn Parameter mitgegeben wurden, können diese fÃŒr einen "Link zurÃŒck" verwendet werden.
657        $trans="Flurst&uuml;cke zum Grundbuch";
658        getFSbyGB(true); // mit BackLink
659
660} elseif($person != "") { // GrundbÃŒcher zur Person
661        // Das Programm hat sich selbst verlinkt aus einer Liste der Personen zu einer Suchmaske.
662        //if ($debug >= 2) {echo "\n<p class='dbg'>Gemeinde-Filter-Steuerung = '".$gfilter."'</p>";}
663
664        // Die Filtereinstellung beeinflusst die Such-Strategie:
665        if ($gfilter == 0) { // Keine Filterung auf "Gemeinde": große Datenmenge
666                if ($kennztyp > 1) {
667                        $trans = "Grundb&uuml;cher in ".$zgbbez." von .."; // Filter GB-Bez
668                } else {
669                        $trans = "Grundb&uuml;cher von .."; // Name steht darunter
670                }
671                getGBbyPerson();
672                // Also schrittweise erst mal Stufe 2 = GrundbÃŒcher zur Person suchen.
673                if(isset($blattgml) ) { // Es wurde nur EIN Grundbuch zu der Person gefunden.
674                        $trans = "1 Blatt zum Eigent&uuml;mer";
675                        getFSbyGB(false);       // Dann dazu auch gleich die Stufe 3 hinterher, aber ohne Backlink.
676                }
677        } else { // mit Filter auf Gemeinde: weniger Daten?
678                if ($kennztyp > 1) {
679                        $trans="Grdb. und Flst. von .. in .."; // Filter GB-Bez,
680                } else {
681                        $trans="Grundb. und Flurst. von .."; // Name steht darunter
682                }
683                getGBuFSbyPerson(); // Schritte 2+3 gleichzeitig, dabei Gemeinde-Filter auf Stufe 3
684        }
685
686} elseif(isset($name)) { // Suchbegriff aus Form: Suche nach Name
687
688        $trans="Namensuche \"".$name."\"";
689        getEigByName(); // Suchen nach Namensanfang
690
691        if($person != "") { // genau EIN Treffer zum gesuchten Namen
692                if ($gfilter == 0) {
693                        $trans="Grundb&uuml;cher zum Namen";
694                        getGBbyPerson(); // Dann gleich das Grundbuch hinterher
695                } else {
696                        $trans="Grdb. und Flst. zum Namen";
697                        getGBuFSbyPerson();     // .. oder auch GB + FS
698                }
699        }
700
701} elseif ($debug >= 1) {
702        $trans="falscher Aufruf";
703        echo "\n<p class='dbg'>Parameter?</p>"; // sollte nicht vorkommen
704}
705
706// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion
707//  im Kopf des Ergebnisrahmens anzeigen.
708// Dazu die im HTML-Header definierte Javascript-Function benutzen.
709// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
710echo "
711<script type='text/javascript'>
712        transtitle('".$trans."');
713</script>";
714
715?>
716
717</body>
718</html>
Note: See TracBrowser for help on using the repository browser.