Duplikate im Array

Ähhhhhhhhhhhhhh - Jaa !

Was willst du uns damit nun sagen ?
Soll das ein SCL-Script werden ?
Wie soll es deiner Meinung nach weiter gehen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nach Duplikaten in Array suchen in SCL

Möchte Daten einträge in einem DB nach Duplikaten durchsuchen
Wird ein Duplikat gefunden soll eine Meldung ausgegeben werden sonnst nicht..

Habe einen UDT angelegt, dieser wird in einem DB als Array aufgerufen.
Der Bediener gibt die Daten mittels OP ein und vergibt namen .
Ist bereits ein Datensatz mit dem gleichem Namen vorhanden soll dies als Meldung angezeigt werden.

Habe folgendes programmiert. Das Problem ist, dieser findet sich selbst und gibt die Meldung aus.

IF SATZ_SPEICHERN AND NOT FL1 THEN // Datensatz bei POS. Flanke speichern
AUFTRAG.DATEN[INDEX]:= AUFTRAG;
FOR INDEX:= 1 TO 99 DO
IF AUFTRAG.DATEN[INDEX].SATZ_NAME = SATZ_NAME THEN
O_MELDUNG:= 100;
EXIT;
END_IF;
END_FOR;
END_IF;
FL1:= SATZ_SPEICHERN;
 
JETZT ABER!

Hallo möchte in ein Array nach Duplikaten durchsuchen.
Falls ein Duplikat gefunden wird soll eine Meldung ausgegeben werden sonst nicht.

Habe ein UDT angelegt. Dieser wird in einem DB als Array aufgerufen.


habe bis jetzt folgendes:

IF #I_SPEICHERN AND NOT #FL1 THEN
"AUFTRÄGE".Auftrag[#INDEX]:= #AUFTRAG;
FOR #INDEX:= 1 TO 99 DO
IF "AUFTRÄGE".Auftrag[#INDEX].SATZ_NAME = #AUFTRAG.SATZ_NAME THEN
#O_MELDUNG_Nr:=106; // Meldung Datensatz schon vorhanden
EXIT;
END_IF;
END_FOR;
END_IF;
#FL1:= #I_SPEICHERN ;

Das Problem ist der findet sich immer selbst!
Wie kann ich auf einen doppelten Eintrag kontrollieren?
 
... du zählst die Anzahl der gleichnamigen Einträge ...! Wenn > 1 dann doppelt !


Habe folgendes probiert, funktioniert aber nicht
was mache ich fasch?

AUFTRAG.SATZ_NAME: STRING
I_SPEICHERN: BOOL;
FL1: BOOL
AUFTRÄGE: ARRAY[1..99] OF DATENSATZ
AUFTRAG: DATENSATZ //Koppelberech HMI -> SPS
i: INT
INDEX: INT
ANZ: INT
O_MELDUNG_Nr: INT



IF #I_SPEICHERN AND NOT #FL1 THEN
"AUFTRÄGE".Auftrag[#INDEX]:= #AUFTRAG;

FOR #i:= 1 TO 99 DO
IF "AUFTRÄGE".Auftrag[#i].SATZ_NAME = #AUFTRAG.SATZ_NAME[INDEX] THEN
#ANZ:= #ANZ+1;
IF #ANZ > 1 THEN
#O_MELDUNG_Nr:=106;
// Meldung Datenatz schon vorhanden
END_IF;
END_IF;
EXIT;
END_FOR;
END_IF;
#FL1:= #I_SPEICHERN ;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem das Du hast, ist das Du den Datensatz einträgst, bevor
Du weist, ob der schon vorhanden ist.
Das muß generell andersrum passieren. Darum findet er immer sich selber.
 
Das wäre eine mögliche Lösung.

IF #I_SPEICHERN AND NOT #FL1 THEN

FOR #i:= 1 TO 99 DO
IF "AUFTRÄGE".Auftrag[#i].SATZ_NAME = #AUFTRAG.SATZ_NAME[INDEX] THEN
#ANZ:= #ANZ+1;
END_IF;
END_FOR;

IF #ANZ >= 1 THEN
#O_MELDUNG_Nr:=106; // Meldung Datenatz schon vorhanden
ELSE
"AUFTRÄGE".Auftrag[#INDEX]:= #AUFTRAG; END_IF;

#FL1:= #I_SPEICHERN;



 
Die Lösung von günny ist sicher gut (wenn er auch vergessen hat #Anz zu initialisieren) und funktioniert bei "kleinen" Arrays

Bei grösseren Tabellen könntest du die Daten sortiert ins Array schreiben und dann mit schnellen Suchalgorithmen nach dem vorhanden sein des Eintrages prüfen.
Aufgrund deiner Frage würde ich dir allerdings davon abraten und die Lösung von günny wählen, das sortieren wäre dann noch etwas komplexer zum implementieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PS: Anhand deiner "#" vor den Variablen gehe ich davon aus, dass du mit TIA arbeitest?
Vorsicht mit Stringgeschichten, sonst hast du schnell ein Problem mit den Lokaldaten, das ist beim TIA noch nicht so richtig gelöst (keine Compileroptionen einstellbar)...
 
Zurück
Oben