Domina la propiedad OpenArgs en Access

Hablábamos de pasada, en el artículo sobre como utilizar el comando DoCmd.OpenForm, de la propiedad OpenArgs y aquí os traigo este artículo donde vamos a ver como darle algunos usos.

La propiedad OpenArgs que utilizamos en Microsoft Access es de solo lectura y podemos utilizarla a la hora de abrir un formulario o un informe, pues ambos la admiten, cuando lo hacemos a través del método OpenForm del Objeto DoCmd. Es decir, OpenArgs nos permite enviar una información al formulario o informe que estamos abriendo y después, desde dicho formulario, leerla y actuar en consecuencia con ella.

OpenArgs se puede utilizar de dos formas, bien a través de VBA o mediante Macros, en este artículo vamos a emplear código VBA para darle utilidad.

Ejemplo: Buscando un cliente

Supongamos un formulario de una Factura con los datos del cliente y nuestra intención es que si hacemos DobleClick sobre el Cliente o su Id nos abra el Formulario de Clientes y nos muestre toda su información. Los pasos a seguir serían:

  1. Desde el formulario Factura abrir el de clientes enviando, mediante OpenArgs, el Id del cliente
  2. Desde el formulario Clientes buscar el cliente cuyo Id corresponde con el que tenemos en OpenArgs

Vamos a ello, utilizaremos el Id que será su Nif, DNI, CIF, o cualquier otro dato que identifique al cliente. Desde el formulario Factura, en un botón dispuesto junto al cliente, en su evento «Al hacer Click» escribiremos el siguiente código:

Private Sub cmdVerCliente_Click()
    DoCmd.OpenForm "Clientes", acNormal, , , , , Me.DNI
End Sub

A la hora de abrir el formulario de Clientes podemos controlar la información que acabamos de enviarle al Formulario de la siguiente manera:

Private Sub Form_Open(Cancel As Integer)

    Dim strCliente As String
    ' Si la propiedad OpenArgs contiene un Id de Empleado, 
    ' busca al empleado correspondiente en el formulario.
    ' Por ejemplo, si la propiedad OpenArgs contiene 
    ' el Id "246548987T", desplázate al primer registro que coincida
    ' con dicho DNI.
    strCliente = Me.OpenArgs 'Guado en la variable lo que hubiera en el OpenArgs
    If Len(strCliente) > 0 Then
        DoCmd.GoToControl "IdCliente"
        DoCmd.FindRecord strCliente, , True, , True, , True
    End If

End Sub

Otro método que podríamos usar para buscar al empleado concreto podría ser:

Private Sub Form_Open(Cancel As Integer)

    If Not IsNull(Me.OpenArgs) Then
        Dim strCliente As String
        strCliente = Me.OpenArgs
        Dim RS As DAO.Recordset
        Set RS = Me.RecordsetClone
        RS.FindFirst "IdCliente = '" & _
            strCliente & "'"
        If Not RS.NoMatch Then
            Me.Bookmark = RS.Bookmark
        End If
    End If

End Sub

Otro Ejemplo: Tomar decisiones a la hora de abrir un formulario en función del OpenArgs que reciba.

Vamos a suponer que tenemos un formulario de búsqueda de Clientes al que podemos darle multitud de usos según desde el formulario que se abra el de clientes.  Nuestra finalidad es que, al hacer Doble Click sobre un cliente realicemos una acción u otra en función de quien haya llamado al formulario de Clientes.

La forma de llamar al formulario de clientes desde cualquier otro podría ser más o menos así:

Private Sub cmdBuscarUnClienteConcreto_Click()
    DoCmd.OpenForm "Clientes", acNormal, , , , , "Facturas"
End Sub

o así:

Private Sub cmdBuscarUnClienteParaInforme_Click()
    DoCmd.OpenForm "Clientes", acNormal, , , , , "Informe"
End Sub

o:

Private Sub cmdBuscarUnClienteParaEnviarMail_Click()
    DoCmd.OpenForm "Clientes", acNormal, , , , , "Mail"
