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.


<perl>
################################################################# # 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!!! # # # ################################################################# #################################################################
# Hier die Felnamen eintragen, durch Komma getrennt auf die #
# geprüft werden soll, es können theoretisch beliebig viele #
# Felder eingetragen werden, bedenken sollte man aber, dass #
# bei vielen Feldern und vielen Datensätzen, die ggf. auf Dou- #
# bletten durchsucht werden sollen u.U. die Scriptlaufzeit #
# sich rheblich erhöht - ggf. üerprüfen #
#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
$pruefliste = "feld1,feld2,feld3,feld4";
#################################################################
# hier das Feld eintragen, auf das als erstes Kriterium die #
# entsprechenden Datensätze durchsucht werden sollen #
# ACHTUNG! Dieses Feld MUSS auf SORTIERUNG stehen! #
#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
$suchfeld = "dassollnichtdoppeltsein";
#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
# Datenbankname anpassen, ggf. geht es auch mit dem Parameter #
# $db - besser/sicherer ist den Datenbanknamen feste anzugeben #
#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
$db_work = $db;
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
# Hier beginnt die Funktion zur Doublettensuche #
# kann normalerweise so bleiben - muss nix weiter angepasst #
# werden #
#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
if (%_put && $_get{cmd} ne ""){ # wenn was gespeichert oder geändert werden soll
   @l_chk_doppelt = split /\,/, $pruefliste;
   my $ds_krit = $_put{$suchfeld}; # hier
   get "$suchfeld==$ds_krit", $db_work, "doublettensuche";
   while(get_next("doublettensuche")){
    $cnt_doublettencheck++;
    $cnt_doppelt = 0;
    foreach $vergl(@l_chk_doppelt){
# für jedes Feld nachschaun, ob Wert doppelt ist, wenn ja, Zähler erhöhen
    my $neu_wert = $_put{$vergl};
    $cnt_doppelt++ if $neu_wert eq ${$vergl};
# foreach-Schleife verlassen, wenn ein doppelter DS gefunden wurde
# (wäre ja sinnlos, dann noch weiter zu suchen...)
# doppelter Datensatz liegt vor, wenn alle Felder/Werte aus der
# pruefliste doppelte Werte enthalten (wird einfach nur gezählt,
# wenn der neue und der vorh. Wert übereinstimmt) - wenn der Zähler
# gleich der Anzahl der Elemente der Prüfliste ist, dann liegt ein
# doppelter Datensatz vor
    last if $cnt_doppelt == $#l_chk_doppelt +1;
    } # E forach - check doppelte DS
      # while_get_next-Schleife verlassen, wenn ein doppelter DS gefunden wurde
# (wäre ja sinnlos, dann noch weitere Datensätze zu durchsuchen...)
    last if $cnt_doppelt == $#l_chk_doppelt +1;
   } # E while_get_next
   # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #
if ($cnt_doppelt == $#l_chk_doppelt +1){
$a_dsdoppelt = "Doppelter Datensatz!";
($a_ort,$a_ot,$a_plz) = split /:/,$l_ort_ot_plz;
$a_action = $cmd eq "add" ? "anlegen" : $cmd eq "mod" ? "ändern" : "";
$a_actiontext =<<EOF;
<p>Konnte Datensatz nicht $a_action!<br>
Daten bereits im Datenbestand</p>
<p>[ <a href="javascript:history.back(1)">Zurück</a> ] zur vorherigen Seite</p>
EOF
   undef %_put; $_get{cmd}="";
} else {
    if($cmd eq "add"){
$a_actiontext = "<p>Datensatz gespeichert...</p>";
    put; undef %_put; $_get{cmd}="";
    } elsif($cmd eq "mod"){
      $a_actiontext = "<p>Datensatz geändert...</p>";
    chg; undef %_put; $_get{cmd}="";
} # E if/else DS neu/ändern
   } # E if/else DS doppelt oder nicht, Aktion auf DS
# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #
} # E if put+cmd
out "$a_actiontext";
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
# Ende des Script-Teile zur Doublettensuche #
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
</perl>

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

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

Letzte Änderung am 21.1.2006, 14:53 - Stichworte: Tools, doppelte Datensätze vermeiden, Beispielec - o - +

© baseportal GmbH. Alle Rechte vorbehalten.


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