0

dopplete Einträge bei create vermeiden

Hallo!
Ich würde gerne zufallsmäßig in die Tabelle "Helfereinsätze" Datensätze automatisiert aus einer anderen Tabelle ("Turnierexport") eintragen. Dazu wählt das Skript eine bestimmte Anzahl an Datensätzen aus und schreibt diese dann mittels einer Schleife in die entsprechende Tabelle.

Soweit funktioniert alles gut. Es sollten aber keine doppelten Einträge entstehen.

Definiert sind die Datensätze der Tabelle "Helfereinsätze" einerseits durch das Feld "Helfer" und andererseits durch das Feld "Turniere".

Ich hoffe, diese Erklärung reicht zum Verständnis und freue mich, wenn mir jemand helfen kann :)

for i in select Turnierexport do
let myZufallszahl := i.(Zufallszahl := random());
while first(select Turnierexport where Zufallszahl = myZufallszahl) do
myZufallszahl := random()
end

end;
let verfuegbar := ((select Turnierexport) order by Zufallszahl);
let me := first(select Turnierexport);
let meTurnier := first(select Turniere where Turnier = me.Turnier and Datum = me.Datum);
let helferBisher := cnt(meTurnier.'Helfereinsätze');
for i in range(helferBisher, Helferanzahl) do
let myHelferEinsatz := (create 'Helfereinsätze');
myHelferEinsatz.(Turniere := meTurnier);
myHelferEinsatz.(Dauer := 1);
let iHelfer := item(verfuegbar, i);
let alleHelfer := concat((select Helfer).(Vorname + Nachname));
let theHelp := if index(alleHelfer, iHelfer.(Vorname + Nachname)) < 0 then
let a := (create Helfer);
a.(Vorname := iHelfer.Vorname);
a.(Nachname := iHelfer.Nachname);
record(Helfer,a.Nr)
else
record(Helfer,first(select Helfer where Vorname + Nachname = iHelfer.(Vorname + Nachname)).Nr)
end;
let meH := theHelp;
let myLKs := (select Turnierexport where Vorname = meH.Vorname and Nachname = meH.Nachname).(GK + LK);
delete (select Leistungsklassen where Helfer.Vorname = meH.Vorname and Helfer.Nachname = meH.Nachname);
for i in myLKs do
let myLK := (create Leistungsklassen);
myLK.(Helfer := meH);
myLK.(GK := substr(i, 0, 1));
myLK.(LK := substr(i, 1))
end;
myHelferEinsatz.(Helfer := theHelp)
end;
'Liste anzeigen' := 1

LG,
Wolfgang

2 Antworten

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Wolfgang, da kann man beim besten Willen nicht durchblicken. Angenommen du hast eine Tabelle Helfer und möchtest aus dieser Tabelle per Zufall eine Bestillte Anzahl Helfer auswählen und diese zu einem Turnier durch die Tabelle Helfereinsatz (n:m mit zwei Verknüpfungen Turnier und Helfer) hinzufügen. Random() liefert eine Zufallzahl zwischen 0 und 1. um diese an die Anzahl der Helfer anzupassen würde ich die Zufallszahl so modifizieren :

    ---

    floor(random()*cnt(select(Helfer)))

    ---

    Jetzt brauche ichquasi einen Array aus Datensätzen die sich nicht wiederholen:

    ---

    let myN:="Anzahl Helfer";

    let myArr:=slice(unique(for i from 1 to 10000000 do
    floor(random()*cnt(select(Helfer)))
    end), 0, myN)

    ---

    Und jetzt kann ich aus der Tabelle Turnier mir die Helfer zuordnen:

    ---

    let my:=this;

    let myN:="Anzahl Helfer";

    let myArr:=slice(unique(for i from 1 to 10000000 do
    floor(random()*cnt(select(Helfer)))
    end), 0, myN);

    for i in myArr do

    let new:=create Helfereinsatz;

    new.Turnier:=my;

    new.Helfer:=item(select Helfer,i)

    end

    ----

    Die Formel habe ich jetzt nicht geprüft, aber es sollte eigentlich funktionieren. zuerst wird einen Array aus einem Million Zufalszahlen von 1 bis Anzahl der Daatensätze in der Tabelle Helfer generiert, dann mit unique werden nur eindeutige Zahlen drin gelassen, statistisch gesehen sollte jetzt ein Array mit der Länge von cnz(select Helfer) entstehen, wo die Nummern zufällig zersctreut sind. Jetzt nimmt man mit slice() die benötigten Anzahl der Helfer. und fügt diese in der Schleife zu dem Turnier.

    Leo

    • info.28
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Leo!
    Vielen DANK!

    Du hast mich mit dem cnt auf die springende Idee gebracht!
    Ich habe meinen ursprünglichen Code jetzt etwas umstrukturiert, jetzt funktioniert es!

    Es fehlt nur noch eine Kleinigkeit:
    Die untenstehende Schleife wird so oft durchlaufen, wie es Helfereinsätze bereits gibt bis zur benögtigten Helferanzahl (ein Nummernfeld, wo die entsprechende Zahl zuvor eingetragen wird).

    Doppelte Einträge werden jetzt richtigerweise nicht mehr in die Tabelle "Helfereinsätze" eingetragen. Aber trotzdem wird der Schleifendurchlauf natürlich gezählt. Was bedeutet, dass im Endeffekt zu wenige "Helfereinsätze" produziert werden.

    Wie kann ich es lösen, dass die Schleife tatsächlich so oft durchlaufen wird, dass am Ende die Anzahl der Datensätze in der Tabelle "Helfereinsätze" tatsächlich der angegebenen Anzahl im Feld Helferanzahl entspricht?

    let helferBisher := cnt(select 'Helfereinsätze' where Turniere = meTurnier);
    for i from helferBisher to Helferanzahl do
    let iHelfer := item(verfuegbar, i);
    let alleHelfer := concat((select Helfer).(Vorname + Nachname));
    let theHelp := if index(alleHelfer, iHelfer.(Vorname + Nachname)) < 0 then
    let a := (create Helfer);
    a.(Vorname := iHelfer.Vorname);
    a.(Nachname := iHelfer.Nachname);
    record(Helfer,a.Nr)
    else
    record(Helfer,first(select Helfer where Vorname + Nachname = iHelfer.(Vorname + Nachname)).Nr)
    end;
    if cnt(select 'Helfereinsätze' where Helfer.Vorname = iHelfer.Vorname and Helfer.Nachname = iHelfer.Nachname) < 1 then
    let myHelferEinsatz := (create 'Helfereinsätze');
    myHelferEinsatz.(Turniere := meTurnier);
    myHelferEinsatz.(Dauer := 1);
    myHelferEinsatz.(Helfer := theHelp)
    end;

    end;

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 2Antworten
  • 1495Ansichten