End Sub

Lo que estamos haciendo es, desde tres formularios o tres botones, lo mismo da, llamar al formulario de Clientes buscando tres funcionalidades distintas. El parámetro que le estamos pasando al OpenArgs en un texto y será este el que analicemos al hacer Doble Click sobre el Cliente Buscado, mas o menos así:

Private Sub IdCliente_DblClick(Cancel As Integer)
    Select Case Me.OpenArgs
        Case Is = "Facturas"
            'Código para asignar el cliente a una factura
        Case Is = "Informe"
            'Código para abrir un informe
            'Por cierto, también se le puede enviar
            'por OpenArgs el IdCliente
        Case Is = "Mail"
            'Envía un mail al cliente seleccionado
    End Select
End Sub

Otra opción que podemos implementar, ya que estamos, es informar al usuario de que va a ocurrir cuando hagamos Doble Click sobre el IdCliente. Para ello podemos tener una etiqueta en el formulario de Clientes cuyo texto modificaremos al abrir el formulario en función del OpenArgs que contenga, mas o menos así:

Private Sub Form_Open(Cancel As Integer)
    Select Case Me.OpenArgs
        Case Is = "Facturas"
            'Código para asignar el cliente a una factura
            Me.lblInformativa.Caption = "Si pulsa Doble Click se asignará el Cliente a la factura"
        Case Is = "Informe"
            'Código para abrir un informe
            'Por cierto, también se le puede enviar
            'por OpenArgs el IdCliente
            Me.lblInformativa.Caption = "Si pulsa Doble Click se mostrará el informe mensual de este Cliente"
        Case Is = "Mail"
            'Envía un mail al cliente seleccionado
            Me.lblInformativa.Caption = "Si pulsa Doble Click se enviará un mail al cliente seleccionado"
        End Select
End Sub

Como ves se le puede dar multitud de utilidades a la propiedad OpenArgs. Aquí es como todo, es otra herramienta más que, sabiendo que existe, quizás mañana puedas implementarla en tu base de datos.

Dejaremos para un próximo artículo como hacer lo mismo a través de Macros por si no te atreves a indagar en el código VBA.

