base
portal
Suche:
Forum
Start
Neue Seite erstellen
Titel:
<h5>Universeller Script-Teil zur Vermeidung von Doppelten Datensätzen</h5> Oftmals kommt es vor, dass man verhindern möchte, dass Daten redundant (doppelt/mehrfach) in eine Datenbank eingetragen werden.</p> Dazu ist es notwendig, Kriterien festzulegen, die einen doppelten Datensatz charakterisieren und dann nach diesen abzufragen.</p> Wenn diese Kriterien zutreffen (also der Datensatz doppelt wäre, wenn er gespeichert wird), wird eine Fehlermeldung ausgegeben und das Speichern wird verhindert.</p> <ul> Das kann man sehr effektiv mit dem folgenden Script-Schnipsel erreichen, die Anpassung ist denkbar einfach, man kann es einfach in seine eigenen Templates einkopieren, auch ohne zu verstehen, was das Script so genau macht (Kommentare sind trotzdem drin, schließlich wird man ja nicht dümmer, wenn man versucht zu verstehen... Ein "kleines" Problem stellt dar, dass bei Ändern von vorhandenen Datensätzen die Änderung verhindert wird, wenn die Daten in den Feldern, die einen doppelten Datensatz charakterisieren, nichts geändert wird. Man kann dies umgehen, indem man die Daten in einem dieser Felder mit ändert und unmittelbar nach Absenden den gleichen Datensatz nochmal bearbeitet um in das zuvor "fälschlicherweise" geänderte Feld den richtigen Wert wieder einzutragen. </ul> <table cellpadding="10" width="90%"> <tr> <td bgcolor="#f0f0f0"><code> <br> <perl><br> ################################################################# # BASEPORTAL-PERLSCRIPT # # # # copyright 2006 by R. Hempel - Computer-Netzwerk-Internet # # Dieses Script ist Freie Software, Sie dürfen es beliebig # # verwenden und/oder verändern nach den Maßgaben und Regelungen # # der GNU GPL, veröffentlicht von der Free Software Foundation # # in Version 2 und allen späteren Versionen. Eine Version der # # Lizenz in einer Übertragung ins Deutsche ist unter # # http://www.gnu.de/gpl-ger.html einsehbar. # # # # Die Entfernung diess Copyrighthinweises ist untersagt. # # Weiterverwendung des Scriptes nur in GPL-Projekten. # # # # !!!Es gilt der Grundsatz: Einmal GPL - Immer GPL!!! # # # ################################################################# #################################################################<br># Hier die Felnamen eintragen, durch Komma getrennt auf die #<br># geprüft werden soll, es können theoretisch beliebig viele #<br># Felder eingetragen werden, bedenken sollte man aber, dass #<br># bei vielen Feldern und vielen Datensätzen, die ggf. auf Dou- #<br># bletten durchsucht werden sollen u.U. die Scriptlaufzeit #<br># sich rheblich erhöht - ggf. üerprüfen #<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br>$pruefliste = "feld1,feld2,feld3,feld4";<br>#################################################################<br># hier das Feld eintragen, auf das als erstes Kriterium die #<br># entsprechenden Datensätze durchsucht werden sollen #<br># ACHTUNG! Dieses Feld MUSS auf SORTIERUNG stehen! #<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br>$suchfeld = "dassollnichtdoppeltsein";<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br># Datenbankname anpassen, ggf. geht es auch mit dem Parameter #<br># $db - besser/sicherer ist den Datenbanknamen feste anzugeben #<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br>$db_work = $db;<br># - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #<br># Hier beginnt die Funktion zur Doublettensuche #<br># kann normalerweise so bleiben - muss nix weiter angepasst #<br># werden #<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br># ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #<br>if (%_put && $_get{cmd} ne ""){ # wenn was gespeichert oder geändert werden soll<br> @l_chk_doppelt = split /\,/, $pruefliste;<br> my $ds_krit = $_put{$suchfeld}; # hier<br> get "$suchfeld==$ds_krit", $db_work, "doublettensuche";<br> while(get_next("doublettensuche")){<br> $cnt_doublettencheck++;<br> $cnt_doppelt = 0;<br> foreach $vergl(@l_chk_doppelt){<br> # für jedes Feld nachschaun, ob Wert doppelt ist, wenn ja, Zähler erhöhen<br> my $neu_wert = $_put{$vergl};<br> $cnt_doppelt++ if $neu_wert eq ${$vergl};<br> # foreach-Schleife verlassen, wenn ein doppelter DS gefunden wurde<br> # (wäre ja sinnlos, dann noch weiter zu suchen...)<br> # doppelter Datensatz liegt vor, wenn alle Felder/Werte aus der<br> # pruefliste doppelte Werte enthalten (wird einfach nur gezählt,<br> # wenn der neue und der vorh. Wert übereinstimmt) - wenn der Zähler<br> # gleich der Anzahl der Elemente der Prüfliste ist, dann liegt ein<br> # doppelter Datensatz vor<br> last if $cnt_doppelt == $#l_chk_doppelt +1;<br> } # E forach - check doppelte DS<br> # while_get_next-Schleife verlassen, wenn ein doppelter DS gefunden wurde<br> # (wäre ja sinnlos, dann noch weitere Datensätze zu durchsuchen...)<br> last if $cnt_doppelt == $#l_chk_doppelt +1;<br> } # E while_get_next<br> # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #<br> if ($cnt_doppelt == $#l_chk_doppelt +1){<br> $a_dsdoppelt = "Doppelter Datensatz!";<br> ($a_ort,$a_ot,$a_plz) = split /:/,$l_ort_ot_plz;<br> $a_action = $cmd eq "add" ? "anlegen" : $cmd eq "mod" ? "ändern" : "";<br> $a_actiontext =<<EOF;<br> <p>Konnte Datensatz nicht $a_action!<br><br> Daten bereits im Datenbestand</p><br> <p>[ <a href="javascript:history.back(1)">Zurück</a> ] zur vorherigen Seite</p><br>EOF<br> undef %_put; $_get{cmd}="";<br> } else {<br> if($cmd eq "add"){<br> $a_actiontext = "<p>Datensatz gespeichert...</p>";<br> put; undef %_put; $_get{cmd}="";<br> } elsif($cmd eq "mod"){<br> $a_actiontext = "<p>Datensatz geändert...</p>";<br> chg; undef %_put; $_get{cmd}="";<br> } # E if/else DS neu/ändern<br> } # E if/else DS doppelt oder nicht, Aktion auf DS<br> # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #<br>} # E if put+cmd<br>out "$a_actiontext";<br># ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #<br># Ende des Script-Teile zur Doublettensuche #<br># ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #<br> </perl><br> <br> </code> </td></tr> </table> Ansicht, wie das ganze funktioniert unter: [ <a href="http://baseportal.de/cgi-bin/baseportal.pl?htx=/hempelr/bib_doubletten/nodoppelt" target=_blank>Test-Seite</a> ] </p> Gesamt-Quelltext-Ansicht des Test-Templates: [ <a href="http://baseportal.de/cgi-bin/baseportal.pl?show=/hempelr/bib_doubletten/nodoppelt" target=_blank>Quelltext-Ansicht</a> ] </p>
Name:
Passwort:
Stichworte:
Version:
1
2
3 Angebot:
Alle
Nur Miete / Lizenz
Nur Miete / Lizenz professional
Nur Miete
Nur Miete smart + pro
Nur Miete smart + pro / Lizenz
Nur Miete pro
Nur Miete ab pure2, smart2, pro1
Nur Lizenz
Nur Lizenz professional
Nur Kostenlos
Ohne Änderungen zurück zur Seite
-
+
©
baseportal
GmbH. Alle Rechte vorbehalten.
powered in 0.01s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!