[Gelöst] Mappenwechsel in Excel

1. Oktober 2008 11:25

Guten Tag,
ich habe ein kleines Problem mit Excel Export in NAV.

Was ich möchte:
Er soll eine vorgefertigte Excel Tabelle öffnen, wo es 6 Mappen gibt (Übersicht, Table, Form, Report, Dataport, Codeunit).
Nun soll er, wenn der Report ausgeführt wird, entsprechend die Tables in die Mappe "Table" exportieren, die Forms in die Mappe "Form" usw.

Mein Problem:
Wenn ich die Excel Tabelle geöffnet habe und die Mappe "Table" gefüllt habe, springt er nicht in die nächste Mappe (Form) und befüllt diese.

Nun meine Frage:
Gibt es einen Befehl, womit ich
1.) entweder die Excel Tabelle abspeicher und anschließen schließe
2.) oder einfach die bereits geöffnete Excel Tabelle editiere und sage, dass er in die nächste Mappe springen soll um diese zu befüllen?

Es würde ja 2 Varianten geben:
1.) Entweder ich sage von Anfang an: Öffne diese Excel Tabelle einmal, befülle Mappe1, editiere dann diese geöffnete Excel Tabelle, befülle diesmal aber Mappe 2 usw. und gebe mir am Ende "GiveUserControl();" damit ich die Excel Tabelle sehen kann.
oder
2.) Öffne diese Excel Tabelle, befülle Mappe1, speicher und schließe die Excel Tabelle. Öffne die Excel Tabelle erneut, befülle Mappe2, speicher und schließe die Excel Tabelle und am Ende gib mir "GiveUserControl();" damit ich sie sehen kann.

Soll natürlich alles im Hintergrund geschehen und am Ende die Excel Tabelle erscheinen, wo alle Mappen entsprechend gefüllt sind.

Ich habe übrigens einen Report dafür gebaut mit 5 DataItems für die entsprechenden Objekte (Table, Form, Report, Dataport, Codeunit).

Wofür dies alles ist?
Um die Lizenzbereiche herauszusuchen.

Funktioniert dies so? Wenn ja, könnte mir dann jemand die Befehle dazu geben?
Wäre super ;).

Danke vielmals im voraus.
Mfg InSiDeR
Zuletzt geändert von InSiDeR am 8. Oktober 2008 11:57, insgesamt 1-mal geändert.

Re: Mappenwechsel in Excel

1. Oktober 2008 11:31

Hi,

ich musste auch einmal eine bestehende Mappe eines Templates ansprechen.
Hierzu habe ich diesen Befehl in der Funktion CreateSheet() eingebaut:
Code:
IF tUseTemplate <> '' THEN
   XlWrkSht := XlWrkBk.Worksheets.Item(1)      // use 1st sheet of the template
ELSE
  // STOP BAU03.feri
  XlWrkSht := XlWrkBk.Worksheets.Add;


Ich wollte eigentlich den Namen zum Suchen verwenden, aber das hat leider nicht so richtig funktionioniert. Mit Item(1) nimmt er einfach die erste Mappe.
Bei dir sollten die Positionen der Mappen ja eigentlich immer fix sein, nehme ich an, dann koenntest du doch einfach mit 1,2,3 ..usw einfach der Reihe nach alle Mappen ansprechen?

Vielleicht hilft es etwas. :wink:

Gruesse
feri

Re: Mappenwechsel in Excel

1. Oktober 2008 11:41

Danke für deine schnelle Antwort, aber ich benutzt die Funktion "CreateSheet();" gar nicht, da die Mappen ja alle vorgefertigt schon vorhanden sind.

Re: Mappenwechsel in Excel

1. Oktober 2008 12:55

Hi,

wir haben einige Funktionen etwas um- bzw. ausgebaut, von daher verwenden wir die Funktion CreateSheet() immer, egal ob mit oder ohne Template.
Jedenfalls musst du an jener Stelle, bei der du auf die entsprechende Mappe wechseln willst, dieses "Workbook.Worksheets.Item(1)" einbauen.

Gruesse
feri

Re: Mappenwechsel in Excel

2. Oktober 2008 08:44

Gibt es da auch eine andere Möglichkeit?

Re: Mappenwechsel in Excel

2. Oktober 2008 09:03

Hi,

mir faellt hier noch eine 2. Variante ein, allerdings nur ohne Template. Dazu habe ich unsere abgeaenderte Excel Buffer Tabelle angehaengt.
Hier noch ein Beispiel wie man zwei Mappen erstellt.

