[Gelöst] Diagramme in Excel mit Navision erstellen

9. November 2006 16:28

Hallo Community,

ich habe da ein Problem. Ich bin mir nicht einmal sicher, ob es überhaupt möglich ist, dieses Problem zu lösen, aber ich lasse mich in der Hinsicht gerne vom Gegenteil überzeugen.
Ich möchte eine Tabelle aus Navision in Excell exportieren. Dies erreiche ich mit der Tabelle Excel Buffer. Ebenso hab ich es geschafft Berrechnungen einzufügen. Bis dahin klappt alles super. Doch nun würde ich gerne das automatisch in einem neuen Sheet ein Diagramm erstellt wird.

Um mein Problem näher zu beschreiben. Ich habe Daten von einem Wasserverband (In dem und dem Jahr wurde so und soviel Wasser in das Netz gespeist). Dies würde gut aussehen, wenn Excell gleich mit dem Report ein Diagramm erstellt. Leider habe ich garkeine Hilfe gefunden. Ich habe lange darüber gegrübelt, wie ich das realiesieren könnte, aber mir fällt dazu nix ein. Ich wäre schon über einen Ansatz sehr glücklich, da ich ja auch noch was lernen möchte (Praktikant). Es wäre auch echt super, wenn ihr mir einen Code postet dazu etwas zu sagen, warum ihr dass und das so und so programmiert habt.
Vielen Dank für die investierte Zeit.

Grüße René
Zuletzt geändert von Rene am 13. November 2006 16:02, insgesamt 1-mal geändert.

9. November 2006 16:37

Hallo René,

auch das geht. Du musst nur ein paar neue Funktion in der Tabelle "Excel Buffer" erstellen.

Folgende Vorgehensweise würde ich empfehlen:

1. Starte Excel und dann die Makro-Aufzeichnung.
2. Mach nun genau das, was Navision später automatisch machen soll und beende die Makro-AUfzeichnung wieder.
3. Schau dir nun die Makro-Aufzeichnung ("Visual Basic"-Code) an.
4. An diesem Code kannst du erkennen, was da im Hintergrund abläuft und wie du den Code in Navision und welche Automation-Variablen du anlegen musst.

Gruß, Marc
Zuletzt geändert von Marc Teuber am 29. November 2006 23:54, insgesamt 1-mal geändert.

10. November 2006 13:42

Hallo Rene,

Ich habe in der Tabelle eine Funktion mit dem Namen "Chart' und folgendem Inhalt eingebaut.Bei mir funktioniert es.
Code:

Name   DataType   Subtype   Length
XlChart   Automation   Unknown Automation Server.Chart   
Locals: VV_neu : Boolean;
           VV_Sheet : Code[20];
           VV_Datenquelle : Code[20];
           VV_Diagrammtyp : Integer;
           VV_Reihe_Spalte : Integer;
           VV_Legende : Bo


   XlChart := XlWorkBook.Charts.Add();
   XlRange := XlWorkSheet.Range(VV_Datenquelle);
   XlChart.ChartWizard(XlRange);
   XlChart.ChartWizard(XlRange,
                       VV_Diagrammtyp,           // -4100,xl3DColumn
                       1,
                       VV_Reihe_Spalte,         // xlColumns
                       1,
                       0,
                       VV_Legende,
                       VV_Titel,
                       VV_Achsenname);

10. November 2006 16:38

Hallo

erstmal Danke für eure Hilfe.
Den Quellcode hab ich mir angeschaut (Visual Basic). Naja verstanden was da womit gemacht wurde hab ich schon, aber beim Übernehmen klappts da noch nicht. Da hab ich noch zu wenig Ahnung von der Navisionprogrammierung, aber da frag ich einfach mal so nach in der Firma.

@Michael Also bis hierher hab ich das alles kapiert
Code:
Name   DataType   Subtype   Length
XlChart   Automation   Unknown Automation Server.Chart   
Locals: VV_neu : Boolean;
           VV_Sheet : Code[20];
           VV_Datenquelle : Code[20];
           VV_Diagrammtyp : Integer;
           VV_Reihe_Spalte : Integer;
           VV_Legende : Boolean;


Aber den Rest versteh ich net. Die Variablen die du verwendest, wo sind diese deklariert? :oops:
Wenn du mir das noch irgendwie erläutern könntest, was du da programmiert hast, wär ich dir mehr als dankbar.

