RTC: Dateien und Ordner

25. November 2010 14:03

Grundsätzlich empfehlenswert: Zu jedem einzelnen FILE-Befehl die Beschreibung in der Onlinehilfe nachlesen! Stichwort: Differences Between the Classic Client and RoleTailored Client

Zu EXISTS, RENAME, ERASE, COPY
http://blogs.msdn.com/b/nav/archive/2010/09/02/few-tips-for-nav-developers.aspx
[Edit Kowa 22.12.21]: https://cloudblogs.microsoft.com/dynamics365/no-audience/2010/09/02/few-tips-for-nav-developers/

Eine super Zusammenfassung zur Vorgehensweise gibt es im Hilfeartikel DOWNLOAD Function (File), Abschnitt "Remarks".
Beachtet hierzu auch:
"We recommend that you use the functions in Codeunit 419, 3-Tier Automation Mgt., to upload and download files."


Hilfeartikel File Handling

Dialog unterdrücken: MagicPath (DOWNLOADFROMSTREAM and UPLOADINTOSTREAM without a dialog box)
[Edit Kowa 22.12.21]MagicPath (DOWNLOADFROMSTREAM and UPLOADINTOSTREAM without a dialog box)

Wie immer: Ergänzungen sehr, sehr gern gesehen!

Re: RTC: Dateien und Ordner

2. Dezember 2010 16:05

Verschoben aus: NAV Tipps & Tricks
In der Theorie habt ihr bestimmt schon längst gehört, dass sich durch den Service-Tier das Dateihandling "verkompliziert".
Aber wie genau funktioniert das, und wo finde ich vielleicht Hinweise im Standard?

Zunächst gibt die Hilfe durchaus nützliche Hinweise:
File Handling

Kurz: Soll z.B. eine Datei für den RTC erzeugt werden, so muss diese erst auf der Serviceschicht erzeugt und dananach vom RTC heruntergeladen werden (wobei sie auf der Serviceschicht wieder entfernt werden muss).

Aber jetzt ein bisschen konkreter:

Eine bestehende Datei ergänzen (und danach öffnen)
Haltet euch am besten an den Standardreport 7132 Export Item Budget to Excel mit der Option "Arbeitsmappe aktualisieren".
Hangelt euch am besten von diesem Abschnitt in Integer - OnAfterGetRecord bis zu den aufgerufenen Funktionen herunter:
Code:
  IF ISSERVICETIER THEN
    IF UploadedFileName = '' THEN
      UploadFile
    ELSE
      FileName := UploadedFileName;


Eine Exceldatei erstellen, ohne sie zu speichern
Auch hier Standardreport 7132, Option "Arbeitsmappe erstellen" -> keine gesonderte Programmierung erforderlich. :-)

Eine Worddatei erstellen oder ergänzen
Siehe Codeunit 5054, ExecuteMerge.
Code:
  MergeFile.WRITEMODE := TRUE;
  MergeFile.TEXTMODE := TRUE;
  MergeFileName := RBAutoMgt.ServerTempFileName(Text029,'.HTM');
  MergeFile.CREATE(MergeFileName);
  ...
  MergeFile.WRITE('</html>');
  MergeFile.CLOSE;
  MergeFileName := RBAutoMgt.DownloadTempFile(MergeFileName);
  wrdDoc := wrdApp.Documents.Open(MainFileName);
  ...

RBAutoMgt ist die Codeunit 419.

Datenexport (txt, csv) mit einem Report statt Dataport
Diese Aufgabe hat mich dazu bewegt, dieses Thema zu schreiben.
Meine Lösung (gekürzt):

Auf der Request Form das Dialogfeld für den Dateinamen (Variable FileName) nur einblenden, wenn Classic Client.
Denn: Den Pfad schon auf der Reqeuest Form auswählen zu lassen, macht keinen Sinn, weil der spätere Download nicht ohne Dialog ausgeführt werden kann -> der Benutzer müsste den Zielort dann ein zweites Mal bestätigen.
Wollen wir aber nicht, gibts auch nicht :-)

Dort im Trigger OnAssistEdit:
Code:
IF NOT ISSERVICETIER THEN BEGIN
  FileName := CommonDialogMgt.OpenFile(Text002,FileName,4,Text005,1);
END;


Datei erzeugen:
Code:
CSVFile.WRITEMODE := TRUE;
CSVFile.TEXTMODE := TRUE;
IF ISSERVICETIER THEN BEGIN
  CSVFile.CREATETEMPFILE();
END ELSE BEGIN
  CSVFile.CREATE(FileName);
END;


Datei füllen (wie gehabt):
Code:
CSVFile.WRITE(...);


Datei ggf. von der Serviceschicht zum Client transferieren:
Code:
IF ISSERVICETIER THEN BEGIN
  CSVFile.CREATEINSTREAM(NewStream);
  IF DOWNLOADFROMSTREAM(
                NewStream,
                Text007,
                '',
                'csv File *.csv| *.csv',
                FileName) THEN;
