Hallo Leute,
im Beitrag Dynamics NAV – Verwendung von Queries habe ich über einen nützlichen Anwendungsfall von Queries (Abfragen) gesprochen. In diesem Beitrag möchte ich über eine weitere Einsatzmöglichkeit von Queries, den generischen Diagrammen, berichten. Wer sich zuerst einlesen möchte, der kann sich den Beitrag im MSDN ansehen (How to: Create Generic Charts). Des Weiteren gib es hier auch eine Einleitung auf deutsch, wie generische Diagramme eingerichtet werden können (Microsoft Dynamics NAV 2013 – neue Auswertungsmöglichkeiten).
In den generischen Diagrammen kann ich grundsätzlich zwischen zwei Datenquellen wählen:
- Tabellen und deren Felder
- Abfragen (Queries) und deren Spalten & Filter
Generische Diagramme bieten sich für eine schnelle Auswertung bestimmter Daten an. In meinem Beispiel befassen wir uns daher mit Kunden- und Lieferanten-Stammdaten. Wir wollen beispielsweise wissen, welche Kunden oder Lieferanten ein Saldo von höher als 1.000 bzw. 10.000 € aufweisen. Wir schauen uns daher die Debitoren mit einem Saldo von mehr als 10.000 € an.
Diese Information steht uns im Microsoft Standard über das Feld Saldo in der Kundentabelle (Tabelle 18 Customer) und in der Lieferantentabelle (Tabelle 23 Vendor) bereits mit dem Flowfield “Balance” (Saldo) zur Verfügung.
Wenn wir nun versuchen unsere Anforderung mit einem generischen Diagramm umzusetzen, dann könnte das so aussehen:
- ID = T18_50000 (Tabelle 18 / 50000 erstes individuelles generisches Diagramm)
- Name = Debitor (Saldo MW > 10000)
- Herkunftsart = Tabelle
- Herkunfts-ID = 18
- Erforderliche Kennzahl (Balance LCY) -> Saldo (MW)
- y-Achse – Titel = Saldo (MW)
- x-Achse – Feld = Name
- x-Achse – Titel = Name
- Beschreibung = Zeigt alle Debitoren mit einem Saldo (MW) > 10.000 €
- Filter auf das Feld Balance (LCY) = “>10000”
Nun integrieren wir das Diagramm in unserer Rollencenter. Dafür führe ich folgende Schritte durch:
- Öffnen des Rollencenters (Ich nutze für mein Beispiel das Rollencenter 9007 -> Profil Einkäufer)
- Anpassen der Rollencenterseite
- Diagrammabschnitt hinzufügen und somit ein “Leeres Diagramm” im Layout des Rollencenters erzeugen.
- Im Rollencenter das “Leere Diagramm” auswählen und dort auf Anpassen klicken:
- Das individuelle Diagramm auswählen “T18_50000” und mit “OK” bestätigen.
- Nun können wir uns das Ergebnis ansehen:
Je nach Anzahl der detaillierten Debitorenposten kann die Performance hier stark schwanken. Ich habe per Stapelverarbeitung 500.000 detaillierte Debitorenposten in einem Cronus Mandanten erzeugt. Trotz meiner sehr leistungsstarken Testumgebung benötigt das generische Diagramm nun ca. 30 Sekunden zum Anzeigen der Daten. Es kann also festhalten werden: Umso mehr detaillierte Debitorenposten vorhanden sind umso länger braucht das Diagramm. Das liegt einfach daran, dass die folgenden Kriterien ungünstig sind:
- Berechnung eines Flowfields pro Debitor
- Filterung auf ein FlowField
So sieht das dann für den Anwender aus und das jedes Mal, wenn die Rollencenterseite geöffnet wird. Das ist dann nicht mehr so schön.
Die Alternative dazu stellt eine Query da, die wesentlich schneller ist. Ich orientiere mich am Flowfield, da ich das exakt gleiche Ergebnis haben möchte. So sieht dann meine Query aus:
- No. – aus der Debitorentabelle
- Name – aus der Debitorentabelle
- Amount / Amount (LCY) aus der Detaillierten Debitorenpostentabelle und die Verknüpfung über das Feld Debitorennr.
Die Einrichtung des generischen Diagramms ist fast identisch mit der Einrichtung der Debitorentabelle (siehe oben). Folgende Änderungen sind vorhanden:
- Herkunftart = Abfrage
- Herkunfts-ID: 50001
- Erforderliche Kennzahl -> Aggragation “Summe”
Ansonsten sind nur die Feldnamen etwas anders.
Nun können wir das Diagramm im Rollencenter austauschen und müssen dann den Client einmal neustarten:
Nach dem Neustart ist das generische Diagramm sofort geladen. Keine Wartezeit! Hier ist die Query wesentlich schneller als die Flowfield Variante.
Auch wenn ich viel Kritik über Query gelesen habe und es auch berechtigte Kritik gibt, weil es beispielsweise keine Standardintegration von Queries in Seiten oder Berichten als SourceTable gibt, so darf man nicht vergessen, dass Queries in manchen Bereichen sehr große Vorteile aufweisen können.
Das Query Objekt (Debitorensalden) könnt ihr hier herunterladen: 161030_CustomerBalanceQuery.zip
Hallo Robert,
vielen Dank erst mal für die Arbeit, die Du dir für uns alle machst.
Ich habe mal einen Query für ein Diagramm erstellt und bin an Grenzen gestossen:
Fragestellung / Anzeige: 10-20 Kreditoren mit dem größten Einkaufswert in Zeitraum
Poblem: a) ich hätte die Werte gern positiv dargestellt
b) Ich weiss nicht, wie ich Query so einen Filter setzen soll. Der Diagramm-Filter passt auch nicht
c) wie kann ich einen variablen Zeitraum verwenden ?
Oder muss ich hier doch mit einer Zwischentabelle arbeiten ?
Grüße
ATLAN / Hermann Schubert
Hi Hermann,
a) Query können Werte nicht negieren oder positiv darstellen. Soweit ich weiß geht das auch nicht über die generischen Diagramme.
b) Filterungen sind auf alle Felder der Tabelle oder der jeweiligen Query möglich (http://robert-dynamicsnav.de/wp-content/uploads/2016/10/Queries2_11_QueryEinrichtungGenerrischesDiagramm.jpg). In diesem Fall habe ich somit einen direkten Filter auf das Feld SUM_Amount_LCY gesetzt. Den Namen habe ich in der Query für dieses Feld hinterlegt, bzw. der Standard hat dies vorgegeben.
c) Das ist mit Queries nicht machbar.
Zwischentabellen wären eine Lösung, aber nach meiner Meinung nach nicht die Beste. Wenn du dich in SQL auskennst, bzw. SQL Skripte schreiben kannst, dann kannst du auch deine Query zu einer SQL View machen. Diese SQL View kannst du in Dynamics NAV anzeigen, wnen du eine neue Tabelle anlegst und diese mit dem gleichen Namen + der Eigenschaft “LinkedObject” = “Yes” hinterlegst.
Dann hast du eine Tabelle, die dann all deine Anforderungen erfüllen kann:
a) in einer SQL View kannst du Werte negieren oder nur positiv darstellen
b) Du kannst dynamische Filter setzen
c) Zeiträumen kannst du ebenso variabel deklarieren
Mehr dazu findet man hier:
– LinkedObject: http://www.msdynamics.de/viewtopic.php?t=2008 / https://msdn.microsoft.com/en-us/library/dd339076.aspx / https://msdn.microsoft.com/en-us/library/dd338595.aspx
– SQL Views: http://techblog.byllemos.com/2008/05/using-sql-views-in-navision/ / https://dynamicsuser.net/nav/b/waldo/posts/how-to-display-an-sql-server-view-in-microsoft-dynamics-nav
VG
Robert
Hallo Robert,
eine Frage. Ist es möglich, ein Diagramm so aufzubereiten, dass es in einer Liste verwendet werden kann?
Zum Beispiel, in der freigegebenen FA-Liste wird ein Wert dynamisch angezeigt, wenn ein Dokument ausgewählt wird.
LG Zeljko
Hi Zeljko,
ich glaube nicht das generische Diagramme in Listen überhaupt in einer Liste anzeigen lassen.
Aus meiner Sicht würde ich bei der Anforderung ein Diagramm in einer Liste einzublenden folgende Optionen in Betracht ziehen:
– Power BI Factbox – das kann Daten in Bezug auf den gewählten Datensatz anzeigen, aber setzt auch voraus, dass man Power BI nutzt,
– eigenes Javascript/.NET Addin in einer Factbox zur Umsetzung der grafischen Anforderung. Es müsste möglich sein Diagramme zu zeichnen (System.Web.DataVisualization / System.Drawing) – habe ich persönlich aber noch nicht gemacht.
– Je nachdem welches business intelligence man nutzt, kann man auch dort die geforderte Auswertung vornehmen und per WebAdding (Darstellung einer Webseite as Addin einfach den Link zu dem gefilterten Diagramm aufrufen).
Sofern die Daten nicht in real time zur Verfügung stehen müssen, könnte man auch einfach mit Bildern arbeiten.
Beispiel:
– Eine Aufgabenwarteschlage erstellt pro Fertigungsauftrag ein RDLC Bericht. Dieser Bericht kann beispielsweise ein Diagramm enthalten, welches als PDF oder Word gespeichert wird. Solche Daten kann man auch in ein Bild umwandeln und dieses dann in ein Blob oder in neueren Versionen in ein Mediaset einlesen. Bilder lassen sich leicht als Factbox zu einer Liste hinzufügen.
Es kann aber auch gut sein, dass keine der genannten Wege eine gute Lösung für dein Problem darstellt. Das hängt sicher davon ab, was genau erreicht werden soll.
VG
Robert
Hi und Danke für die Erklärung. Ich beschäftige mich zum ersten mal mit den Gen. Diagrammen und versuche nun ein Diagramm auf einer von mit erstellten Query zu erstellen.
Wenn ich über die Tabelle gehe funktioniert alles, nur da kann ich keinen dynamischen Datumsfilter integrieren, also habe ich mir eine Query gebaut.
Wenn ich aber nun versuche eine Aggregation per “Anzahl” zu erstellen, bekomme ich die Fehlermeldung “Sie können keine Anzahl für dieses Diagramm auswählen, weil die Quellenanfrage diese Aggregationsmethode nicht unterstützt.”
Hast du vielleicht eine Idee was das sein könnte? Hab schon diverse Propertys an der Query ausprobiert, aber bekomme es nicht hin.
Hey,
kannst du vielleicht kurz beschreiben, was das generische Diagramm anzeigen soll und aus welcher Tabelle die Daten dazu kommen?