0

Dateneinträge zuordnen per Schleife

Hallo Zusammen!

ich komme nicht auf meinen Fehler, wieso meine Zuordnung von Dateneinträgen nicht funktioniert.

let myVon := 'Datum von';
let myBis := 'Datum bis';
for n in select Tabelle1 do
    let myID := n.ID;
    let myData := (select Tabelle1
            where ID = myID and PP_Beginn + 120 > myVon and PP_Beginn < myBis and
            Gutschriften2 = null);
    for i in myData do
        let myGutschrift := first(select Gutschriften where 'G-Datum' = today() and myID = ID);
        if myGutschrift = null then
           let newR := (create Gutschriften);
           newR.('G-Datum' := today());
           i.(Gutschriften2 := newR);
           newR.(alsTrigger := 1)
        else
           i.(Gutschriften2 := myGutschrift)
        end
    end
end

Der Code ist bei einem Button als Skript hinterlegt. Das Ziel dieses Skriptes soll die Erstellung eines neuen Dateneintrages in der Tabelle "Gutschriften" sein, falls noch kein Dateneintrag vorliegt, der die Bedingung ('G-Datum' = today() and myID = ID) erfüllt. Falls schon ein Dateneintrag vorliegt, der die Bedingung erfüllt, soll der Eintrag sich mit dem vorliegenden Dateneintrag verknüfen. Somit sollten 26 Einträge in der Tabelle "Gutschriften" entstehen mit denen dann die Einträge aus Tabelle1, wo die Bedingung (ID = myID and PP_Beginn + 120 > myVon and PP_Beginn < myBis) erfüllt ist, verlnüpft werden.

In der Tabelle1 befinden sich 26 Einträge (Stammdaten).
Gutschriften2 ist das Verknüpfungsfeld von Tabelle1 zu "Gutschriften" (Tabelle)

 

Aktuell erstellt das Skript nur einen Dateneintrag in der Tabelle "Gutschriften" und verknüpft dann alle 1824 Dateneinträge aus der Tabelle1 mit diesem einzigen Dateneintrag (in Tabelle "Gutschriften").

 

Ich freue mich über jegliche Anregungen oder Tipps! :)

Viele Grüße

Jonas

8 Antworten

