0

Brauche Hilfe bei einer Schleife

Liebe Ninox Freunde! Leider komme ich nicht weiter und brauche Hilfe bei einer verschachtelten Schleife. 

let me := this;
if 'DIM-BRENNPUNKT ERHALTEN' = true then
    for i in select KONTAKT where 'ID NUMMER' = me do
        let ii := first(select ANSCHRIFT where Kontakte);
        let iii := first(select KONTAKT where Ehepartner);
        let new := (create 'BRENNPUNKT-LISTE');
        new.(Vorname := i.Vorname);
        new.(Nachname := i.Nachname);
        new.(Strasse := ii.Strasse);
        new.(Hausnummer := ii.Hausnummer);
        new.(PLZ := ii.PLZ);
        new.(Ort := ii.Ort);
        new.(Land := ii.Land);
        new.(Ehepartner := iii.Vorname)
    end
end

Ich möchte gerne das er mir in dem neun Datensatz in der Tabelle 'BRENNPUNKT-LISTE' die Anschrift und den Ehepartner richtig zuordnet. Momentan ordnet er den ersten aus der Tabelle zu durch den Befehl first(). Was muss ich bei dem select ergänzen? 

Die Verknüpfung ist folgende die Tabelle "KONTAKT" ist mit der Tabelle "ANSCHRIFT" 1:N und Tabelle "KONTAKT" ist mit sich selbst N:1 verknüpft "Ehepartner)

9 Antworten

