Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Conception

Conception Le forum qui vous aide à résoudre vos questions relatives à la modélisation de votre base de données sous Access.

Réponse
 
Outils de la discussion
Vieux 04/10/2008, 15h14   #1 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut Suite liens fichier en réseau

Comme déjà évoqué dans un topic "liens fichier en réseau"

Une application installée sur un Pc nommé 'PcServeur' avec base dorsale et frontale.

Une table article avec
un champ Code
un champ Lien1 de type lien hypertexte (lien vers un fichier ou un lien web)

Cette table est alimentée par un formulaire et le champs lien1 est alimenté par une fonction GetFileName.

Cela peut donner:
1510 c:\Program Files\appli\annexes\regles\Reg_1510.pdf
1520 c:\Program Files\appli\documentation\Reg_1520.odt
1530 http:\\www.appli.fr

Et dans mon formulaire article Il suffit de cliquer sur le lien pour ouvrir le fichier correspondant.
Tout se passe bien en mono poste

Problème s'il faut installer un Pc supplémentaire en réseau appelé 'PcClient'

Sur le poste principal il faut partager le dossier appli avec comme nom de partage par exemple "Application"

Sur le poste client la connexion va se faire
soit par les favoris réseau "\\PcServeur\Application"
soit par une connexion lecteur "Application sur PcServeur(M)"

Cette information est stockée dans un fichier ini
[Chemin]
chemin appli=\\PC_serveur\Application dans le premier cas

[Chemin]
chemin appli=M:\ dans le deuxième cas

Le problème maintenant

Pour que dans mon formulaire le lien c:\Program Files\appli\annexes\regles\Reg_1510.pdf sur le PcClient soit un lien valide il va falloir qu'automatiquement il s'appelle
soit Z:\annexes\regles\Reg_1510.pdf
soit \\PcServeur\Application\annexes\regles\Reg_1510.pdf

et pour c:\Program Files\appli\documentation\Reg_1520.odt le lien devra être
Z:\documentation\\Reg_1520.odt
soit \\PcServeur\Apllication\documentation\Reg_1520.odt

Dans mon précédent Topic Philippe Alias Starec m'a appris à me servir de la fonction Split (Merci à eux deux...) mais cela ne suffit plus .
Je galère sur ce problème depuis un moment. J'ai peur de ne plus voir quelque chose de simple. Et je n'en suis pas au stade de remplir la table à partir du poste PcClient.

J'ai réussi, si cela peut servir à convertir la chaine Z:\ en chemin Unc "\\PcServeur\Application" .

Alors merci d'avance à tous
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 04/10/2008, 16h27   #2 (permalink)
Rédacteur
 
Avatar de LedZeppII
 
Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
Par défaut

Bonjour,

Tu peux essayer d'intercepter le clic sur le lien de ton champ hypertexte.
Ensuite au lieu de laisser Access ouvrir le lien du champ, tu passes par une étiquette à laquelle tu affectes un autre lien hypertexte.

Exemple:
On suppose que le contrôle et le champ ont le même nom : Lien1
Dans le formulaire j'ai ajouté une étiquette lblHpl.
Code vb :
Private Sub Lien1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim strAdr As String
If Button = acLeftButton Then
   ' Récupérer adresse
   strAdr = Me.Lien1.Hyperlink.Address
   ' ici on peut agir sur l'adresse
   ' ...
   
   ' on met l'adresse dans la propriété de l'étiquette lblHpl
   Me.lblHpl.HyperlinkAddress = strAdr
   ' on ouvre le lien
   Me.lblHpl.Hyperlink.Follow
   ' annuler l'événement pour qu'Access n'ouvre pas le lien du
   ' champ de type hyperlink
   DoCmd.CancelEvent
End If
End Sub
Là ou j'ai mis ' ... tu modifies l'adresse (le chemin) si c'est nécessaire.
Par exemple tu pourra remplacer "c:\Program Files\appli" par "Z:\" ou "\\PC_serveur\Application" selon le contenu de ton fichier ini.

Sinon, idéalement il faudrait que tous tes chemins soient de type UNC dans ta table.
\\NomServeur\NomDePartage\.....\NomFichier.ext
Dans ce cas les liens hypertextes fonctionneraient depuis les deux pc.

A+
LedZeppII est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 04/10/2008, 19h33   #3 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Merci LedZeppII

J'ai bien compris le principe. Néanmoins il y a un problème. Comment puis je intercepter la relation entre Z et C:\Program Files\Appli ou n'importe quelle autre
chaine. En effet les personnes utilisant le logiciel mettront ce qu'ils veulent et ce pourra être c:\tartempion ou d:\liens. Car pour faire une modif comme le suggère LedZeppII ou pour faire la Requête de Maj suggérée par Philippe pour transformer toutes mes entrées en chemin UNC, il faut que je connaisse le point exact du Split.
Comment savoir que dans la chaine C:\program Files\Appli\...\...\Lien.pdf le point de split se situe après Appli\
Dans mon premier topic j'avais fixé le dossier dans lequel se trouvaient stockés ces fichiers, mais en fait l'utilisateur créera ces propres dossiers et sous dossiers
et cela complique tout.
Merci encore
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....

