2008-11-03 29 views
7

estoy usando el parámetro OpenArgs para enviar un valor cuando se utiliza DoCmd.OpenForm:AbrirArgs es error nulo

DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value" 

Luego utilizo Me.OpenArgs dentro de la forma abierta para agarrar el valor. A veces envía un valor Null en lugar de la cadena original. ¿Qué está mal?

Respuesta

1

Una alternativa muy interesante a este argumento "openArgs" es usar la colección .properties del objeto currentProject.allforms ("myFormName"). Cuando necesite pasar un valor a un formulario (como un filtro heredado de otro control u otro formulario, por ejemplo), simplemente agregue la propiedad correspondiente para su formulario y agregue su valor a esta propiedad.

Ejemplo:

addPropertyToForm "formFilter","Tbl_myTable.myField LIKE 'A*'",myFormName 

La función llamada intentará actualizar el valor de la propiedad "formFilter" del objeto. Si la propiedad no existe (se incrementa el error 2455), se agregará como una nueva propiedad en el código de administración de errores.

Function addPropertyToForm(_ 
    x_propertyName as string, _ 
    x_value As Variant, _ 
    x_formName As String) 
As Boolean 

On Error GoTo errManager 
CurrentProject.AllForms(x_formName).Properties(x_propertyName).Value = x_value 
addPropertyToForm = True 
On Error GoTo 0 

Exit Function 

errManager: 
If Err.Number = 2455 Then 
    CurrentProject.AllForms(x_formName).Properties.Add x_propertyName, Nz(x_value) 
    Resume Next 
Else 
    msgbox err.number & ". The property " & x_propertyName & "was not created" 
End If 

End Function 
+0

+1, porque permite una funcionalidad similar a OpenArgs con instrucciones que no permiten OpenArgs (por ejemplo, DoCmd.OutputTo). Por otro lado, esto es seguramente problemático en una base de datos compartida, y sospecho que no funcionará con un MDE. –

+0

Perdón por la votación negativa, pero pensé que esto no estaba solucionando el problema. –

0

¿Se toma el valor del control completado por un usuario? ¿Se asegura de que el foco se mueva desde el control antes de ejecutar la línea de forma abierta?

EDITAR: La propiedad de valor del control será igual al valor anterior, que puede ser nulo, a menos que haga esto.

0

Creo que he encontrado la respuesta a mi problema:

En mi experiencia, AbrirArgs tiene que ser manejado inmediatamente después de la apertura del formulario. (link)

Comprobé esto haciendo una pausa antes de intentar usar el valor OpenArgs, y fue nulo. Pero cuando elimino el corte, el programa no muestra ningún error. Esto solo debe suceder durante el desarrollo.

+0

"OpenArgs debe manejarse inmediatamente después de abrir el formulario" * Nunca * he encontrado que esto sea cierto y Con frecuencia uso OpenArgs. – Fionnuala

+0

Estoy de acuerdo 100% con Remou –

+0

¿Qué haces entonces, Remou? – lamcro

20

Esto sucede a menudo durante DEVELOPPMENT whem el formulario ya está oppened (en modo de edición, por ejemplo) y se invoca la función DoCmd.OpenForm. En este caso, el formulario se coloca en modo normal (vista) y se generan los eventos OnOpen y OnLoad, pero la propiedad OpenArgs se establece en null, independientemente de lo que haya pasado a docmd.OpenForm.

La solución es obviamente cerrar el formulario antes de invocarlo con docmd.OpenForm. Sin embargo, hay una solución alternativa que me gusta usar. En el evento OnOpen, compruebo si me.OpenArgs es nulo y, si lo está, lo reemplazo con algunos valores de depuración.

if not isnull(me.OpenArgs) then 
    myvalue = me.OpenArgs 
else 
    msgbox "Debug mode" 
    myValue = "foo" 
endif 
+0

Eso es obviamente un error, ya que la documentación establece claramente que OpenArgs devuelve una * cadena *. Hoy tuve el mismo problema con un informe, y es la primera vez que lo veo. Normalmente siempre Len (Me.openArgs) y eso siempre funcionó bien. –

+1

Gracias, realmente me dolía la cabeza preguntándome por qué en la tierra OpenArgs siempre fue nulo en mi forma. El formulario estaba abierto en modo de diseño. No es realmente el tipo de comportamiento que hubiera esperado ... –

8

Acabo de tener este problema. La cadena Arg no se aprobó, porque el informe ya estaba abierto, pero no visible. Se dejó abierto cuando el código se bloqueó con el Null string error.

La solución fue la de cerrar el informe en la ventana inmediata, con

Docmd.Close acReport, "myReport" 

Se arregló el fallo y los argumentos fueron pasados ​​correctamente.

+0

+1, excelente! –

1

Puede ser que ya tengas tu formulario abierto (como se sugiere), pero solo busca nulo y el formulario manejará la apertura con argumentos perdidos también.

Esto permitirá abrir el formulario para una rápida ojeada (por usted o los usuarios) si los argumentos no son vitales.

Private Sub Form_Open(Cancel As Integer) 
    If Not IsNull(Me.OpenArgs) Then 
     Me.lblHeading.Caption = Me.OpenArgs 
    End If 
End Sub 

Un valor nulo se puede pasar a AbrirArgs omitiendo el valor de la llamada AbrirFormulario, o haciendo doble clic en el formulario en el acceso a los objetos de la barra lateral.


Si se trata de una forma modal, usted debe comprobar de forma explícita si está abierto y cerrarla antes de abrirlo si es así. Este es un gotcha común.

Lo mismo podría hacerse por supuesto para todas las formas, no solo para las modales, y entonces no necesitaría la verificación nula (siempre que nunca le pase nulo). Pero a menudo hay muchas formas en un proyecto, e incluso más llamadas OpenForm que formularios ...