Access, Excel, VBA y más

Domina la propiedad OpenArgs en Access

Domina 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.

Salir de la versión móvil