11 comentarios

  1. Si no quiero colocar argumento en OpenArgs que debo colocar al final? Si deje sin nada despues de la coma me da error, si coloco una coma mas tambien me da error.
    Gracias

    1. Simplemente no pongas la coma. La coma se pone si se quiere usar ese parámetro pero, sino se quiere utilizar, simplemente no se pone la coma.

  2. Hola, queria hacer una consulta. Yo soy un amateur de la programación. Tengo un formulario, adonde la clave principal (ID) es el DNI del cliente.
    Tengo otro formulario (#2) adonde cargo IDcliente en un campo y pongo la fecha del registro y luego agrego texto en un campo predeterminado.
    Mediante un botón con macro incrustado, abre ese segundo formulario. Lo que busco es que el ID del formulario principal sea copiado en un registro nuevo del formulario #2 y no tenga necesidad de hacer todas las veces «copy paste» desde el formulario principal. Me dio la impresión que podría hacerlo con este comando. ¿hay algun código sencillo para hacerlo o necesitare dárselo a un programador?
    Mil gracias igual.

  3. Hola, muchas gracias por el artículo. Tengo una inquietud: el OpenArgs es una variable temporal, de un solo acceso, o está disponible durante toda la vida del formulario vinculado, es decir, puede ser accesado más de una vez desde diferentes subrutinas.
    Salu2

  4. tengo el siguiente codigo, donde solo consigo que se me pase el paramatro openArgs en el primer Docmd , que ser alo que no estoy considerando?

    Private Sub btnDoctorFecha02_Click()
    If txtFechaDesde «» And txtFechaHasta «» And cmbDoctor «» Then
    If txtFechaDesde = txtFechaHasta Then
    txtDesFecha = txtFechaDesde
    Else
    txtDesFecha = «Desde » & txtFechaDesde & vbCrLf & «Hasta » & txtFechaHasta
    End If
    res = «hola»
    DoCmd.OpenReport «InfPagoDoctor1», acViewPreview, entreFechas, «fechaPago >= #» & Format(txtFechaDesde, «mm-dd-yyyy») & «# and fechaPago = #» & Format(txtFechaDesde, «mm-dd-yyyy») & «# and fechaPago <= #" & Format(txtFechaHasta, "mm-dd-yyyy") & "# and ( Doctor = '" & cmbDoctor & "')", acWindowNormal, txtDesFecha
    End If
    Else
    P = MsgBox("Debe indicar ambas Fechas y seleccionar un Doctor", vbExclamation, "Aviso")
    End If

    End Sub

  5. Private Sub btnDoctorFecha02_Click()
    If txtFechaDesde «» And txtFechaHasta «» And cmbDoctor «» Then
    If txtFechaDesde = txtFechaHasta Then
    txtDesFecha = txtFechaDesde
    Else
    txtDesFecha = «Desde » & txtFechaDesde & vbCrLf & «Hasta » & txtFechaHasta
    End If
    res = «hola»
    DoCmd.OpenReport «InfPagoDoctor1», acViewPreview, entreFechas, «fechaPago >= #» & Format(txtFechaDesde, «mm-dd-yyyy») & «# and fechaPago = #» & Format(txtFechaDesde, «mm-dd-yyyy») & «# and fechaPago <= #" & Format(txtFechaHasta, "mm-dd-yyyy") & "# and ( Doctor = '" & cmbDoctor & "')", acWindowNormal, txtDesFecha
    End If
    Else
    P = MsgBox("Debe indicar ambas Fechas y seleccionar un Doctor", vbExclamation, "Aviso")
    End If

    End Sub

  6. Hola, buenas tardes. Trato de entender lo que explicas pero no manejo BVA, pero me encanta la programación y me gusta programar sobre todo para lo que necesito en mi pequeño emprendimiento. Serias tan amable de ayudarme con un problema que tengo en un formulario «facturas de compras» en el cual ingreso los datos del proveedor «nombre, rut, dirección, fecha, numero factura, etc., y en este formulario tengo un sub formulario «lineas facturas de compra» al cual le ingreso los artículos comprados y cuando no se encuentra un articulo en la lista, agregue este código que me dieron en la web.

    Private Sub CODIGO_ARTICULO_FC_NotInList(NewData As String, Response As Integer)
    Beep
    Dim CodigoArticulonuevo As Integer, título As String ‘, mensaje As Integer
    título = «EL CODIGO NO ESTA EN LA LISTA»
    CodigoArticulonuevo = MsgBox(«DESEAS AGREGAR ESTE CODIGO», vbYesNo + vbQuestion, título)
    If CodigoArticulonuevo = vbYes Then
    DoCmd.OpenForm «ARTICULOS», acNormal, «», «», acFormAdd, acDialog, NewData
    Response = acDataErrAdded
    End If
    End Sub

    y adicional a este código me dijeron que agregara este otro código en el formulario «articulos»

    Private Sub Form_Load()
    If Nz(Me.OpenArgs, «») «» Then Me.CODIGO_ARTICULO_AOb = Me.OpenArgs
    End Sub

    y funciona de maravilla guardando el articulo que no estaba en la tabla, pero no me guastaría agregar una columna en la tabla «artículos» que me indique que proveedor me vendió ese articulo.

    Así que aprovechando que en el formulario «facturas de compra» hay un cuadro de texto con el código del proveedor (oculto), agregue un campo con el nombre «CodigoProveedor» en la tabla «artículos» y en el formulario «artículos» un cuadro de texto «CodigoProveedor». Asi cuando agregue un código que no esta en la lista en el sub formulario «lineas facturas de compra» el «código del articulo» se pase junto con el «código del proveedor»

    Que tendría que agregar o quitar para que funcione?

    De antemano muchas gracias
    Saludos de Chile

    Y agradezco que tengas la amabilidad de enseñar estos misterios de la programación

Responder a NirVano Cancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.