Hace unos días uno de los equipos de desarrollo de la empresa detectó que no se mostraban algunos reports de la plantilla de Scrum (ScrumforTeamSystem.2.2.14165.003). Concretamente se trataba de los reports Builds y Build Unit Test.
El error venía dado porque aun habiendo compilaciones lanzadas, el servidor no mostraba datos disponibles. Al no tratarse de un problema del refresco del DataWarehouse damos por sentado que el error se estaba produciendo en el report.
Nos bajamos el rdl del servidor de reporting para dar un vistazo a la Select principal que utiliza el report en cuestión, la cual es:
SELECT CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) AS BuildDay
, bs.[Build Status] AS BuildStatus
, COUNT(b.[__ID]) AS BuildCounter
FROM dbo.Build b
INNER JOIN dbo.[Build Details] bd
ON b.[__ID] = bd.Build
INNER JOIN dbo.[Team Project] tp
ON bd.[Team Project] = tp.[__ID]
INNER JOIN dbo.[Build Status] bs
ON bd.[Build Status] = bs.[__ID]
AND bs.[Build Status] IN ('Succeeded', 'Partially Succeeded',
'Failed', 'Stopped')
WHERE CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) BETWEEN
@vStartDate AND @vEndDate
AND b.[Build Type] = @vBuildType
AND tp.[Team Project] = @vProject
GROUP BY CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) ,
bs.[Build Status]
Tras ver el código, comprobamos que en la tabla build status de la base de datos TfsWarehouse, los valores que se usan para guardar el estado de una compilación son los siguientes:
__ID Build Status __LastUpdatedTime __DimensionMemberActive
1 En curso 2009-03-16 10:31:58.003 1
2 Correcto 2009-03-16 10:31:58.020 1
3 Completado parcialmente 2009-03-16 10:31:58.020 1
4 Incorrecto 2009-03-16 10:31:58.020 1
5 Detenido 2009-03-16 10:31:58.020 1
6 Sin iniciar 2009-03-16 10:31:58.020 1
Por lo tanto, la select anterior no mostrará nunca ningún valor en el report Builds citado anteriormente al filtrar por los valores del estado en inglés(Suceeded, Failed, etc. ) mientras que los valores reales que TFS asocia a la compilación están en español en la base de datos(Correcto, Incorrecto, etc.)
Por tanto hemos decidido editar el report cambiando los estados de inglés a castellano, quedando la consulta principal del report de la siguiente manera:
SELECT BuildDay
, ISNULL([Correcto],0) [Correcto]
, ISNULL([Completado parcialmente],0) [Completado parcialmente]
, ISNULL([Incorrecto],0) [Incorrecto]
, ISNULL([Detenido],0) [Detenido]
FROM
(
SELECT CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) AS BuildDay
, bs.[Build Status] AS BuildStatus
, COUNT(b.[__ID]) AS BuildCounter
FROM dbo.Build b
INNER JOIN dbo.[Build Details] bd
ON b.[__ID] = bd.Build
INNER JOIN dbo.[Team Project] tp
ON bd.[Team Project] = tp.[__ID]
INNER JOIN dbo.[Build Status] bs
ON bd.[Build Status] = bs.[__ID]
AND bs.[Build Status] IN ('Correcto', 'Completado',
'parcialmente', 'Incorrecto', 'Detenido')
WHERE CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) BETWEEN
@vStartDate AND @vEndDate
AND b.[Build Type] = @vBuildType
AND tp.[Team Project] = @vProject
GROUP BY CONVERT(DATETIME,CONVERT(VARCHAR,b.[Build Start Time],112),112) ,
bs.[Build Status]
) p PIVOT
(
SUM(BuildCounter) FOR BuildStatus IN ([Correcto], [Completado
parcialmente], [Incorrecto], [Detenido)
) AS pvt
Hay que pensar que se hace referencia a estos valores en diversas partes del rdl, por lo que habrá que tenerlo en cuenta a la hora de modificar el report.
Después de esto, sólo hace falta subirlo de nuevo (en nuestro caso, hemos dejado el original y el modificado se ha subido con otro nombre), volver a configurar el origen de datos, de reports y de olap y el report comienza a proporcionarnos los datos que necesitamos.
Entiendo que es un problema que sólo se da en instalaciones de la plantilla de Scrum en un TFS instalado en castellano (con el language pack correspondiente en WSS). Si alguno tiene algún problema similar, estaría encantado de comentarlo.
Una última cosa, también hemos tenido que modificar los parámetros de inicio (start date) y final (end date) del report y quitarles los valores por defecto. Sin este último paso, no había manera de que cogiese los valores introducidos por el usuario y usaba siempre de los de la configuración.
Saludos