Grüße René

10. November 2006 16:43

Rene hat geschrieben:[...] Die Variablen die du verwendest, wo sind diese deklariert?

In der neuen Funktion einfach über "Ansicht" in die "C/AL Locals" gehen. Dort kannst du die Variablen anlegen.

Gruß, Marc

10. November 2006 17:36

Hallo Marc,

ich glaube ich hab mich etwas falsch ausgedrückt.

ich meinte diese Variablen
Code:
XlChart := XlWorkBook.Charts.Add();
   XlRange := XlWorkSheet.Range(VV_Datenquelle);
   XlChart.ChartWizard(XlRange);
   XlChart.ChartWizard(XlRange,


also z.B. XlChart

Grüße René

EDIT Achso ne alles klar. weiß nu was du meintest. Ok werds mal probieren, aber erst am Montag. Jetzt ist erstmal Feierabend.

13. November 2006 09:48

Der komplette Code sieht bei mir so aus
Code:

IF VV_neu THEN BEGIN
   XlChart := XlWorkBook.Charts.Add();
   XlRange := XlWorkSheet.Range(VV_Datenquelle);
   XlChart.ChartWizard(XlRange,
                       VV_Diagrammtyp,           // -4100,xl3DColumn
                       1,
                       VV_Reihe_Spalte,         // xlColumns
                       1,
                       0,
                       VV_Legende,
                       VV_Titel,
                       VV_Achsenname);
END ELSE BEGIN
   XlChart := XlWorkBook.Charts.Item(VV_Sheet);
   XlRange := XlWorkSheet.Range(VV_Datenquelle);
   XlChart.ChartWizard(XlRange);
END;

Name   DataType                   Subtype                                    
XlRange   Automation   Unknown Automation Server.Range
XlChart   Automation   Unknown Automation Server.Chart

// XlRange ist bereits in der Tabelle 370 vorhanden
   
Locals sind:

Var   Name                  DataType   Subtype   Length
No   VV_neu   Boolean      
No   VV_Sheet   Code      20
No   VV_Datenquelle   Code      20
No   VV_Diagrammtyp   Integer      
No   VV_Reihe_Spalte   Integer      
No   VV_Legende   Boolean      
No   VV_Titel   Text      30
No   VV_Achsenname   Text      30

Aus einem Bericht übergebe ich folgenden Zeile

"R_Excel Buffer".Chart(TRUE,'Diagramm 1','$A$2:$D$'+FORMAT(2),-4100,2,FALSE,'','');

13. November 2006 15:30

Hallo nochmal,

Also der Code sieht ja sehr gut aus, und scheint auch zu funktionieren. Ich hab den Code noch ein wenig an meine Tabelle 370 angepasst und die Funktion als solches kompiliert er. Allerdings kommt beim Funktionsaufruf im Reporttrigger die Fehlermeldung

Navision hat geschrieben:[...]Für diese Automation Variable wurde keine Instanz erstellt.[...]

Ich hab daraufhin mit Create( ) versucht herauszufinden, für welche Variable das zutrifft. Es ist die Variable "XlWrkBk" also bei dem Code von euch "XlWorkBook".


Grüße René

13. November 2006 15:37

Aus dem Report heraus muss du ja bevor du ein Diagramm erstellst die entsprechende Excel-Vorlage öffnen bzw. erstellen. Bei dieser Aktion wird die Instanz ja berreits erstellt.

mfg Michael

13. November 2006 15:39

naja das wird ja gemacht. Das Excellblatt erscheint ja auch und wird in den Vordergrund geholt. Danach höre ich aber son bing-ton :-D und dann wenn ich wieder auf Navision gehe, erscheint diese tolle fehlermeldung.

Grüße

EDIT ich habe mal meinen Code gepostet


Code:
RowNo += 1;
EnterCell(RowNo, 2, 'Total', '', TRUE, FALSE, FALSE);
EnterCell(RowNo, 3, '', STRSUBSTNO(Summe, RowNo-1), TRUE, FALSE, FALSE);
RowNo += 1;
EnterCell(RowNo, 2, 'STABW', '', TRUE, FALSE, FALSE);
EnterCell(RowNo, 3, '', STRSUBSTNO(Standardabweichung, RowNo-2), TRUE, FALSE, FALSE);
ExcelBuffer.CreateBook;
ExcelBuffer.CreateSheet(TABLECAPTION, TABLECAPTION, COMPANYNAME, USERID);
"R_Excel Buffer"(TRUE,'Diagramm 1','B2:B14'+FORMAT(2),-4100,2,FALSE,'','');
ExcelBuffer.GiveUserControl();

13. November 2006 15:45

Hast du eventuell bevor du die Chart-Funktion aufrufst,
"R_Excel Buffer".GiveUserControl; drin?

13. November 2006 16:01

Hallo

nein hatte ich nicht, aber ich hab den Fehler nun in meinem code gefunden. Mittlerweile funktioniert das tadellos.

Herzlichsten Dank für eure Hilfe.

Grüße rené

11. April 2007 14:54

Hallo,

das mit dem Diagramm funktioniert ja wirklich gut, aber ist es auch möglich, einen anderen Diagrammtyp als -4100 zu benutzen? Habe bis jetzt etliche probiert und stoße immer auf einen .Range Fehler.
Hat da vielleicht irgendjemand eine Idee?

Danke schon mal im Voraus...

11. April 2007 15:49

Hallo schlaechter,

vorab ersteinmal ein "Herzliches Wilkommen" im Forum.

Herausfinden des enumerator typs:
1. Öffne Excel
2. Öffne -->Extras-->Makros-->Visual Basic Editor
3. Öffne -->Ansicht-->Objektkatalog
4. Wähle "Excel" oben links aus
5. Im linken Menü "XlWBATemplate" auswählen
6. Im rechten Bereich "Elemente von XlWBATemplate" -->"xlWBATWorksheet" auswählen
7. Der Wert kann im unteren Bereich der Form entnommen werden

Weitere Informationen kannst du im adg.pdf Kapitel 19. (Finding the enumerator Value) auf der Navision CD entnehmen.

Gruß Mikka

PS: Vieleicht kannst du ja ein paar Werte Posten, somit hätten zumindest andere das Problem nicht mehr.

12. April 2007 16:00

Hallo mikka (und natürlich alle anderen),

danke erstmal für die freundliche Begrüßung und für die schnelle Antwort.
Ich weiß nicht ob ich mich richtig ausgedrückt bzw die Postings oben richtig verstanden habe:
Meiner Meinung ist in der Codezeile, die aus dem Report übergeben wird, die -4100 für den ChartType zuständig. Dieser integer-Wert steht für (glaube ich) den Diagrammtyp xl3dcolumn. Ich benötige jedoch den ChartType xl3dcolumnstacked100. Dieser hat den integer-Wert 56 (laut VBA Editor). Wenn ich diesen Wert aber übergebe(statt der -4100), bekomme ich einen Fehler.
Habe mich übrigens oben vertan, es kommt kein Range Fehler, sondern Excel meldet einfach einen Fehler, dass die ChartWizard-Methode des
Chart-Objektes nicht ausgeführt werden konnte. Mit -4100 funktioniert es wunderbar. Das ist eben genau das, was ich nicht verstehe.
Was sagt eigentlich dieser xlWBATWorksheet-Enumerator aus???

12. April 2007 16:11

Vermutlich hat der Wizard nur einen begrenzten Horizont und kann nicht alle Charts....

12. April 2007 16:47

Hab ich mir auch schon gedacht und versucht, das ganze ohne Wizard zu realisieren. Problem hierbei: Die Zuweisungen, die ich aus VBA klau, müssen ja in Navision mehr oder weniger als Funktion aufgerufen werden. Und siehe da, ein bißchen umgemodelt und er nimmt XlChart.ChartType(56);
Dann gehts aber auch schon los: Die Range-Zuweisung geschieht in VBA über den Befehl
ActiveChart.SetSourceData Source:=Sheets("Tabelle1").Range("A2:D5"), PlotBy :=xlRows
Und jetzt versuch des ma Navision beizubringen :lol:
Wenn ich einfach nix übergeb zeigt er mir sogar den richtigen ChartType in Excel, aber natürlich leer. Logisch. Das heißt wenn ich die Range jetzt noch gebacken bekomm, sollte das eingentlich funktionieren. Aber wie gesagt, häng grad daran...

12. April 2007 17:59

Die -4100 gibt wie du geschrieben hast den Chart Typ an.
Um den gewünschten Chart Typ zu bekommen,
musst du dein Wunschdiagramm (in Excel) erstellen und wie oben beschrieben den "enumerator Typ" heraussuchen
-->Enumerator Typ herausfinden
(So zumindest habe ich die Doku verstanden!)

Hier die Felder der ChartWizard Funktion:

XlChart.ChartWizard(Range,-4100,2,2,1,0,0,'Text1','Text2','Text3');
Code:
Argument           Beschreibung               Wert
Source             Der Quellbereich           z.B. Range := Sheet.Range('C3:D14');
Gallery            Der Chart Typ               -4100 = Enumerator = "Stacked Column 3D effect
Format             Option Nummer             
                       für Autoformat
PlotBy             Die Daten sind für         2 = xlRows XlRowCol enumerator
                     Zeilen oder Spalten
CategoryLabels     IntegerWert = Anzahl       1 = Eine Zeile
                      Kategorie Label
Serieslabels       IntegerWert = Anzahl       1 = Keine Serien Label
                       Serien Label
HasLegend          Legende Anzeigen           0
Title              Diagrammtitel              Text1
ValueTitle         Titel X Achse              Text2
ExtraTitle         Titel Z Achse              Text3


Gruß Mikka

13. April 2007 09:47

Hallo mikka,

danke nochmal für die Antwort, aber diesen Enumerator hätte ich ja eigentlich schon, nämlich diese 56 für xl3dcolumnstacked100. Diesen Wert spuckt ja auch der VBA Editor aus. Funktionieren tut er halt eben net...

13. April 2007 11:39

Könntest du mir schreiben, wie dieser Chart aussieht.
Ggf. ein Sceenshot posten.

Evtl. habe ich ja Glück und finde eine andere Zahl heraus.
Gruß Mikka

13. April 2007 12:36

Freude oh Freude,

Habs gelöst.
Er nimmt den ChartType über den Wizard ums verrecken nicht, also hab ich das Chart einfach mit Type -4100 erstellt, und das ganze NACHTRÄGLICH geändert mit
XlChart.ChartType(56); und danach
ExcelBuffer.GiveUserControl();
Jetzt ist alles super :-D
Ist viel einfacher, danach alles Stück für Stück zu ändern anstatt zu versuchen, gleich alles dem Wizard mitzugeben...

Vielen, vielen Dank nochmal für deine/eure Hilfe.

PS: Muss ich da jetzt doppelt [gelöst] reinschreiben??? :-)

