baseportal
Suche: 
 Forum   Start 

Doublettensuche nach beliebig vielen Kriterien

 
Universeller Script-Teil zur Vermeidung von Doppelten Datensätzen

Oftmals kommt es vor, dass man verhindern möchte, dass Daten redundant (doppelt/mehrfach) in eine Datenbank eingetragen werden.

Dazu ist es notwendig, Kriterien festzulegen, die einen doppelten Datensatz charakterisieren und dann nach diesen abzufragen.

Wenn diese Kriterien zutreffen (also der Datensatz doppelt wäre, wenn er gespeichert wird), wird eine Fehlermeldung ausgegeben und das Speichern wird verhindert.

<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&uuml;ft werden soll, es k&ouml;nnen theoretisch beliebig viele     #<br># Felder eingetragen werden, bedenken sollte man aber, dass     #<br># bei vielen Feldern und vielen Datens&auml;tzen, die ggf. auf Dou-  #<br># bletten durchsucht werden sollen u.U. die Scriptlaufzeit      #<br># sich rheblich erh&ouml;ht - ggf. &uuml;erpr&uuml;fen                         #<br>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#<br>$pruefliste = "feld1,feld2,feld3,feld4";<br>#################################################################<br># hier das Feld eintragen, auf das als erstes Kriterium die     #<br># entsprechenden Datens&auml;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&auml;ndert werden soll<br>&nbsp;&nbsp;&nbsp;@l_chk_doppelt = split /\,/, $pruefliste;<br>&nbsp;&nbsp;&nbsp;my $ds_krit = $_put{$suchfeld}; # hier<br>&nbsp;&nbsp;&nbsp;get "$suchfeld==$ds_krit", $db_work, "doublettensuche";<br>&nbsp;&nbsp;&nbsp;while(get_next("doublettensuche")){<br>&nbsp;&nbsp;&nbsp;  $cnt_doublettencheck++;<br>&nbsp;&nbsp;&nbsp;      $cnt_doppelt = 0;<br>&nbsp;&nbsp;&nbsp;      foreach $vergl(@l_chk_doppelt){<br>         # f&uuml;r jedes Feld nachschaun, ob Wert doppelt ist, wenn ja, Z&auml;hler erh&ouml;hen<br>&nbsp;&nbsp;&nbsp;         my $neu_wert = $_put{$vergl};<br>&nbsp;&nbsp;&nbsp;         $cnt_doppelt++ if $neu_wert eq ${$vergl};<br>            # foreach-Schleife verlassen, wenn ein doppelter DS gefunden wurde<br>            # (w&auml;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&auml;hlt,<br>            # wenn der neue und der vorh. Wert &uuml;bereinstimmt) - wenn der Z&auml;hler<br>            # gleich der Anzahl der Elemente der Pr&uuml;fliste ist, dann liegt ein<br>            # doppelter Datensatz vor<br>&nbsp;&nbsp;&nbsp;         last if $cnt_doppelt == $#l_chk_doppelt +1;<br>&nbsp;&nbsp;&nbsp;      } # E forach - check doppelte DS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# while_get_next-Schleife verlassen, wenn ein doppelter DS gefunden wurde<br>      # (w&auml;re ja sinnlos, dann noch weitere Datens&auml;tze zu durchsuchen...)<br>&nbsp;&nbsp;&nbsp;   last if $cnt_doppelt == $#l_chk_doppelt +1;<br>&nbsp;&nbsp;&nbsp;} # E while_get_next<br>&nbsp;&nbsp;&nbsp;# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  #<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" ? "&auml;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&uuml;ck</a> ] zur vorherigen Seite</p><br>EOF<br>&nbsp;&nbsp;&nbsp;undef %_put; $_get{cmd}="";<br>   } else {<br>&nbsp;&nbsp;&nbsp;   if($cmd eq "add"){<br>      $a_actiontext = "<p>Datensatz gespeichert...</p>";<br>&nbsp;&nbsp;&nbsp;   put; undef %_put; $_get{cmd}="";<br>&nbsp;&nbsp;&nbsp;   } elsif($cmd eq "mod"){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a_actiontext = "<p>Datensatz ge&auml;ndert...</p>";<br>&nbsp;&nbsp;&nbsp;   chg; undef %_put; $_get{cmd}="";<br>      } # E if/else DS neu/&auml;ndern<br>&nbsp;&nbsp;&nbsp;} # 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>

Ansicht, wie das ganze funktioniert unter:
Test-Seite ]

Gesamt-Quelltext-Ansicht des Test-Templates:
Quelltext-Ansicht ]

Letzte Änderung am 23.9.2006, 01:32 - Stichworte: Tools, doppelte Datensätze vermeiden, Beispiele

c - o - + 
© baseportal GmbH. Alle Rechte vorbehalten.


powered in 0.02s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!