Buongiorno di nuovo,
ho un'altra idea malsana per la mente e vorrei chiedere a qualcuno più pratico dove sto sbagliando. Premetto che ho trovato in rete, su altri siti, due codici di VBA utili per poter ottenere due dati, a parer mio, importantissimi se si utilizza un DB in multiutenza. A breve non sarò l'unico ad utilizzarlo questo DB e perciò vorrei renderlo il più tracciato possibile.
Tanto per iniziare ho trovato esattamente il dato che interessava a me: il nome dell'utente del pc e il nome del pc. Sono costretto ad utilizzare questi due dati perché la rete aziendale é configurata in modo tale da poter accedere al proprio account da ogni pc dell'azienda ma con la differenza che i programmi rimangono in locale, sul proprio pc.
Ho provato oggi con la funzione "GetUserName()" - credo che fosse esattamente questa, o qualcosa di molto simile - ma mi restituiva sempre il valore "admin", cosa di cui non me ne facevo nulla nel momente in cui il DB diventa multiutenza. Ergo, ho trovato due codici da inserire nei moduli, alquanto interessanti... per chi li volesse:
Create un modulo nell'editor di VBA e salvate il modulo come "username", ha il suo perché, fidatevi.
Option Compare Database
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function fOSUserName() As String
' Returns the network login name
Dim lngLen As Long, lngX As Long
Dim strUserName As String
strUserName = String$(254, 0)
lngLen = 255
lngX = apiGetUserName(strUserName, lngLen)
If (lngX > 0) Then
fOSUserName = Left$(strUserName, lngLen - 1)
Else
fOSUserName = vbNullString
End If
End Function
Il secondo codice da inserire in un secondo modulo (per me é più comodo separarli - ricordatevi di salvare il modulo con il nome "machine name", anche qui ha il suo perché):
Option Compare Database
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Declare Function apiGetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function fOSMachineName() As String
'Returns the computername
Dim lngLen As Long, lngX As Long
Dim strCompName As String
lngLen = 16
strCompName = String$(lngLen, 0)
lngX = apiGetComputerName(strCompName, lngLen)
If lngX <> 0 Then
fOSMachineName = Left$(strCompName, lngLen)
Else
fOSMachineName = ""
End If
End Function
Riassumendo: se creo una maschera e inserisco due caselle di testo e come origine controllo gli imposto rispettivamente, "=fOSUsername()" alla prima casella di testo e "=fOSMachineName()" al secondo, ottengo due dati che sicuramente non potranno (si spera almeno) essere uguali alla prima funzione citata sopra - ripeto, non ricordo bene ma era molto simile a "GetUserName()", qualcosa di moltooo simile.
Tutto felice ho pensato di inserire le due funzioni "fOS..." come valori predefiniti in una nuova tabella per test ma questi, sia il primo che il secondo, non vogliono funzionare nella tabella.
Mi restituisce il seguente errore : "Funzione 'fOSUserName()' sconosciuta nell'espressione di convalida o nel valore predefinito di Tabella1.utente" sia con la prima funzione che con la seconda.
Avete la minima pallida idea di cosa sia sbagliato? o almeno, é possibile usare tali funzioni come valori predefiniti in una colonna della tabella esattamente come se fosse una compilazione automatica di alcuni campi proprio come se fosse il classico "Now()"?