Wie doppelte Datensätze bei der Neueingabe vermeiden?
Ich habe meine Datenbank soweit mit eurer Hilfe funtionsfähig erstellt.
Ich benutze auch die Scriptsprache für Überwachungen.
Ein großes Problem besteht weiterhin für mich.
Wie kann ich bei der Neueingabe eines Datensatzes prüfen, ob der Datensatz nicht schon vorhanden ist.
Ich möchte für den Vergleich ein Barcode-Feld nutzen.
Wenn ich einen neuen Datensatz erzeuge gehe ich auf das Barcode-Feld und gebe den Barcode ein. (Manuell oder Kamera)
Nachdem der Wert erfasst ist, soll per Script geprüft werden, ob der Barcode in der Tabelle vorhanden ist oder nicht.
Wenn bereits vorhanden, soll der eben erstellte Datensatz sofort wieder gelöscht werden ansonsten geht die Eingabe der restlichen Felder weiter.
Mir fehlen hier die Befehle für 'suche nach dem Datensatz in der Tabelle' 'Auswertung wenn gefunden Ja/Nein'
Der Barcode ist eine Eindeutigkeit, der nur einmal in der Vorhandenen Tabelle vorkommen kann.
Also kann keine Datenmenge existieren.
Er ist mit dieser eindeutigen Nummer vorhanden oder nicht und hier möchte ich gerne wissen, wie ich das per Script darstelle.
Vielen Dank vorab.
Gruss
Uwe
18 Antworten
-
Hallo Uwe,
hier "nur" mit Alert:
if 'Barcode' != null then
let myBC := 'Barcode';
let myNR := Nr;
let myCNT := cnt(select 'Deine Tabelle' where Nr != myNR and 'Barcode' = myIP);
if myCNT != 0 then
alert("Der Datensatz mit dem Barcode <" + myBC + "> existiert bereits.")
end;
lg, Torsten
-
Hallo Torsten
Erst einmal Danke für deine Hilfe.
Ich habe dein Script jetzt in das Feld Barcode eingebunden.
Hier meine Anpassung:
if Barcode != null then
let myBC := Barcode;
let myNR := Nr;
let myCNT := cnt(select Nahrungsmittel where Nr != myNR and Barcode = myBC);
if myCNT != 0 then
alert("Der Datensatz mit dem Barcode <" + myBC + "> existiert bereits.")
end;
end;Zeile 4 hat bei dir die Variable myIP enthalten, du meinstest sicherlich myBC und eine end-Anweisung fehlte noch.
Damit funktioniert schon einmal die Alarmmeldung, das der Wert bereits vorhanden ist. (Habe ich getestet :-))
Darauf kann ich jetzt aufbauen und den Datensatz löschen.
Danke nochmals für die Hilfe ohne die ich nicht weitergekommen wäre.
Gruss
Uwe
-
So, im Handbuch steht zum löschen des Datensatzes soll der Befehl delete benutzt werden.
Wenn ich nach dem 'Alert' jetzt 'delete' hinscheibe passiert außer einer Fehlermeldung nichts.
....if myCNT != 0 then
alert("Der Datensatz mit dem Barcode <" + myBC + "> existiert bereits.")delete
end;
Auch Semikolons am Ende bringen keine Abhilfe.
Das Handbuch erklärt nicht, wie der Befehl zu verwenden ist (Schreibweise) im den aktuellen Datensatz zu löschen.
Das finde ich für ein Handbuch sch....e
-
Hallo Uwe,
den aktuellen Datensatz kannst Du mit
delete this
löschen.Gruß Alex
-
Hallo Alex
Deine Schreibweise funktioniert.
Mit einem weiteren Semikolon habe ich auch hinbekommen, dass erst die Warnmeldung angezeigt wird und der Datensatz gelöscht wird.
...
if myCNT != 0 then
alert("Der Datensatz mit dem Barcode <" + myBC + "> existiert bereits.");
delete this
end........
Falls andere auch vor dem Problem stehen.
-
Hallo Uwe,
schön das es klappt - und sorry für den copy/paste-Fehler ;-)
lg, Torsten
-
Hallo Torsten
Kein Problem, das hilft dann beim verstehen.
Und nochmals vielen Dank.
-
Hallo.
Ich versuche gerade, euer Script für mich zu nutzen, aber bei mir funktionert es nicht.
In der Tabelle "Rechnungen" habe ich entweder unter "Nach Änderung ..." oder "Bei neuem Datensatz... euer Script, dass ich für meine Bedürfnissse angepasst habe, eingefügt, bekomme aber keine Meldung und auch der Datensatz wird doppelt eingetragen. Dabei soll er beid ereingabe von Rech.-Nr. und Ausstelldatum die Meldung bringen und den Datensatz nicht erstellen.
Habe ich einen Fehler im Script (oder eventuell im Kopf)?
Toll, wenn jemand helfen könnte. Dank im Voraus.
Gruß
Peer
-
Ich habe den Fehler gefunden.
let myCNT := cnt(select Rechungen where 'Rech.-Nr.' = myBC and Ausstelldatum = myDate);
Ein Ausrufezeichen war zuviel.
Jetzt brauche ich aber Hilfe, wenn beide Bedingungen Rech.-Nr. und Ausstelldatum schon vorhanden sind, soll die Meldung kommen und der DS gelöscht werden.
-
Hallo Peer,
mir deucht, wenn Du das Script so als Trigger nach Änderung eingetragen hast, wird Dir Ninox jeden Datensatz, den Du anfasst, löschen, denn mit
let myCNT := cnt(select Rechungen where 'Rech.-Nr.' = myBC and Ausstelldatum = myDate);
zählst Du, wieviele Datensätze in der Tabelle Rechnungen (Typo?) die selbe 'Rech.-Nr.' und das gleiche Ausstelldatum wie der aktuelle haben - und das inklusive des aktuellen Datensatzes. Das Ergebnis dürfte ergo immer mindestens "1" sein.
if 'Rech.-Nr.' != null then
let my := Nr;
let myReNr := 'Rech.-Nr.';
let myDate := Ausstelldatum;
let myCNT := cnt(select Rechnungen where 'Rech.-Nr.' = myReNr and Ausstelldatum = myDate and Nr != my);
if myCNT != 0 then
alert("Der Datensatz mit der Rechnung Nr. " + myReNr + " existiert bereits.");
delete this
end
end
als Trigger nach Änderung in den Tabellen-Eigenschaften sollte zum gewünschten Ziel führen.
lg, Torsten
-
Hallo Torsten.
Vielen Dank für deine Hilfe.
Auch wenn ich mich jetzt vielleicht blamiere, kannst du mir erklären, wie man das Script versteht? Wo kommt der Wert Nr her? Dieses Feld gibt es bei mir nicht.
LG Peer
-
Sorry.
Ich Trottel.
Nr ist die Nummer des DS.
Jetzt ist (fast) alles klar.
-
Aber warum funktioniert es trotzdem nicht, wie gewünscht? Scheinbar spricht er das Datumsfeld "Ausstelldatum" nicht an. Ich habe mal das Feld mit in die Meldung gepackt.
let myCNT:= cnt(select Rechnungen where 'Rech.-Nr.' = myNr and Ausstelldatum = myDate and Nr !=my);
if myCNT != 0 then
alert("Die Rechnungs-Nr. " + myNr + " vom " + myDate + " existiert bereits.");
-
Hallo Peer,
ohne direkten Blick auf die Datenbank schwer zu sagen.
Unabhängig von der Frage, warum Du das Datum zusätzlich mit vergleichst (gibt's denn Rechnungen mit gleicher Nummer an unterschiedlichen Tagen - und sind die auch so erwünscht?) würde ich mir vielleicht zum Debuggen eine Ansicht (Gestaltungselement) einfügen und dort den select-Part als Funktion hinterlegen. So siehst Du quasi live, was das Script im Falle des Falles finden und zählen würde. Wenn Deine select-Anweisung da dann passt, kannst Du sie in's Trigger-Script übertragen.
lg, Torsten
-
Hallo
Freut mich, dass meine Anfrage auch bei anderen genutzt und diskutiert wird.
Bei mir funktioniert es soweit gut. Ich möcht jetzt aber die Alert-Meldung erweitern.
Bisher wird ja nur mit der count() Funktion geprüft ob ein weiterer Datensatz mit gleichem Feldeintrag vorhanden ist.
Ich versuche mich jetzt aber daran die Alert-Meldung zu erweitern.
In der Alert-Meldung soll dann der bereits vorhandene Datensatz angezeigt werden. Zumindest die DatensatzNr und einige spezifische Daten um ihn zu finden.
Ich habe schon einiges probiert, bekomme aber nur die Werte des neu eingegeben Datensatzes und nicht des bereits vorhandenen Datensatzes. Ich dachte, dass mit der select()-Funktion beim finden der gefundene Datensatz der dann aktuelle ist und ich einfach dessen Werte in Variablen speichern kann um diese in der Alert-Meldung anzuzeigen. Aber so ist es offensichtlich nicht.
ich habe auch schon in der Handbuch-Hilfe versucht herauszufinden wie die Select()-Funktion funktionirt.
Scheinbar erzeugt diese ein Array, in dem die gefundenen Datensätze gespeichert werden.
Wie komme ich aber an diese ran?
Vielen Dank vorab für eure Hilfe.
Gruss
Uwe
-
Hallo Uwe.
Ich habe ein paar Post vorher zwei Bilder eingefügt, wo man den relevanten Teil erkennt. Nur das Script ist noch alt.
Es kann schon mal vorkommen, dass die Rech.-Nr mehrmals vorkommen kann (z.B. 001), aber es eher unwahrscheinlich, das sie am selben Tag vergeben wird.
Was du des weiteren schreibst, ist für mich nicht zu verstehen. So tief bin ich mit meinem Wissen (noch) nicht vorgedrungen.
Aber das Ausstelldatum sollte doch zumindest in der Meldung erscheinen?
Schreibfehler kann ich keinen erkennen.
Gruß Peer
-
Hallo Uwe,
select() gibt Dir ein Array zurück, das ist korrekt. Da Du wohl in diesem Array immer nur einen Eintrag hast, kannst Du diesen sicher mit
first(select(deine_anweisungen_aus_der_count_funktion))
referenzieren.
lg, Torsten
-
Hallo, mir funktioniert alles super, nur die „delete this“ Funktion funktioniert leider nicht. Ich bekomme die Meldung, dass ein Datensatz dieser Art bereits existiert.
Woran liegt dass ?
LG
Content aside
- vor 5 JahrenZuletzt aktiv
- 18Antworten
- 6034Ansichten