[Risolto] Login con riporto utente

di il
13 risposte

[Risolto] Login con riporto utente

Ciao a tutti,
sto creando un semplice Access (2016) in cui ogni utente deve inserire il proprio tempo per cui ha fatto un tipo di lavorazione in base a delle causali dedicate al proprio reparto.

Ho creato un interfaccia iniziale in cui devono effettuare il Login selezionando il proprio Username e inserendo la password.
Su un pulsante ho inserito la verifica dei capi compilati e, se tutto va a buon fine, apre la maschera mscInserimento, "trasportando" il campo Username tramite questa formula:
Forms!mscInserimento!txtUtente.Value = DLookup("[Username]", "tblUtenti", "[IDUtente]=" & Forms!mscLogin!cboUtente.Value)

L'utente inserisce il suo tempo e la causale nel nuovo form e confermando si chiude l'interfaccia ripartendo dalla mscLogin.

La mia domanda è:
Come faccio a permettergli di inserire un nuovo valore, mantenendo il campo Utente nella mscInserimento, senza che debba riloggarsi?
Non credo si possa passare il valore Username aprendo e chiudendo la stessa maschera (o sbaglio?).

Grazie in anticipo per l'aiuto.

13 Risposte

  • Re: [Risolto] Login con riporto utente

    Da mscLogin passi a mscInserimento senza chiudere mscLogin: vero? Se sì, hai un valido motivo per lasciare mscLogin aperta?
    Puoi esporre tutti i codici completi del meccanismo che avresti messo in atto?
  • Re: [Risolto] Login con riporto utente

    Ciao Osvaldo, grazie per la risposta.

    La maschera mscLogin viene chiusa dopo aver passato il dato all'altra maschera, di seguito il comando associato al pulsante di login:
    Private Sub Comando1_Click()
    'Check that EE is selected
    If IsNull(Me.cboUtente) Then
    MsgBox "Seleziona l'utente!", vbCritical
    Me.cboUtente.SetFocus
    Else
    'Check for correct password
    If Me.txtPassword = Me.cboUtente.Column(3) Then
    DoCmd.OpenForm "mscInserimento", , , , acFormAdd
    Forms!mscInserimento!txtUtente.Value = DLookup("[Username]", "tblUtenti", "[IDUtente]=" & Forms!mscLogin!cboUtente.Value)
    Forms!mscInserimento!txtReparto.Value = DLookup("[Reparto]", "tblUtenti", "[IDUtente]=" & Forms!mscLogin!cboUtente.Value)
    DoCmd.Close acForm, "mscLogin", acSaveNo
    Else
    MsgBox "Password non corretta, riprova!", vboOkOnly
    Me.txtPassword = Null
    Me.txtPassword.SetFocus
    End If
    End If
    End Sub
  • Re: [Risolto] Login con riporto utente

    La logica vuole che l'utente sia Loggato al PC personale e lo stesso apra l'interfaccia... sicchè il programmatore legge l'utente del S.O. e gestise quel dato...
    Se invece il CLIENT è invece usabile da Più Users, con le stesse credenziali al S.O., allora devi gestire il sistema di LOGIN.
    In questo caso serve sempre pensare che l'utente che si LOGGA lo fa 1 volta all'ingresso e non ogni volta che deve operare, questo significa che devi salvare i dati di LOGIN in variabili Ambiente che potrai recuperare da ogni parte del tuo applicativo, ed è errato quello che hai fatto ovvero passare dalla Maschera di Login i dati a maschere Fisse.
    La maschera di LOGIN si usa SOLO ED ESCLUSIVAMENTE per il Login, poi la si chiude(o rende non visibile se si deve gestire un AutoLogout a tempo di inattività) ma i dati si salvano in Variabili Accessibili, quindi possono essere Public oppure si scrivono delle Funzioni che le modificano e le leggono, oppure si creano delle Public Properties di Applicativo.
  • Re: [Risolto] Login con riporto utente

    Purtroppo, in questo caso almeno, non posso utilizzare il nome dell'utente del S0 per questa attività (ma ti ringrazio per la dritta che potrei usare per altro).
    Purtroppo (2), non ho mai avuto modo di utilizzare e imparare le variabili accessibili. Provo a leggermi qualcosa in giro sperando di essere in grado di riprodurle. Se avete dei link sottomano (roba semplice, esempi di DB già fatti) a riguardo ve ne sarei grato.

    Queste Variabili funzionano anche se più persone utilizzano la stessa applicazione contemporaneamente?

    Vi ringrazio per il supporto
  • Re: [Risolto] Login con riporto utente

    AndrewTFox ha scritto:


    Purtroppo, in questo caso almeno, non posso utilizzare il nome dell'utente del S0 per questa attività (ma ti ringrazio per la dritta che potrei usare per altro).
    Purtroppo (2), non ho mai avuto modo di utilizz
    are e imparare le variabili accessibili. Provo a leggermi qualcosa in giro sperando di essere in grado di riprodurle. Se avete dei link sottomano (roba semplice, esempi di DB già fatti) a riguardo ve ne sarei grato.
    Non c'è molto da dire... sono Variabili Dichiarate Public in un Modulo Standard...
    
    Public mUSER As String
    Public mLEVEL As Byte
    In qualsiasi parte del codice le leggi e le scrivi...

    AndrewTFox ha scritto:


    Queste Variabili funzionano anche se più persone utilizzano la stessa applicazione contemporaneamente?
    Questa domanda spaventa, ma serve capirla.. di solito si sviluppano Applicazione Client-Server, ma supponendo tu non lo abbia fatto se più utenti usano la medesima applicazione, questo può accadere solo in 3 modi...
    1° Ogni utente dal proprio PC lancia l'applicazione che si trova in un percorso accessibile..., in questo caso ognuno apre in locale un'istanza INDIPENDENTE dell'applicativo e fara il proprio LOGIN valorizzando le Variabili nella propria istanza...
    2° L'applicatico è su una sola postazione e rimane aperto, quindi accessibile da N Utenti... in questo caso chi arriva fa il LOGIN e quando ha finito fa il LOGOUT..., ed il Nuovo fara altrettanto...
    3° L'utente A sta lavorando sull'applicativo ed ha fatto il Login come UTENTE_A, poi arriva l'Utente B che uccide l'utente A e gli ruba il PC... ma siccome è corretto fa prima il LogOUT, per poi fare il LOGIN come UTENTE_B...

    Tu in quale dei 3 casi sei...?

    AndrewTFox ha scritto:


    Vi ringrazio per il supporto
    Saluti
  • Re: [Risolto] Login con riporto utente

    Buongiorno Alex,
    sono più nel primo caso.
    Ogni utente lancia dal proprio PC l'applicazione che è stata copiata sul loro desktop (in alcuni casi più persone sullo stesso PC a turno). Contiene delle tabelle scollegate in un percorso di rete accessibile da chiunque.

    Grazie!
  • Re: [Risolto] Login con riporto utente

    Purtroppo non riesco a venirne fuori per quanto facile dovrebbe essere.
    Ho creato le mie variabili che vengono compilate alla pressione di un pulsante, ma nel momento in cui devo andare a richiamarle sul caricamento in una nuova maschera, i campi non si riempiono.

    Dichiarazione in maschera di Login:
    mUtente = Me.cboUtente
    mReparto = Me.txtReparto

    Assegnazione in altra maschera:
    txtUtente = mUtente
    txtReparto = mReparto

    L'unica cosa particolare è che cboUtente nella maschera di Login è una casella combinata, ho provato pure utilizzando il codice Me.cboUtente.Column(4) ma non funziona comunque.

    Scusate la mia ignoranza..

    Qui potete trovare anche l'applicativo se avete la pazienza di supportarmi.
    https://drive.google.com/open?id=1Hwq8F5is2IqTUxkasrFvScLJsi-B2Hop

    Grazie
  • Re: [Risolto] Login con riporto utente

    Secondo me sei poco attento... e forse non hai le idee chiare...
    Hai visto che hai dichiarato una variabile ma ne usi un'altra...?

    Queste le Variabili:
    
    Public mUSER As String
    Public mReparto As String
    Questo il punto in cui scrivi:
            
    mUtente = Me.cboUtente
    mReparto = Me.txtReparto
    Oltretutto NON HAI definito l'opzione di OBBLIGO della dichiarazione delle variabili altrimenti avresti avuto ERRORE...
    Ovviamente la Combo avendo come BoundColumn il campo ID restituisce la PK, ma non è una Stringa, quindi quello che fai non è giusto.
    Puoi Dichairare 3 Variabili AMbiente se ti torna comodo, anche se Reparto per come la stai getendo è innutile... a pura fantasia di chi digita...:
    
    Prublic mIDUSER As Long
    Public mUSER As String
    Public mReparto As String
    Quidni nella Maschera LOGIN:
    :
            
    mIDUSER = Me.cboUtente
    mUSER = Me.cboUtente.Column(2)
    mReparto = Me.txtReparto
  • Re: [Risolto] Login con riporto utente

    Ciao Alex,
    effettivamente ho richiamato una variabile che non esisteva, stupidi errori di distrazione, mea culpa.

    Ma se volessi riportare il valore Username della Combo, in una Casella di Testo di un'altra macchina non è sufficiente utilizzare
    mUser = Me.cboUtente.Column(1) e poi dichiararla sull'apertura txtUtente = mUser?
    Estraggo il testo di una combo e lo inserisco in una casella di testo, che poi servirà solamente per visualizzare l'utente loggato e compilare il valore per la registrazione del tempo.

    mReparto lo utilizzo per fare i filtri sulle causali, ogni Reparto ha Cause differenti, quindi lo riporto nella query della cmbCause nella mscRegistrazione.

    Ora il problema si è spostato nel popolare i campi txtUtente e txtReparto nella form mscRegistrazione con le variabili dichiarate. Se lo faccio tramite un pulsante me li compila correttamente, mentre se li imposto sull'apertura mi riporta questo errore:
    Access Run time error - '-2147352567 (80020009)':
    Impossibile assegnare un valore all'oggetto.

    Il debug riporta al codice txtUtente = mUser.



    Sono riuscito a rattoppare il problema usando "Se mouse spostato" ma mi sembra un accrocchio.
  • Re: [Risolto] Login con riporto utente

    AndrewTFox ha scritto:


    Ciao Alex,
    effettivamente ho richiamato una variabile che non esisteva, stupidi errori di distrazione, mea culpa.

    Ma se volessi riportare il valore Username della Combo, in una Casella di Testo di un'altra macchina non è sufficiente utilizzare
    mUser = Me.cboUtente.Column(1) e poi dichiararla sull'apertura txtUtente = mUser?
    Estraggo il testo di una combo e lo inserisco in una casella di testo, che poi servirà solamente per visualizzare l'utente loggato e compilare il valore per la registrazione del tempo.
    Mi spaventa quando dici su un'altra macchina... le istanze di Access sono indipendenti... se devi sapere da un'altra istanza chi è loggato e quando, devi fare una gestione utenti che scriva nelle Tabelle sul Server... ed implementare una struttura Client-Server non aprire il File il Sharing.

    Detto questo per popolare le TextBox di solito è più comodo scrivere una Funzione che restituisca il valore... tipo
    
    Option Compare Database
    Option Explicit
    
    Private mUserName As String
    
    Function UserName(Optional Value)
        If Not IsMissing(Value) Then mUserName = Value
        GetValue = mUserName 
    End Function
    Conquesta impostazione, puoi salvare il valore dello user, oppure richiamarlo....
    Per salvarlo
    
    Call UserName(Me!NomeCombo.Column(1))
    Mentre per valorizzare la TextBox ti basta scrivere nell'origine controllo
    
    =UserName()
    Non lo avevo suggerito prima perchè mi pare possa essere un po fuori dalla normale fruibilità di base...

    AndrewTFox ha scritto:


    mReparto lo utilizzo per fare i filtri sulle causali, ogni Reparto ha Cause differenti, quindi lo riporto nella query della cmbCause nella mscRegistrazione.
    Per questo vale la medesima cosa...

    AndrewTFox ha scritto:


    Ora il problema si è spostato nel popolare i campi txtUtente e txtReparto nella form mscRegistrazione con le variabili dichiarate. Se lo faccio tramite un pulsante me li compila correttamente, mentre se li imposto sull'apertura mi riporta questo errore:
    Access Run time error - '-2147352567 (80020009)':
    Impossibile assegnare un valore all'oggetto.

    Il debug riporta al codice txtUtente = mUser.
    Questi controlli non sono associati vero...?
    In ogni caso come ti ho esposto sopra funziona... purtroppo però, in mezzo ci stanno le tue conoscenze che possono fraintenderne l'utilizzo e la funzionalità... ma quì mi fermo.

    AndrewTFox ha scritto:


    Sono riuscito a rattoppare il problema usando "Se mouse spostato" ma mi sembra un accrocchio.
    Decisamente nemmeno da prendere in considerazione.
  • Re: [Risolto] Login con riporto utente

    AndrewTFox ha scritto:


    Ciao Alex,
    effettivamente ho richiamato una variabile che non esisteva, stupidi errori di distrazione, mea culpa.

    Ma se volessi riportare il valore Username della Combo, in una Casella di Testo di un'altra maschera non è sufficiente

    Perdonami, intendevo Maschera, non macchina.

    Ti ringrazio per il tuo supporto, sicuramente ho delle lacune, già cosi comunque mi hai dato una grande mano e reindirizzato su alcuni argomenti.
    Cercherò di colmare quello che mi manca.

    Grazie ancora
  • Re: [Risolto] Login con riporto utente

    @Alex ha scritto:


    
    Option Compare Database
    Option Explicit
    
    Private mUserName As String
    
    Function UserName(Optional Value)
        If Not IsMissing(Value) Then mUserName = Value
        GetValue = mUserName 
    End Function
    Conquesta impostazione, puoi salvare il valore dello user, oppure richiamarlo....
    Per salvarlo
    
    Call UserName(Me!NomeCombo.Column(1))
    Mentre per valorizzare la TextBox ti basta scrivere nell'origine controllo
    
    =UserName()

    Ciao Alex, scusa ma mi sfugge completamente l'utilizzo di GetValue, non essendo una funzione nativa di Access non saprei come implementarla.

    Teoricamente non dovrebbe associare il valore "Value" alla mia variabile "mUtente" anche in questo modo?
    Function fUtente(Optional Value)
    mUtente = Value
    End Function
  • Re: [Risolto] Login con riporto utente

    E' un refuso della Funzione che uso io...
    La tua funzione non va bene in quanto è WRITEONLY, oltre che mancare un pezzo che da adito a malintesi... la dichiarazione della Variabile mUtente..

    Questa Funzione scritta così, è ReadWrite, se passi il parametro lo Sovrascrive, quindi lo aggiorna, se non passi nulla lo legge lo associa al valore restituito alla Funzione.
    Option Compare Database
    Option Explicit
    
    Private mUserName As String
    
    Function UserName(Optional Value)
        If Not IsMissing(Value) Then mUserName = Value
        UserName= mUserName
    End Function
Devi accedere o registrarti per scrivere nel forum
13 risposte