Nombre dinámico en archivo adjunto de SSRS
Hace unos días tuve la necesidad de enviar unos informes por correo desde Reporting Services, pero, no con el nombre por defecto sino con un nombre dinámico. Este nombre consistía en la fecha actual y el nombre del informe. Ej: 22-02-2016_Informe1.
Funcionamiento interno SSRS
Cada vez que creamos una suscripción a un informe en Reporting Services, internamente nos crea un job con su respectivo schedule e inserta los datos necesarios en la base de datos de ReportServer.
Con esta query podemos ver la información que nos va ha hacer falta para modificar el job al que le queremos cambiar el nombre del archivo adjunto.
USE [ReportServer]
GO
SELECT s.LastStatus
,s.LastRunTime
,c.[path]
,rs.subscriptionid
,rs.reportid
FROM reportschedule rs
INNER JOIN subscriptions s ON rs.subscriptionid = s.subscriptionid
INNER JOIN dbo.catalog c ON rs.reportid = c.itemid
El resultado será parecido al siguiente:
- LastStatus: último estado.
- LastRunTime: fecha de la última ejecución.
- Path: indica la carpeta donde está ubicado el informe, en nuestro caso BETA, y el nombre del informe.
- SuscriptionId: este campo hace referencia al id de la suscripción del informe, el cual vincula el job con la suscripción.
- ReportId: este campo indica el nombre del job que deberemos modificar.
Modo de implementación
Abrimos el Job, nos dirigimos a steps, edit y nos aparecerá el siguiente código.
En la parte Command comentamos o borramos el código y pegamos el siguiente script.
USE [ReportServer]
GO
DECLARE @jobName NVARCHAR(100),@subscriptionId UNIQUEIDENTIFIER,@reportId NVARCHAR(100),@pathOld NVARCHAR(100),@newName NVARCHAR(100)
--Nombre del job al que hace referencia la subscripcion
SET @jobName = '01B6F118-7ED5-4DC4-BA6E-D0BDEF5AAB26'
--Especifica la carpeta en la que están desplegados los reports y depues el nombre "/carperta/name"
SET @newName = '/BETA/'+CAST(CAST(GETDATE() AS DATE) AS NVARCHAR(50))+' - Cierre'
SELECT @pathOld = c.[path]
,@subscriptionId = rs.subscriptionid
,@reportId = rs.reportid
FROM reportschedule rs
INNER JOIN subscriptions s ON rs.subscriptionid = s.subscriptionid
INNER JOIN dbo.catalog c ON rs.reportid = c.itemid
WHERE rs.scheduleid = @jobName
--Modifica el nombre del fichero
UPDATE dbo.catalog
SET [path] = @newName
WHERE itemid = @reportId
EXEC dbo.addevent @eventtype = 'TimedSubscription',
@eventdata = @subscriptionId
--Este delay es necesario ya que tiene que crear el correo antes de hacer el update
WAITFOR DELAY '00:01'
--Deja como estaba el fichero para que no de errores en la siguiente ejecución
UPDATE dbo.catalog
SET [path] = @pathOld
WHERE itemid = @reportId
GO
Una vez pegado el script solo tenemos que modificar dos cosas:
- En la parte de set @jobName=” introducir el nombre del job entre las comillas.
- En la parte de set @newName=” es donde especificaremos el nuevo nombre del archivo adjunto. Debemos seguir el formato /carpeta/nombreInforme teniendo en cuenta que la longitud de @newName tiene que ser menor de 50 caracteres.
Cuando tengamos todo modificado debería mandar el archivo adjunto de la siguiente forma:
Business Intelligence Expert Consultant. Specialising in creation of Data Warehouse, Analysis Services, Power BI, SSIS, SSRS and Databricks.