0

Ältesten Datensatz heraussuchen

Hi, ich versuche in einer verschachtelten schleife immer die ältesten Datensätze zuerst abzuarbeiten. Hat einer eine Idee, wie ich dies umsetzen könnte? Ich hab folgenden Ansatz ausprobiert: 

let ABC := this;
let newa := (create Bestellung);
newa.(Rahmenvertrag := ABC);
newa.(Unternehmen := ABC.'Unternehmen.');
let pos := (select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC);
let vAnzahl := 0;
for j in pos do
    while j.'Bestellen/Abrufen Menge' > 0 do 
        let oldestRecord := null;
        let oldestDate := null;
        for i in j.'Liefertermine Rahmenvertrag,' do
            if oldestRecord == null or i.Datum < oldestDate then
                oldestRecord := i;
                oldestDate := i.Datum;
            end
        end;
        if vAnzahl = 0 and oldestRecord != null then
            let newd := (create Bestellpositionen);
            newd.(Bestellung := newa);
            newd.(Artikel := oldestRecord.'Rahmenvertrag Positionen'.'Artikel,,');
            newd.(Menge := j.'Bestellen/Abrufen Menge');
            newd.(Preis := oldestRecord.Preis);
            vAnzahl := 1;
        end;
        if oldestRecord != null then
            if oldestRecord.Verbleibend > 0 or oldestRecord.Neu = true then
                if j.'Bestellen/Abrufen Menge' <= oldestRecord.Menge then
                    oldestRecord.('Abgerufen/Bestellt' := oldestRecord.'Abgerufen/Bestellt' + j.'Bestellen/Abrufen Menge');
                    oldestRecord.(Verbleibend := oldestRecord.Menge - oldestRecord.'Abgerufen/Bestellt');
                    j.('Bestellen/Abrufen Menge' := 0);
                else
                    oldestRecord.('Abgerufen/Bestellt' := oldestRecord.Menge);
                    j.('Bestellen/Abrufen Menge' := j.'Bestellen/Abrufen Menge' - oldestRecord.'Abgerufen/Bestellt');
                    oldestRecord.(Verbleibend := 0);
                    oldestRecord.(Neu := false);
                end;
                if oldestRecord.'Abgerufen/Bestellt' >= oldestRecord.Menge then
                    oldestRecord.(Status := 2);
                end;
            end;
        end;
    end;
    vAnzahl := 0;
end;

 

Leider funktioniert die Zuweisung mit oldestRecord nicht:    newd.(Artikel := oldestRecord.'Rahmenvertrag Positionen'.'Artikel,,');

 In der Tabelle j.'Liefertermine Rahmenvertrag,' will ich die ältesten Datensätze zuerst abarbeiten. 

5 Antworten

null
    • kevin.1
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Hab auch schon versucht die Tabelle zu sortieren: 
     

    let ABC := this;
    let newa := (create Bestellung);
    newa.(Rahmenvertrag := ABC);
    newa.(Unternehmen := ABC.'Unternehmen.');
    let pos := (select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC);
    let vAnzahl := 0;
    for j in pos do
        while j.'Bestellen/Abrufen Menge' > 0 do 
            let sort := (j.'Liefertermine Rahmenvertrag,' order by number(j.'Liefertermine Rahmenvertrag,'.Datum)*-1);
            for i in sort do
                if vAnzahl = 0 then
                    let newd := (create Bestellpositionen);
                    newd.(Bestellung := newa);
                    newd.(Artikel := i.'Rahmenvertrag Positionen'.'Artikel,,');
                    newd.(Menge := j.'Bestellen/Abrufen Menge');
                    newd.(Preis := i.Preis);
                    vAnzahl := 1
                end;
                if i.Verbleibend > 0 or i.Neu = true then
                    if j.'Bestellen/Abrufen Menge' <= i.Menge then
                        i.('Abgerufen/Bestellt' := i.'Abgerufen/Bestellt' + j.'Bestellen/Abrufen Menge');
                        i.(Verbleibend := i.Menge - i.'Abgerufen/Bestellt');
                        j.('Bestellen/Abrufen Menge' := 0)
                    else
                        i.('Abgerufen/Bestellt' := i.Menge);
                        j.('Bestellen/Abrufen Menge' := j.'Bestellen/Abrufen Menge' - i.'Abgerufen/Bestellt');
                        i.(Verbleibend := 0);
                        i.(Neu := false)
                    end;
                    if i.'Abgerufen/Bestellt' >= i.Menge then
                        i.(Status := 2)
                    end
                end
            end;
            vAnzahl := 0
        end

    end

    Funktioniert aber leider auch nicht

    • T_Bartzsch
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Die kleinste Datensatz-ID (Nr) ist ja immer der älteste Eintrag... d.H. wenn Du mal in ein Formelfeld nur:

    (select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC)

    eingibst, müsste Ninox dir ja eigentlich schon die richtige Sortierung rausschmeissen... zur Not kannst du das noch durch "order by Nr" ergänzen...

    evtl. würde 

    let pos := ((select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC) order by Nr);

    oder zur Not 

    let pos := concat(((select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC) order by Nr).Nr);

    schon dein "pos" in die richtige Reihenfolge zu bringen....

      • kevin.1
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Entchuldige, ich hab mich nicht richtig ausgedrückt. Es geht nicht um den "neusten" Datensatz, der hinzugefügt wurde. Jeder Datensatz enthält ein Datum, wenn also ein neuer Datensatz mit einem älteren Datum hinzugefügt wird, soll dieser nicht als erstes abgearbeitet werden. 

      • T_Bartzsch
      • vor 9 Monaten
      • Gemeldet - anzeigen

       jetzt komme ich durcheinander...:

      Also; ninox sortiert immer aufsteigend.

      (select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC) 

      müsste Dir sowas wie "3, 15, 45, 55, 134, 156" ausgeben....

      ((select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC) order by Datum)

      kann sowas ausgeben wie "45, 15, 134, 15, 55, 156"

      Versuch doch erstmal ohne for-Schleifen Gedöns in einem Formeldfeld an die Reiehenfolge zu kommen, die du brauchst

    • Ninox-Professional
    • planoxpro
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Hallo, da "Nr" intern kein Wert vom Typ Zahl ist, sollte man number() nutzen, wenn man nach der Record-Nummer sortieren will. Und mit rsort() ließe sich das entstehende Array auch gleich absteigend sortieren:

    let Pos := rsort((select 'Rahmenvertrag Positionen' where Rahmenvertrag = ABC) order by DATUM);
    

     

Content aside

  • Status Answered
  • vor 9 MonatenZuletzt aktiv
  • 5Antworten
  • 34Ansichten
  • 3 Folge bereits