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

Revision 399, 27.1 KB checked in by frank.jaeger, 6 years ago (diff)

ALKIS-Navigation für Mapbender 2: Input Validation für alle Parameter. Kleine Korrekturen.

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