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
-
hab mal die DB in gekürzter form hier hinterlegt,
wäre echt toll wenn ihr helfen könntet.
-
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
-
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
-
Wenn sich die Datenbank schlecht installieren lässt einfach vor dem Backup die Historie löschen. Dann sollte das neue Installieren ohne Fehlermeldung funktionieren.
-
Mach ich und stell sie dann noch mal rein
-
Jetzt ist sie schön klein
https://FundS.synology.me:10003/d/s/599136665996407857/rkZ5ujFb5bU_2n1ndfFnN8lln_5dzABo-i7lALtKsUAg_
-
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)
-
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 -
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
-
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
-
Hier kommt leider die meldung : Expression does not return a record: 'Planzeit Restmontage passt' in Zeile 3 bei beiden Varianten
-
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 -
Danke dir,
jetzt geht es schnell und funktioniert perfekt.
-
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; -
Ich glaube nicht, hier geht es auch darum in der Schleife neue Datensätze zu erstellen.
Leo
-
Schade
Content aside
- vor 3 JahrenZuletzt aktiv
- 16Antworten
- 1283Ansichten