FlowField - Berechnung

1. November 2006 20:04

Als ich vor Jahren den ersten C/SIDE Kurs absolviert habe (übrigens in Hamburg :-) ), hat der Kursleiter erklärt, wie Navision die Berechnung der FlowFields handhabt.

Das einzige, dass ich davon noch weiss ist, das Navision dazu immer nur 2 DB-Zugriffe benötigt, und von den beiden dort ermittelten Zahlen die Differenz zurückgibt, was dann das Resultat ist.

Liege ich da richtig? Weiss jemand im Detail, wie das funktioniert?

1. November 2006 23:23

Meine Development-Schulung war auch im Hamburg (bzw.: alle beide).

Und deine Erklärung deckt sich mit dem, was uns gesagt wurde, schon sehr gut.
Uns wurde ein anschauliches Beispiel gezeigt, leider habe ich es nicht mitgeschrieben. Wenn ich mich nicht irre, ging es so:

Wir haben eine Tabelle mit einem FlowField, z.B. eine bestimmte Anzahl von etwas.
Dieses Feld wird für alle Zeilen berechnet (und immer aktualisiert, sobald der Datensatzbestand geändert wird). Gleichzeitig werden diese Werte zeilenweise kumuliert.

So könnte eine kleine Tabelle aussehen:
Datensatz
Nr.....FlowField...kumuliert
---------------------------------------------
1......8..............8
2......1..............9
3......3..............12
4......4..............16
5......5..............21

Soll aber nun die Summe nur für DS 2 bis 4 angezeigt werden, braucht Navision nur noch mit den kumulierten Werten zu rechnen:
Summe = kumulierter Wert des letzten betroffenen Datensatzes
minus kumulierter Wert des letzten Datensatzes VOR dem ersten gesuchten, also:
gesuchte Summe = 16 - 8 = 8

1. November 2006 23:58

Auch ich habe damals (1997) genau diese Variante ("nur zwei Datensätze notwendig") gelernt.
Ich kann mich auch daran erinnern, dass uns das anhand einer Tabelle dargestellt wurde, die der von Natalie sinngemäß identisch ist.
Auch die Art der Ermittlung dieser zwei Datensätze ist korrekt.
Es wird immer der letzte Datensatz in dem gefilterten Bereich genommen und davon wird der Wert des letzten Datensatzes vor dem ersten des gefilterten Bereichs abgezogen.

2. November 2006 09:14

Wo wir gerade bei dem Thema FlowFields sind, möchte ich gerne die Frage erweitern.

Ich habe eine selbsterstellte Tabelle mit ca. 200000 Datensätzen, in dieser ist unter anderem das Feld "Lagerbestand" (Tabelle Artikelposten) und Restauftragsmenge (Tabelle Verkaufszeile).
Wenn ich diese beiden Felder auf '>0' (grösser Null) Filtere, dauert es Ewigkeiten bin Navi die Daten anzeigt.

Mir ist schon klar, das wenn ich Filtern will einen geeigneten Key verwenden muss, allerdings kann ich auf Flow Fields keinen erstellen!
Was könnte ich ansonsten für die Performance tun?
Gruß Mikka

2. November 2006 12:00

mikka hat geschrieben:Was könnte ich ansonsten für die Performance tun?
Gruß Mikka

Wenn die Datensatzzahl größer wird, dauert auch das Abgrenzen zur Berechnung immer länger. Das ist unvermeidlich. Normalerweise wird dies aber erst spürbar, wenn die Datensatzanzahl in die Millionen geht.

Schlüssel, die für SumIndexFields genutzt sollten wenn möglichst immer so erstelllt werden, dass mit dem ersten Feld so viel wie möglich eingegrenzt werden kann und dadurch wenig Datensätze übrig bleiben die dann weiter gefiltert werden müssen.

Besonders wenn die Datenbank nur aus einer Datei besteht, wird bei einer Tabellenoptimierung der Artikelposten die Suchperformanace etwas besser. Das Wegschreiben neuer Daten kann danach aber länger dauern.
Zuletzt geändert von Kowa am 16. November 2006 11:10, insgesamt 1-mal geändert.

15. November 2006 20:20

Zur Ergänzung:
Im Application Designer's Guide wird das Rechenverfahren gut beschrieben.
Zu finden ist es im Kapitel "Beyond the Basics" unter 24.1 SumIndexFields.
Bei mir ist das Seite 490 im Dokument bzw. Seite 502 im Reader.

16. November 2006 11:10

Hi,

Ich dachte immer das Besondere an der C/SIDE SWIFT Technologie sei, dass die Werte gleich im Schlüssel gespeichert werden.

Bei SQL werden ja die Schattentabellen angelegt für jeden Level. Darum soll man ja da auch die Level möglichst einschränken. Ich lasse immer den letzten weg, denn das kann der SQL-Server vermutlich schneller selbst addieren.

Was könnte ich ansonsten für die Performance tun?
Gruß Mikka


Da Navision bei jedem DS erstmal die zwei Flowfields berechnen muss vor dem Filtern. Solltest Du versuchen die Berechnung der Flowfields zu optimieren. Eventuell könntest Du einen neuen Schlüssel (in Deinen Zieltabellen) mit SUM-Indexfield anlegen mit genau den Feldern, die Du bei der Berechnung des Flowfiels verwendest.

Wenn Dich die Menge nicht interressiert sondern nur dass welche da sind könntest Du versuchen die FlowFields auf Exist umzustellen.

16. November 2006 11:57

Danke für Eure Beiträge zur Performance.

Leider ist es so, das die Tabelle ungefiltert benutzt wird (warum auch immer!),
Ich Prüfe, ob ich einen besseren Key erstellen kann.
Gruß Mikka