Code:
  // 1. Dataitem
  ExcelBuffer.DELETEALL;
  // Excel erstellen
  ExcelBuffer.CreateBook();     

  ExcelBuffer.EnterCell(1,1,STRSUBSTNO('€¿‰¹—Î…Ñ'),FALSE,FALSE,FALSE,0,0,'','');
  ExcelBuffer.EnterCell(2,1,STRSUBSTNO('‰½›Ž“ø‚–: %1',COMPANYNAME),FALSE,FALSE,FALSE,0,0,'','');
  ExcelBuffer.EnterCell(3,1,STRSUBSTNO('Filters: %1',GETFILTERS),FALSE,FALSE,FALSE,0,0,'','');
  ExcelBuffer.EnterCell(5,1,'‰¹›„·’Ô',TRUE,FALSE,FALSE,0,0,'','');
  // usw..
 
  // 1. Mappe erstellen
  ExcelBuffer.CreateSheets('Sheetname 1',5,0);   
  // Tabelle leeren
  ExcelBuffer.DELETEALL;                       

  // 2. Dataitem
  ExcelBuffer.EnterCell(1,1,STRSUBSTNO('€¿‰¹—Î…Ñ'),FALSE,FALSE,FALSE,0,0,'','');
  // usw...

  // 2. Mappe erstellen
  ExcelBuffer.CreateSheets(STRSUBSTNO('Sheetname 2'),5,0);
  ExcelBuffer.giveUserControl();
  ExcelBuffer.DELETEALL;


Gruesse
feri
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Mappenwechsel in Excel

2. Oktober 2008 09:10

Hallo,

vielleicht hilft dies:
Ich habe in der Table 370 eine neue Funktion "SelectSheet" erstellt und kann damit das Tabellenblatt wechseln.
Dabei muss man allerdings wissen, wie das Tabellenblatt heißt.

Die Funktion "SelectSheet":
Code:
    PROCEDURE SelectSheet@1106800002(SheetName@1001 : Text[250]);
    VAR
      i@1002 : Integer;
      EndOfLoop@1003 : Integer;
      Found@1004 : Boolean;
    BEGIN
      IF SheetName = '' THEN
        ERROR(Text002);

      XlWrkBk := XlApp.ActiveWorkbook;
      i := 1;
      EndOfLoop := XlWrkBk.Worksheets.Count;
      WHILE (i <= EndOfLoop) AND (NOT Found) DO BEGIN
        XlWrkshts := XlWrkBk.Worksheets.Item(i);
        IF SheetName = XlWrkshts.Name THEN
          Found := TRUE;
        i := i + 1;
      END;
      IF Found THEN
        XlWrkSht := XlWrkBk.Worksheets.Item(SheetName);
    END;


Im Report für den Excel-Export, kann dann diese Funktion so aufgerufen werden:
Code:
    LOCAL PROCEDURE CreateExcelbook@1106800000();
    BEGIN
      ExcelBuf.CreateBook;

      ExcelBuf.CreateSheet(Text001,Text002,COMPANYNAME,USERID);

      ExcelBuf.SelectSheet('Informationen');


Vielleicht hilft dieser Hinweis.

Gruß
Jörg

Re: Mappenwechsel in Excel

2. Oktober 2008 09:20

Also ich habe nun die Funktion "SelectSheet" mit dem Parameter "SheetName" (Text, 250) erstellt.
Dazu die Variablen
i (Integer)
EndOfLoop (Integer)
Found (Boolean)

In die Funktion selbst hab ich geschrieben:
Code:
      XlWrkBk := XlApp.ActiveWorkbook;
      i := 1;
      EndOfLoop := XlWrkBk.Worksheets.Count;
      WHILE (i <= EndOfLoop) AND (NOT Found) DO BEGIN
        XlWrkshts := XlWrkBk.Worksheets.Item(i);
        IF SheetName = XlWrkshts.Name THEN
          Found := TRUE;
        i := i + 1;
      END;
      IF Found THEN
        XlWrkSht := XlWrkBk.Worksheets.Item(SheetName);


Hoffe, dass war soweit richtig.

Ich teste es jetzt mit dem "SelectSheet" mal aus. Leider hat der Report noch einen Bug, den ich erst beheben muss.

//edit: Es tritt immer ein Fehler auf:

Code:
Diese Meldung ist für C/AL-Programmierer:
Für diese Automation Variable wurde keine Instanz erstellt.
Sie können ihr eine Instanz zuordnen, indem Sie sie entweder erstellen oder zuordnen.

Re: Mappenwechsel in Excel

2. Oktober 2008 11:35

Was deinen "Bug" im Report betrifft: Schau dir doch bitte mal im C/Side Reference Guide die Funktion CREATE(Automation) an.

CREATE (Automation)
Use this function to create an Automation object.

Müsste in deinem Report dann folgendermaßen aussehen: CREATE("Deine Automation-Variable")

Re: Mappenwechsel in Excel

