Verschoben aus: NAV Tipps & TricksIn 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 HandlingKurz: 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: Alles auswählen
IF ISSERVICETIER THEN
IF UploadedFileName = '' THEN
UploadFile
ELSE
FileName := UploadedFileName;
Eine Exceldatei erstellen, ohne sie zu speichernAuch hier Standardreport 7132, Option "Arbeitsmappe erstellen" -> keine gesonderte Programmierung erforderlich.
Eine Worddatei erstellen oder ergänzenSiehe Codeunit 5054, ExecuteMerge.
- Code: Alles auswählen
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 DataportDiese 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: Alles auswählen
IF NOT ISSERVICETIER THEN BEGIN
FileName := CommonDialogMgt.OpenFile(Text002,FileName,4,Text005,1);
END;
Datei erzeugen:
- Code: Alles auswählen
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: Alles auswählen
CSVFile.WRITE(...);
Datei ggf. von der Serviceschicht zum Client transferieren:
- Code: Alles auswählen
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: Alles auswählen
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