Este post es en ayuda para alguien que quiera buscar como trabajar con los datos del reporte sin necesidad de ir otra vez a SQL.
Es decir por ejemplo si quisiera este reporte:
Tipo 1
Característica 1 | Característica 2 | Característica 3… |
valores | valores | valores |
Total2 | Total3 |
Tipo 2
Característica 1 | Característica 2 | Característica 3 | Característica 4 | Característica 5 |
valores | valores | valores | valores | valores |
Total4 | Total5 |
…. (varios tipos dinámicos)
Y desear tener una tabla resumen con todas las sumas de cada tabla ademas de una suma total –> Total3 + Total5 + etc
Tabla Resumen
Total3 | valor |
Total5 | valor |
TotalN | valor |
… | …. |
TOTAL | valor + valor + … |
Si vemos el problema sin mucho conocimiento de SSRS, pues decidiríamos tener un stored procedure que me de cada tipo o que me de todos los tipos y otro que me de la tabla resumen. Yo pienso que eso esta de mas, porque la tabla resumen lo podríamos sacar de los datos ya obtenidos para los tipos…
y crear la variable con las expresiones o características que deseamos. Un post que me ayudo mucho en esto si lo deseas utilizar fue http://blogs.msdn.com/robertbruckner/archive/2008/07/20/Using-group-variables-in-reporting-services-2008-for-custom-aggregation.aspx es muy bueno porque te lo muestra paso a paso.
La otra forma posible de hacerlo seria utilizar los reports items, propiedad existente desde la versión 2005, para esto si necesitaría sumar esos totales no es mas que: ReportItems!NombreTotal1.value + ReportItems!NombreTotal2.value + … claro que con las validaciones correspondientes como isNothing o isNumeric, etc. Pero esto tiene un pequeño problema, si los tipos del ejemplo crecen dinámicamente en una lista o en una tabla no podría saber como se llama cada ReportItem. Para ello vamos a la siguiente solución :p …
Finalmente, vamos al tema central :p .. que se llama Custom Code. Para mi esto fue una característica en SSRS 2005 (creo que ya venia desde el 2000) que me saco de serios líos cuando quise sacar una gráfica que no venia con Reporting, entonces utilice algunas librerías gráficas, lo referencie y lo combine con unos custom codes, pero no nos desviemos :p
Para este problema en el Custom Code cree las variables publicas que necesite para almacenar los totales:
Public Valores As New System.Collections.Generic.Dictionary(Of String, Decimal)
luego agregamos el siguiente código para llenar este Dictionary
Public Function InsertarTotal(ByVal Titulo As String, ByVal Mkt As Decimal)
If (Titulo<>Nothing) then
If Valores.ContainsKey(Titulo) Then
Valores(Titulo) = Valores(Titulo) + Mkt
else
Valores.add(Titulo,Mkt)
End If
End If
InsertarTotal = 0
End Function
Con esta función almaceno en la lista de datos, indizado con el nombre, así que cada vez que haya un total llamo a la función y se inserta en la lista.
y por cada fila que deseamos agregar el valor colocamos: = … + code.InsertarTotal(Fields!Titulo.Value,Fields!Mkt.Value)
al final tenemos la lista con los valores y ya los ponemos poner en una tabla:
Usamos la misma consulta que nos dan los resultados, pero con un distintc de los totales
Titulos | Valores |
=Fields!Titulo.value | =code.Valores(Fields!Titulo.value) |
y con esto solucionamos esto, derrepente parezca sencillo a primera vista pero es un tip que me costo un día averiguarlo :p, espero les sea útil.
ya escribiré hasta el próximo break de la chamba :S
P.D.: Me olvide de comentarles que deben tener mucho cuidado con los totales en diferentes hojas!!! porque el total se pierde si es que no hacen algunos cambios 🙂
Mola el que haya variales…una cosa más a la saca :D!! Gracias
Una cosa sobre los ReportItems, hay que tener cuidado con ellos al darle formato y luego llamarlos desde otro sitio porque podrían salir valores extraños.
Algo que nos pasó en un proyecto, fue que yo los llamaba para hacer totates en diferentes tablas y al exportar a excell salía un error :(.
Buen aporte!!
Un Saludo
Fran,
Como le hiciste para llamar para totales en diferentes tablas? Cuando trato me regresa un error que solo quiere referencias a objetos en el grupo. Tienes algun ejemplo?
Se agradeceria,
Desde Arizona U.S.A.
Oscar,