0

Array-Diff aus 2 Tabellen in Ninox für Ansicht

Gibt es in Ninox eine Möglichkeit aus 2 selects ein Diff-Array zu bilden oder denke ich zu komplex? Ich arbeite in der Mac-App.

Ich habe 4 Tabellen (Personen, Kurse, Themen, Teilnehmer, ).

In Kurse gibt es ein DMFAF Personen und dieses schreibt die Daten via Personen-Bestätigen-Button...

( über Trigger nach Änderung konnte ich keinen Daten in eine neue Tabelle schreiben!? .. Funktioniert das nicht, oder ist hier auch ein Sonderweg nötig?)

...in die Tabelle Teilnehmer (Felder: Person-Nr(Zahl); Kurs-Nr(Zahl); Themen-Nr(Zahl)) 

Nun habe ich in der Tabelle "Themen" ein Ansicht-Feld und zeige alle Benutzer an, welche bereits dieses Thema absolviert haben. Nun möchte ich alle Benutzer anzeigen, welche diesen Kurs noch nicht absolviert haben.

Bisher habe ich folgendes versucht, aber angezeigt wird nichts in dem Ansichten-Feld:

let me := this;
let myTeilnehmer := (select Teilnehmer)[ThemenNr = me.nr].PersonNr;
let myPersonen := (select Personen)[Name != null];
let myPersonenString := concat(myPersonen.Nr);
for i in myTeilnehmer do
  myPersonenString := replace(myPersonenString, text(i) + ",", " ")
end;
myPersonenString := replace(myPersonenString, " ", "");
let myPersonenArray := split(myPersonenString, ",");
let newArray := [""];
for myP in myPersonenArray do
  let myPerson := first(select Personen[Nr := number(myP)];
  newArray := array(newArray, [text(myPerson.Name)])  ;
end;
newArray

Dies zeigt zumindest in der Konsole auch das gewünschte Ergebnis.

Leider wird aber damit in der "Anzuzeigenden Spalten"-Auswahl im Anischtenfeld die Meldung "Expression does not return records" angezeigt und auch keine Daten in der Ansicht.

Gibt es hier ein Möglichkeit in Ninox, welche ich bisher nicht blicke?

2 Antworten

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi. Für mein Abstraktionsvermögen sind das zu viele Bedingungen, die ich nicht kenne. Aber, damit Du erstmal weiterarbeiten kannst hier ein paar Hinweise. Die Ansichten verlangen ein Recordarray. D.h. Dein Script kann nicht funktionieren, weil es ein Stringarray erstellt. Hier mal eine Idee, wobei ich denke, dass wenn man Das Datenmodell und die Feldnamen kennen würde, es wohl auch einfacher ginge, aber viele Wege und Rom und so.

    Voraussetzung für meinen Tip ist, dass Dein Script in der Summe ein richtiges Ergebnis liefert. Die vorletzte Schleife sammelt also nun die ID-Nummern anstatt der Namen und füllt damit newArray und dann iteriert die letzte Schleife über dieses Array und bildet ein Recordarray. Da Dein Script ahnen läßt, dass Du geübt bist im Script schreiben, denke ich, reichen Dir diese Hinweise vielleicht aus. Mirko

    let me := this;
    let myTeilnehmer := (select Teilnehmer)[ThemenNr = me.nr].PersonNr;
    let myPersonen := (select Personen)[Name != null];
    let myPersonenString := concat(myPersonen.Nr);
    for i in myTeilnehmer do
      myPersonenString := replace(myPersonenString, text(i) + ",", " ")
    end;
    myPersonenString := replace(myPersonenString, " ", "");
    let myPersonenArray := split(myPersonenString, ",");
    let newArray := [0];
    for myP in myPersonenArray do
      let personID := first(select Personen[Nr := number(myP)]).number(Nr);
      newArray := array(newArray, [personID]);
    end;
     for i in newArray[!=0] do
        record(Personen,i)
     end
    
    • CRo
    • vor 2 Jahren
    • Gemeldet - anzeigen

    🙈 Kopf schlägt mehrfach auf Tisch auf 🙈

    Herzlichen Dank!!!

    So einfach wenn man es dann nach mehr als 2 Stunden experimentieren vorgelegt bekommt! 

    Ich habe es jetzt wie folgt gelöst, wobei es mit Sicherheit auch kürzer ginge:

    let me := this;
    let myTeilnehmer := (select Teilnehmer)[ThemenNr = me].PersonNr;
    if cnt(myTeilnehmer) > 0 then
        let myPersonen := (select Personen)[Name != null];
        let myPersonenString := concat(myPersonen.Nr);
        for i in myTeilnehmer do
            myPersonenString := replace(myPersonenString, text(i) + ",", " ")
        end;
        let myPString := replace(myPersonenString, " ", "");
        let myPersonenArray := split(myPString, ",");
        for myP in myPersonenArray do
            record(Personen,number(myP))
        end
    end
    

    Da mir der Beitrag von contact (https://forum.ninox.de/t/83hs1tw/personen-filtern) erst auf die Idee gebracht hat, werde ich meine DB mal ein wenig auf seine Bedürfnisse umschreiben und Ihm diese in den nächsten Tagen in seinem Beitrag hochladen.

    Danke nochmals