13. April 2007 14:03

schlaechter hat geschrieben:PS: Muss ich da jetzt doppelt [gelöst] reinschreiben???


Nein, musst du nicht, der Beitrag müsste eigentlich voneinander abgetrennt werden.
Da aber die Themen jedoch recht dicht aneinander sind, lasse ich Ihn so wie er ist. (Es sei den die anderen Moderatoren sehen es anders!)

***

Danke für den Tipp mit dem Nachträglichen ändern.
Wo hast du deine Nr. gefunden?


-->So Interessehalber, funktioniert -4109 als Chart Type?
(Ich habe eben nochmal in den VBA-Editor geschaut)
Gruß Mikka

13. April 2007 14:24

Hab ich grad ausprobiert, -4109 geht nicht, zumindest lauf ich da auf einen Fehler.

Hab die integer-Werte folgendermaßen rausgefunden:
In Excel ein Makro aufgezeichnet, währenddessen den Diagrammtyp geändert. Dann sieht man die englische Bezeichnung des Diagrammtyps im VBA Editor im dazugehörigen Modul --> Makro.
Dann einfach Strg+G (fürs Direktfenster) und folgendes eintippen:
? Diagrammtypname(so wies oben drübersteht)
Dann ENTER und der VBA Editor spuckt den dazugehörigen integer-Wert aus.

Viele Spaß
Grüße

13. April 2007 20:48

Danke für dir Info.
Wenn es nicht funktioniert wie in der Doku beschrieben, dann halt "von hinten durch die Brust".
Gruß Mikka

16. April 2007 08:58

hier eine Liste mit den ChartTypes für Excel

Liste als Download
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.