2. Oktober 2008 15:22

Hallo,

dieses Problem mit dem "Bug" hatte ich zunächst auch.
Beheben kann man dies nur dadurch, dass z.B. die Funktion "SelectSheet" erst nach den Funktionen "CreateBook" bzw. "CreateSheet" aufgerufen wird,
weil in diesen Funktionen erst die notwendigen Automation-Variablen erzeugen (= Excel als Hintergrund-Prozess starten).
siehe auch den zweiten Teil meine Code-Beispiele.

Gruß
Jörg

Re: Mappenwechsel in Excel

7. Oktober 2008 12:10

Ich komme einfach nicht weiter.

Ich möchte:

1. Code auslesen
2. In Excel Tabelle schreiben
3. nächsten Code auslesen
4. in der geöffneten Excel Tabelle nur die Mappe wechseln und da rein schreiben
5. nächsten Code auslesen
6. Wieder Mappe wechseln und da rein schreiben
usw.

Zum Schluss: GiveUserControl und alle entsprechenden Eintragungen in den entsprechenden Mappen.

----------
Ich habe Funktionen für die entsprechenden Objekte erstellt und den Code dort rein geschrieben und führe diese im OnAfterGetRecord Trigger aus. Leider schreibt er alles in die selbe Mappe. Ich weiß einfach nicht weiter. :(

Re: Mappenwechsel in Excel

7. Oktober 2008 13:26

InSiDeR hat geschrieben:Ich habe Funktionen für die entsprechenden Objekte erstellt und den Code dort rein geschrieben und führe diese im OnAfterGetRecord Trigger aus. Leider schreibt er alles in die selbe Mappe. Ich weiß einfach nicht weiter. :(


Hi,

ich nehme an, du verwendest jetzt die Funktion SelectSheet()?
Wo genau rufst du die auf?

Gruesse
feri

Re: Mappenwechsel in Excel

7. Oktober 2008 13:39

Im OnPreDataItem Trigger öffne ich als erstes die Excel Vorlage:
gExcelBuffer.OpenBook('C:/excel.xls','Table');
Dabei gebe ich direkt mit an, dass er in die Mappe "Table" schreiben soll.

Dann habe ich 5 Funktionen erstellt.
Diese rufe ich alle in den OnAfterGetRecord Trigger auf um die entsprechenden Objetke zu filtern auf Lizenzen.

Im OnPostDataItem Trigger dann verwende ich CreateSheet damit er schreibt und GiveUserControl damit ich das Ergebnis sehe.
gExcelBuffer.CreateSheet(TABLECAPTION, TABLECAPTION, COMPANYNAME, USERID);
gExcelBuffer.GiveUserControl();

SelectSheet habe ich ausprobiert, indem ich einfach mal gExcelBuffer.SelectSheet('Form'); schreibe. Funktioniert soweit auch, aber dann schreibt er alle (!) Ergebnisse von allen 5 Funktionen in die Mappe "Form".

Wenn ich das SelectSheet zwischendurch nehme, zwischen den einzelnen Funktionen kommt eine Fehlermeldung, da es diese EInträge bereits gibt im Excel Buffer.Wie muss ich das nun machen?

Re: Mappenwechsel in Excel

8. Oktober 2008 11:11

Hi,

das mit den bereits vorhandenen Excel Buffer Eintraegen ist leider der Nachteil hier.
Du musst jedes Sheet einzeln erstellen bzw. befuellen, sobald das im Excel ist, musst du die Excel Buffer Records loeschen.
Dann werden die Daten des 2. Sheets in die Tabelle und danach ins Excel geschrieben. Jetzt wieder alle Excel Buffer Records loeschen und mit dem naechsten weitermachen.

Du musst also jedes Sheet sofort befuellen und abschliessen, du kannst spaeter, zumindest mit den Standardfunktionen, nicht mehr bei den vorherigen Sheets noch was aendern.
Zumindest in deinem Fall sollte das aber kein Problem darstellen.

Gruesse
feri

Re: Mappenwechsel in Excel

8. Oktober 2008 11:57

Habs selber gelöst.

Ich habe einfach einmal OpenBook verwendet mit der entsprechenden Mappe.
Dann die Funktion ausgeführt, in die ExcelTabelle geschrieben mit CreateSheet, anschließend die Excel Buffer Tabelle geleert.

Danach habe ich die Mappe gewechselt mit SelectSheet und anschließend die nächste Funktion ausgeführt und am Ende erneut mit CreateSheet die Mappe befüllt und wieder die Excel Buffer Tabelle geleert.

Dies hab ich für alle 5 Funktionen gemacht und ganz am Ende dann GiveUserControl zum Anschauen geschrieben.

Funktioniert einwandfrei. Gelöst!