0

Performance for Schleife - Alternative?

Folgendes Problem:

Ich möchte eine Auswertung erstellen, wo oft ein Produkt aus einer Artikelliste in den Bestellungen eines bestimmten Zeitraums gekauft wurde.

Einziger Ansatz, der mir einfiel: In einer leeren Tabelle werden genauso viele Datensätze erstellt, wie es Produkte gibt. Mit

for p in select Artikelliste do
let my_record := (create Auswertung);
my_record.(Anzahl := cnt(select 'Bestellungen' where Artikel.Nr = p.Nr));
my_record.(Bezeichnung := p.Bezeichnung);
end

("Artikel" ist die Verknüpfung in den Bestellungen zur Artikelliste)

Vor einer erneuten Auswertung werden dann alle alten Datensätze der letzten Auswertung gelöscht. Inhaltlich funktioniert das perfekt. Die Zahlen und die angezeigte Produkte stimmen. 

Haken ist nur, dass das Erzeugen der neuen Datensätze mit der for-Schleife extrem langsam läuft, will heißen 1s pro Datensatz bei derzeit 15 Datensätze. Das läuft wie im Daumenkino, bis die Tabelle mit der Auswertung komplett steht. und es liegt bestimmt nicht an meinem Rechner oder der Internetverbindung zur Cloud.

Ist das bei NinoxDB normal und wenn ja, hat jemand eine bessere Idee wie ich eine Prüfung aller Artikeldatensätze über alle Bestellungsdatensätze mit der Summierung erzeugen könnten?

Danke vorab.

3 Antworten

null
    • Birger_H
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ändere deinen code wie folgt:

    –––
    do as server
    for p in select Artikelliste do
    let my_record := (create Auswertung);
    my_record.(Anzahl := cnt(select 'Bestellungen' where Artikel.Nr = p.Nr));
    my_record.(Bezeichnung := p.Bezeichnung);
    end
    end
    –––

    • Skydive_Leipzig_Manife
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Danke. Kannst du mir bitte noch den Hintergrund erklären? Hilft beim Verstehen und Anwenden. Danke.

    • Birger_H
    • vor 5 Jahren
    • Gemeldet - anzeigen

    do as server
    [...]
    end

    tut genau dies. Es fürhrt code auf dem Server aus. Ansornsten würde jede Schleifendurchlauf einen weiteren Server-Aufruf erzeugen, jedes Mal müsste die antwort des Servers abgewartet werden... Funtktion verbessert die Performance um das 10-100-fache.

    Birger

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 3Antworten
  • 1485Ansichten