null
    • chalvi // WERBEAGENTUR GbR
    • VS2021
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Eine kleine Hilfe brauche ich noch! 

    Ich habe alles soweit hinbekommen, dass er mir die Datensätze anlegt mit den passenden Verknüpfungen. Ich möchte jetzt aber wenn ich auf false umstelle dass er mit nicht die beiden Datensätze löscht sondern nur den letzten der beiden. 

    Was muss ich da tun? 

    Mit den löscht er mir die beiden Datensätze:

    let me := this;
    if 'DIM-BRENNPUNKT ERHALTEN' = true then
        for i in select KONTAKT where 'ID NUMMER' = me do
            let ii := first(select ANSCHRIFT where Strasse = i.Anschrift.Strasse);
            let iii := first(select KONTAKT where Vorname = i.Ehepartner.Vorname);
            let new := (create 'BRENNPUNKT-LISTE');
            new.(Vorname := i.Vorname);
            new.(Nachname := i.Nachname);
            new.(Strasse := ii.Strasse);
            new.(Hausnummer := ii.Hausnummer);
            new.(PLZ := ii.PLZ);
            new.(Ort := ii.Ort);
            new.(Land := ii.Land);
            new.(Ehepartner := iii.Vorname);
            new.('MPE PROZESS' := me)
        end
    else
        if 'DIM-BRENNPUNKT ERHALTEN' = false then
            for b in select 'BRENNPUNKT-LISTE' where 'MPE PROZESS' = me do
                delete b
            end
        end
    end

    Vielen dank!

    • m2apla gmbh
    • Etienne_Scherrer
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo

    Ich verstehe noch nicht ganz was du genau mit dem machst, aber gewisse Dinge sind mir mal aufgefallen.

    Ich kenne deine Datenstruktur nicht genau, aber ich denke diese zwei selects brauchst du eigentlich nicht:

     let ii := first(select ANSCHRIFT where Strasse = i.Anschrift.Strasse);
     let iii := first(select KONTAKT where Vorname = i.Ehepartner.Vorname);

    Und um nur den letzten Datensatz löscht, kannst du last() verwenden.

    Hier so wie ich mir denke das es funktionieren könnte:

    let prozess := this;
    if 'DIM-BRENNPUNKT ERHALTEN' = true then
        for i in select KONTAKT where 'ID NUMMER' = prozess do
            let neueListe := (create 'BRENNPUNKT-LISTE');
            neueListe.(
                Vorname := i.Vorname;
                Nachname := i.Nachname;
                Strasse := i.Anschrift.Strasse;
                Hausnummer := i.Anschrift.Hausnummer;
                PLZ := i.Anschrift.PLZ;
                Ort := i.Anschrift.Ort;
                Land := i.Anschrift.Land;
                Ehepartner := i.Ehepartner;
                'MPE PROZESS' := prozess
            )
        end
    else
        if 'DIM-BRENNPUNKT ERHALTEN' = false then
            delete last((select 'BRENNPUNKT-LISTE' where 'MPE PROZESS' = prozess) order by _cd)
        end
    end

    Gibt es überhaupt mehrere Kontakte mit der selben 'ID NUMMER'? Wenn nicht, dann müsstest du nichtmals eine Schleife machen.

    Falls das nicht dem entspricht, was du machen willst, dann gerne nochmals melden.

    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Schau mal, vielleicht so. Mirko

    ...
    else
        if 'DIM-BRENNPUNKT ERHALTEN' = false then
            delete last((select 'BRENNPUNKT-LISTE' order by number(Nr))['MPE PROZESS' = me])
            end
    ...
    
      • chalvi // WERBEAGENTUR GbR
      • VS2021
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko würdest du mir hier vielleicht noch eine Hilfestellung geben! Wenn ich auf true stelle, werden mir zwei Datensätze in der TABELLE "BRENNPUNKT-LISTE" erstellt, weil zwei KONTAKTE dieselbe ID haben. Deshalb hatte ich die IDEE, dass delete zu setzen damit der letzte Eintrag von den deinen neuen Datensätze gelöscht wird. Es klappt aber nicht. Manchmal löscht er es, dass nachte mal nicht. Was mache ich hier falsch? Danke dir

      let prozess := this;
      if 'DIM-BRENNPUNKT ERHALTEN' = true then
          for i in select KONTAKT where 'ID NUMMER' = prozess do
              let neueListe := (create 'BRENNPUNKT-LISTE');
              neueListe.(
                  Vorname := i.Vorname;
                  Nachname := i.Nachname;
                  Strasse := i.Anschrift.Strasse;
                  Hausnummer := i.Anschrift.Hausnummer;
                  PLZ := i.Anschrift.PLZ;
                  Ort := i.Anschrift.Ort;
                  Land := i.Anschrift.Land;
                  Ehepartner := i.Ehepartner;
                  'MPE PROZESS' := prozess
              )
          end;
          delete last((select 'BRENNPUNKT-LISTE' order by number(Nr))['MPE PROZESS' = me])
      else
          if 'DIM-BRENNPUNKT ERHALTEN' = false then
              delete last((select 'BRENNPUNKT-LISTE' order by number(Nr))['MPE PROZESS' = me])
           end
      end
      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      VS2021 Das ist natürlich alles sehr abstrakt für mich. Folgendes. Dein Script macht im Moment folgendes:

      - wenn Feld = ja dann

              durchlaufe alle Kontakte mit der ID-Nummer wie in diesem Datensatz und

              lege jeweils einen Datensatz in der Brennpunktliste an und fülle ihn mit den Daten

              und lösche dann den letzten Datensatz.

      - wenn Feld = nein dann

              lösche auch den letzten Datensatz

      Das heißt, dass in jedem Fall der letzte Datensatz gelöscht wird, es aber im ersten Fall einer der neuen Datensätze ist und im letzten Fall einer der alten, vorher angelegten DS.

      Ich weiß so richtig nicht, was Du bezwecken willst. Ich verstehe auch nicht, warum mehrere Kontakte eine ID-Nummer haben (Familie?) und warum dann der letzte gelöscht werden will. Also vielleicht kannst Du das sinngemäß noch erläutern, oder hängst eine Dummy-Datei an, die ich mir dann ansehe. Gruß Mirko

      • chalvi // WERBEAGENTUR GbR
      • VS2021
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Danke dir für deine Hilfe Mirko. Meine Datenbank ist ziemlich Groß, deshalb versuche ich es genauer zu erklären.

      Ich habe eine Tabelle "ID Nummer" die ID Nummer wird den KONTAKTEN zu geordnet. Eheleute bekommen natürlich dieselbe "ID Nummer". Der ID NUMMER werden dann Spenden zugewiesen. 

      Die Tabelle "BRENNPUNKT-LISTE" ist eine Liste wo später die Etiketten für ein Magazin gedruckt werden. Jetzt zu meinem Vorgang!

      Wenn ich Feld - JA drücke, dann werden bei Single (Wo die ID nur einmal verwendet wird) ein Datensatz erstellt. Bei Eheleuten natürlich zwei Datensätze, weil die ID zweimal verwendet wird. 

      Im Umkehr befinden sich dann doppelte Adressen in der Tabelle "BRENNPUNKT-LISTE". Deshalb möchte ich das wenn ich Feld-JA drücke bei Eheleuten zwei Datensätze erstellt werden und dann der letzte gleich gelöscht wird. (Eine andere Lösung wäre das es gleich nur einen Datensatz erstellt) Wenn ich auf Feld-Nein drücke soll dann die ID-Nummer und der Datensatz aus der BRENNPUNKT-LISTE gelöscht werden.

      Ich hoffe es ist jetzt besser verständlich. Vielen Dank

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      VS2021 Ich gehe mal davon aus, dass der Button in Kontakte liegt und Du jeweils nur diesen Datensatz in die Brennpunkt-Liste übertragen willst, oder wieder löschen willst. Dann würde ich an Deiner Stelle keine Schleife benutzen (wie es schon Etienne Scherrer schrieb) sondern den Code sogar in das Ja/Nein-Feld "DIM-BRENNPUNKT ERHALTEN" unter "Trigger nach Änderung" legen. Damit dieser Datensatz besser identifizierbar ist, solltest Du noch in der BRENNPUNKT-LISTE das Feld 'ID NUMMER' nachtragen, was ich unten im Code schon berücksichtigt habe. Wenn Du jetzt anklickst, wird der Datensatz angelegt und wenn Du das Häkchen löscht, dann wird er wieder entfernt. Das geht aber genauso gut im Button. Achtung, das Löschen erfolgt über alle Datensätze, die diese ID-Nummer haben. Mach sicherheitshalber eine Datensicherung. Könnte dann so aussehen:

      let me := this;
      if 'DIM-BRENNPUNKT ERHALTEN' then
          (create 'BRENNPUNKT-LISTE').(
              Vorname := me.Vorname;
              Nachname := me.Nachname;
              Strasse := me.Anschrift.Strasse;
              Hausnummer := me.Anschrift.Hausnummer;
              PLZ := me.Anschrift.PLZ;
              Ort := me.Anschrift.Ort;
              Land := me.Anschrift.Land;
              Ehepartner := me.Ehepartner;
              'MPE PROZESS' := me;
              'ID NUMMER' := me.'ID NUMMER'
          )
      else
          delete (select 'BRENNPUNKT-LISTE')['ID NUMMER' = me.'ID NUMMER']
      end
      

       

      Versuche es mal und wenn es nicht geht, dann melde Dich ruhig wieder. Mirko

    • chalvi // WERBEAGENTUR GbR
    • VS2021
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Vielen Dank für eure Hilfe! Es hat Super funktioniert.

    Durch die Beispiele habe ich endlich die Schleifen besser verstanden. Tatsächlich gibt es zwei Kontakte zu der ID NUMMER und ich möchte nur 1 Kontakt von der ID NUMMER stehen haben. Aus der Liste sollen dann die Versandetiketten gedruckt werden.

    Noch eine Verständnis Frage: Was bedeutet das Order by _cd. Wo wird dieses cd hergeholt?

    Vielen Dank nochmals für die Hilfe!

            delete last((select 'BRENNPUNKT-LISTE' where 'MPE PROZESS' = prozess) order by _cd)
      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

      VS2021 _cd gehört zu den internen Variablen von Ninox und liest das Datum aus, wann der Datensatz erstellt wurde.

      _cu = Erstellt von xy
      _md = Zuletzt geändert am xx.xx.xxxx
      _mu = Zuletzt geändert von xy

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 9Antworten
  • 97Ansichten
  • 4 Folge bereits