Frage zu Keys & Reportoptimierung

24. April 2007 19:50

Hallo Leute!

Ich habe einen - für mich ziemlichen Umfangreichen - Report gebastelt.

Der Report ist für unsere Wochenkalkulation gedacht, und soll alle noch zu fakturierenden und bereits gebuchten Aufträge anzeigen. Leider haben viele unserer Kunden Sammelrechnungen und sehr oft erfolgt das Buchen zur Lieferung ohne VK - Preis, aus diesem Grund muss ich leider immer über die Sales Line gehen.

Angezeigt werden die Daten durch den Aufbau wie folgt.
Ebene 1 Debitor
Ebene 2 Artikel
Ebene 3 Aufträge
Ebene 3 Rechnungen
Ebene 3 Gutschriften
Ebene 2 nächster Artikel
Ebene 3Aufträge .....
Ebene 1 nächster Debitor
usw.

Durch den gewählten Aufbau ist der Report nicht gerade besonders schnell. Aus diesem Grund möchte ich entsprechende Key´s in den Tabellen hinzufügen, um die Sache zu beschleunigen.

Ich habe in meiner Testumgebung versucht, einen Key hinzuzufügen, der die Primären Links Sell-to Customer und Item No. beinhaltet, sowie die wichtigsten Kritierien auf dennen gefiltert wird.

Jedoch hat sich in der Performance des Reports nichts geändert, was einer verbesseren würdig wäre. Habe ich vielleicht einen Denkfehler beim erstellen meiner Key´s. Oder kann man den Report gar nicht beschleunigen, bei diesem "verrückten" Aufbau?

Vielleicht hat jemand einen Tipp für mich. Bin für jede Hilfe dankbar.

LG
Martin
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von martinhaindl am 26. April 2007 18:17, insgesamt 1-mal geändert.

24. April 2007 20:24

Moin,

Interessanter Bericht. Hast Du überpüft, ob die Keys in jeder Tabelle auch gesetzt sind? (SETCURRENTKEY) Standardmäßig wird der Primary-Key genommen.

Ich würde nicht den Link nutzen, da der Bezug zum Item fehlt. De Zeilen müssten einen Key haben, die u.a. Item und "Sell to customer" beinhaltet.
Auf die Zeilen würde ich zwischen Item und Zeile kinken und dann einen SETRANGE auf "Sell to Customer" setzen.

Aber wenn der Bericht zu langsam ist, fehlt meistend ein Key an der richtigen Stelle, vielleicht mal mit dem Debugger überprüfen.



Gruss
Miljenko Martinac

24. April 2007 21:25

Die unteren beiden DataItems werden immer komplett abgearbeitet.
Es ist keine Verlinkung vorhanden. Dieses könnte die erste Ursache sein.

Weiter währe zu Prüfen, ob die Filter korrekt sind.
Lieber ein SETRANGE als SETFILTER.

Des weiteren Prüfe ob der Report bzw. die untergeordneten DataItems immer durchlaufen werden müssen.
(Statt eines DataItems eine Recordvariable nehmen und nur wenn der Zugriff erforderlich ist en GET machen)

Wie mmartinac schrieb,
bei allen DataItem den Korrekten Key einstellen.
Gruß Mikka

25. April 2007 08:21

mikka hat geschrieben:Des weiteren Prüfe ob der Report bzw. die untergeordneten DataItems immer durchlaufen werden müssen.
(Statt eines DataItems eine Recordvariable nehmen und nur wenn der Zugriff erforderlich ist en GET machen)


Das geht aber auch genauso gut oder schlecht im OnPreDataItem-Trigger. Wenn die Bedingung nicht zutrifft, dann macht man halt ein CurrReport.BREAK;

25. April 2007 10:16

Jein,

bei Korrekt verlinkten DataItems Stimme ich dir zu.
(DataItemLinkReference und DataItemTableView)
Wenn allerdings diese nicht verknüpft sind, muss der Report alle Records durchlaufen, obwohl dieses nicht notwendig währe.
(wie bei z.B. "Sales Line", "Sales Invoice Line" usw.)

