0

Langsame for Schleife durch select ersetzen ?

Hallo Profis,

ist es möglich die Langsame for Schleife durch eine select anweisung zu ersetzen? oder geht das nicht, da sich anscheinend das Datum nicht über eine Variable weiterverarbeiten lässt. 

do as server
let Au := Auslieferdatum;
for i in (select 'Touren FH')['Planzeit für Restmontage Passt' = true] do
(select 'Touren FH')['Planzeit für Hauptmontage Passt' = true and date(year(i.Tourdatum), month(i.Tourdatum), day(i.Tourdatum) - 1) = date(year(Tourdatum), month(Tourdatum), day(Tourdatum))].('Nachmontage passt' := true);
(select 'Touren FH')['Planzeit für Hauptmontage Passt' = true and date(year(i.Tourdatum), month(i.Tourdatum), day(i.Tourdatum) - 1) < (> date(year(Tourdatum), month(Tourdatum), day(Tourdatum)))].('Nachmontage passt' := false);
Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' = true and number(Tournummer) = 31 and Tourdatum > Au).Tourdatum
end
end

Michi

16 Antworten

null
    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    hab mal die DB in gekürzter form hier hinterlegt, 

    wäre echt toll wenn ihr helfen könntet.

     

    https://gofile.me/4mF3s/T5ru2wPg6

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Michi,

    bei mir hängt alles wärend der Installation. Ich habe leider die geschichte mit < (> nicht verstanden. Ist das ein Equivalent für ungleich? dann würde ich es so versuchen:

     

    ---

    do as server
    let Au := Auslieferdatum;
    let myRTour:=(select 'Touren FH'['Planzeit für Restmontage Passt']);
    let myHTour:=(select 'Touren FH'['Planzeit für Hauptmontage Passt']);
    myRTour.(
    let search_date:=date(year(Tourdatum), month(Tourdatum), day(Tourdatum) - 1);
    myHTour[ search_date = Tourdatum].('Nachmontage passt' := true);
    myHTour[search_date!=Tourdatum].('Nachmontage passt' := false));
    Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' and number(Tournummer) = 31 and Tourdatum > Au).Tourdatum
    end

    ---

    Leo

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke erstmal ganz doll Leo,

    Ja das sollte ungleich heißen. Versuch das dann morgen gleich mal. Bin echt am verzweifeln damit. 

    Hab schon versucht die ganze datenbank so zu verkleinern das sie leichter zu installieren ist. Dauert immer ne Weile trotz Fehlermeldung. Warum die oh Daten immer noch so groß ist verstehe ich selber nicht. Da es ja nur 3 tabellen sind ohne Daten 

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Wenn sich die Datenbank schlecht installieren lässt einfach vor dem Backup die Historie löschen. Dann sollte das neue Installieren ohne Fehlermeldung funktionieren.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Mach ich und stell sie dann noch mal rein

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen
    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    hab die DB mal mit deinem script befüllt, leider will es nicht das machen was es soll. (Nachmontage passt wird nur auf false gesetzt) Kannst du eventuell noch mal schauen. Hier die DB mit deinem script und daten zum probieren. ( Historie ist gelöscht damit sie zu instalieren geht)

    https://gofile.me/4mF3s/0a5zMQ8gA

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Wenn man das mit der schleife macht geht es, aber es ist halt einfach zu langsam. Den unterschied merkt man wenn man die Performans von den (vor) und (zurück) Buttons vergleicht. Das ist in der Arbeit mit dem Kunden am Telefon schlicht weg nicht möglich.

     

    do as server
    let Au := Auslieferdatum;

    for i in select 'Touren FH' where 'Planzeit Restmontage passt' do
    (select 'Touren FH')['Planzeit Montagetag passt' = true and Lieferdatum = i.date(year(Lieferdatum), month(Lieferdatum), day(Lieferdatum) - 1)].('Nachmontage passt' := true);
    (select 'Touren FH')['Planzeit Montagetag passt' = false and Lieferdatum = i.date(year(Lieferdatum), month(Lieferdatum), day(Lieferdatum) - 1)].('Nachmontage passt' := false);
    Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' and number(Tour) = 31 and Lieferdatum > Au).Lieferdatum
    end
    end

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Michi,
    aus meiner Erfahrung arbeitet Ninox wahnsinnig schnell mit Texten. Vielleicht würde es so gehen:

    ---

    do as server
    let Au := Auslieferdatum;
    let myText:=concat(select 'Touren FH' where 'Planzeit Restmontage passt'.format(date(year(Lieferdatum), month(Lieferdatum), day(Lieferdatum) - 1),"YYYYMMDD"));
    (select 'Touren FH')['Planzeit Montagetag passt' = true and contains(myText, format(Lieferdatum,"YYYYMMDD")].('Nachmontage passt' := true);
    (select 'Touren FH')['Planzeit Montagetag passt' = false and contains(myText, format(Lieferdatum,"YYYYMMDD")].('Nachmontage passt' := false);
    Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' and number(Tour) = 31 and Lieferdatum > Au).Lieferdatum
    end

    ---

    Leo

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    oder sogar mit unique faslls die Tage mehrmals vorkommen:

    ---

    do as server
    let Au := Auslieferdatum;
    let myText:=concat(unique(select 'Touren FH' where 'Planzeit Restmontage passt'.format(date(year(Lieferdatum), month(Lieferdatum), day(Lieferdatum) - 1),"YYYYMMDD")));
    (select 'Touren FH')['Planzeit Montagetag passt' = true and contains(myText, format(Lieferdatum,"YYYYMMDD")].('Nachmontage passt' := true);
    (select 'Touren FH')['Planzeit Montagetag passt' = false and contains(myText, format(Lieferdatum,"YYYYMMDD")].('Nachmontage passt' := false);
    Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' and number(Tour) = 31 and Lieferdatum > Au).Lieferdatum
    end

    ---

    Leo

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hier kommt leider die meldung : Expression does not return a record: 'Planzeit Restmontage passt' in Zeile 3 bei beiden Varianten

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    do as server
    let Au := Auslieferdatum;
    let myTour := (select 'Touren FH');
    let myText := concat(unique(myTour['Planzeit Restmontage passt'].format(date(year(Lieferdatum), month(Lieferdatum), day(Lieferdatum) - 1), "YYYYMMDD")));
    myTour['Planzeit Montagetag passt' and contains(myText, format(Lieferdatum, "YYYYMMDD"))].('Nachmontage passt' := true);
    myTour[not 'Planzeit Montagetag passt' and contains(myText, format(Lieferdatum, "YYYYMMDD"))].('Nachmontage passt' := false);
    Auslieferdatum := first(select 'Touren FH' where 'Nachmontage passt' and number(Tour) = 31 and Lieferdatum > Au).Lieferdatum
    end

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke dir,  

    jetzt geht es schnell und funktioniert perfekt. 

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Blöde frage,

    kann man deine for Schleife eventuell auch so anpassen? Da diese variante ja viel schneller ist.

     

    do as server
    for i in (select CSVin)[Spalte7 = 1 and Spalte2 = format(date(today()), "YYYYMMDD")] do
    let myNextId := min((select CSVin)[Spalte7 = 1 and number(Nr) > i.number(Nr)].number(Nr));
    let new := (create Pool);
    new.(KV := i.Spalte10);
    new.(Vorname := i.Spalte12);
    new.(Name := i.Spalte11);
    new.('Straße' := i.Spalte13);
    new.(PLZ := i.Spalte15);
    new.(Ort := i.Spalte16);
    new.('Tele 1' := i.Spalte17);
    new.('Tele 2' := i.Spalte5);
    new.(Mail := i.Spalte37);
    new.(Auftragswert := i.Spalte32);
    new.(Auslieferlager := i.Spalte26);
    new.(Anlieferlager := i.Spalte25);
    new.(Reklakennzeichen := i.Spalte31);
    new.(Lieferkennzeichen := i.Spalte30);
    new.(Inhalt := join((select CSVin)[number(Nr) > i.number(Nr) and number(Nr) < myNextId and Spalte7 = 4 and Spalte2 = format(date(today()), "YYYYMMDD")].(Spalte17 + Spalte18 + Spalte19), "
    "))
    end
    end;

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich glaube nicht, hier geht es auch darum in der Schleife neue Datensätze zu erstellen.

    Leo

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Schade