Ho creato un modulo di accesso denominato login dove il nome utente è digitato nella casella di testo txtEmployee e ho bisogno di visualizzare lo stesso nella seconda pagina in un altro modulo in MS Access.Passaggio dei parametri tra moduli in MS Access
risposta
DoCmd.OpenForm
consente di passare un valore arbitrario come ultimo parametro. Questo valore può essere letta nel nuovo modulo come Me.OpenArgs
:
' Invoked by some Button on the first form '
Sub GoToSecondPage()
DoCmd.OpenForm "MySecondPage", acNormal, , , , , txtEmployee.Value
End Sub
' Second form '
Sub Form_Open(Cancel As Integer)
If Not IsNull(Me.OpenArgs) Then
lblShowEmployeeName.Value = Me.OpenArgs
End If
End Sub
(. Esempio di codice non testato)
Personalmente farli passare attraverso gli argomenti aperti all'apertura del modulo. Per esempio dalla forma A vostra avrebbe scritto
DoCmd.OpenForm "frmB", , , , , acDialog,”Badger”
E poi in caso OnOpen di modulo B è possibile catturare ciò che avete inviato in questo modo
Me.txtSomething=Me.OpenArgs
È possibile passare solo una cosa però Quello che faccio molto è passare una stringa delimitata da una pipe negli argomenti aperti e quindi dividerla.
Perché stai aprendo con acDialog? – Fionnuala
Beh, quell'esempio è stato preso da un form popup così ho voluto che fosse modale, questo ovviamente può essere rimosso se l'OP vuole solo un modulo normale –
Un paio di idee ...
Utilizzare l'evento DopoAggiornamento sul campo login nome utente per scrivere il nome di una variabile globale, quindi popolare il campo nella seconda pagina con l'evento OnLoad.
Oppure, se si ha intenzione di lasciare il log in forma aperta a tutti i tempi è possibile impostare il valore di default del campo direttamente a = [Forms]! [LoginForm]! [Nome utente]
Perché non creare un funzione pubblica che memorizza &/o recupera una variabile globale che si memorizza dopo l'esecuzione del primo modulo? Ciò consentirebbe non solo di utilizzarlo su uno o più moduli, ma anche come criterio all'interno di una query (ad esempio, per restituire i record che corrispondono al nome utente che hai memorizzato).
Sono d'accordo che questa è una sicurezza "falsa", ma ci sono anche momenti in cui è sufficiente per le vostre esigenze. L'ho implementato in precedenza, dove abbino il nome utente della stringa di ambiente a una voce in una tabella utente.
BTW, mi riferisco a questa funzione come personalizzazione, non di sicurezza.
Solo un pensiero.
Non userei mai un globale per questo. Invece, userei una variabile STATIC all'interno della funzione che restituisce il valore, e se non è impostato, aprirebbe il modulo per raccogliere le informazioni. Ciò significherebbe che è sia auto-guarigione che sicuro di essere alterato altrove nel codice. –
È possibile passare una stringa delimitata come parametro OpenArgs:
DoCmd.OpenForm FormName:="miscForm", OpenArgs:=paramstring
Ecco una routine per l'elaborazione di una catena di tubi delimitato passato come parametro per DoCmd.OpenForm:
Dim Pstring As Variant
If Len(Me.OpenArgs) > 0 Then
Pstring = Split(Me.OpenArgs, "|")
var1 = Pstring(0)
<etc..>
End If
Generalmente vedo la necessità di farlo come un'indicazione di un problema di progettazione. Cioè, se devi passare tante informazioni al modulo, in pratica dovresti usare un qualche modo strutturato per farlo. –
@David, Ti stai riferendo a una variabile di tipo 'struct'? Io uso questo solo per un modulo nella mia attuale app di Access, in modo da non dover inserire elementi nel database prima di richiamare il modulo, e poi di nuovo quando sono nel modulo. Sono aperto a un'idea migliore, non sono un esperto di accesso. –
Ci sono molti modi per farlo. Uno è semplicemente inserire i dati nel modulo chiamato dal contesto di chiamata. Questo può essere fatto aprendo il modulo sia con acHidden che con acDialog, e quando hai finito di recuperare i dati nel modulo chiamato, lo rendi visibile, il che lo rende modale e l'esecuzione del codice nel contesto chiamante si interrompe. Io generalmente non lo faccio. È più probabile che utilizzi un modulo di classe, ma è proficuo solo quando hai diversi attributi che devi passare, ad esempio quando filtri su più criteri. –
È l'utente nome uguale al nome utente di login di Windows? In tal caso, è possibile ottenere il nome da: http://www.mvps.org/access/api/api0008.htm – Fionnuala
Inoltre, perché è necessario visualizzare il nome utente, sicuramente l'utente sa chi sono? Se hai bisogno del nome per qualche altro motivo, dovresti dirlo, perché c'è più di un modo per passare le informazioni. Ad esempio, se il nome viene utilizzato per filtrare i record, l'argomento Where del metodo OpenForm è probabilmente il migliore. – Fionnuala
Sembra che tu abbia costruito un sistema con una sicurezza fasulla. Perché l'hai fatto, invece di utilizzare la sicurezza Jet ULS o Windows NTFS o Active Directory? –