Newsgroup: it.comp.appl.access
Titolo: Riconetti unita di rete via codice

Bunona Sera a tutti,
ho un probelema che mi sta facendo dannare.
Mi sapreste dare una mano o darmi una dritta per far ricollegare un unità di
rete all'apertura della maschera principale visto che il database è posto su
un altro pc con unita di rete y e capita che all'avvi del pc non si
collegano in rete automaticamente perche pultroppo non anno un server.
Grazie mille

 wrote in message
news:H%U0f.40912$
hV3....@nntpserver.swip.net

Non ho molto tempo per spiegarti il codice, quindi
ti passo direttamente le Routine complete, poi decidi tu 
quale metodo usare.
Per mappare una risorsa di rete hai 2 metodi:
---------------------------------------------------------
1)API
---------------------------------------------------------
Private Declare Function WNetAddConnection2 Lib "mpr" _
    Alias "WNetAddConnection2A" _
   (lpNetResource As NETRESOURCE, _
    ByVal lpPassword As String, _
    ByVal lpUserName As String, _
    ByVal dwFlags As Long) As Long
 
Private Declare Function WNetCancelConnection2 Lib "mpr" _
    Alias "WNetCancelConnection2A" _
   (ByVal lpName As String, _
    ByVal dwFlags As Long, _
    ByVal fForce As Long) As Long
 
Private Const ERROR_SUCCESS = 0
Private Const CONNECT_UPDATE_PROFILE = &H1
' The following includes all the constants defined for NETRESOURCE,
' not just the ones used in this example.
Private Const RESOURCETYPE_DISK = &H1
Private Const RESOURCETYPE_PRINT = &H2
Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCE_CONNECTED = &H1
Private Const RESOURCE_REMEMBERED = &H3
Private Const RESOURCE_GLOBALNET = &H2
Private Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
Private Const RESOURCEDISPLAYTYPE_GENERIC = &H0
Private Const RESOURCEDISPLAYTYPE_SERVER = &H2
Private Const RESOURCEDISPLAYTYPE_SHARE = &H3
Private Const RESOURCEUSAGE_CONNECTABLE = &H1
Private Const RESOURCEUSAGE_CONTAINER = &H2
' Error Constants:
Private Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_ALREADY_ASSIGNED = 85&
Private Const ERROR_BAD_DEV_TYPE = 66&
Private Const ERROR_BAD_DEVICE = 1200&
Private Const ERROR_BAD_NET_NAME = 67&
Private Const ERROR_BAD_PROFILE = 1206&
Private Const ERROR_BAD_PROVIDER = 1204&
Private Const ERROR_BUSY = 170&
Private Const ERROR_CANCELLED = 1223&
Private Const ERROR_CANNOT_OPEN_PROFILE = 1205&
Private Const ERROR_DEVICE_ALREADY_REMEMBERED = 1202&
Private Const ERROR_EXTENDED_ERROR = 1208&
Private Const ERROR_INVALID_PASSWORD = 86&
Private Const ERROR_NO_NET_OR_BAD_PATH = 1203&
Private Declare Function GetLogicalDriveStrings Lib "kernel32" _
   Alias "GetLogicalDriveStringsA" _
  (ByVal nBufferLength As Long, _
   ByVal lpBuffer As String) As Long
