MagicPath

Les commandes DOWNLOADFROMSTREAM et UPLOADINTOSTREAM permettent d’envoyer des fichiers entre le client RTC et le serveur NAV. Toutefois, il arrive régulièrement que l’on se pose la question suivante : Comment faire pour transférer des fichiers sans afficher de boite de dialogue pour la sélection du fichier ?

Ce petit bout de code, vous permettra de télécharger, ou de téléverser un fichier sans interaction de l’utilisateur :

DOWNLOADFROMSTREAM

Le code ci-dessous permet de copier un fichier spécifique du serveur NAV sur le poste exécutant le client RTC sans possibilité à l’utilisateur de modifier le dossier ou le nom du fichier :

FileToDownload  Text 180
FileVar          File  
IStream          InStream
MagicPath        Text       180

IF NOT ISSERVICETIER THEN EXIT;
FileToDownload := 'c:\Temp\ServerFile.txt';
FileVar.OPEN(FileToDownload);
FileVar.CREATEINSTREAM(IStream);
DOWNLOADFROMSTREAM(IStream,'','<TEMP>', '',MagicPath);
MESSAGE('Path = ' + MagicPath);
FileVar.CLOSE;

Ainsi, notre fichier sur la machine exécutant le client RTC, et la variable MagicPath nous renvoie la position de celui-ci sous la forme :

C:\Users\[UserName]\AppData\Local\Temp\Microsoft Dynamics NAV\4612\__TEMP__ff7c5a286cfd463f9f7d92ae5b4757e2

Le nombre 4612 dans MagicPath viens de l’ID du processus du client RTC.

Manipulation de fichiers côté client

Toutefois, il serait maintenant intéressant de donner un nom spécifique à ce fichier. Pour ce faire, je vous propose d’utiliser l’automation suivante :

'Microsoft Scripting Runtime'.FileSystemObject

Puis de créer une instance coté client, comme suit :

 CREATE(FileSystemObject,TRUE,TRUE);
 DestinationFileName := 'c:\Temp\newfile.txt';
 IF FileSystemObject.FileExists(DestinationFileName) THEN
 FileSystemObject.DeleteFile(DestinationFileName,TRUE);
 FileSystemObject.CopyFile(MagicPath,DestinationFileName);
 FileSystemObject.DeleteFile(magicpath,TRUE);

UPLOADINTOSTREAM

MagicPath fonctionne parfaitement dans les deux sens. DOWNLOADFROMSTREAM permettait de créer un chemin automatiquement, et vous renvoyer sa position, autant avec UPLOADINTOSTREAM vous devez tout connaitre à l’avance.

 // download a temp file to get MagicPath
 FileVar.CREATETEMPFILE;
 FileVar.CREATEINSTREAM(IStream);
 DOWNLOADFROMSTREAM(IStream,'','<TEMP>', '',MagicPath);
 FileVar.CLOSE;
 MESSAGE(MagicPath);

Ensuite, on extrait le nom du dossier de MagicPath :

FOR i := STRLEN(MagicPath) DOWNTO 1 DO BEGIN
 IF MagicPath[i] = '\' THEN BEGIN
 MagicPath := COPYSTR(MagicPath,1,i);
 i := 1;
 END;
 END;

Une fois que nous connaissons la position de MagicPath, l’étape suivante conciste à copier le fichier à l’emplacement souhaité :

FileToUpload := 'newfile.txt';
FolderName := 'c:\Temp\';
IF ISCLEAR(FileSystemObject) THEN
  CREATE(FileSystemObject,TRUE,TRUE);
FileSystemObject.CopyFile(FolderName + '\' + FileToUpload,MagicPath + '\' + FileToUpload);

Puis on utilise UPLOADINTOSTREAM pour téléverser le fichier de MagicPath vers le serveur NAV :

UPLOADINTOSTREAM('','<TEMP>','',FileToUpload,IStream);

Enfin, on sauvegarde la variable InStream dans un fichier sur le serveur :

FileVar.WRITEMODE(TRUE);
FileVar.CREATE('c:\Temp\OnServer.txt');
FileVar.CREATEOUTSTREAM(OStream);
COPYSTREAM(ostream,istream);
FileVar.CLOSE;

Ainsi, le fichier C:\Temp\ServerFile.txt est télécharger sur C:\Temp\NewFile.txt, puis téléverser en retour sur le serveur sur C:\Temp\OnServer.txt

 Source : Microsoft Dynamics NAV Team Blog – Article : MagicPath
Publié dans 6.00, 6.01, 6.02, 7.00, Dynamics NAV, FRA, RTC

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*