Dernière modification par GAYOT ; 05/10/2008 à 07h56 Motif: Eclaircissement
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/10/2008, 11h44   #4 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Peut être faut il que j'impose un dossier dans lequel stocker ces fichiers
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/10/2008, 19h43   #5 (permalink)
Rédacteur
 
Avatar de LedZeppII
 
Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
Par défaut

Bonjour,

Je ne sais pas si j'ai bien compris le problème.
Chaque utilisateur stocke des documents sur son ordinateur et leur chemin est mis dans une table unique de la base dorsale.
Ce chemin doit permettre a n'importe quel utilisateur (depuis n'importe quel PC) d'accéder à ces documents.
Ce doit donc être un chemin réseau et cela implique que l'utilisateur doit utiliser un dossier partagé sur son PC.

Au moment où un utilisateur ajoute un document à la table, le code de ton formulaire doit remplacer le dossier partagé par son équivalent UNC.
Je pense avoir trouvé un moyen de le faire.
Ce bout de code énumère les dossiers partagés de l'ordinateur qui l'exécute.
Si le chemin du document sélectionné par l'utilisateur (strChemin) commence par le chemin d'un dossier partagé (strCheminPartage), il le remplace par son équivalent UNC (strCheminUNC).

Par exemple si PcClientx a un dossier partagé C:\Mes Documents\NomAppli appelé PartageNomAppli,
SharedFolderToUNC("C:\Mes Documents\NomAppli\annexes\regles\Reg_1510.pdf") retournera \\PcClientx\PartageNomAppli\annexes\regles\Reg_1510.pdf

Code :
Function SharedFolderToUNC(strChemin As String) As String
Dim strComputer As String, objWMIService, colShares, objShare
Dim strNomPartage As String, strCheminPartage As String, strCheminUNC As String
 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
 
' Tous les dossiers partagés
Set colShares = objWMIService. _
    ExecQuery("Select * from Win32_Share WHERE Type=0")
 
strComputer = GetComputerName()
SharedFolderToUNC = strChemin
For Each objShare In colShares
    strNomPartage = objShare.Name
    strCheminPartage = objShare.Path
    strCheminUNC = "\\" & strComputer & "\" & objShare.Name
    If InStr(1, strChemin, strCheminPartage, vbTextCompare) = 1 Then
       SharedFolderToUNC = Replace(strChemin, strCheminPartage, strCheminUNC)
       Exit For
    End If
Next
 
End Function
Code de GetComputerName() (voir aussi dans la faq)
Code :
' Déclaration fonction API dans la section Déclarations
Private Declare Function apiGetComputerName Lib "kernel32.dll" Alias "GetComputerNameA" ( _
    ByVal lpBuffer As String, ByRef lpnSize As Long) As Long  ' BOOL
' Fin Déclarations
 
Public Function GetComputerName() As String
Dim strBuff As String, lSize As Long
 
lSize = 16  ' Taile max = 15 caractères
strBuff = String(lSize, vbNullChar)
If apiGetComputerName(strBuff, lSize) <> 0 Then
   GetComputerName = Left(strBuff, lSize)
Else
   GetComputerName = ""
End If
End Function
A+
LedZeppII est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/10/2008, 21h24   #6 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Citation:
Envoyé par LedZeppII Voir le message
Bonjour,

Je ne sais pas si j'ai bien compris le problème.
Chaque utilisateur stocke des documents sur son ordinateur et leur chemin est mis dans une table unique de la base dorsale.
Ce chemin doit permettre a n'importe quel utilisateur (depuis n'importe quel PC) d'accéder à ces documents.
Ce doit donc être un chemin réseau et cela implique que l'utilisateur doit utiliser un dossier partagé sur son PC.

Au moment où un utilisateur ajoute un document à la table, le code de ton formulaire doit remplacer le dossier partagé par son équivalent UNC.
A+
Bonsoir
Merci LedZeppII. C'est exactement cela.
En lisant cette réponse je pense que cette solution est la bonne. J'ai pourtant cherché toute la journée mais mon niveau très modeste fait que je ne connaissais pas cette Api.
Il faut maintenant que je la mette en application, que je la comprenne bien et que je la teste sur un réseau. Je ne manquerai pas de vous tenir informé.
Mais quoi qu'il en soit Merci beaucoup, car non seulement cela m'aide, mais en plus j'apprends plein de choses.
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 13h12   #7 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Citation:
Envoyé par LedZeppII Voir le message
Bonjour,

Je ne sais pas si j'ai bien compris le problème.
Chaque utilisateur stocke des documents sur son ordinateur et leur chemin est mis dans une table unique de la base dorsale.
Ce chemin doit permettre a n'importe quel utilisateur (depuis n'importe quel PC) d'accéder à ces documents.
Ce doit donc être un chemin réseau et cela implique que l'utilisateur doit utiliser un dossier partagé sur son PC.
Bonjour
Je devais être un peu saturé hier soir en disant que c'était exactement cela.
En effet la première rubrique n'est pas bonne.
Chaque utilisateur peut céer des fiches, avec un lien vers des documents stockés sur le poste principal, ces liens étant mis dans une table unique de la base dorsale sur le Pc principal.
Par contre le code émis par LedZeppII va surement me servir pour mettre à jour les liens déjà stockés sur la base dorsale.

Merci
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 20h53   #8 (permalink)
Rédacteur
 
Avatar de LedZeppII
 
Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
Par défaut

Bonsoir,

Voila une ébauche de fonction pour essayer de convertir un chemin en chemin UNC dans les deux cas suivant :
  • Le chemin commence par un lecteur réseau
  • Le chemin contient un dossier partagé local (mon code précédent)
La fonction renvoie PathToUncPath(...) renvoie un chemin au format UNC ou rien (chaîne vide) en cas d'échec
Code vb :
' Début Déclaration fonctions API
'
Private Declare Function PathIsUNC Lib "shlwapi.dll" Alias "PathIsUNCA" ( _
        ByVal strPath As String) As Long ' BOOL
 
Private Declare Function apiGetComputerName Lib "kernel32.dll" Alias "GetComputerNameA" ( _
	ByVal lpBuffer As String, ByRef lpnSize As Long) As Long  ' BOOL
'
' Début Déclaration fonctions API
 
Public Function GetComputerName() As String
Dim strBuff As String, lSize As Long
 
lSize = 16  ' Taile max = 15 caractères
strBuff = String(lSize, vbNullChar)
If apiGetComputerName(strBuff, lSize) <> 0 Then
   GetComputerName = Left(strBuff, lSize)
Else
   GetComputerName = ""
End If
End Function
 
Function PathToUncPath(strChemin As String) As String
Dim fso As Object, fsoDrv As Object
Dim objWMIService As Object, colShares As Object, objShare As Object
Dim strComputer As String, strLect As String, strRelPath As String
Dim strNomPartage, strCheminPartage As String
Dim strCheminUNC As String, strErr As String
#Const DebugOn = True
 
strLect = Left(strChemin, 2)
If strLect Like "[A-Z]:" Then
   Set fso = CreateObject("Scripting.FileSystemObject")
   If fso.DriveExists(strLect) Then
      Set fsoDrv = fso.GetDrive(strLect)
      If fsoDrv.DriveType = 3 Then
         ' Lecteur réseau
         strNomPartage = fsoDrv.ShareName
         strRelPath = Mid(strChemin, 3, Len(strChemin) - 2)
         If Left(strRelPath, 1) <> "\" Then strRelPath = "\" & strRelPath
         strCheminUNC = strNomPartage & strRelPath
      ElseIf fsoDrv.DriveType = 2 Then
         ' Disque fixe
         ' Rechercher si le chemin contient un dossier partagé
         strComputer = "."
         Set objWMIService = GetObject("winmgmts:" _
             & "{impersonationLevel=impersonate}!\\" _
             & strComputer & "\root\cimv2")
         ' Tous les dossiers partagés
         Set colShares = objWMIService. _
             ExecQuery("Select * from Win32_Share WHERE Type=0")
         strComputer = GetComputerName()
         For Each objShare In colShares
             strNomPartage = "\\" & strComputer & "\" & objShare.Name
             strCheminPartage = objShare.Path
             If InStr(1, strChemin, strCheminPartage, vbTextCompare) = 1 Then
                strCheminUNC = Replace(strChemin, strCheminPartage, strNomPartage)
                Exit For
             End If
         Next
         
      Else
         ' Autre type de lecteur
         strErr = strLect & " n'est pas un lecteur réseau ou un disque fixe"
      End If
   Else
      ' Le lecteur n'exite pas
      strErr = strLect & " n'existe pas"
   End If
Else
   ' Le chemin ne commence pas par une lettre de lecteur ...
   If PathIsUNC(strChemin) Then
      ' ... et est déja eu format UNC
      strCheminUNC = strChemin
   Else
      ' ... et n'est pas au format UNC
      strErr = strLect & " non valide"
   End If
End If
 
#If DebugOn Then
If strErr <> "" Then Debug.Print "! " & strErr & " ! ";
#End If
 
PathToUncPath = strCheminUNC
End Function
A+
LedZeppII est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 21h12   #9 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Merci LedZepeppII

Je vais essayer votre fonction. Qui plus est, je commence à y voir beaucoup plus clair sur la façon dont je vais pouvoir combiner tout cela dans mon programme.Je vous tiendrai au courant.
Merci encore.
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....

Dernière modification par GAYOT ; 08/10/2008 à 06h58
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 20h34   #10 (permalink)
Membre régulier
 
Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
Par défaut

Le code LedZeppII était génial. Je l'ai adapté à mes propres besoins, et cela fonctionne très bien.

Merci à lui et à Philippe.
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'avancer loin....

Dernière modification par GAYOT ; 13/10/2008 à 20h54
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Conception

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide