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
-
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
-
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
-
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.
-
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
-
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!
Content aside
- vor 4 JahrenZuletzt aktiv
- 5Antworten
- 1137Ansichten