[Code] Cómo crear un reporte flexible usando Jerarquías (Recursivo)

Saludos

Dentro del desarrollo de un reporte se presentan varios retos, uno de los mas recurrentes es crear un reporte flexible, que se acomode a los cambios en los datos sin necesidad de modificar el reporte, en el presente artículo presento una característica muy interesante de Reporting Services

Consideremos primero la siguiente Jerarquía:

 

Basado en el esquema anterior generemos una tabla de ejemplo

select 1 as Id, null as Padre, 'Sede Central' as Nombre, 0 as Valor union all
select 2 as Id, 1 as Padre, 'Estado' as Nombre, 0 as Valor  union all
select 3 as Id, 2 as Padre, 'Ciudad1' as Nombre, 0 as Valor  union all
select 4 as Id, 2 as Padre, 'Ciudad2' as Nombre, 0 as Valor  union all
select 5 as Id, 3 as Padre, 'Sede Centro' as Nombre, 11 as Valor  union all
select 6 as Id, 3 as Padre, 'Sede Sur' as Nombre, 12 as Valor  union all
select 7 as Id, 4 as Padre, 'Sede Norte' as Nombre, 15 as Valor  union all
select 8 as Id, 4 as Padre, 'Sede Occidente' as Nombre , 10 as Valor 

 

Creando el Reporte

1) Se agrega un DataSet con los datos de ejemplo

2) En la parte de presentación, para el presente ejemplo, se selecciona siguiente

3) Para el presente ejemplo seleccionamos el estilo por defecto 

4) Una vez finalizado el asitente para la creación de una tabla, editamos el grupo del reporte (recordemos que tenemos un solo grupo para el reporte que se está creando), Se debe agrupar por la columna Id dado que esta presenta un valor único y es parte de la llave para poder lograr recursividad en el reporte

 5) En la misma ventana, se selecciona Avanzado (Advanced) y se estable como Padre Recursivo (Recursive Parent) al campo Padre el cual contiene la información sobre cual de los nodos es el padre en la Jerarquía

6) Si se ejecuta el reporte no se obtiene un resultado muy interesante hasta el momento

7) Pero si se usa la función Level() se podrá detectar el nivel de la jerarquía de la fila actual lo que es útil para generar una indentación que ayude a la comprensión de los datos

En la propiedad Padding=>Left del campo Nombre se agrega el siguiente código

=CStr(2 + (Level()*20)) + “pt”

Lo que crea una indentación como la presentada en la imagen

8) Si se desea agregar un esquema de colores al reporte para seguir algún tipo de convensión se puede usar una paleta de colores, como la del siguiente ejemplo

  

 
 
 
 
 
 

Para lograr aplicar la paleta seleccionada se agrega código al reporte:

 

 

El resultado Final:

 

Claro, un diseñador gráfico logrará un mejor resultado con la paleta de colores pero para este caso es netamente ilustrativo

El archivo del reporte de ejemplo se puede encontrar en: [Sample] Cómo crear un reporte flexible usando Jerarquías (Recursivo)

 

Los comentarios son bienvenidos, espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP