![]() |
| 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é. | |||||||
|
|||||||
| Conception Le forum qui vous aide à résoudre vos questions relatives à la modélisation de votre base de données sous Access. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
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... 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 |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
|
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 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+ |
|
|
|
|
|
#3 (permalink) |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
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 |
|
|
|
|
|
#4 (permalink) |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
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.... |
|
|
|
|
|
#5 (permalink) |
![]() Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
|
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 :
' 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 |
|
|
|
|
|
#6 (permalink) | |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
Citation:
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.... |
|
|
|
|
|
|
#7 (permalink) | |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
Citation:
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.... |
|
|
|
|
|
|
#8 (permalink) |
![]() Date d'inscription: décembre 2005
Localisation: IdF
Messages: 2 064
|
Bonsoir,
Voila une ébauche de fonction pour essayer de convertir un chemin en chemin UNC dans les deux cas suivant :
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 |
|
|
|
|
|
#9 (permalink) |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
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 |
|
|
|
|
|
#10 (permalink) |
|
Membre régulier
![]() Date d'inscription: novembre 2004
Localisation: Lorraine
Âge: 53
Messages: 126
|
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 |
|
|
|
![]() |
![]() |
||
Suite liens fichier en réseau
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|