Comando dlookup in report di access

di il
11 risposte

Comando dlookup in report di access

Buongiorno a tutti,

premetto che non sono esperto di access ma mi sono avvicinato al programma da autodidatta con grande entusiasmo.

ho il seguente problema:

ho creato un DB per gestire un servizio di trasporto di persone fragili.

per accedere al DB ogni utente dovra loggarsi con la propria username e password.

memorizzo la username in una variabile temportanea:

TempVars("Username") = Me.UsernameTxt.Value

in seguito tra le varie maschere di utilizzo del DB richiamo la variabile temporanea per inserirla in una casella di testo oppure in una etichetta attraverso la funzione Dlookup:

Me.OperIns = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")

Me.UtenteTxt.Caption = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")

ora vorrei fare la stessa cosa in un report pensando di utilizzare ancora la funzione in un report senza modificarne la sintassi ma purtroppo non funziona e non riesco riportare il nome dell'utente .

potreste aiutarmi?

vi ringrazio in anticipo

11 Risposte

  • Re: Comando dlookup in report di access

    Ciao,

    ti devi assicurare che la TempVars sia valorizzata prima di utilizzarla nel Dlookup

    Per esempio verifica nell'evento Open Report  se  esiste e se contiene qualcosa.

    Questo come primo controllo ... per approfondire meglio sarebbe necessario qualche indizio in più.

    Domanda : perchè vuoi sempre eseguire il dlookup ? Se hai già memorizzato il valore e sufficiente utilizzarlo .... per esempio se nel report esiste una Label di Nome LabelUser, la puoi semplicemente valorizzare in Open Report inquesto modo : 
    LabelUser = TempVars("Username")

  • Re: Comando dlookup in report di access

    Scusami se faccio domande poco pertinenti ma cosa vuol dire verificare nell'evento open report?

    tra l'altro dove potrei vedere nell'architettura di access dove viene messa la variabile temporanea?

    grazie mille

  • Re: Comando dlookup in report di access

    Presumo che non usi il debug oppure non sai come fare ...

    Un pò difficile, ma ci provo a spiegarti.

    Esegui questi passi:

    1. apri in struttura il report
    2. aggiungi per esempio un controllo di tipo Label :
      1. nel tuo caso dovresti averla già con il nome UtenteTxt
        1. per esempio posiziona questa label nella testata del report
    3. adesso vai su proprietà report \ eventi
      1. sull'evento "Su apertura"  (OpenReport) selezionare Routine evento e scegliere i "..." per aprire il codice Vba per l'evento
      2. nella routine Open report inserire semplicemente questo codice:
    ' OPEN REPORT EVENT
    Private Sub Report_Open(Cancel As Integer)
    
    Me.UtenteTxt.Caption = TempVars("Username")
    
    End Sub

    Adesso salva tutto e apri il report. 

    Verifica se la label viene popolata con la UserName che hai memorizzato nella variabile temporanea

  • Re: Comando dlookup in report di access

    17/04/2025 - By65Franco ha scritto:

    Domanda : perchè vuoi sempre eseguire il dlookup ? Se hai già memorizzato il valore e sufficiente utilizzarlo

    Non mi hai risposto alla domanda... provo a spiegarmi meglio 

    Presumo che tu abbia una tabella per validare gli utenti che si loggano

    • se l'utente esiste allora procedi ed esegui il dlookup a tal fine : Me.OperIns = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")
    • se è tutto ok allora memorizzi l'utente loggato nella variabile temporanea : TempVars("Username") = Me.UsernameTxt.Value

    .

    A seguito di questi due passaggi, fino a quando non chiudi MsAccess, troverai in qualsiasi momento il valore Utente memorizzato nella TempVars("Username")  

    Quindi adesso la puoi semplicemente utilizzare là dove ti occorre, come per esempio abbiamo fatto nel report sopra riportato.

    Per questo motivo ti chiedevo perchè continui a fare il Dlookup ?  
    L'hai fatto all'inizio per validare l'utente e per memorizzare il valore nella variabile temporanea.
    Quindi direi che è del tutto inutile continuare a ripetere la funzione DLookUp. Se vuoi sapere chi è l'Utente loggato puoi semplicemente utilizzare il valore di ritornno dalla funzione :  TempVars("Username") 

  • Re: Comando dlookup in report di access

    17/04/2025 - Loppi ha scritto:

    tra l'altro dove potrei vedere nell'architettura di access dove viene messa la variabile temporanea?

    La variabile temporanea Username viene memorizzata nella RAM in una collection public e quindi è visibile in tutto il progetto... Form/Report/Query/Macro/etc...

    Se la vuoi vedere per esempio in debug oppure in tempo reale puoi fare questa verifica:

    1. Avvia il progetto e inserisci la User Name
    2. Chiudi la form che ti consente di gestire l'inserimento della User Name
    3. Vai nel codice Vba e apri la finestra immediata (Ctrl+G)
      1.  nella finestra immediata interroga la variabile in questo modo: 

        ? TempVars("Username")

        oppure 

        ? TempVars!Username 

    .
    Con tali interrogazioni ti verrà restituito il valore che hai in precedenza memorizzato nella variabile "Username"

    In questo caso ho memorizzato nella variabile temporanea l'utente pippo

  • Re: Comando dlookup in report di access

    17/04/2025 - Loppi ha scritto:

    Me.OperIns = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")

    Me.UtenteTxt.Caption = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")

    Quando scrivi queste function devi fare attenzione a controllare il probabile Null come valore di ritorno.

    In tal caso il processo va in crash restituendo errore di runtime e rimani bloccato.

    Per evitare ciò hai almeno due alternative:

    Esempio con variabile di tipo Variant

    ' Retrieve value
    Dim varOperIns AS Variant
    varOperIns = DLookup("NomeUtente", "UtentiT", "Username= '" & Me.UsernameTxt.Value & "'")
    
    ' Check error 
    If Not IsNull(varOperIns) Then
    	' Set temp variable
    	TempVars("Username") = varOperIns 
    Else
        MsgBox "Error: UserId not found"
    End If

    Oppure per esempio utilizzando la funzione Nz:

    ' Retrieve and Display User Id value
    Me.UsernameTxt.Value = Nz(DLookup("NomeUtente", "UtentiT", "Username= '" & Me.UsernameTxt.Value & "'"), "")	
    
    ' Check error 
    If Me.UsernameTxt.Value <> "" Then
    	' Set temp variable
    	TempVars("Username") = Me.UsernameTxt.Value
    Else
        MsgBox "Error: UserId not found"
    End If

    Sono solo esempi ... puoi adottare altre tecniche... rimane il fatto che se una function restituisce Null , tale valore deve essere testato per evitare "Invalid use of Null"

    Adesso se l'UserId è OK, allora puoi assegnare il valore alle tue variabili e/o controlli:

    Me.OperIns.Value = TempVars("Username")
    
    Me.UtenteTxt.Caption = TempVars("Username")
    
    etc... etc...
    
    oppure 
    
    Me.OperIns.Value = TempVars!Username
    
    Me.UtenteTxt.Caption = TempVars!Username
    
    etc... etc...
    
  • Re: Comando dlookup in report di access

    Dimenticavo di chiarire una cosa:

    Me.OperIns = DLookup("NomeUtente", "UtentiT", "Username= '" & TempVars("Username") & "'")

    con questo comando scrivo nel campo OperIns il NomeUtente che corrisponde al nome e cognome dell'utente e non la username che è in realtà un alias usato semplicemente per loggarsi.

    questo perchè ho una tabella di riferimento "UtentiT" in cui ho inserito i vari dati degli utenti ( nome,cognome, data di nascita, username , password...)

    ecco perchè avevo trovato comodo usare Dlookup.

    Comunque mi rendo conto di avere una conoscenza veramente basica del programma rispetto a te.

    ti ringrazio molto della tua disponibilità

  • Re: Comando dlookup in report di access

    Credo di aver capito!

    avevo inserito nell'evento "su corrente" la funzione dlookup e non funziona, mentre ora l'ho inserita nell'evento "su apertura" e funziona correttamente!!

    come vedi non ho imparato a gestire opportunamente gli eventi:

    devo cercare qualche esauriente spiegazione in merito.

    grazie ancora

  • Re: Comando dlookup in report di access

    17/04/2025 - Loppi ha scritto:

    avevo inserito nell'evento "su corrente" la funzione dlookup e non funziona, mentre ora l'ho inserita nell'evento "su apertura" e funziona correttamente!!

    Ok, bene!

    Considera che potresti anche utilizzare l'evento Load Report:

    ' REPORT LOAD
    Private Sub Report_Load()
    
    
    End Sub

    La differenza tra i due eventi è sostanziale e si usa l'uno o l'altro secondo le operazioni che si intendono fare 

    Open Report viene eseguito in fase di apertura del report 
    mentre Load Report viene eseguito in fase di caricamento del report

    La differenza si nota in modo significativo soprattutto quando si richiama il report in visualizzazione anteprima.

    .

    devo cercare qualche esauriente spiegazione in merito.

    Qui trovi un pò di documentazione utile:
    https://learn.microsoft.com/en-us/office/vba/api/access.report
    Se vai alla fine della documentazione microsoft sull'oggetto report, vedrai la lista degli eventi e per ogni link potrai studiarti l'argomenti.

    Qui invece con quale sequenza si verificano gli eventi principali del report:

  • Re: Comando dlookup in report di access

    17/04/2025 - Loppi ha scritto:

    avevo inserito nell'evento "su corrente" la funzione dlookup e non funziona

    Ok, ma leggi bene la mia obiezione nel fare e rifare il DLookup ogni volta, perchè se vuoi solo ottenere il NomeUtente che si è loggato, è sufficiente reperire tale valore dalla variabile temporanea come ti ho fatto vedere nei post precedenti.

    Me.OperIns.Value = TempVars("Username")
    
    Me.UtenteTxt.Caption = TempVars("Username")
    
    etc... etc...
    
    oppure 
    
    Me.OperIns.Value = TempVars!Username
    
    Me.UtenteTxt.Caption = TempVars!Username
    
    etc... etc...

    Quindi :

    con questo comando scrivo nel campo OperIns il NomeUtente che corrisponde al nome e cognome dell'utente e non la username che è in realtà un alias usato semplicemente per loggarsi.

    questo perchè ho una tabella di riferimento "UtentiT" in cui ho inserito i vari dati degli utenti ( nome,cognome, data di nascita, username , password...)

    ecco perchè avevo trovato comodo usare Dlookup.

    perfetto, allora nella variabile temporanea memorizzi il NomeUtente  e farai una sola volta il DLookUp.

    Se poi hai bisogno sia del NomeUtente  che del Username usato come Login allora memorizzi i due valori in due variabili temporanee:

    Esempio:  (ovviamente devono essere inseriti i dovuti controlli come ti ho spiegato in precedenza in fase di validazione UserId immesso dall'utente)

    IN FASE DI INSERIMENTO USERID SI SALVANO LE DUE VARIABILI:
    
    ' Set temp variable Nome Utente Completo
    TempVars!UserNameDesc = Nz(DLookup("NomeUtente", "UtentiT", "Username= '" & Me.UsernameTxt.Value & "'"), "")
    
    ' Set temp variable Login UserId
    TempVars!Username = Me.UsernameTxt.Value
    
    ----------------------------------------------------------------------------------------------------------------------------
    ' A questo punto puoi reperire uno o entrambe i valori a tuo piacimento
    ' ESEMPIO:
    
    Me.LabelUserReport.Caption = TempVars!Username			' Login UserID
    
    Me.LabelUserReportDesc.Caption = TempVars!UserNameDesc 	' Nome Completo Utente
  • Re: Comando dlookup in report di access

    17/04/2025 - Loppi ha scritto:

    Comunque mi rendo conto di avere una conoscenza veramente basica del programma rispetto a te.

    Se approfondisci la documentazione che ti ho lasciato, vedrai che un piccolo passo avanti lo farai.
    Tieni presente che sul web trovi tutta la documentazione, completa e con esempi, nel supporto tecnico Microsoft. (meglio di un manuale cartaceo ma soprattutto trovi proprio tutto tutto tutto quello che serve)

    ti ringrazio molto della tua disponibilità

    Di nulla, prego... anzi poi con calma, ti faccio avere per fine mese la fattura per la consulenza rilasciata.

    ;-))

    .

    Per l'uso del Debug e finestra Immediata, puoi fare riferimento a partire da qui:

Devi accedere o registrarti per scrivere nel forum
11 risposte