null
    • Developer by Smartplanung
    • smartplanung
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo  , erst mal die Frage - was beinhaltet die ID? Ist das ein eigenes Feld, wo eine ID geschrieben wird oder möchtest Du die Record ID (Nr bzw. _id) ansprechen?

    Auf dem ersten Blick könntest Du das in einer Schleife, statt zwei Schleifen machen, da Du bei der ersten Schleife ohne Bedingungen die Tabelle1 ansprichst und dann in einem zweiten Durchgang innerhalb der ersten Schleife die gleiche Tabelle filterst.

    Da kannst Du auch direkt in der ersten Schleife deine where Bedingungen angeben (in dem Fall ohne ID Abgleich). Hier ein Versuch:

    let myVon := 'Datum von';
    let myBis := 'Datum bis';
    for n in (select Tabelle1 where PP_Beginn + 120 > myVon and PP_Beginn < myBis and Gutschriften2 = null) do
       let myID := n.ID;
       let myGutschrift := first(select Gutschriften where 'G-Datum' = today() and myID = ID);
       if myGutschrift = null then
          let newR := (create Gutschriften);
          newR.('G-Datum' := today());
          n.(Gutschriften2 := newR);
          newR.(alsTrigger := 1)
       else
          i.(Gutschriften2 := myGutschrift)
       end
    end
    

     

    Alternativ könntest Du erst noch zählen, wie viele Gutschriften es gibt - weiß aus dem Kopf gerade nicht, ob das mit if myGutschrift = null ohne weiteres funktioniert.

    let myVon := 'Datum von';
    let myBis := 'Datum bis';
    for n in (select Tabelle1 where PP_Beginn + 120 > myVon and PP_Beginn < myBis and Gutschriften2 = null) do
       let myID := n.ID;
       let myGutschriftCnt := cnt(select Gutschriften where 'G-Datum' = today() and myID = ID);
       if myGutschriftCnt = 0 then
          let myGutschrift := first(select Gutschriften where 'G-Datum' = today() and myID = ID);
          let newR := (create Gutschriften);
          newR.('G-Datum' := today());
          i.(Gutschriften2 := newR);
          newR.(alsTrigger := 1)
       else
          i.(Gutschriften2 := myGutschrift)
       end
    end
    

     

    Dein Script setzt aber auch voraus, dass die "ID" in Tabelle "Tabelle1" gleich sein muss mit dem Feld "ID" in der Tabelle "Gutschriften" - was in deinem Vorhaben auch Sinn ergeben könnte.

      • Jonas_Zander
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Hallo , ich habe einen kleinen Fehler gemacht, bei den Tabellenbezeichnungen, dadurch wirkt es so, als könne man es in einer Schleife umsetzen. Sorry dafür!

      Aber dein Gedanke mit cnt() gefällt mir sehr gut. Leider behebt das nicht mein aktuelles Problem.

      • Jonas_Zander
      • vor 1 Jahr
      • Gemeldet - anzeigen

      die ID in Tabelle1 beinhaltet eine zusammengesetzte ID also nicht die Record ID

    • Jonas_Zander
    • vor 1 Jahr
    • Gemeldet - anzeigen
    let myVon := 'Datum von';
    let myBis := 'Datum bis';
    for n in select Tabelle1 do
        let myID := n.ID;
        let myData := (select Tabelle2
                where ID = myID and PP_Beginn + 120 > myVon and PP_Beginn < myBis and
                Gutschriften2 = null);
        for i in myData do
            let myGutschrift := first(select Gutschriften where 'G-Datum' = today() and myID = ID);
            if myGutschrift = null then
               let newR := (create Gutschriften);
               newR.('G-Datum' := today());
               i.(Gutschriften2 := newR);
               newR.(alsTrigger := 1)
            else
               i.(Gutschriften2 := myGutschrift)
            end
        end
    end
    

    so, hier sind die Tabellen richtig angegeben :)

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

       mir fällt hier gerade auf, dass die Variable "myGutschrift" sich innerhalb der "i"-Schleife eigentlich nie ändern wird. Ist das so gewollt? Andernfalls müsste sich die Abfrage für diese Variable vielleicht auf einen Wert in der i-Schleife beziehen?

      Wenn das nicht die Lösung bringt, wäre es vermutlich einfacher die Datenbank mit Beispieldaten hier hochzuladen. Da kann man die Funktion besser nachvollziehen.

      • Jonas_Zander
      • vor 1 Jahr
      • Gemeldet - anzeigen

      okay, das ist nicht so ganz gewollt, dass die Variable "myGutschrift" sich nie verändert. Ich bin davon ausgegangen, dass sich diese 26 mal ändert, da ja über die n-Schleife immer eine neue ID an die Variable "myID" übergeben wird.

      Ist dies nicht der Fall?

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

       doch das ist der Fall. Aber dann schreibst Du die Zeile besser noch vor die i-Schleife. Zum einen wegen der Übersicht und zum anderen schreibst Du sonst pro Durchlauf in der i-Schleife jedesmal die Variable neu auf n.ID. Das wird die Performance zwar nicht beeinflussen, aber ja...kann man sich einfach sparen 😅

      Aber wenn Du dich jedesmal auf die n.ID beziehen willst, sollte das so passen. Daher vielleicht die Datenbank mit Beispieldaten bereitstellen.

      • Jonas_Zander
      • vor 1 Jahr
      • Gemeldet - anzeigen

      oh man, ich habe meinen Fehler gefunden. Der Fehler lag aber nicht im Code sondern an meiner zusammengesetzten ID 😅
      Patrick, ich danke dir für deine Zeit und deine Anstrengungen mir zu helfen!

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 8Antworten
  • 70Ansichten
  • 2 Folge bereits