END;
CSVFile.CLOSE();

Die Hilfe hat mir veraten, dass in der Serviceschicht mit
Code:
File.CREATETEMPFILE();
...
File.CLOSE;

die Datei durch CLOSE automatisch entfernt wird.

Bei DOWNLOADFROMSTREAM erhält der Benutzer den Eingabedialog, in welchem er den Client-Ablageort für die Datei bestimmt.
Wenn der Dialog unterdrückt werden soll: MagicPath (DOWNLOADFROMSTREAM and UPLOADINTOSTREAM without a dialog box)

---
Wenn ihr diesbezüglich schon viel weiter seid und merkt, dass ich es mir viel zu umständlich gemacht habe, dann lasst es mich bitte wissen :-)

Re: RTC: Dateien und Ordner

22. September 2011 09:24

Hallo Natalie,
Ich habe versucht nach deinen Vorgaben hier einen Report für die Erzeugung einer TXT-Datei zu erstellen.

Obowhl ich den Code hier übernommen habe erhalte ich am Schluss der Verarbeitung keinen Dialog für das Speichern der Datei. Es geschieht einfach nichts, der Report läuft durch und fertig.

Hast du ev. eine Idee, woran das liegen kann?

Re: RTC: Dateien und Ordner

22. September 2011 09:56

Ist es ein CC-Report (also auch, wenn ein Report ohne Layout im RTC ausgeführt wird) oder RTC-Report?

Re: RTC: Dateien und Ordner

22. September 2011 10:16

Der Report läuft 'ProcessingOnly', also gänzlich ohne Layout, wird aber im RTC ausgeführt.

Re: RTC: Dateien und Ordner

22. September 2011 11:01

rotsch hat geschrieben:Der Report läuft 'ProcessingOnly', also gänzlich ohne Layout, wird aber im RTC ausgeführt.

Lass dir mal über eine MESSAGE ausgehen, ob ISSERVICETIER wahr oder falsch ist. Erst dann wissen wir doch, welcher Teil des Codes nicht so funktioniert, wie er soll.

Re: RTC: Dateien und Ordner

22. September 2011 11:17

Das habe ich gemacht.

Die Funktion IF DOWNLOADFROMSTREAM... ganz am Schluss liefert FALSE zurück. Da bin ich bereits innerhalb ISSERVICETIER.

Re: RTC: Dateien und Ordner

22. September 2011 11:44

Dann lass doch das IF weg, denn bekommst du eine Fehlermeldung, die dir hoffentlichen den Grund nennt. Wahrscheinlich eine fehlende Berechtigung auf ein Verzeichnis.

Re: RTC: Dateien und Ordner

22. September 2011 13:05

Die Meldung lautet 'Der angegeben Pfad ist ungültig'

Aber genau den will ich ja im nicht erscheinenden Dialog angeben können.

Re: RTC: Dateien und Ordner

22. September 2011 13:29

Oops, die Onlinehilfe sagt zu CREATETEMPFILE: "This function is not supported in the RoleTailored client".
War das in früheren NAV2009 ohne SP etwa anders ...?
Belass es mal oben beim CSVFile.CREATE(FileName);
Den Dialog zur Auswahl von FileName müsstest du dann noch selbst erzeugen.

Re: RTC: Dateien und Ordner

23. September 2011 09:31

Alles klar, besten Dank. So hats geklappt :-)

Re: RTC: Dateien und Ordner

9. November 2011 14:06

Ich habe in diesem Zusammenhang noch ein Problem, dem ich nicht auf die Spur komme.

Der Report mit der Erstellung des Files funktioniert tadellos. Wenn nun aber ein Anwender den Report ausführt kann er den kompletten Vorgang ausführen bis zum Speichern der Datei. Dort erscheint dann die Fehlermeldung 'Der Pfad ist ungültig'. Wenn ich das direkt auf dem Server ausführe, funktioniert auch das. Und wenn der Anwnder die Datei in ein lokales Verzeichnis seines PC's speichert, welches auch auf dem Server existiert, kann er die Datei ebenfalls problemlos speichern. Einzig beim Versuch, die Datei z.B. auf dem eigenen Desktop abzulegen, bringt die erwähnte Fehlermeldung.

Hat jemand eine Idee, wie ich das lösen könnte?

[Nachtrag]
Da dieses Problem nach wie vor besteht möchte ich den Task nochmals anstossen mit der Frage:
Müssen Verzeichnisse wirklich auf dem Server, in welche Dateien gespeichert werden sollen auch lokal auf den einzelnen PC's angelegt werden, damît das klappt? Einen anderen Weg habe ich bis jetzt noch nicht gefunden, denke aber, das dies ja nicht die Lösung sein kann, oder?

Dialog zum Auswählen eines Ordners öffnen

24. Juli 2012 16:13

Mit DotNet-Variable
Mit Automation-Variable

Re: RTC: Dateien und Ordner

26. Mai 2017 09:48

NAV Pattern of the week: Silent File Upload and Download
Multi-File Download