source: trunk/info/info/alkisn/alkisbestnw.php @ 430

Revision 430, 26.4 KB checked in by frank.jaeger, 22 months ago (diff)

ALKIS-Auskunft angepasst an PHP 8

Line 
1<?php
2/*      alkisbestnw.php
3
4        ALKIS-Auskunft
5        Author: Frank JÀger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo)
6
7        Bestandsnachweis fÃŒr ein Grundbuch (-Blatt) aus ALKIS PostNAS
8
9        Version:
10        2016-02-24 Version fÃŒr norGIS-ALKIS-Import
11        ....
12        2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
13        2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
14        2020-12-15 Input-Validation und Strict Comparisation (===)
15        2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÀche)
16                           Tabellenstruktur verbessert und Title bei "Recht an".
17        2021-12-30 Bestandsnachweis recursiv ÃŒber alle Buchungs-Ebenen
18        2022-01-13 Functions aus alkisfkt.php in dies Modul verschoben, wenn nur hier verwendet. Neue Functions LnkStf(), DsKy()
19        2022-07-05 PHP 8.1: Connection verwenden bei "pg_prepare" und "pg_execute", keine NULL-Werte in String-Functions verwenden
20*/
21
22function bnw_bsdaten($gml_h, $ebene) {
23/*      Bestandsnachweis - Buchungsstellen-Daten
24        "dienende" Buchungsstellen suchen. Miteigentumsanteil, Erbbaurecht usw.
25        Return: gml_id der dienenden Buchungsstelle wenn gefunden? Sonst Leerstring */
26        global $dbg, $bartkey, $bart, $bartstory, $anteil, $con;
27
28//      dann "dienende" Buchungsstellen
29//  sh=herrschend          sd=dienend
30//  ax_buchungsstelle >zu> ax_buchungsstelle (des gleichen Blattes)
31//  ax_buchungsstelle >an> ax_buchungsstelle (anderes Blatt, z.B Erbbaurecht an)
32//      - "zu" kommt in der Praxis (NRW) nicht vor, wird hier nicht berÃŒcksichtigt
33
34        if ($ebene > 5) {echo "\n<p class='err'>Ungewöhnlich tiefe Schachtelung ".$ebene." der Buchungs-Stellen.</p>";}
35
36        $sql ="SELECT sd.gml_id, sd.buchungsart, sd.zaehler, sd.nenner, sd.laufendenummer AS lfd, sd.beschreibungdesumfangsderbuchung AS udb, "
37        ."sd.nummerimaufteilungsplan AS nrap, sd.beschreibungdessondereigentums AS sond, "
38        ."wb.beschreibung AS bart, wb.dokumentation, "
39        ."b.gml_id as gbgml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, b.blattart, "
40        ."bb.beschreibung AS blattartv, z.bezeichnung AS beznam "
41        ."FROM ax_buchungsstelle sh "
42        ."JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) "
43        ."JOIN ax_buchungsblatt b ON b.gml_id=sd.istbestandteilvon "   
44        ."LEFT JOIN ax_buchungsart_buchungsstelle wb ON sd.buchungsart = wb.wert "
45        ."LEFT JOIN ax_buchungsblattbezirk z ON b.land=z.land AND b.bezirk=z.bezirk ".UnqKatAmt("b","z")
46        ."LEFT JOIN ax_blattart_buchungsblatt bb ON b.blattart = bb.wert "
47        ."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL "
48        ."ORDER BY sd.laufendenummer;";
49        $v=array($gml_h); // gml_id "herrschende" B-Stelle
50        $resan=pg_prepare($con, "", $sql);
51        $resan=pg_execute($con, "", $v);
52        if (!$resan) {
53                echo "\n<p class='err'>Fehler bei 'dienende Buchungsstelle'.</p>";
54                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gml_bs."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
55        }
56        $zeianz=pg_num_rows($resan); // Zeilen-Anzahl = Returnwert
57        $und = false; // mehrfaches "Recht an" auf gleicher Ebene
58        while($row= pg_fetch_assoc($resan)) {
59                $gml_bsan=$row["gml_id"];       // id der dien. BS
60                $blatt=ltrim($row["blatt"], "0");               
61
62                // als Global-Var zur Sub-Function:
63                $bartkey=$row["buchungsart"];   
64                $bart=$row["bart"]; // Buchungsart, entschlÃŒsselt
65                $bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8");
66                if ($row["zaehler"] == "") {$anteil = "";}
67                else {$anteil = $row["zaehler"]."/".$row["nenner"];}
68
69                // Zeile ausgeben Buchungsstelle dienend
70                bnw_bszeile_d($row["bezirk"], $row["beznam"], $blatt, $row["blattart"], $row["blattartv"], $row["lfd"], $row["gbgml"], $gml_bsan, $ebene, $und);
71                $und = true;
72                if ($row["nrap"] != "") { // Nr im Auft.Plan
73                        echo "\n<tr>\n\t<td colspan=3></td><td class='nrap' colspan=4>Nummer <span class='wichtig'>".$row["nrap"]."</span> im Aufteilungsplan.</td><td></td>\n</tr>";
74                }
75                if ($row["sond"] != "") { // Sondereigentumsbeschreibung
76                        echo "\n<tr>\n\t<td></td><td class='sond' colspan=6 title='Sondereigentums-Beschreibung'>Verbunden mit dem Sondereigentum an: ".$row["sond"]."</td><td></td>\n</tr>";
77                }
78
79                // Rekursiver Aufruf der gleichen Function, weitere Ebene dienend?
80                $tiefer = bnw_bsdaten($gml_bsan, ($ebene + 1));
81                If ($tiefer == 0) {  // Wenn nicht, dann kann es FlurstÃŒcke dazu geben
82                        $fscnt= bnw_fsdaten($gml_bsan, false); // FlurstÃŒcksdaten
83                }
84        }
85        pg_free_result($resan);
86        return $zeianz;
87}
88
89function bnw_fsdaten($gml_bs, $mit_buchung_link) {
90/*      Bestandsnachweis - FlurstÃŒcksdaten
91        Die Tabellenzeilen mit den FlurstÃŒcksdaten zu EINER Buchungsstelle im Bestandsnachweis ausgeben.
92        Die Funktion wird entweder aufgerufen fÃŒr die Buchungen direkt auf dem GB (Normalfall)
93        oder bei Erbbaurecht fÃŒr die mit "an" verknÃŒpften Buchungsstellen der untersten Ebene (dienende Buchung).
94        Der Tabellenkopf wird im aufrufenden Programm ausgegeben.
95        Return: Anzahl der ausgegebenen FlurstÃŒcke */
96        global $dbg, $gkz, $showkey, $filtkreis, $filtgem, $trclass, $katAmtMix, $lfdnr, $altlfdnr, $bartkey, $bart, $bartstory, $anteil, $con;
97
98        $sql="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche "
99        ."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
100        ."WHERE f.endet IS NULL AND g.endet IS NULL AND f.istgebucht = $1 ";
101        if ($filtgem === '') { // ungefiltert
102                $v=array($gml_bs);
103        } else {
104                $sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÀndiges Gebiet
105                $v=array($gml_bs, $filtkreis, $filtgem);
106        }
107        $sql.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
108        $resf = pg_prepare($con, "", $sql);
109        $resf = pg_execute($con, "", $v);
110        if (!$resf) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck</p>";}
111        $zeianz=pg_num_rows($resf);
112        while($rowf = pg_fetch_assoc($resf)) {
113                $fskenn=$rowf["zaehler"];
114                if ($rowf["nenner"] != "") { // Bruch
115                        $fskenn.="/".$rowf["nenner"];
116                }
117                $flae=number_format($rowf["amtlicheflaeche"],0,",",".") . " m&#178;";
118
119                echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
120               
121                // Sp. 1-3 der Tab. Daten aus Buchungsstelle, nicht aus FS
122                if($lfdnr === $altlfdnr) { // gleiches GrundstÃŒck, leer lassen
123                        echo "\n\t<td>&nbsp;</td>"
124                        ."\n\t<td>&nbsp;</td>"
125                        ."\n\t<td>&nbsp;</td>";
126                } else { // Sprungmarke, BVNR
127                        $bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
128                        echo "\n\t<td id='bvnr".$bvnr."'><span class='wichtig'>".$bvnr."</span>\n\t</td>"
129                        ."\n\t<td title ='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
130                        ."\n\t<td>&nbsp;</td>";
131                        $altlfdnr=$lfdnr;
132                }
133
134                // Sp. 4-7 aus FlurstÃŒck
135                echo "\n\t<td>".DsKy($rowf["gemarkungsnummer"], 'Gemarkungsnummer').$rowf["bezeichnung"]."</td>"
136                ."\n\t<td>".$rowf["flurnummer"]."</td>\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
137                ."\n\t<td class='fla'>".$flae."</td>"
138                ."\n\t<td>\n\t\t<p class='nwlink noprint'>";
139
140                // Buchung BVNR
141                If ($mit_buchung_link == true) { // nur bei GrundstÃŒck
142                        echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs.LnkStf()
143                        ."' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>&nbsp;";                     
144                        $mit_buchung_link = false; // nur in erster Zeile
145                }
146                // Flurstk.
147                echo "\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowf["gml_id"]."&amp;eig=n".LnkStf()."' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
148                ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''></a>"
149                ."\n\t\t</p>\n\t</td>\n</tr>";
150        }
151        pg_free_result($resf);
152        return $zeianz;
153}
154
155function bnw_bszeile_h() {
156/*      Bestandsnachweis - Buchungs-Stellen-Zeile ausgeben - herrschend.
157        Die GB-Daten hierzu stehen bereits im Kopf und bleiben in der Tab. leer */
158        global $dbg, $gkz, $trclass, $lfdnr, $bartkey, $bart, $bartstory, $anteil;
159
160        $bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
161        echo "\n<tr class='".$trclass."'>"
162        ."\n\t<td id='bvnr".$bvnr."'><span class='wichtig'>".$bvnr."</span></td>" // Sprungmarke=BVNR auf dem GB-Blatt
163        ."\n\t<td class='dien' title='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
164        ."\n\t<td class='dien'>".$anteil."</td>"
165        ."\n\t<td colspan=5>&nbsp;</td>\n</tr>";
166}
167
168function bnw_bszeile_d($bezkey, $beznam, $blatt, $blattartkey, $blattart, $lfdnran, $gbgml, $gml_bsan, $ebene, $und) {
169/*      Bestandsnachweis - Buchungsstellen-Zeile ausgeben - dienend
170        Eine Folge-Zeile fÃŒr eine dienende Buchung ausgeben. */
171        global $gkz, $trclass, $bartkey, $bart, $bartstory, $anteil;
172
173        $bvnr=str_pad($lfdnran, 4, "0", STR_PAD_LEFT);
174        $filler=str_repeat("&nbsp;", $ebene - 2); // 3 und 4 EinrÃŒcken
175        if ($und){$filler.="und ";}; // Unterscheidung Hierarchie (Ebene wechselt) von Liste (gleiche Ebene)
176        echo "\n<tr class='".$trclass."'>"
177        ."\n\t<td title='Ebene ".$ebene."'>".$filler."an</td>"
178        ."\n\t<td class='dien' title='".$bartstory."'>".DsKy($bartkey, 'Buchungsart-*').$bart."</td>"
179        ."\n\t<td class='dien'>".$anteil."</td>";
180
181        // Sp.4 GB-Bezirk
182        echo "\n\t<td class='dien' title='Grundbuch-Bezirk'>".DsKy($bezkey, 'Grundbuch-Bezirk-*').htmlentities($beznam, ENT_QUOTES, "UTF-8")."</td>"
183        ."\n\t<td class='dien' title='".$blattart."'>".$blatt."</td>"
184        ."\n\t<td class='dien' title='Bestandsverzeichnis-Nummer'>".$bvnr."</td>"
185        ."\n\t<td class='dien'></td>";
186
187        echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
188
189        // Link Bestand Blatt
190        echo "\n\t\t\t".DsKy($blattartkey, 'Blatt-Art-*')."<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml.LnkStf()
191        ."#bvnr".$lfdnran."' title='Zum Grundbuchnachweis des dienenden Blattes'>".$blattart
192        ." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>";
193
194        if ($bartkey < 2000){
195                // Link Buchung BVNR nur fÃŒr GrundstÃŒck usw.
196                echo "<br>\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bsan.LnkStf()
197                ."' title='Grundst&uuml;cksnachweis'>Buchung <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a>";   
198        }
199        echo "\n\t\t</p>"
200        ."\n\t</td>\n</tr>";
201}
202
203// Start
204ini_set("session.cookie_httponly", 1);
205session_start();
206$showkey="n"; $nodebug=""; // Var. initalisieren
207$cntget = extract($_GET); // Parameter in Variable umwandeln
208
209// strikte Validierung aller Parameter
210if (isset($gmlid)) {
211        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
212} else {
213        die("Fehlender Parameter");
214}
215if (isset($gkz)) {
216        if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
217} else {
218        die("Fehlender Parameter");
219}
220if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
221if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
222if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
223
224include "alkis_conf_location.php";
225include "alkisfkt.php";
226
227?>
228<!doctype html>
229<html lang="de">
230<head>
231        <meta charset="utf-8">
232        <meta name="viewport" content="width=device-width, initial-scale=1.0">
233        <title>ALKIS Bestandsnachweis</title>
234        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
235        <link rel="shortcut icon" type="image/x-icon" href="ico/Grundbuch.ico">
236        <script type="text/javascript">
237                function ALKISexport(gmlid) {
238                        window.open('alkisexport.php?gkz=<?php echo $gkz;?>&tabtyp=grundbuch&gmlid=' + gmlid);
239                }
240        </script>
241</head>
242<body>
243<?php
244
245$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
246$dbg=$debug;
247if ($nodebug === "j") {$dbg=0;}
248
249$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbestnw.php'");
250if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
251
252// G R U N D B U C H
253$sql="SELECT g.gml_id, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung AS blatt, g.blattart, wb.beschreibung AS blattartv, wb.dokumentation AS blattartd,
254b.gml_id, b.bezirk, b.bezeichnung AS beznam, d.gml_id, d.land, d.bezeichnung, d.stelle, d.stellenart, wd.beschreibung AS stellev
255FROM ax_buchungsblatt g
256LEFT JOIN ax_buchungsblattbezirk b ON g.land=b.land AND g.bezirk=b.bezirk ".UnqKatAmt("g","b")
257."LEFT JOIN ax_dienststelle d ON b.land=d.land AND b.gehoertzu_stelle=d.stelle ".UnqKatAmt("b","d")
258."LEFT JOIN ax_blattart_buchungsblatt wb ON g.blattart = wb.wert
259LEFT JOIN ax_behoerde wd ON d.stellenart = wd.wert
260WHERE g.gml_id= $1 AND g.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL;";
261// .. AND d.stellenart=1000
262
263$v = array($gmlid);
264$res = pg_prepare($con, "", $sql);
265$res = pg_execute($con, "", $v);
266if (!$res) {
267        echo "\n<p class='err'>Fehler bei Grundbuchdaten.</p>";
268        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
269}
270$zeianz=pg_num_rows($res);
271if ($dbg > 0) {
272        if ($zeianz > 1){
273                echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Grundbuch-Objekt!</p>";
274                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
275        }
276}
277if ($zeianz == 0){
278        echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r ein Grundbuch-Blatt mit gml_id=".$gmlid."</p>";
279        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
280        echo "\n</body>\n</html>";
281        return;
282}
283if ($row = pg_fetch_assoc($res)) {
284        $blattkey=$row["blattart"];
285        $blattart=$row["blattartv"];
286        $blatt=ltrim($row["blatt"], "0");
287
288        echo "<p class='balken gbkennz'>ALKIS Bestand ".$row["bezirk"]." - ".$blatt."&nbsp;</p>"; // Balken
289        echo "\n<h2>Grundbuch</h2>";
290        echo "\n<table class='outer'>" // Blatt UND Eigent.
291                ."\n\t<tr>\n\t\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Blatt:</td>"
292                ."\n\t\t<td colspan='2'>"; // Outer Mitte, Kennz. im Rahmen
293                        if ($blattkey === "1000") {
294                                echo "\n\t\t\t<table class='kennzgb' title='Bestandskennzeichen'>";
295                        } else {
296                                echo "\n\t\t\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
297                        }
298                        echo "\n\t\t\t<tr>"
299                                ."\n\t\t\t\t<td class='head'>".DsKy($row["stellenart"], 'Stellenart-*').$row["stellev"]."</td>"
300                                ."\n\t\t\t\t<td class='head'>Bezirk</td>"
301                                ."\n\t\t\t\t<td class='head' title='".htmlentities($row["blattartd"], ENT_QUOTES, "UTF-8")."'>".DsKy($blattkey, 'Blattart-*').$blattart."</td>"
302                        ."\n\t\t\t</tr>\n\t\t\t<tr>"
303                                ."\n\t\t\t\t<td title='Amtsgerichtsbezirk'>".DsKy($row["stelle"], 'Stelle-*').htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8")."</td>"
304                                ."\n\t\t\t\t<td title='Grundbuchbezirk'>".DsKy($row["bezirk"], 'Grundbuchbezirk-*').htmlentities($row["beznam"], ENT_QUOTES, "UTF-8")."</td>"
305                                ."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
306                        ."\n\t\t\t</tr>"
307                ."\n\t\t\t</table>"
308                ."\n\t\t</td>\n\t\t<td>&nbsp;</td>\n\t</tr>";
309}
310pg_free_result($res);
311
312if ($blattkey === "5000") { // fikt. Blatt
313        echo "\n<p>Keine Angaben zum Eigentum bei fiktivem Blatt.</p>";
314} else { // E I G E N T Ü M E R
315        $n = eigentuemer($gmlid, true, false); // MIT Adressen.
316        if ($n === 0) { // keine NamensNr, kein Eigentuemer
317                echo "\n<p class='err'>Keine Namensnummer gefunden.</p>"
318                ."\n<p>Bezirk: ".$row["bezirk"].", Blatt: ".$blatt.", Blattart ".$blattkey." (".$blattart.")</p>";
319        }
320}
321echo "\n</table>";
322
323// Vorab eine Tiefbohrung zur Sondierung von (potentiell) herrschend bis dienend ÃŒber max. 4 Buchungs-Stellen.
324// Diese ZÀhlung sagt nur aus, ob es "generell" solche FÀlle auf diesem Grundbuch gibt (ist selten).
325// In jedem einzelnen Zweig der Buchungen muss aber individuell danach gesucht werden.
326// Die Relation "zu" ist hier einbezogen, wird aber spÀter nicht ausgewertet. Hier könnte man die Differenz erkennen falls "zu" doch mal auftaucht.
327$sql ="SELECT count(s2.laufendenummer) AS anz2";
328if ($dbg > 1) {$sql.=", count(s3.laufendenummer) AS anz3, count(s4.laufendenummer) AS anz4";}
329$sql.=" FROM ax_buchungsstelle sh " // herrschend
330        ."LEFT JOIN ax_buchungsstelle s2 ON (s2.gml_id=ANY(sh.an) OR s2.gml_id=ANY(sh.zu)) ";
331if ($dbg > 1) {
332        $sql.="LEFT JOIN ax_buchungsstelle s3 ON (s3.gml_id=ANY(s2.an) OR s3.gml_id=ANY(s2.zu)) "
333                ."LEFT JOIN ax_buchungsstelle s4 ON (s4.gml_id=ANY(s3.an) OR s4.gml_id=ANY(s3.zu)) ";
334}
335$sql.="WHERE sh.istbestandteilvon= $1 AND sh.endet IS NULL AND s2.endet IS NULL ";
336if ($dbg > 1) {$sql.="AND s3.endet IS NULL AND s4.endet IS NULL";}
337$v=array($gmlid); // GB-Blatt
338$res=pg_prepare($con, "", $sql);
339$res=pg_execute($con, "", $v);
340if (!$res) {
341        echo "\n<p class='err'>Fehler bei tiefer Suche nach Buchungen.</p>";
342        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
343}
344$row=pg_fetch_assoc($res);
345$anz2=$row["anz2"]; // steuert Tabellenform und Überschrift
346if ($dbg > 1) {
347        $anz3=$row["anz3"];
348        $anz4=$row["anz4"];
349        echo "\n<p class='dbg'>Anzahl dienende Buchungen Ebene 2: '".$anz2."', Ebene 3: '".$anz3."', Ebene 4: '".$anz4."'</p>";
350}
351echo "\n<hr>\n\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''>";
352if ($anz2 > 0) { // auch "Rechte an", also dienende B.
353        echo " Rechte und Flurst&uuml;cke</h3>\n<table class='fs'>";
354        echo "\n<tr>" // zus. Kopfz. "Rechte" vor FS
355                ."\n\t<td class='heads' title='laufende Nummer Bestandsverzeichnis (BVNR) = Grundst&uuml;ck'>\n\t\t<span class='wichtig'>BVNR</span>"
356                        ."\n\t\t<img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'>\n\t</td>"
357                ."\n\t<td class='head dien' title='herrschendes Grundst&uuml;ck'>Buchungsart</td>"
358                ."\n\t<td class='head dien'>Anteil</td>"
359                ."\n\t<td class='head dien'>Bezirk</td>"
360                ."\n\t<td class='head dien'>Blatt</td>"
361                ."\n\t<td class='head dien'>BVNR</td>"
362                ."\n\t<td class='head dien'>&nbsp;</td>"
363                ."\n\t<td class='head dien'>&nbsp;</td>"
364        ."\n</tr>";
365} else { // keine Rechte an, nur FS
366        echo " Flurst&uuml;cke</h3>\n<table class='fs'>";
367}
368echo "\n<tr>"; // Kopfzeile "FlurstÃŒck"
369        if ($anz2 > 0) { // BS und FS
370                echo "\n\t<td class='head'>&nbsp;</td>"
371                ."\n\t<td class='head'>&nbsp;</td>";
372        } else { // nur FS
373                echo "\n\t<td class='heads' title='laufende Nummer Bestandsverzeichnis (BVNR) = Grundst&uuml;ck'>\n\t\t<span class='wichtig'>BVNR</span>"
374                        ."\n\t\t<img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'>"
375                ."\n\t</td>"
376                ."\n\t<td class='head'>Buchungsart</td>";
377        }
378        echo "\n\t<td class='head'>&nbsp;</td>"
379        ."\n\t<td class='heads'>Gemarkung</td>"
380        ."\n\t<td class='heads'>Flur</td>"
381        ."\n\t<td class='heads fsnr' title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>Flurst.</span></td>"
382        ."\n\t<td class='head fla'>Fl&auml;che</td>"
383        ."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>"
384."\n</tr>";
385
386// Blatt ->  B u c h u n g s s t e l l e (oberste Ebene 1, GrundstÃŒck oder herrschend). Relation istBestandteilVon
387// aktuelles ax_buchungsblatt <istBestandteilVon< ax_buchungsstelle
388$sql ="SELECT s.gml_id, s.buchungsart, s.laufendenummer AS lfd, s.beschreibungdesumfangsderbuchung AS udb, s.zaehler, s.nenner,
389s.nummerimaufteilungsplan AS nrap, s.beschreibungdessondereigentums AS sond, b.beschreibung as bart, b.dokumentation
390FROM ax_buchungsstelle s
391LEFT JOIN ax_buchungsart_buchungsstelle b ON s.buchungsart = b.wert
392WHERE s.istbestandteilvon= $1 AND s.endet IS NULL ORDER BY cast(s.laufendenummer AS integer);";
393$v=array($gmlid);
394$res=pg_prepare($con, "", $sql);
395$res=pg_execute($con, "", $v);
396if (!$res) {
397        echo "\n<p class='err'>Fehler bei Buchung.</p>";
398        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
399}
400$i=0;  // ZÀhler Buchungs-Stellen auf oberer Ebene
401$zpaar=false;
402$altlfdnr=''; // GW
403
404while($row = pg_fetch_assoc($res)) { // Loop Buchungsstellen der 1. Ebene (herrschend oder nur FS)
405        $i++;
406        $gml_bs=$row["gml_id"]; // gml der Buchungsstelle
407        $lfdnr=$row["lfd"];
408        $bartkey=$row["buchungsart"]; // Key
409        $bart=$row["bart"]; // BuchungsART Text dazu
410        $bartstory=htmlentities($row["dokumentation"], ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet     
411        if ($row["zaehler"] == "") {$anteil = "";}
412        else {$anteil = $row["zaehler"]."/".$row["nenner"];}
413        if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel je Buchung auf Ebene 1
414        $zpaar=!$zpaar;
415
416        if ($bartkey <= 1102) { // (aufgeteiltes) GrundstÃŒck
417
418                $zeianz = bnw_fsdaten($gml_bs, true); // FlurstÃŒcksdaten zur direkten Buchungsstelle
419                if ($zeianz === 0) {
420                        echo "\n<tr class='".$trclass."'>\n\t<td><span class='wichtig'>".$lfdnr."</span></td>"
421                        ."\n\t<td colspan='7'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n\t<td></td>\n</tr>";
422                }
423
424        } else { // herrschende Buchung
425
426                bnw_bszeile_h(); // Die herrschende Buchung, aus Global
427
428                $altlfdnr=$lfdnr;
429
430                if ($row["nrap"] != "") { // Nr im Auft.Plan
431                        echo "\n<tr>\n\t<td colspan=3></td><td class='nrap' colspan=4>Nummer <span class='wichtig'>".$row["nrap"]."</span> im Aufteilungsplan.</td><td></td>\n</tr>";
432                }
433
434                if ($row["sond"] != "") { // Sondereigentumsbeschreibung
435                        echo "\n<tr>\n\t<td></td><td class='sond' colspan=6 title='Sondereigentums-Beschreibung'>Verbunden mit dem Sondereigentum an: ".$row["sond"]."</td><td></td>\n</tr>";
436                }
437
438                $tiefer = bnw_bsdaten($gml_bs, 2);  // dienend, recursiv Ebenen 2,3,4
439
440        }
441}
442echo "\n</table>";
443if ($i === 0) {echo "\n<p class='err'>Keine Buchung gefunden.</p>";}
444pg_free_result($res);
445
446// B e r e c h t i g t e  BuchungsblÀtter mit Recht an dem aktuellen (fiktiven?) Blatt
447
448// bf                          sf            sb                               bb
449// Blatt   <istBestandteilVon< Stelle  <an<  Stelle      >istBestandteilVon>  Blatt
450// Fiktiv                      Fiktiv  <zu<  Berechtigt                       Berechtigt
451$sql="SELECT sf.laufendenummer AS anlfdnr, bb.gml_id, bb.land, bb.bezirk, bb.buchungsblattnummermitbuchstabenerweiterung AS blatt, bb.blattart, wa.beschreibung AS blattartv,
452sb.gml_id AS gml_s, sb.laufendenummer AS lfdnr, sb.buchungsart, wb.beschreibung AS bart, wb.dokumentation AS bartd, bz.bezeichnung AS beznam, d.bezeichnung, d.stelle, d.stellenart, wd.beschreibung AS stellev
453FROM ax_buchungsstelle sf JOIN ax_buchungsstelle sb ON (sf.gml_id=ANY(sb.an) OR sf.gml_id=ANY(sb.zu))
454JOIN ax_buchungsblatt bb ON bb.gml_id=sb.istbestandteilvon
455LEFT JOIN ax_buchungsblattbezirk bz ON bb.land=bz.land AND bb.bezirk=bz.bezirk ".UnqKatAmt("bb","bz")
456."LEFT JOIN ax_dienststelle d ON bz.land=d.land AND bz.gehoertzu_stelle=d.stelle ".UnqKatAmt("bz","d")
457."LEFT JOIN ax_blattart_buchungsblatt wa ON bb.blattart = wa.wert
458LEFT JOIN ax_buchungsart_buchungsstelle wb ON sb.buchungsart = wb.wert
459LEFT JOIN ax_behoerde wd ON d.stellenart = wd.wert
460WHERE sf.istbestandteilvon = $1 AND sf.endet IS NULL AND sb.endet IS NULL AND bb.endet IS NULL AND bz.endet IS NULL AND d.endet IS NULL
461ORDER BY cast(sf.laufendenummer AS integer), bz.bezeichnung, bb.buchungsblattnummermitbuchstabenerweiterung, cast(sb.laufendenummer AS integer);";
462
463$v = array($gmlid);
464$resb = pg_prepare($con, "", $sql);
465$resb = pg_execute($con, "", $v);
466if (!$resb) {
467        echo "\n<p class='err'>Fehler bei 'Berechtigte Bl&auml;tter.</p>";
468        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
469}
470$b=0; // count: Buchungen / BlÀtter
471$zpaar=false;
472while($rowb = pg_fetch_assoc($resb)) {
473        if ($b === 0) { // Überschrift und Tabelle nur ausgeben, wenn etwas gefunden wurde
474                echo "\n\n<h3><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Berechtigte Grundb&uuml;cher</h3>"
475                ."\n<table class='outer'>\n<tr>"
476                ."\n\t<td class='heads' title='lfd. Nr. auf diesem Blatt, wie im Teil Flurst&uuml;cke'><span class='wichtig'>an BVNR</span><img src='ico/sort.png' width='10' height='10' alt='' title='prim&auml;re Sortierung'></td>"
477                ."\n\t<td class='head'>Dienststelle</td>"
478                ."\n\t<td class='heads'>Bezirk</td>"
479                ."\n\t<td class='heads'><span class='wichtig'>Blatt</span></td>"
480                ."\n\t<td class='heads'>BVNR</td>"
481                ."\n\t<td class='head'>Buchungsart</td>"
482                ."\n\t<td class='head nwlink noprint'>Weitere Auskunft</td>\n</tr>";
483        }
484
485        $anlfdnr=$rowb["anlfdnr"];      // an BVNR
486        $anlfdnr0=str_pad($anlfdnr, 4, "0", STR_PAD_LEFT); // mit fÃŒhr.0
487        $gml_b=$rowb["gml_id"];         // id des ber. Blattes
488        $gml_s=$rowb["gml_s"];          // id der ber. B-Stelle
489        $blart=$rowb["blattart"];
490
491        $buch=$rowb["buchungsart"];     // Buchungsart Stelle berechtigt
492        $bart=$rowb["bart"];            // BA entschl.
493        $lfdnr=$rowb["lfdnr"];          // BVNR ber.
494        $blatt=ltrim($rowb["blatt"], "0");
495        $bvnr=str_pad($lfdnr, 4, "0", STR_PAD_LEFT);
496
497        if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel je Zeile = GrundstÃŒck
498        $zpaar=!$zpaar;
499
500        echo "\n<tr class='".$trclass."'>"; // Der Teil "berechtigte GrundbÃŒcher" ist nach BVNR sortiert wie oberer Teil "FlurstÃŒcke"
501                echo "\n\t<td><span class='wichtig'>".$anlfdnr0."</span></td>"
502                ."\n\t<td>"; // Amtsgericht,Grundbuchamt
503                        echo htmlentities($rowb["stellev"], ENT_QUOTES, "UTF-8")." ";
504                        echo DsKy($rowb["stelle"], 'Stelle-*').htmlentities($rowb["bezeichnung"], ENT_QUOTES, "UTF-8")
505                ."</td>"
506                ."\n\t<td>".DsKy($rowb["bezirk"], 'Grundbuch-Bezirk-*').htmlentities($rowb["beznam"], ENT_QUOTES, "UTF-8")."</td>"
507                ."\n\t<td><span class='wichtig'>".$blatt."</span></td>"
508                ."\n\t<td>".$bvnr."</td>"
509                ."\n\t<td title='".htmlentities($rowb["bartd"], ENT_QUOTES, "UTF-8")."'>".DsKy($buch, 'Buchungsart-*').$bart."</td>"
510                ."\n\t<td>"
511                        ."\n\t\t<p class='nwlink noprint'>";
512                        // Bestand
513                        echo "\n\t\t\t".DsKy($blart, 'Blattart-*')."<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gml_b.LnkStf()
514                        ."#bvnr".$lfdnr."' title='Nachweis des berechtigten Blattes an einer Buchung auf ".$blattart."'>".$rowb["blattartv"]
515                        ." \n\t\t\t<img src='ico/GBBlatt_link.png' width='16' height='16' alt=''></a>"
516                        ."\n\t\t</p>"
517                ."</td>"
518        ."\n</tr>";
519        $b++;
520}
521if ($b === 0) {
522        if ($blattkey > 2000 ) { // Warnung nicht bei Grundbuchblatt 1000 und Katasterblatt 2000
523                echo "\n<p class='err'>Keine berechtigten Bl&auml;tter zu ".$blattart." (".$blattkey.") gefunden.</p>";
524        }
525} else {
526        echo "\n</table>";
527        if ($i > 1) {
528                echo "\n<p class='cnt'>Rechte anderer Buchungsstellen an ".$b." der ".$i." Buchungen</p>";
529        }
530}
531pg_free_result($resb);
532
533echo "\n<div class='buttonbereich noprint'>\n<hr>"
534        ."\n\t<a title='zur&uuml;ck' href='javascript:history.back()'><img src='ico/zurueck.png' width='16' height='16' alt='zur&uuml;ck'></a>&nbsp;";
535if ($PrntBtn==true){echo "\n\t<a title='Drucken' href='javascript:window.print()'><img src='ico/print.png' width='16' height='16' alt='Drucken'></a>&nbsp;";}
536if ($blattkey == 5000) { // Nicht bei "fiktives Blatt"
537        echo "\n\t<img src='ico/download_gb_no.png' width='32' height='16' alt='Export' title='F&uuml;r ein fiktives Blatt ohne Eigent&uuml;mer ist ein CSV-Export nicht sinnvoll.'>";
538} else {
539        echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_gb.png' width='32' height='16' alt='Export'></a>";
540}
541echo "&nbsp;\n</div>";
542footer($gmlid, selbstverlinkung()."?", "");
543?>
544</body>
545</html>
Note: See TracBrowser for help on using the repository browser.