FOSUserName() e fOSMachineName()

di il
6 risposte

FOSUserName() e fOSMachineName()

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()"?

6 Risposte

  • Re: FOSUserName() e fOSMachineName()

    Ciao,
    metti in un modulo:
    
    Function GetUser() As String
        GetUser = CStr(Environ$("username"))
    End Function
    
    Function GetComp() As String
        GetComp = CStr(Environ$("computername"))
    End Function
    
    le potrai richiamare rispettivamente con GetUser() e GetComp().
  • Re: FOSUserName() e fOSMachineName()

    Provo a darti 2 suggerimenti... perchè mi pare che la "buona volontà" sia da orientare e rendere più concreta...!
    Le API si usano se e quando veramente servono, sono flessibili ma pericolose se non si sanno gestire... e per quello che hai esposto tu... non servono.

    Ora al posto di tutto quel codice che hai scritto... con 2 sole istruzioni ottieni in modo NATIVO la stessa cosa.
    Innanzitutto puoi imparare ad usare la finestra Immediata, che è estremamente importante per Test e Debug.
    Le 2 chiamate sono queste:
    
    =ENVIRON("USERNAME")
    =ENVIRON("COMPUTERNAME")
    Perchè le tue non funzionano se messe come Valore di Default...?
    Perchè essendo delle Funzioni devi mettere "=NomeFunzione()" cioè con anche il segno di [=].

    Detto qusto il suggerimento è di riflettere un po di più prima di partire a testa bassa.
  • Re: FOSUserName() e fOSMachineName()

    Angelo_Tbp ha scritto:


    Ciao,
    metti in un modulo:
    
    Function GetUser() As String
        GetUser = CStr(Environ$("username"))
    End Function
    
    Function GetComp() As String
        GetComp = CStr(Environ$("computername"))
    End Function
    
    le potrai richiamare rispettivamente con GetUser() e GetComp().
    Mi restituisce lo stesso identico errore di prima...

    @Alex ha scritto:


    Perchè le tue non funzionano se messe come Valore di Default...?
    Perchè essendo delle Funzioni devi mettere "=NomeFunzione()" cioè con anche il segno di [=].
    Ehm, avevo fatto proprio così ma non andava ed é perciò che ho provato a chiedere qui.
    Comunque si, vedo cosa posso fare anche se la vedo dura, molto dura... ci provo, almeno quello.
  • Re: FOSUserName() e fOSMachineName()

    Ovviamente, nella proprietà valore predefinito delle caselle di testo, non hai messo le virgolette prima e dopo il richiamo della funzione vero?
  • Re: FOSUserName() e fOSMachineName()

    Il valore predefinito si dovrebbe gestire dall'interfaccia utente, la maschera e non dalla tabella... quindi come credo diamo per scontato sia io che Angelo... devi inserirlo nella text box associata a quel campo nella maschera che usi per inserire... perché NON si usano MAI nè tabelle nè queries per la manipolazione dei dati.
  • Re: FOSUserName() e fOSMachineName()

    Angelo_Tbp ha scritto:


    Ovviamente, nella proprietà valore predefinito delle caselle di testo, non hai messo le virgolette prima e dopo il richiamo della funzione vero?
    Assolutamente no.

    Avevo messo esattamente questo
    
    =fOSUserName()
    
    Idem per l'altro... eppure non ha funzionato.

    @Alex ha scritto:


    Il valore predefinito si dovrebbe gestire dall'interfaccia utente, la maschera e non dalla tabella... quindi come credo diamo per scontato sia io che Angelo... devi inserirlo nella text box associata a quel campo nella maschera che usi per inserire... perché NON si usano MAI nè tabelle nè queries per la manipolazione dei dati.
    Ok, ho capito che ho provato a sfidare le leggi della fisica per ottenere una cosa relativamente banale.
    Provo a combinare qualcosa e poi vi faccio sapere. Quello che vi ho chiesto é un tassello di una cosa un pò più grande che voglio ottenere.
Devi accedere o registrarti per scrivere nel forum
6 risposte