Saltar al contenido

¿Cómo uso los parámetros en VBA en los diferentes contextos en Microsoft Access?

Nuestro team de expertos pasados muchos días de trabajo y recopilar de información, dimos con la solución, esperamos que resulte útil para ti para tu proyecto.

Solución:

Hay muchas formas de utilizar parámetros en consultas. Trataré de proporcionar ejemplos para la mayoría de ellos y donde sean aplicables.

Primero, analizaremos las soluciones exclusivas de Access, como formularios, informes y agregados de dominio. Luego, hablaremos de DAO y ADO.


Usar valores de formularios e informes como parámetros

En Access, puede usar directamente el valor actual de los controles en formularios e informes en su código SQL. Esto limita la necesidad de parámetros.

Puede hacer referencia a los controles de la siguiente manera:

Forms!MyForm!MyTextbox para un control simple en un formulario

Forms!MyForm!MySubform.Form!MyTextbox para un control en un subformulario

Reports!MyReport!MyTextbox para un control en un informe

Implementación de muestra:

DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Forms!MyForm!MyTextbox" 'Inserts a single value
DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE ID = Forms!MyForm!MyTextbox" 'Inserts from a different table

Está disponible para los siguientes usos:

Cuando usas DoCmd.RunSQL, consultas normales (en la GUI), fuentes de registros de formularios e informes, filtros de formularios e informes, agregados de dominios, DoCmd.OpenForm y DoCmd.OpenReport

Esto es no disponible para los siguientes usos:

Al ejecutar consultas utilizando DAO o ADODB (por ejemplo, abrir conjuntos de registros, CurrentDb.Execute)


Usando TempVars como parámetros

TempVars en Access son variables disponibles globalmente, que se pueden configurar en VBA o usando macro’s. Se pueden reutilizar para múltiples consultas.

Implementación de muestra:

TempVars!MyTempVar = Me.MyTextbox.Value 'Note: .Value is required
DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE ID = TempVars!MyTempVar"
TempVars.Remove "MyTempVar" 'Unset TempVar when you're done using it

La disponibilidad de TempVars es idéntica a la de los valores de formularios e informes: no disponible para ADO y DAO, disponible para otros usos.

Recomiendo TempVars para usar parámetros al abrir formularios o informes en lugar de hacer referencia a nombres de control, ya que si el objeto que lo abre se cierra, las TempVars permanecen disponibles. Recomiendo usar nombres únicos de TempVar para cada formulario o informe, para evitar rarezas al actualizar formularios o informes.


Usar funciones personalizadas (UDF) como parámetros

Al igual que TempVars, puede utilizar una función personalizada y static variables para almacenar y recuperar valores.

Implementación de muestra:

Option Compare Database
Option Explicit

Private ThisDate As Date


Public Function GetThisDate() As Date
    If ThisDate = #12:00:00 AM# Then
        ' Set default value.
        ThisDate = Date
    End If 
    GetThisDate = ThisDate
End Function


Public Function SetThisDate(ByVal NewDate As Date) As Date
    ThisDate = NewDate
    SetThisDate = ThisDate
End Function

y luego:

SetThisDate SomeDateValue ' Will store SomeDateValue in ThisDate.
DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE [SomeDateField] = GetThisDate()"

También una único funcionar con un Opcional El parámetro se puede crear tanto para configurar como para obtener el valor de un static variable:

Public Function ThisValue(Optional ByVal Value As Variant) As Variant
    Static CurrentValue As Variant
    ' Define default return value.
    Const DefaultValue  As Variant = Null

    If Not IsMissing(Value) Then
        ' Set value.
        CurrentValue = Value
    ElseIf IsEmpty(CurrentValue) Then
        ' Set default value
        CurrentValue = DefaultValue
    End If
    ' Return value.
    ThisValue = CurrentValue
End Function

Para establecer un valor:

ThisValue "Some text value"

Para obtener el valor:

CurrentValue = ThisValue

En una consulta:

ThisValue "SomeText"  ' Set value to filter on.
DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE [SomeField] = ThisValue()"

Usando DoCmd.SetParameter

Los usos de DoCmd.SetParameter son bastante limitados, así que seré breve. Le permite establecer un parámetro para su uso en DoCmd.OpenForm, DoCmd.OpenReport y alguna otra DoCmd declaraciones, pero no funciona con DoCmd.RunSQL, filtros, DAO y ADO.

Implementación de muestra

DoCmd.SetParameter "MyParameter", Me.MyTextbox
DoCmd.OpenForm "MyForm",,, "ID = MyParameter"

Usando DAO

En DAO, podemos usar el DAO.QueryDef para crear una consulta, establecer parámetros y luego abrir un conjunto de registros o ejecutar la consulta. Primero configura el SQL de las consultas, luego usa el QueryDef.Parameters colección para establecer los parámetros.

En mi ejemplo, usaré tipos de parámetros implícitos. Si desea hacerlos explícitos, agregue un PARAMETERS declaración a su consulta.

Implementación de muestra

'Execute query, unnamed parameters
With CurrentDb.CreateQueryDef("", "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE Field1 = ?p1 And Field2 = ?p2")
    .Parameters(0) = Me.Field1
    .Parameters(1) = Me.Field2
    .Execute
End With

'Open recordset, named parameters
Dim rs As DAO.Recordset
With CurrentDb.CreateQueryDef("", "SELECT Field1 FROM Table2 WHERE Field1 = FirstParameter And Field2 = SecondParameter")
    .Parameters!FirstParameter = Me.Field1 'Bang notation
    .Parameters("SecondParameter").Value = Me.Field2 'More explicit notation
    Set rs = .OpenRecordset
End With

Si bien esto solo está disponible en DAO, puede establecer muchas cosas en los conjuntos de registros DAO para que usen parámetros, como conjuntos de registros de formulario, conjuntos de registros de cuadro de lista y conjuntos de registros de cuadro combinado. Sin embargo, dado que Access usa el texto, y no el conjunto de registros, al ordenar y filtrar, esas cosas pueden resultar problemáticas si lo hace.


Usando ADO

Puede usar parámetros en ADO usando el ADODB.Command objeto. Usar Command.CreateParameter para crear parámetros y luego agregarlos a la Command.Parameters colección.

Puedes usar el .Parameters colección en ADO para declarar explícitamente parámetros, o pasar un parámetro array al Command.Execute método para pasar parámetros implícitamente.

ADO no admite parámetros con nombre. Si bien puede pasar un nombre, no se procesa.

Implementación de muestra:

'Execute query, unnamed parameters
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    Set .ActiveConnection = CurrentProject.Connection 'Use a connection to the current database
    .CommandText = "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE Field1 = ? And Field2 = ?"
    .Parameters.Append .CreateParameter(, adVarWChar, adParamInput, Len(Me.Field1), Me.Field1) 'adVarWChar for text boxes that may contain unicode
    .Parameters.Append .CreateParameter(, adInteger, adParamInput, 8, Me.Field2) 'adInteger for whole numbers (long or integer)
    .Execute
End With

'Open recordset, implicit parameters
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    Set .ActiveConnection = CurrentProject.Connection 'Use a connection to the current database
    .CommandText = "SELECT Field1 FROM Table2 WHERE Field1 = @FirstParameter And Field2 = @SecondParameter"
     Set rs = .Execute(,Array(Me.Field1, Me.Field2))
End With

Se aplican las mismas limitaciones que para abrir conjuntos de registros DAO. Si bien esta forma se limita a ejecutar consultas y abrir conjuntos de registros, puede utilizar esos conjuntos de registros en cualquier otro lugar de su aplicación.

Agradecemos que quieras patrocinar nuestro trabajo dejando un comentario y dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *