fichier sur lecteur reseau ?

fichier sur lecteur reseau ? - C#/.NET managed - Programmation

Marsh Posté le 08-08-2008 à 11:36:03    

Bonjour a tous !
Alors je vous explique ... :pt1cable:  
j'ai un fichier Excel qui est sur le disque T:\ partagé par plusieurs postes et en fait ce fichier est actualisé en temps réel grâce a une application qui se trouve sur un poste distant du mien. Je ne peux pas me connecter a cette application directement de mon poste. J'ai besoin de récupérer les données de ce fichier le plus souvent possible pour les mettre dans un data set (en ouvrant une OleDbConnection etc ...)
Je voudrais savoir si vous avez une idée ? pour que je puisse quand je fais la connexion ça prenne les valeurs actuelles ?
(je suppose que le fichier sur l'ordinateur distant doit être ouvert ?? )
 
sinon faire une copie en local ?? (mais j'ai deja essayé avec File.copy ça ne fonctionne pas... )
 
Merci d'avance pour votre aide !!!

Reply

Marsh Posté le 08-08-2008 à 11:36:03   

Reply

Marsh Posté le 09-08-2008 à 11:37:29    

rien ne t'empeche de simplement l'ouvrir. De toute façon, si une autre applic la ouvert en Read/Write, tu ne pourras que l'ouvrir en Read.


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
Reply

Marsh Posté le 12-08-2008 à 10:04:42    

oui non en gros c'est parce que le fichier excel n'est pas régulièrement sauvegardé bien qu'il change ... du coup j'aimerai exécuter du code vba en C# (le code vba me permettrait de copier le contenu de la feuille excel dans une autre par valeur (avec un spécial paste) quelqu'un sait comment exécuter du vba en C# ??

Reply

Marsh Posté le 13-08-2008 à 08:58:09    

vba en C# ???? tu veux dire vba .net ? Ouaip => regarde ca http://safari.oreilly.com/05960076 [...] -PREFACE-1
 
Pourquoi ne forces-tu pas l'ecriture ? tu crées juste un timer dans la feuille qui force l'enregistrement du fichier voir l'ecriture d'un fichier dédié à ton appli.  
 
Par ailleurs, tu peux accéder à la feuiile excel en ADO. Net avec OleDb  
 
 

Reply

Marsh Posté le 13-08-2008 à 11:00:52    

Pour ce qui est de l'écriture ben le truc c'est qu'il faut le faire genre de 5 a 10 fois par seconde ... ce qui est lourd du coup ...
En plus même en faisant ça (avec un timer) des fois ça pose des problèmes car je me connecte au fichier excel (via OleDb en C#) en même temps qu'il est sauvegardé du coup la connexion ne peut plus accéder au fichier ou inversement la macro ne peut pas l'enregistrer ... j du coup pour synchroniser je me suis dit que je lancerais la macro depuis le code C# comme ça avant chaque consultation du fichier Excel on exécute la macro ... mais je sais pas si c'est la meilleure solution ?  
je suis allée voir sur le lien que tu m'as donné mais il faut acheter le livre d'après ce que j'ai compris ? (c'est tout en anglais xD)
mais j'ai quand même peur que ce soit très lent parce que l'appli est censée "monitorer" des valeurs en temps réel ...
si quelqu'un a une idée lumineuse je suis preneuse lol

Reply

Marsh Posté le 20-08-2008 à 15:28:35    

Hello
 
Si tu cherches des temps de réponses de l'ordre de 100 ms avec en plus des connections réseaux c'est clair que c'est mal parti.
Tu peux regler tes problèmes de synchro en faisant un fichier temporaire:
par ex :  
Le fichier principale s'appel F.xls (j'ai plein d'imagination moi ;))
Il contient une macro qui se lance toutes les 100 ms.
La macro test si le fichier F1.csv existe
   Si non elle écrit le contenu de F.xls dans F1.csv.tmp(au format cvs c'est + leger) puis renomme le fichier en F1.csv
   Si oui elle elle ne fait rien.
 
De l'autre coté l'appli test si F1.csv existe
   Si oui elle lit le fichier F1.csv, fait son job, puis l'efface. Si ton traitement dure tu as interet à stocker les variables en mémoire, effacer le fichier puis de faire le traitement pour accélérer la vitesse de rafraichissement.
   Si non elle attend ( ~ 50 ms)
 
La synchro est assuré par l'utilisation du renommage de csv.tmp en .csv dans un sens en le delete dans l'autre  
Cela suppose que tu mets moins de 100 ms pour ecrire le fichier F1.csv.tmp et le renommer. Dans le cas contraire tu dois augmenter le temps du timer jusqu'a dépasser le temps d'ecriture du fichier (prend de la marge. Perso je prendrais 100 %)  
 
A tester.  
 
Voilou  
 
A+


Message édité par m3z le 20-08-2008 à 17:46:02
Reply

Marsh Posté le 27-08-2008 à 11:59:30    

cc !
 
d'abord merci beaucoup pour ta réponse !
alors je voudrais bien mettre en place la solution que tu m'a conseillée ... cependant je ne vois pas comment en VBA exécuter une macro toutes les 100 (voire 50 ms) puisque je crois que les fonctions Ontime ou même timevalue et timeserial ont une précision de 1sec ? as tu une solution ? créer une API ? (si c'est le cas je sens que je vais galérer... lol)
sinon la j'ai essayé avec 1 sec et depuis mon programme C # je fais une boucle while tant que j'ai pas lu le fichier excel (et du coup ca ralentit toute l'application) ce serait quand même plus simple d'enregistrer le fichier Excel (ouvert) depuis C# non ? est ce possible ??  
merci d'avance pour votre aide !  

Reply

Marsh Posté le 29-08-2008 à 10:44:24    

Hello,  

cokate a écrit :

cc !
cependant je ne vois pas comment en VBA exécuter une macro toutes les 100 (voire 50 ms) puisque je crois que les fonctions Ontime ou même timevalue et timeserial ont une précision de 1sec ? as tu une solution ?  


 
Oui, utilise un timer system.  
Voici un site ou tu peux trouver les infos dont tu auras besoin pour l'implementation.  
Le principe c'est d'utiliser un timer à ~ 50 ms pour venir "pooler". Dans Exel tu lances un timer dès l'ouverture du fichier xls.  
Dans ton appli c'est le même truc. Tu lances un timer qui va venir tester l'état du fichier .csv.  
Ta boucle principale attend juste l'evenement de fin de programme. Tout se passe dans les fonctions appelé par les timers.
 

cokate a écrit :


sinon la j'ai essayé avec 1 sec et depuis mon programme C # je fais une boucle while tant que j'ai pas lu le fichier excel (et du coup ca ralentit toute l'application)  


Le modèle que je te propose est Asynchrone et tu codes du synchrone semble-t-il.
Ouaip ton appli gaspille son temps a attendre alors qu'il faut renvoyer la main au systeme. (c'est la fonction timer qui s'occupe de faire le boulot).
 

cokate a écrit :


ce serait quand même plus simple d'enregistrer le fichier Excel (ouvert) depuis C# non ? est ce possible ??  

.
A premiere vue bien sûr mais le problème c'est que toute ta chaine de traitement devient dépendante.  
Goutte au timer tu verras c'est simple aussi.
 
ps : tu peux lancer un autre timer pour la mise à jour des résultats à l'écran. Dans ce cas prevoit un flag de synchro (multi-thread) pour que cela se passe bien.
 
A+


Message édité par m3z le 29-08-2008 à 11:15:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed