en

MSGuayaquil

Recursos esenciales para el desarrollador .NET

Blog Comunitario

Paso de parametros multivalue a procedures y ejecución dinámica de queries

En reporting services existe la propiedad de multivalues la cual nos permite que dado un conjunto de valores disponibles sean estos desde un procedure o desde una lista ingresada manualmente escoger uno o mas de esos valores, el problema esta cuando tratamos de enviar esos valores a un procedure debido a que reporting services ve a los elementos seleccionados como los elementos de un arreglo y ese tipo de parametros por lo poco que he leido no es posible utilizarlos pero eso no nos libra de tener que encontrar una forma de sacarle provecho a esta util propiedad, una posible forma (la cual he probado y me ha funcionado) es la siguiente:

  • declarar un parametro con propiedad internal con el nombre del parametro del procedure <param1> de tipo string
  • declarar un parametro que tenga la lista de valores <param2>

Si el valor que se va a comparar en la base es un string

al parametro <param1> le asignamos como valor por defecto una expresion la cual será ="'" & Join(Parameters!<param2>.Value, "','") & "'" esto hace que <param1> tenga por valor los elementos elegidos de <param2> en forma la forma 'valor0','valor1','valor3' en el caso de que se seleccionaran los valores 0, 1 y 3 si fueran otros los indices estos valores variarian

si fuera un grupo de enteros seria
=& Join(Parameters!<param2>.Value, "','")

con esto nos damos cuenta que podemos formar el valor a comparar en el procedure esto es

select ....
  from ....
where parametro  in (<param1>)


ahora debemos modificar el procedure para que el valor del parametro de entrada sea un varchar de longitud n porque n eso depende de la cantidad maxima de datos a seleccionarse recordemos que se han añadido , y 's si queremos ganar unos cuantos characteres podriamos añadir las 's en el procedure

además recordemos que el valor que es utilizado por el in no puede ser un string formateado porque en ese caso el lo tomara como si fuera 1 unico valor; como resolver ese problema? utilizando una ejecucion dinamica

esto es exec(<query>) donde query es un string con un query valido en este caso un select
entonces nuestro procedure un select que sería ejecutado y ese conjunto de filas retornado al dataset del reporting services.

esto sería

create procedure SelectDinamicoParametroMultivalor
 @parametroEntrada varchar(50)
as
begin

 declare @select varchar(100), @from varchar(100), @where varchar(100);

 set @select = '<select>'; --el select del query a ejecutar
 set @from =' <from>'; -- el from
 set @where = ' where <parametro> in (' + @parametroentrada + ')'; -- el where

 exec (@select +  @from + @where);

end;

Notese que deje un espacio en blando al iniciar el from y el where esto es debido a que al concatenar los string puede dar un mensaje de error y seria porque el from quedaria unido a ultimo valor del select y en el caso del where con el del from

Espero les sea de utilidad y si tienen otra forma de implementacion me agradaria que la compartan

Comentarios

 

Andres dijo:

Hola, muchas gracias por el aporte, pero mira esta pagina, lo solucionan mucho mas facil, solo es correr la funcion SPLIT de SQL, les dejo el link para que lo miren, yo lo estoy usando y funciona muy bien

msdn.microsoft.com/.../default.aspx

Otra forma es usar el replace dentro del Stored Procedure..

February 22, 2008 12:38 PM
 

jhordan dijo:

de verdad es de mucha ayuda gracias por preocuparse por la gente que realmente lo nesecita

May 3, 2008 8:20 PM
 

dlplenin dijo:

buen aporte cramtor

gracias

July 7, 2008 4:03 PM

Deja tu Comentario

(requerido)  
(opcional)
(requerido)  

Ingresa los números de la imagen:
© 2007 MSGuayaquil. Todos los derechos reservados.
Powered By IIS 6 Powered By ASP.NET 2.0 Ofrecido por Community Server (Commercial Edition) Powered By SQL Server 2005
Creado y Administrado por Julio Casal