Parametrizar stored procedures desde excel

31/01/2007 - 15:49 por Tininisku | Informe spam
Estoy intentando enviar parámetros desde Excel a un procedimiento almacenado
en SQLServer 2000(exec xx_pruebas param1,param2). Sigo las instrucciones de
MSQuery de cómo convertir los parámetros de entrada del procedimiento en
variables (substituyendo los parámetros de entrada por '?'), pero me genera
un error: 'No se admiten parámetros en consultas que no se pueden representar
gráficamente'. ¿Cómo tengo que crear la sentencia SQL para que admita
parámetros variables y que por tanto se los pueda enviar desde Excel?
Gracias.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
01/02/2007 - 04:57 | Informe spam
hola, 'anonimo/a' !

Estoy intentando enviar parametros desde Excel a un procedimiento almacenado en SQLServer 2000 (exec xx_pruebas param1,param2).
Sigo las instrucciones de MSQuery de como convertir los parametros de entrada del procedimiento en variables
(substituyendo los parametros de entrada por '?'), pero me genera un error:
'No se admiten parametros en consultas que no se pueden representar graficamente'.
Como tengo que crear la sentencia SQL para que admita parametros variables y que por tanto se los pueda enviar desde Excel?



[aunque seria bueno si expones los 'detalles faltantes' del procedimiento en sql...] -?-
-> ve si te sirve algo de lo comentado en los siguientes enlaces...
Ed Ferrero: Run SQL Server stored procedure in Excel macro -> http://tinyurl.com/pdmg2
Robin Hammond: Stored procedures -> http://tinyurl.com/lpak2
{+} Getting stored procedure result to excel -> http://tinyurl.com/epors
Sean Connolly: pass paramter to SQL server stored procedure -> http://tinyurl.com/rdavt
conversaciones varias -> http://tinyurl.com/op4k5
otra conversacion mas > http://tinyurl.com/3yyjtr

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Tininisku
01/02/2007 - 22:10 | Informe spam
Hola, Héctor,
gracias por los links, me pongo a ello.
Los detalles del procedimiento que me pedías:
es un procedure al que tengo que pasar 5 parametros referentes a códigos de
producto differentes entre aprox. 2000 que el usuario tecleará en Excel para
trabajar con ellos dentro del procedimiento y crear una tabla temporal que
és devuelta a Excel como resumen para que el usuario haga sus promedios y
estudios a partir de ellos.
Respuesta Responder a este mensaje
#3 Tininisku
01/02/2007 - 22:35 | Informe spam
Ya veo que la solución pasa siempre por VB... Que le vamos a hacer.
He encontrado un articulo que me soluciona el problema, muchas gracias,
ahunque no tengo claro como preguntar al usuario los parámetros, pués en este
artículo, están prefijados dentro del script.
El código propuesto és el siguiente:
Sub OpencnnSQL()
Dim cnnSQL As ADODB.Connection
Dim cmdSQL As ADODB.Command
Dim rstSQL As ADODB.Recordset
Dim prm(2) As ADODB.Parameter
Dim strCnn As String, strSQL As String
Dim iCol As Integer, fldCount As Integer

strCnn = Empty
strCnn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=True;" & _
"Initial Catalog=Northwind;Data Source=localhost"
strSQL = Empty
' This stored procedure is in the SQL Server 2000 Northwind dB.
' It takes 2 parameters (@Beginning_Date and @Ending_Date) and returns
6 fields.
strSQL = strSQL & "dbo.[Employee Sales by Country]"

Set cnnSQL = New ADODB.Connection
Set cmdSQL = New ADODB.Command
Application.StatusBar = "Connecting ..."
With cnnSQL
.CursorLocation = adUseClient
.Open strCnn
End With
With cmdSQL
.ActiveConnection = cnnSQL
.CommandText = strSQL
.CommandType = adCmdStoredProc
Set prm(1) = .CreateParameter("Beginning_Date", adDate, adParamInput)
' Parameter values could also be passed to this subroutine or
retrieved from user at run-time.
prm(1).Value = "June 1, 1997"
Set prm(2) = .CreateParameter("Ending_Date", adDate, adParamInput)
prm(2).Value = "June 30, 1997"
For i = 1 To UBound(prm)
.Parameters.Append prm(i)
Next i
End With
Application.StatusBar = "Executing ..."
Set rstSQL = cmdSQL.Execute
' Select destination for results
With ThisWorkbook.Worksheets(6)
.Activate
.UsedRange.EntireColumn.Delete
Application.StatusBar = "Populating ..."
fldCount = rstSQL.Fields.Count
For iCol = 1 To fldCount
.Cells(1, iCol).Value = rstSQL.Fields(iCol - 1).Name
Next
.Cells(2, 1).CopyFromRecordset rstSQL
Application.StatusBar = "Formatting ..."
.Rows(1).Font.Bold = True
.UsedRange.Columns.AutoFit
.Cells(1, 1).Activate
End With
Application.StatusBar = "Closing ..."
rstSQL.Close
cnnSQL.Close
Set rstSQL = Nothing
Set cmdSQL = Nothing
Set cnnSQL = Nothing
Application.StatusBar = False
End Sub
es una solución muy bonita, pero ¿cómo puedo preguntar al usuario por los
códigos que desea consultar?
Gracias de antemano.
Por cierto, me llamo Jordi, hasta la vista!
Respuesta Responder a este mensaje
#4 Héctor Miguel
02/02/2007 - 01:31 | Informe spam
hola, Jordi !

