2010-08-13 26 views
12

He creado un formulario de inicio de sesión llamado inicio de sesión donde el nombre de usuario se escribe en el cuadro de texto txtEmployee, y necesito mostrarlo en la segunda página en otro formulario en MS Access.Pasar parámetros entre formularios en MS Access

+0

es el usuario nombre lo mismo que el nombre de usuario de inicio de sesión de Windows? Si es así, puede obtener el nombre de: http://www.mvps.org/access/api/api0008.htm – Fionnuala

+1

Además, ¿por qué necesita mostrar el nombre de usuario, seguramente el usuario sabe quiénes son? Si necesita el nombre por algún otro motivo, debe decirlo, porque hay más de una forma de pasar la información. Por ejemplo, si el nombre se usa para filtrar registros, el argumento Where del método OpenForm es probablemente el mejor. – Fionnuala

+2

Parece que ha creado un sistema con seguridad falsa. ¿Por qué hiciste eso, en lugar de usar Jet ULS o la seguridad de Windows NTFS o Active Directory? –

Respuesta

24

DoCmd.OpenForm le permite pasar un valor arbitrario como último parámetro. Este valor se puede acceder en la nueva forma como 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 

(. Código ejemplo no probado)

4

Personalmente pasar a través de los argumentos abiertos al abrir el formulario. Por ejemplo, de la forma A su escribiría

DoCmd.OpenForm "frmB", , , , , acDialog,”Badger” 

Y luego, en el caso AlAbrir de la forma B se puede capturar lo que ha enviado como esto

Me.txtSomething=Me.OpenArgs 

Sólo puede pasar una cosa sin embargo lo que hago mucho es pasar una cadena delimitada por una tubería en los argumentos abiertos y luego dividirla.

+0

¿Por qué abres con acDialog? – Fionnuala

+0

Bueno, ese ejemplo fue tomado como un formulario emergente, así que quería que fuera modal, esto por supuesto puede ser eliminado si el OP solo quiere una forma normal –

0

un par de ideas ...

Utilice el evento AfterUpdate en el campo de nombre de usuario de inicio de sesión para escribir el nombre de una variable global, a continuación, rellenar el campo en la segunda página con el evento onLoad.

O, si va a la salida del registro en forma abierta en todo momento se podría establecer el valor por defecto del campo directamente a = [Formularios]! [LoginForm]! [Nombre de usuario]

0

por qué no crear una función pública que almacena &/o recupera una variable global que almacena después de que se ejecuta el primer formulario? Esto le permitiría no solo usarlo en uno o más formularios, sino también como criterios dentro de una consulta (por ejemplo, para devolver registros que coincidan con el nombre de usuario que ha almacenado).

Acepto que se trata de una seguridad "falsa", pero también hay momentos en los que es suficiente para sus necesidades. Lo he implementado antes, donde coincido con el nombre de usuario de la cadena de entorno a una entrada en una tabla de usuario.

BTW, me refiero a esta función como personalización, no como seguridad.

Solo un pensamiento.

+1

Nunca usaría un global para esto. En cambio, usaría una variable STATIC dentro de la función que devuelve el valor, y si no está configurado, abriría el formulario para recopilar la información. Esto significa que es autocurativo y está a salvo de ser alterado en otro lugar del código. –

5

puede pasar una cadena delimitada como parámetro AbrirArgs:

DoCmd.OpenForm FormName:="miscForm", OpenArgs:=paramstring 

Aquí es una rutina para procesar una cadena de tubos delimitado pasado como parámetro a DoCmd.OpenForm:

Dim Pstring As Variant 

If Len(Me.OpenArgs) > 0 Then 
    Pstring = Split(Me.OpenArgs, "|") 
    var1 = Pstring(0) 
    <etc..> 
End If 
+1

Generalmente veo la necesidad de hacer esto como una indicación de un problema de diseño. Es decir, si debe pasar tanta información al formulario, básicamente debería utilizar algún tipo de forma estructurada de hacerlo. –

+0

@David, ¿te refieres a una variable de tipo 'struct'? Solo uso esto para un formulario en mi aplicación de acceso actual, para no tener que poner cosas en la base de datos antes de abrir el formulario, y luego otra vez cuando estoy en el formulario. Estoy abierto a una idea mejor, no soy experto en formularios de acceso. –

+0

Hay muchas maneras de lograr esto. Una es simplemente insertar los datos en la forma llamada desde el contexto de llamada. Esto se puede hacer abriendo el formulario con acHidden y acDialog, y cuando haya terminado de obtener los datos en el formulario llamado, lo hará visible, lo que lo hace modal y la ejecución del código en el contexto de llamada se detiene. Generalmente no hago eso. Es más probable que use un módulo de clase, pero eso solo es rentable cuando tiene varios atributos que debe aprobar, como cuando se filtra en múltiples criterios. –