Public Function ConnectNextFreeNetworkDrive(sServer As String) As String
   ' Questa funzione cerca di Mappare una risorsa del SERVER
   ' ciclando le lettere da C÷Z nella speranza di trovare una Risorsa
   ' libera.
   '
   '----------------------- ESEMPIO DI CHIAMATA ------------------------
   '
   '  Call ConnectNextFreeNetworkDrive("\\Server\SharedFolder"
   '
   '--------------------------------------------------------------------
   Dim NETR As NETRESOURCE
   Dim errInfo As Long
   Dim x As Long
   Dim testDrv As String
 
  ' Imposta la prima lettera disponibile a C (ASCII 67) in realtà da 68
  ' come si vedrà poi, quindi se già esistente incrementa di uno
  ' fino alla Z (ASCII 90).
  ' Ne troverà uno libero....!!!
   x = 67
   Do
     ' Incrementa la Lettera del DRIVE di 1 ma partiremo da "D"
      x = x + 1
      testDrv = Chr$(x) & ":"
 
      With NETR
         .dwScope = RESOURCE_GLOBALNET
         .dwType = RESOURCETYPE_DISK
         .dwDisplayType = RESOURCEDISPLAYTYPE_SHARE
         .dwUsage = RESOURCEUSAGE_CONNECTABLE
         .lpRemoteName = sServer
         .lpLocalName = testDrv
      End With
      ' Impostare la PASSWORD e lo USERNAME
      ' La PWD può essere passata come vbNullstring
      errInfo = WNetAddConnection2(NETR, _
                                   "Password", _
                                   "username", _
                                   CONNECT_UPDATE_PROFILE)
 
   Loop Until x = 90 Or errInfo = ERROR_SUCCESS   '90 = "z"
 
   ' Se avrà successo verrà restituita la lettera del DRIVE
   If errInfo = ERROR_SUCCESS Then
      ConnectNextFreeNetworkDrive = testDrv
   Else
      MsgBox "ERRORE: " & errInfo & " - Connessione di Rete Falita !",
vbCritical, "AVVISO"
      ConnectNextFreeNetworkDrive = "NONE"
   End If
 
End Function
Public Function RemoveNetworkDrive(strDrive As String) As Boolean
   Dim errInfo As Long
   ' Questa funzione rimuove la risorsa mappata passando
   ' la lettera del DRIVE, e verificandone l'esistenza.
 
   '----------------------- ESEMPIO DI CHIAMATA ------------------------
   '
   '  Call RemoveNetworkDrive("H:")
   '
   '--------------------------------------------------------------------
 
   If DriveExists(strDrive) Then
      errInfo = WNetCancelConnection2(strDrive, vbNullString,
CONNECT_UPDATE_PROFILE)
      RemoveNetworkDrive = errInfo = ERROR_SUCCESS
   End If
End Function
Private Function DriveExists(SDrive As String) As Boolean
   ' Questa funzione verifica l'esistenza del DRIVE
   Dim tmp As String
   Dim nBuffersize As Long
  'Call the API with a buffer size of 0.
  'The call fails, and the required size
  'is returned as the result.
   nBuffersize = GetLogicalDriveStrings(0&, tmp)
  'pad a string to hold the results
   tmp = Space$(nBuffersize)
   nBuffersize = Len(tmp)
  'and call again
   If GetLogicalDriveStrings(nBuffersize, tmp) Then
     'if the drive letter passed is in
     'the returned logical drive string,
     'return True. Use vbTextCompare for
     'a case-insensitive match (remembering
     'that when a compare method is specified,
     'the start position must also be specified.
      DriveExists = InStr(1, tmp, SDrive, vbTextCompare)
   End If
End Function
---------------------------------------------------------
2)WMI
---------------------------------------------------------
' Mappa una Risorsa di RETE
Public Function MapNetworkDrive(sServer As String) As String
   Dim WshNetwork
   Dim allDrives
   Dim i                   As Integer
   Dim x                   As Integer
 
   Dim AlreadyConnected    As Boolean
   Dim mDrive              As String
 
   Set WshNetwork = CreateObject("WScript.Network")
   Set allDrives = WshNetwork.EnumNetworkDrives()
   ' Anche quì cicleremo le lettere Mappate con la speranza
   ' di trovarne una libera e partiremo da ASCII 68=D
   AlreadyConnected = False
   For x = 68 To 90
      mDrive = Chr(x)
      AlreadyConnected = DriveExist(mDrive)
      If AlreadyConnected = False Then
         ' Impostare la PASSWORD e lo USERNAME
         ' La PWD può essere passata come vbNullstring
         WshNetwork.MapNetworkDrive mDrive & ":", sServer, "Utente",
"password"
         'MsgBox "Drive " & DriveLetter & " connected successfully."
         MapNetworkDrive = mDrive
         Set WshNetwork = Nothing
         Set allDrives = Nothing
         Exit Function
      End If
   Next
   Set WshNetwork = Nothing
   Set allDrives = Nothing
   MapNetworkDrive = vbNullString
   MsgBox "Attenzione la risorsa Server non è mappata", vbCritical,