... la solucion pasa siempre por VB... Que le vamos a hacer. He encontrado un articulo que me soluciona el problema
... aunque no tengo claro como preguntar al usuario los parametros... en este articulo, estan prefijados dentro del script...



para el caso 'especifico' del ejemplo de codigo que has encontrado adaptable a tus requerimientos...
las partes de codigo que 'proveen' los parametros al procedimiento almacenado son:
prm(1).Value = "June 1, 1997"
prm(2).Value = "June 30, 1997"



-> para cambiar por datos proporcionados por el usuario [o tomados de alguna celda en alguna hoja de calculo]
solo cambia la seccion a la derecha del signo '=' +/- por alguna de las siguientes variantes...
a) para tomarlos de alguna celda: -> prm(1).Value = Range("a1")
b) para preguntarselos al usuario: -> prm(1).Value = InputBox("Indica la fecha correspondiente")
o podrias establecerlos previamente por medio de variables [obviamente del 'tipo' adecuado]

-> nota en en estos casos se asume/espera/confia/... que el tipo de dtos que se provee ES exactamente lo que espera el procedimiento

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto/encontrado/... __
El codigo propuesto es el siguiente:
Sub OpencnnSQL()
Dim cnnSQL As ADODB.Connection
Dim cmdSQL As ADODB.Command
Dim rstSQL As ADODB.Recordset
Dim prm(2) As ADODB.Parameter
Dim strCnn As String, strSQL As String
Dim iCol As Integer, fldCount As Integer
strCnn = Empty
strCnn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;" & _
"Initial Catalog=Northwind;Data Source=localhost"
strSQL = Empty
' This stored procedure is in the SQL Server 2000 Northwind dB.
' It takes 2 parameters (@Beginning_Date and @Ending_Date) and returns 6 fields.
strSQL = strSQL & "dbo.[Employee Sales by Country]"
Set cnnSQL = New ADODB.Connection
Set cmdSQL = New ADODB.Command
Application.StatusBar = "Connecting ..."
With cnnSQL
.CursorLocation = adUseClient
.Open strCnn
End With
With cmdSQL
.ActiveConnection = cnnSQL
.CommandText = strSQL
.CommandType = adCmdStoredProc
Set prm(1) = .CreateParameter("Beginning_Date", adDate, adParamInput)
' Parameter values could also be passed to this subroutine or retrieved from user at run-time.
prm(1).Value = "June 1, 1997"
Set prm(2) = .CreateParameter("Ending_Date", adDate, adParamInput)
prm(2).Value = "June 30, 1997"
For i = 1 To UBound(prm)
.Parameters.Append prm(i)
Next i
End With
Application.StatusBar = "Executing ..."
Set rstSQL = cmdSQL.Execute
' Select destination for results
With ThisWorkbook.Worksheets(6)
.Activate
.UsedRange.EntireColumn.Delete
Application.StatusBar = "Populating ..."
fldCount = rstSQL.Fields.Count
For iCol = 1 To fldCount
.Cells(1, iCol).Value = rstSQL.Fields(iCol - 1).Name
Next
.Cells(2, 1).CopyFromRecordset rstSQL
Application.StatusBar = "Formatting ..."
.Rows(1).Font.Bold = True
.UsedRange.Columns.AutoFit
.Cells(1, 1).Activate
End With
Application.StatusBar = "Closing ..."
rstSQL.Close
cnnSQL.Close
Set rstSQL = Nothing
Set cmdSQL = Nothing
Set cnnSQL = Nothing
Application.StatusBar = False
End Sub
Respuesta Responder a este mensaje
#5 Tininisku
06/02/2007 - 12:42 | Informe spam
Grácias de nuevo!
Esta semana llevo un poco de lío, pero a la que pueda lo implanto, a ver si
són capaces de respetar el formato de fecha!
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida