Dynamics NAV – Datei Import/Export #1

Von | 4. Juli 2016

Hallo Leute,

ich werde immer wieder gefragt, wie man mit Dateien im RTC umgeht! Es haben sich im Gegensatz zum Classic Client einige Dinge geändert. Vieles davon hat sicherlich schon die Runde gemacht und einige Dinge sind evtl. auch noch neu für Euch.

Heute möchte ich kurz erläutern, wie man mit Dateien ab NAV 2009 RTC umgeht und wie man idealerweise eine solide Grundstruktur für automatische Verarbeitungen oder auch für manuelle Verarbeitungen von Dateien schafft. Ich werde das exemplarisch mit NAV 2016 zeigen. Einige Funktionen sind in NAV 2009 evtl. noch nicht vorhanden, aber das Prinzip ist gleich.
Zu aller erst möchte ich daher auf einen wichtigen Punkt hinweisen. Microsoft liefert mit der Codeunit 419 “File Management” schon eine super Auswahl an vielen Funktion aus, die wir ohne Probleme nutzen können.

Auch müssen wir berücksichtigen, dass der C/AL Code in der Regel immer auf der Service Tier ausgeführt wird. Klar kann man beispielsweise .NET Komponenten dazu zwingen auch auf dem Client zu laufen, aber das ist der grundlegende Punkt. Wenn ihr versucht eine Datei mit einer Variable vom Datentyp “File” auf Laufwerk C:\ zu öffnen, dann wird dieser Code auf der Service Tier ausgeführt und dort wird nach der Datei auf Laufwerk C:\ gesucht.

Daher muss man sich hier anders behelfen.

Schritt 1: Dafür erstelle ich nun exemplarisch einen neuen Bericht (R50004) und nenne diesen “Import File”. Des Weiteren stelle ich ProcessingOnly auf Yes, da ich keine Seitenansicht benötige und somit einen “OK” Knopf zum ausführen des Berichtes bekomme.

DateiHandling_1_NewReport

Schritt 2: Ich lege globale Variablen an, um die Datei clientseitig und serverseitig verarbeiten zu können.

  • FileManagment CU419 -> Nutzen der im Standard gelieferten Funktionen
  • FileName -> Stellt den Dateinamen inkl. Pfad auf dem Client dar
  • ServerFileName -> Stellt den Dateinamen inkl. Pfad auf dem Server dar

DateiHandling_2_NewVariable

Schritt 3: Erstellung Requestpage, sodass der Anwender eine Client auswählen kann. Dafür erstelle ich eine “ContentArea” eine Gruppe “Optionen” und hinterlege das Feld “FileName”.

DateiHandling_3_RequestPage

Schritt 4: Zusätzlich lege ich nun zwei Textkonstanten an. Diese benötige ich gleich für den Aufruf der Funktion “OpenFileDialog”:

  • ImportFileCaption – DEU=Importiere Datei;ENU=Import File
  • TxtFilterString -DEU=Textdateien (*.txt)|*.txt;ENU=Text Files (*.txt)|*.txt

DateiHandling_4_OpenFileDialogTextKonstants

Schritt 5: Im OnAssistEdit rufe ich nun die Funktion “OpenFileDialog” aus dem FileManagement auf. Diese hat drei Parameter:

  • “WindowTitle”: Wie soll das Fenster heißen. Hier könnte man beispielsweise auch “Importiere Preisliste” oder “Datei für Preislistenimport auswählen” hinterlegen. Wichtig ist dabei nur, dass man einen Titel wählt, der zu dem Import passt. In meinem Fall verwende ich hier die Textkonstante: “ImportFileCaption”
  • “DefaultFileName”: Gibt den Standardpfad und/oder den Dateinamen an. Ich hinterlege hier nichts, da ich in meinem Fall nichts vorbelegen möchte.
  • “FilterString”: Hier kann man angeben, welche Dateitypen überhaupt ausgewählt werden dürfen. In meinem Beispiel verwende ich die Textkonstante TxtFilterString.  Hierbei trägt man die Beschreibung und dann getrennt mit einem “Pipe” (|) die Dateiendung, die man zulassen möchte (siehe mein Beispiel).

Vorsicht. Auch im Validatetrigger des Feldes sollte geprüft werden, ob die Datei die richtige Endung hat.

DateiHandling_5_OpenFileDialog

Schritt 6: Testen des Berichts – Führe ich den Bericht aus, öffnet sich die RequestPage, in der ich eine Datei, im Feld “Dateiname” hinterlegen kann. Drücke ich auf die drei Pünktchen, dann öffnet sich der File Dialog. Hier sieht man nun auch, wie mein Filterstring und mein Fenstertitel greifen.

DateiHandling_6_Berichtsausgabe

DateiHandling_7_Berichtsausgabe_AssistEdit

Schritt 7: Nun müssen wir noch ein wenig Programmcode hinzufügen, um die Datei auch hochzuladen (auf die NST) und die Prüfung auf die Dateiendung integrieren:

Ich füge nun also zwei Funktionen “GetFileEnding” und “UploadFile” hinzu:

  • GetFileEnding ermittelt die Dateiendung und gibt diese zurück.
  • UploadFile prüft die Dateiendung und lädt die Datei auf dem Server hoch:

DateiHandling_8_Zusatzfunktionen

Schritt 8: Die Funktionen müssen wir nun noch im OnValidate und im OnAssistEdit des Feldes “FileName” integrieren:

DateiHandling_9_DateinameValidate_Assist

Schritt 9: Zu guter letzt können wir nun noch prüfen, ob unser Programmcode funktioniert. Dafür prüfe ich mit “EXISTS”, ob die Datei auf dem Server gefunden werden kann. EXISTS wird nämlich auf dem Server ausgeführt:

DateiHandling_10_OnPreReport

Schritt 10: Nun den Bericht zum Test einmal ausführen:

DateiHandling_11_Test

DateiHandling_12_TestMessage

Der Benutzer kann über den AssistEdit Knopf keine falsche Datei auswählen. Versucht der Anwender eine nicht unterstützte Datei direkt in den Dateinamen zu kopieren, wird dies über unsere kleine Prüfung verhindert:

DateiHandling_13_PrüfungAufEndung.jpg

Hier findet ihr den Bericht, wie immer als txt oder als fob:

160704_ImportFile.zip

Für Fragen hinterlasst mir einfach einen Kommentar. In folgenden Beiträgen werde ich mich mit dem Import Excel Dateien, CSV Dateien und anderen Besonderheiten auseinandersetzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.