"AVVISO"
End Function
Public Function RemoveMapNetwork() As Boolean
   Dim WshNetwork
   Dim allDrives
   Set WshNetwork = CreateObject("WScript.Network")
   Set allDrives = WshNetwork.EnumNetworkDrives
 
   ' Se non esiste nessuna risorsa mappata non proseguo
   If allDrives.Count = 0 Then
      MapDrive = vbNullString
   End If
   If DriveExist(MapLetter) Then WshNetwork.RemoveNetworkDrive MapDrive
Exit_Here:
   Set WshNetwork = Nothing
   Set allDrives = Nothing
End Function
Public Function DriveExist(strLetter As String) As Boolean
   Dim fso, d, dc
   DriveExist = False
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set dc = fso.Drives
   For Each d In dc
   Set d = fso.GetDrive(d.DriveLetter)
       If d.DriveLetter = strLetter Then
          DriveExist = True
          Exit Function
       End If
   Set d = Nothing
   Next
   Set d = Nothing
   Set dc = Nothing
   Set fso = Nothing
End Function
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message 
news:H%U0f.40912$hV3....@nntpserver.swip.net...

Ma se invece di collegarti al drive Y: (così mappato sul tuo
computer, al quale drive corrisponde supponiamo il drive C:
sul server) ti colleghi direttamente al drive C: del server
con \\<NetPath>\C\, non risparmi tempo e fatica?
Bruno

 ha scritto nel messaggio 
news:H%U0f.40912$hV3....@nntpserver.swip.net...

Dimmi se ho capito.
PC Nome A
E' il primo pc che si accende al mattino.
Vi sono tutte le tabelle, E' IL COMANDANTE.
PC Nome B
Si accende in un secondo tempo. Quando si accende i dati li scrive sul PC 
Nome A tramite unita' di rete.
Se questo è vero vuol dire che la cartella del PC A la hai connessa con 
unita' di rete xxx e le tabelle le hai collegate con la stessa unita' di 
rete.
SBAGLIATO!!!! Stai attento mica che vengono fuori CASINI o ti siincazza il 
TUTTO.
Nel PC Nome A devi avere i dati sotto cartella esempio c:\Mio Database. 
Condividi questa cartella.
Nel PC Nome B devi connettere con unita di rete xxx la cartella condivisa 
del PC A
A questo punto dei avere 2 Programmi.
Nel PC Nome A devi avere il programma PROG dove le tabelle devono essere 
collegate con C:\Mio Database.
Nel PC Nome B devi avere il programma RETE dove le tabelle devono essere 
collegate con la stessa unita' di rete xxx
Attenzione nel PC A devi TOGLIERE la connseeione a unita' di rete xxx.
Nel PC A devi lanciare il programma PROG.
Nel PC B devi lanciare il programma RETE.
Un domani che colleghi un altro PC C basta copiare il programma rete.
La differenza dei due programmi è solo IL COLLEGAMENTO DELLE TABELLE. Quindi 
crei un nuovo Database RETE. Alleghi le tabelle ed importi query, maschere 
eccetere dal database PROG.
Buon Lavoro

 ha scritto nel messaggio
news:4344b966$0$8487$5fc...@news.tiscali.it...

Ce lo fatta... grazie mille a tutti

 del PC A
Questo e' sacrosanto.
Io sono diversi anni che uso access perche' mi risparmia un sacco di
tempo, l'unico problema e' la protezione dei dati [al di la' degli
ovvi backup].
Nel caso del Pc A che funge da server, la cartella condivisa *deve*
consentire i diritti di lettura e scrittura? Io ho sempre pensato di
si', ma se una mattina qualcuno impazzisce e cancella il database
[dove naturalmente da cinque mesi non facevano backup, Murpie docet]
che accade al mio destino?
-- 
Giacomo Alessandroni      
g.aless...@peacelink.it
Associazione PeaceLink    
http://www.peacelink.it/
VoIP @ Skype              
callto://galessandroni

 maschere eccetere dal database PROG.
Se anche nel server il programma ha le tabelle collegate a
\\<NetServerPath>\C piuttosto che piů semplicemente a C:\, allora
tutti programmi della rete sono perfettamente uguali.
Ciao
Bruno