reporting services - una - Poblando con ''0'' cuando los datos en SSRS no existen
error al procesar el informe no se puede crear un lector de datos para el conjunto de datos (2)
Estoy tratando de crear un informe en SSRS donde tengo una matriz, que tiene el género como encabezados de columna y grupos de edad definidos específicamente como las filas. El informe está ordenado por fecha (es decir, los registros que se muestran están filtrados por el valor de modifedAt). Mi problema es que deseo que se muestren todas las categorías de grupos de edad, incluso si el conjunto de datos no devuelve ningún dato para esa fila.
Entonces, por ejemplo, si configuro la fecha como una fecha donde no hay filas de db donde hay niños de Age5-16, aún quiero mostrar el nombre de la categoría, pero solo tengo que mostrar las celdas relacionadas con esa fila '' 0 ''. En cambio, el informe simplemente descarta toda la fila porque, obviamente, la consulta no devuelve datos.
¿La solución es tener un conjunto de datos por separado que devuelva toda la lista de categorías y luego, de alguna manera, las una a las otras? Estoy atrapado aquí así que cualquier ayuda es apreciada!
Puedo pensar en algunas maneras de hacer esto:
Nivel de conjunto de datos
En lugar de simplemente devolver los datos relevantes en los datos subyacentes en el conjunto de datos, incluya todas las categorías que desea mostrar en todos los casos.
Por ejemplo, para una consulta de base de datos, puede ser la diferencia entre una left join
inner
y una left join
, es decir, que va desde algo como:
select *
from AgeGroup
inner join MyData on ...
a:
select *
from AgeGroup
left join MyData on ...
Por lo tanto, el informe siempre tiene todos los grupos de edad para mostrar. Donde hay valores NULL
, solo muestra 0.
Creo que esta es la mejor opción si tiene control sobre el DataSet: no tendrá que actualizar su informe, con suerte, los cambios reales en el DataSet deben ser mínimos, solo hay una llamada al DataSet, y es por mucho más simple de mantener.
Grupos de código duro en el informe
Aquí incluye una fila de encabezado de tabla para cada grupo que desea mostrar, por lo que siempre se muestran en todos los casos.
Aquí tiene algún tipo de expresión condicional para mostrar los valores, por ejemplo, para cada fila de grupo se adaptará a ese grupo:
=Sum(IIf(Fields!AgeGroup.Value = "5-16", Fields!Amount.Value, Nothing)
Esto no es demasiado flexible y necesitará actualizaciones a medida que cambia de grupo, y no tiene tantas opciones para el diseño. Todavía hay una sola llamada DataSet, por lo que es un plus.
Subinformes
Puede tener un DataSet primario que muestre una fila para cada grupo de edad, luego incrustar un subinforme en cada fila que muestre los datos que desea para esa fila.
Esto le permite flexibilidad en el diseño, pero agregará complejidad al informe (s) y significará que realizará muchas llamadas al DataSet que podrían evitarse con otras opciones.
Sé que esto es viejo, pero quería profundizar en la sección 1 de Ian anterior usando uniones en el nivel del conjunto de datos. (Su respuesta fue muy útil para mí para un informe en el que estoy trabajando).
por op:
¿La solución es tener un conjunto de datos separado que devuelva toda la lista de categorías y luego, de alguna manera, las una a las otras?
Así es como lo he manejado con éxito, pero puede hacerlo sin crear un conjunto de datos por separado mediante el uso de expresiones de tabla comunes (o tablas temporales, por supuesto).
Para estas tablas de ejemplo:
AGE_Table
ID Group Group_Desc Toys
1 A 00-10 Teddy Bear
2 B 11-20 Video Game
3 C 21-30 Sports Car
4 D 31-40 Mansion
5 E 41-50 Jewelry
People_Table (filtered for whatever date)
ID Name Age Gender Age_Group
1 Ariel 07 F A
2 Brandon 23 M C
3 Chelsea 27 F C
4 Derek 06 M A
Desea ver 2 resultados para la fila 00-10, 2 para la fila 21-30 y, a continuación, siga viendo filas para los otros grupos de edad, incluso si no hay ningún resultado.
Queremos crear un conjunto de datos con todos los grupos de edades diferentes y luego unirnos a él. He aquí una solución que usa expresiones de tabla comunes:
with CTE_Age AS
(SELECT Distinct Age_Group from AGE_Table)
SELECT ID, Name, Age, Gender, CTE_Age.Age_Group FROM People_Table
RIGHT JOIN CTE_Age ON
People_Table.Age_Group = CTE_Age.Age_Group
Esto volverá:
ID Name Age Gender Age_Group
1 Ariel 7 F A
4 Derek 6 M A
NULL NULL NULL NULL B
2 Brandon 23 M C
3 Chelsea 27 F C
NULL NULL NULL NULL D
NULL NULL NULL NULL E
Una vez que tenga eso en su conjunto de datos, puede cambiar los valores NULOS a 0 en el lado del generador de informes. Creo que en 2008R2 el valor predeterminado es simplemente en blanco.