Correr procedimientos con parámetros en access

En estos días he estado profundizando sobre la forma de ejecutar un procedimiento desde fuera de la base de datos access. Encontré un código en internet que ejecuta el procedimiento desde Excel. Este es:
Dim APPACC As New Access. Application
Dim ACCFILE As String
ACCFILE = "" & ThisWorkbook. Path & "\Recibidos. Accdb"
APPACC. OpenCurrentDatabase (ACCFILE)
APPACC. Run ("publico")
APPACC. Quit
Set APPACC = Nothing
La Pregunta es la siguiente:
¿Alguien sabe si hay alguna forma de introducir parámetros desde Excel para que se ejecuten dentro del procedimiento o función en Access?
Muchas Gracias por su atención y colaboración.
1

1 Respuesta

165.800 pts. Más de 35 años en la informática y más de 20 trabajando...
Los parámetros que quieres pasar al procedimiento los tienes que poner el la instrucción "Run", separados del nombre del procedimiento por comas.
Por ejemplo, para llamar al procedimiento 'calcularFactorial' pasando el valor 6 como parámetro, pondrías:
    APPACC. Run "calcularFactorial", 6
Los paréntesis sobran en la llamada ya que sino entendería que se trata de una función y tendrías que asignar el resultado a una variable.
Excelente respuesta, me gustaría que me acalarara:
"Los paréntesis sobran en la llamada ya que sino entendería que se trata de una función y tendrías que asignar el resultado a una variable."
Ojala sea con un ejemplo incluyendo la llamada desde axcel y la función ejecutada en access.
Gracias..
La llamada a un procedimiento no devuelve por sí un resultado (puede hacerlo a través de los parámetros, pero no el propio procedimiento). Esta llamada puede hacerse poniendo los parámetros entre paréntesis o sin ellos.
Normalmente no suelen ponerse paréntesis en las llamadas a procedimientos.
Cuando haces una llamada a una función como tal, los parámetros tienen que ir siempre entre paréntesis y el resultado hay que asignarlo a una variable.
También podemos tener definida una función y llamarla como si fuera un procedimiento. En ese caso, la llamada no llevaría los parámetros entre paréntesis y no se asignaría a ninguna variable.
A ver si con un ejemplo me consigo explicar bien.
Supongamos que definimos una función que nos presente el factorial de un número en un mensaje.
Function factorial(ByVal n As Integer) As Long
    Dim i As Integer
    Dim aux As Long
    aux = 1
    For i = 1 To n
        aux = aux * i
    Next i
    MsgBox "El factorial es: " & Format$(aux, "#,##0")
    factorial = aux
End Function
Sub llamarFuncionFactorial(ByVal valorN As Integer)
    Dim aux As Long
    ' Llamada estilo procedimiento. Presenta el mensaje pero no recuperamos el resultado
factorial valorN
    ' Llamada estilo función. Ejecuta lo mismo, pero a la vuelta tendremos el resultado
' en nuestra variable
aux = factorial(valorN) ' El parámetro siempre entre paréntesis
End Sub
Sub prueba()
    LlamarFuncionFactorial 4
    LlamarFuncionFactorial (6) ' No se suele poner entre paréntesis por llamar a un procedimiento (sub)
End Sub
Muchas Gracias es de gran ayuda la información que posteas. Aunque personalmente viendo correr el programa en red se torna un poco lento al momento de abrir la aplicación de access, Por lo cual he pensado en la forma de correr el procedimiento o función con ADODB para ver si gano un poco de tiempo. Me dice si cerramos este caso o me colabora si puede con la ejecución de un proedimiento o función con parámetros con ADODB.
Nuevamente,
Muchas Gracias
Piensa que trabajando en red es bastante fácil que las bases de datos se vuelvan lentas.
Necesitan una gran cantidad de información y, aunque las redes son rápidas, muchas veces son insuficientes.
Por si te sirve de ayuda te comento cómo suelo hacerlo yo en mi trabajo.
Yo accedo desde access y VB a múltiples bases de datos tanto en Access como DB2, Oracle y Sql Server, de lo más variado, y con una red que realmente es muy buena. Pero si tengo que estar accediendo continuamente a cada uno de los orígenes la cosa se vuelve lenta.
La solución: relativamente sencilla. Hago una copia inicial de los datos que voy a necesitar y a partir de ese momento leo los datos de mi propia base de datos en lugar de acceder a otras.
Por ejemplo, antes de empezar los procesos hago una copia de la tabla de clientes con:
on error resume next
docmd.runsql "drop table misClientes"
on error goto 0
docmd.runsql "select * into misClientes from clientes"
Docmd. Runsql "create unique index primaryKey on misClientes(nCliente) with primary"
Con eso consigo tener la tabla de clientes en local y el acceso es muchísimo más rápido.
Además, al copiarme los datos al principio evito que me modifiquen la información mientras estoy ejecutando mi proceso.
Espero que te sea de ayuda.
Respecto a la pregunta anterior, si quieres la cierras o la mantienes. Como quieras.
Ok buena solución, pero sabe si puedo correr procedimientos y funciones usando ADODB, le agradezco me colabore.
Desde Excel puedes usar accesos DAO o ADODB, el que quieras. Incluso los dos al mismo tiempo. Lo único que tienes que hacer es incluir una referencia (menú herramientas) a la biblioteca para manejar estos objetos.
Eso sí, mi consejo es intentar trabajar siempre con uno de los dos tipos ya que si intentas manejar los dos a la vez te puedes liar (hay algunas variaciones entre ambos).
Puede dar algún ejemplo de como correr procedimiento o función con ADODB.
Supongamos que tienes una tabla de clientes con un campo 'snImprimir' para marcar los registros que quieres imprimir en un momento determinado. Esta tabla está en una base de datos llamada 'facturación.mdb'.
Podríamos hacer un proceso que marque para imprimir todos aquellos clientes cuya fecha de alta sea del año actual.
Sub ejemplo1()
    Dim cn As New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Facturacion.mdb;" & _
                          "Persist Security Info=False"
    cn.Execute "update clientes set snImprimir=year(fechaAlta)=year(now())"
    cn.Close
    Set cn = Nothing
End Sub
Sub ejemplo2()
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Facturacion.mdb;" & _
                          "Persist Security Info=False"
    rs.Open "clientes", cn
    If Not rs.EOF Then rs.MoveFirst
    Do While Not rs.EOF
        If Year(rs!fechaAlta) = Year(Now()) Then rs!snImprimir = True Else rs!snImprimir = False
        rs.Update
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub
Estos son un par de formas de hacer lo mismo. Lo más correcto es la primera, pero en la segunda se ve mejor el manejo de registros.
Perdón por no ser claro pero lo que quiero no es hacer consulta ni actualizaciones lo que quiero es correr un procedimiento o función a través adodb (es decir desde excel voy a usar un procedimiento de access) algo igual como la primera pregunta pero no abriendo el archivo para ejecutar el procedimiento sino ejecutarlo a través de adodb. Espero ser claro y puedas comprender la pregunta y tener una solución a mi inquietud, Muchas Gracias.
Que yo sepa, desde ADODB no se pueden lanzar ejecuciones de procedimientos/funciones de una base de datos.
El método "execute" de la conexión de ADODB ejecuta consultas de acciones, no procedimientos almacenados en VB.
Vamos, que yo sepa es así. Si encuentras alguna forma de hacerlo dímelo, pero tengo mis dudas ya que no me parece lógico que se pueda hacer.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas