0

Denkfehler? Mehrfachauswahl mit Schleife auswerten und Zwischentabelle füllen

Hallo zusammen,

ich brauche einmal euer geballtes Wissen. Und zwar habe ich eine Datenbank mit den Tabellen Ansprechpartner (folgend Ap) und Protokolle (folgend Pr). Um eine m:n Beziehung herstellen zu können habe ich die Tabelle ApPr mit Verknüpfung zu den anderen beiden Tabellen erstellt. In der Tabelle Ap gibt es eine Mehrfachauswahl um Protokolle auswählen zu können, denen der Ap angehört. Zusätzlich hat der Ap noch ein Auswahlfeld aktiv/inaktiv.

Die Tabelle ApPr soll, nach Änderung eines Ap-Datensatzes, automatisch mit den entsprechenden Verknüpfungen gefüllt werden. Erst hatte ich einen Denkfehler und habe den Code so geschrieben, dass nur ein Protokoll in der Mehrfachauswahl verarbeitet werden konnte - das hat einwandfrei funktioniert. Nach Ändern eines Ansprechpartners wurden die entsprechenden Verknüpfungen für Ap und Pr in ApPr angelegt.
Nach ändern des Codes, um beispielsweise auch zwei Protokolle verarbeiten zu können, habe ich nun das Problem, dass zwar EIN Eintrag in ApPr erstellt wird, allerdings hat dieser Eintrag keine Zuweisung zu Pr sondern nur zu Ap und ein zweiter Eintrag wird auch nicht angelegt.
Um die Schleife testen zu können, habe ich ein Textfeld in die Maske eingefügt, in welches die ausgewählten Protokollnamen aus der Mehrfachauswahl eingetragen werden - was auch funktioniert. An dem Wert der Schleife kann es somit also nicht liegen.

Folgend mein Anfangscode (funktionsfähig):

let ApID := this.Nr;
let PID := first(select Protokolle where 'Gruppen-Nr.' = this.'Gruppen-Nr.').Nr;
let data_ApPr := (select ApPr where Ansprechpartner.Nr = ApID and Protokolle.Nr = PID);
if count(data_ApPr) > 0 then
if this.Status = 2 then
delete (select ApPr where Nr = data_ApPr)
end
else
if this.Status = 1 then
let new_ApPr := (create ApPr);
new_ApPr.(Ansprechpartner := ApID);
new_ApPr.(Protokolle := PID)
end
end

Und mein geänderter Code für die Mehrfachauswahl (fehlerhaft):

let ApID := this.Nr;
for i in chosen(this.'Gruppen-Nr.') do
let PID := first(select Protokolle where 'Gruppen-Nr.' = i).Nr;
let data_ApPr := (select ApPr where Ansprechpartner.Nr = ApID and Protokolle.Nr = PID);
if count(data_ApPr) > 0 then
if this.Status = 2 then
delete (select ApPr where Nr = data_ApPr);
end
else
if this.Status = 1 then
let new_ApPr := (create ApPr);
new_ApPr.(Ansprechpartner := ApID);
new_ApPr.(Protokolle := PID);
end
end
end

 

Im Voraus vielen Dank für eure Hilfe!

Svenja

5 Antworten

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Svenja,

    probier mal volgendes:

    ---

    let me := this;
    for i in chosen('Gruppen-Nr.') do
    switch me.Status do
    case 2:
    (delete ApPr[Protokolle.'Gruppen-Nr.' = i])
    case 1:
    if cnt(ApPr[Protokolle.'Gruppen-Nr.' = i]) = 0 then
    let new := (create ApPr);
    new.(Ansprechpartner := me);
    new.(Protokolle := first((select Protokolle)['Gruppen-Nr.' = i]))
    end
    end
    end

    ---

    Leo

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Aber das Vorgehen miot dem Status finde ich nicht besonders bequem. Ich würde es ohne Status machen. So kann man direkt die Protokolle löschen wenn diese aus dem Auswahlfeld abgewählt werden:

    ---

    let me := this;
    delete ApPr[not chosen(me.'Gruppen-Nr.', Protokolle.'Gruppen-Nr.')];
    for i in chosen('Gruppen-Nr.') do
    if cnt(ApPr[Protokolle.'Gruppen-Nr.' = i]) = 0 then
    let new := (create ApPr);
    new.(Ansprechpartner := me);
    new.(Protokolle := first((select Protokolle)['Gruppen-Nr.' = i]))
    end
    end

    ---

    Leo

    • Svenja_Muller
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

     

    vielen Dank für deine Hilfe! Da es vorkommen kann, dass ein Ansprechpartner nur kurzweilig nicht den Protokollen zugeordnet sein soll, ist der Status leider notwendig.

    Ich habe den ersten Code eingefügt und nun werden auch zwei Einträge in der Tabelle ApPr erstellt, aber es wird immer noch keine Verknüpfung zu dem entsprechenden Protokoll hinterlegt. Da die Bezeichnungen in Ansprechpartner.Gruppen-Nr und Protokoll.Gruppen-Nr auch identisch sind und es bei meiner ersten Variante ja auch geklappt hat, gehen mir so langsam die Ideen aus, woran es liegen könnte.

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Svenja,

    ich würde auf irgendwelche verstekte Leerzeichen tippen. Vielleicht so:

    ---

    let me := this;
    for i in chosen('Gruppen-Nr.') do
    switch me.Status do
    case 2:
    (delete ApPr[Protokolle.trim('Gruppen-Nr.') like trim( i)])
    case 1:
    if cnt(ApPr[Protokolle.trim('Gruppen-Nr.') like trim( i)]) = 0 then
    let new := (create ApPr);
    new.(Ansprechpartner := me);
    new.(Protokolle := first((select Protokolle)[trim('Gruppen-Nr.') like trim( i)]))
    end
    end
    end

    ---

    Leo

    • Svenja_Muller
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen Leo,

    juhuuu, das war ein super Gedanke! Es hat funktioniert :)

    Vielen, vielen Dank!

    Ich habe allerdings das trim bei dem Protokolle.'Gruppen-Nr.' weg gelassen, weil ich da eine Fehlermeldung hatte: Die Funktion ist nicht definiert: trim(multi) in Zeile 5, Spalte 50

    Ich wünsche dir einen schönen Tag!