Para ejecutar procedimientos almacenados escritos en SQL Server desde Microsoft Access, solo tenemos que recurrir a ADODB.
A través de esta librería, disponemos de varios objetos que nos ofrecerán a su vez varios modos de ejecutar:
- Directamente a través del objeto Connection. Este es el método más sencillo y es adecuado para procedimientos que no devuelvan información, aunque si se le puede enviar información en la llamada al procedimiento.
- A través de un objeto Command. Por este método sí podemos asociar parámetros al procedimiento que nos permiten tanto enviar como recibir informacion (input, output, input/output).
Veamos unos ejemplos:
A través del objeto Connetion:
Dim cs As String
cs = "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=True;User ID=pepe;Initial Catalog=basededatos;Data Source=192.168.3.44"
Dim objConn As New ADODB.Connection
objConn.Open cs
objConn.Execute "exec actualizar_empresa '" + Trim(Me.CIF_NIF.Value) + "','Nombre_Base_Datos'"
A través del objeto command:
Dim cs As String
cs = "Provider=SQLOLEDB.1;Password=1234; Persist Security Info=True; User ID=pepe;Initial Catalog=basededatos;Data Source=192.168.3.44"
Dim objConn As New ADODB.Connection
objConn.Open cs
Dim objRs As New ADODB.Recordset
Dim oc As New ADODB.Command
Set oc.ActiveConnection = objConn
'El procedimiento almacenado en SQL Server es actualizar_empresa
oc.CommandText = "actualizar_empresa"
oc.CommandType = adCmdStoredProc
'Podemos enviar parámentros de entrada. Ej enviamos datos para un filtro.
Dim op As ADODB.Parameter
Set op = oc.CreateParameter("CIF_EMPRESA", adVarChar,adParamInput, 9)
oc.parameters.Append op
op.Value = Trim(cif)
Dim op1 As ADODB.Parameter
Set op1 = oc.CreateParameter("NOMBRE", adVarChar, adParamInput, 50)
oc.parameters.Append op1
op1.Value = "PEPE SANCHEZ"
oc.Execute
Por supuesto este código irá escrito en algún evento del formulario de Access desde el que deseemos lanzar el procedimiento.
Por último reseñar que debemos de tener referenciada en Access la librería ADO que deseamos usar (Herramientas – referencias y selecciónar la versión de Microsoft Activex Data Objects… que deseamos usar, con la 2.1 library funciona).
Estos ejemplos están probados para Access 2007 contra un procedimiento almacenado programado en SQL Server 2005.
Buenas tardes .podrán decirme si puedo enlazar un procedimiento almacenado en SQL que devuelve registros a un recordset de un formulario de Access ?He logrado con una tabla una consulta. Pero no con un SPGracias! !!
Ese tema no lo he trabajado, imagino que sí, pero ahora mismo no sabría decirle al 100%. De todos modos la opción de crear una tabla temporal que pueda usar y posteriormente eliminarla no es mala opción.
Un saludo.
buenas tardes muy interasante su post pero tengo un problema al ejecutar el Private Sub Comando0_Click()Dim cs As String cs = «Provider=SQLOLEDB.1;Password=Bf0ment0;Persist Security Info=True;User ID=sa;Initial Catalog=BASE_RIESGOS;Data Source=srvsqlserver» Dim objConn As New ADODB.Connection objConn.Open cs objConn.Execute «exec patrimonio » + «8» + «,» + «2014» ////** el 8 y 2014 son parametros que tiene mi store procedure que son numero de mes y y añoEnd Subel problema es que me tira un mensaje de «EXPIRO TIEMPO DE ESPERA DE LA CONSULTA » me podria ayudar con este problema ya que e buscado y no e podido solucionarloesperare muy agradecido su respuesta
Estimado Brando, casi con toda seguridad su procedimento está fallando y no llega a finalizar y claro pasado un tiempo el sistema devuelve el error que usted comenta.
Revise su procedimiento.
Buenos días quiero hacerle la siguiente pregunta. Pues llevo varios días investigando por internet y no lo encuentro y lo más aproximado lo explica usted.
Tengo un procedimiento almacenado en un servidor sql, por ejemplo «BuscarDni», que tiene un parametro de entrada que es el DNI a buscar, y este procedimiento almacenado nos puede devolver un registro, o muchos registros o nada y esto meterlo en un recordset
¿Esto se puede hacer en Access.?
Un saludo y muchas gracias.
Ciertamente nunca he probado lo que usted dice. En .NET si lo he hecho, pero claro las estructuras de .NET son más actuales (Dataset) que los antiguos recordset.
Como idea por si no lo consigue, siempre puede hacer un procedimiento que cree una tabla temporal con los datos deseados de modo que esa tabla una vez usada desde su aplicación sea eliminada.
Un saludo.
Antes que nada te felicito por tu excelente trabajo. Evolucionado en esto de las bases de datos he creado un proyecto ADP. Hasta aquí todo bien pero me doy cuenta que no puedo usar casi nada de lo conocido en Access y que hay que familiarizarse con T-SQL.
No he podido filtrar un cuadro combinado en base a un cuadro de texto en un formulario. Algo tan sencillo en Access. El origen de la fila del ComboBox es un procedimiento almacenado el cual tiene un parámetro que es el que debería filtrarlo.
CREATE PROCEDURE sp_storedprocedure
@myinput int
AS
SELECT columna1, columna2 FROM Tabla1
WHERE columna1 = @myInput
GO
@myinput es igual a Me.Texto1.Value
¿Cómo puedo pasarle el valor del parámetro al Procedimiento? Cuando pulso sobre el cuadro combinado siempre me abre un cuadro de diálogo pidiéndome el parámetro. Te agradezco de antemano.
Estimado lector.
En respuesta a su consulta le comento que en los dos ejemplos que acompaño en el post, puede usted ver como enviar parámetros a un procedimiento almacenado.
Creo que el problema por lo que me comenta es que los que usted está intentando enviar está vacío con lo que access le pide el valor antes de hacer la llamada (como cuando en una consulta no pode el valor de filtro).
Yo le aconsejo que ejecute paso a paso el código de Access y se asegure de que está usando bien las propiedades del combo para seleccionar el valor deseado y por tanto se está enviando bien ese valor a la llamado.
No encuentro otra razón por la que no funcione ese código.
Buenas tardes amigo,
De antemano le agradezco por su respuesta que me ha sido muy útil =), pero a la vez me surge una nueva duda y que se estoy muy cerca de lograr sacar mi proyecto y es la siguiente:
objConn.Execute «exec monitoreo_trx ‘» + Trim(Me.CIF_NIF.Value) + «‘,’monitoreo_trx'»
Que significa Trim(Me.CIF_NIF.Value) que me arroja error cuando ejecuto el código desde Access, a que nos referimos con el Trim y el código que esta en paréntesis.
Nuevamente gracias por la atención y quedo atento a sus comentarios.
La función Trim, lo que hace es quitar todos los espacios en blanco que tenga el argumento al principio y al final. Ejemplo Trim (» hola amigo «), devuelve la cadena «hola amigo».
Por qué razón imagino que le dá un error a usted, pues porque CIF_NIF.Value contenga el valor NULL. Un modo de evitar el error es solo aplicar la función Trim si el argumento es distinto de NULL. Ej.:
If IsNull(CIF_NIF.Value) = true then
En base a esa respuesta actuar.
Espero que le sirva.
Un saludo.