Ich habe mir gerade das Bild mit dem Sceenshot angeschaut.
Eine andere Anordnung der DataItems währe evtl. Sinnvoller?!

Jetzt muss zu jedem Debitor jeder Artikel durchlaufen werden.
Zu jedem Artikel alle "Sales Lines" usw. :!:

Gruß Mikka

25. April 2007 10:23

Mikka, wie kommst du auf die Idee, dass die DataItems "Sales Invoice Line" und "Sales CR.Memo Line" nicht verlinkt sind?
Martin hat doch die Properties dieser DataItems nicht gepostet...

25. April 2007 12:41

:shock:

Stimmt, ich weiß nicht was mich da "geritten" hat. *Sorry*
Ich muss mich Korrigieren und Schumi Recht geben.

Also unter Vorraussetzung der korrekten Verlinkung sollte es heißen.
Gruß Mikka

26. April 2007 17:43

Hallo!

Danke vielmals für eure Tips.

Ich habe heute ein wenig mit den Key´s herumexperimentiert bzw. fehlende zusätzlich angelegt. Weiters habe ich alle SETFILTER gegen SETRANGE getauscht. Der Report ist jetzt um ca. 50% schneller. Statt einer Minute läuft die Abfrage jetzt nur 30 sek, was ja schon mal einiges ist.
Key "Sell-to Customer No.", "Type", "Item No."

Trotzdem habe ich noch eine zusätzliche Frage bezüglich der ganzen Thematik. Wenn ich von vorn herein schon sagen kann, auf welche Felder gefiltert wird, ist es dann sinnvoll diese gleich in den Key mit einzubauen, oder hat dies keine Geschwindigkeitsvorteile? Ich konnte bei meinen Tests keine Geschwindigkeitsverbesserungen feststellen. zB Buchungsdatum.

Wenn jemand noch einen Tip bezüglich einer besseren Anordnung der Dataitems oder so hat, wäre ich euch echt dankbar. Zurzeit ist die Sache wirklich so, dass zu jedem Customer die Artikel und dann in den 3 Sales Dataitems nachgeschaut wird. Was sicher eine Menge Datenschaufelei für Navision bedeutet. Und zu den meisten Customers und Items gibt es meist gar keine Einträge. Jedoch kenne ich leider noch keine Funktion wie ich das vorher abfangen kann. Aus meiner Ansicht nach muss ich ja zuerst nachsehen, ob es Zeilen gibt bevor ich ein BREAK machen kann. Und das ist eigentlich der Grund warum der Report so langsam ist. Vermute ich mal. Oder verstehe ich da etwas falsch?

Andererseits könnte ich aber auch in den Customer FlowFields nachsehen, ob es überhaut Auftragszeilen, Rechnungszeilen oder Gutschriftzeilen gibt, um die weitere Verarbeitung anzustossen. Aber diese bedeutet wieder jede menge Tipparbeit und FlowFieldberechnungen.

Bezüglich eurer Vermutungen SETRANGE oder LINK sieht die Sache in dem Report wie folgt aus.

Die Dataitems Sales Order Line, Sales Invoice Line und Sales Cr.Memo Line sind mit dem Dateitem Item über Artikelnummer verlinkt. Die Filterung der Customer erfolgt jeweils auf den 3 Sales Dataitems mittels SETRANGE auf dem Trigger OnPreDataItem.

Danke schon mal im Voraus, für eure Antworten.

So long
Martin

27. April 2007 00:29

du könntest die Debitoren auf die Felder No. of Orders , No. of Invoices und No. of Credit Memos <>0 filtern, hier brauchst du noch nicht mal Calcfields zu verwenden, das macht Navision dann für Dich.
und die Sales Dataitems kannst du nach setzen der Filter mit
Code:
IF "Sales Line".ISEMPTY THEN CurrReport.BREAK;

im OnPreDataItem abbrechen, wenn nix drin ist.