Categorías
Donaciones

Todo el contenido es gratuito y en beneficio de la comunidad. Puedes reconocer el esfuerzo con una donación si lo deseas.

Inserte aquí su publicidad

No me prodigo mucho en Reporting Services, así que cada vez que me toca pasar por allí aprendo una cuantas cosas. En mi último viaje, me pidieron algo trivial, que se enviara un listado en formato Excel por mail.

Hasta ahí, pues muy sencillo. La complicación vino cuando me pidieron que en el mail se adecuaran de forma dinámica algunas cosas, como incluir el rango de fechas del informe en el asunto y en el cuerpo del mensaje y dotar al fichero de un nombre que incluyera esas características.

Después de ver hasta dónde se podía llegar con una Data-driven subscription, comprobé que se pueden hacer cosas, pero no demasiadas, y desde luego no las que yo necesitaba. Así que hice lo que todos, porque quizá no sepa mucho de SSRS, pero sí sé buscar en Google. Además, esta necesidad es bastante simple a mi entender, con lo que contaba con que no era el primer caso en la historia del mundo mundial en el que a alguien se le ocurría que el fichero a adjuntar a un mail tuviera un nombre que no fuera el del informe.

Y me sorprendió ver que, si bien el problema era común, no había una solución simple. Me costó encontrarlo, y la alternativa no es muy ortodoxa que digamos (ni soportada) así que me pareció interesante compartirlo. Hay varias entradas similares en la web, yo partí de la siguiente: http://www.sqlservercentral.com/scripts/Reporting+Services+(SSRS)/70387/.

Esa es la pista. Hay que crear una suscripción normal y corriente. Luego encontrar el job que la lanza y modificarlo. Antes de lanzar la suscripción, se personaliza (ojo, conservando una referencia de lo que se ha cambiado):

declare @reportID uniqueidentifier, @subscriptionID uniqueidentifier, @path nvarchar(255), @body nvarchar(max), @asunto nvarchar(max)

SELECT
  @reportID  = rs.reportID
, @path = '/Listados/Listado_Semana_' + convert(char(8), dateadd(dd, -7, getdate()), 112)+ '_' + convert(char(8), dateadd(dd, -1, getdate()), 112)
, @subscriptionID = rs.SubscriptionId
,  @body = 'Se adjunta listado con todos los datos de la última semana (del ' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 1, 4) + ' al ' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 1, 4) + ').',
  @asunto = 'Listado de datos de la semana del ' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 1, 4) + ' al ' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 1, 4)
FROM
        ReportSchedule rs
            INNER JOIN subscriptions s
                ON rs.subscriptionID = s.subscriptionID
            INNER JOIN dbo.[catalog] c
                ON rs.reportID = c.itemID
WHERE
  c.[path] = '/Listados/Listado Última Semana'

update dbo.[Catalog] set [path] = @path where itemID = @reportID

update subscriptions set
   ExtensionSettings = 
      replace(replace(cast(ExtensionSettings as nvarchar(max)), 'Se adjunta listado con todos los datos de la última semana.', @body), '@ReportName', @asunto)
where SubscriptionID = @subscriptionID

exec dbo.AddEvent @EventType='TimedSubscription', @EventData=@subscriptionID

Luego añadimos un segundo paso al job para dejar las cosas como estaban (yo le he añadido un delay de 1 minuto, que seguramente se pueda quitar, es para asegurarse de que el informe sale antes de volver a dejar cambiados los datos otra vez). Así, el segundo paso de ese job sería más o menos así:

waitfor delay '00:01'

--Ahora lo dejo como estaba
declare @reportID uniqueidentifier, @subscriptionID uniqueidentifier, @path nvarchar(255), @body nvarchar(max), @asunto nvarchar(max)

SELECT
  @reportID  = rs.reportID
, @path = '/Listados/Listado Última Semana'
, @subscriptionID = rs.SubscriptionId
,  @body = 'Se adjunta listado con todos los datos de la última semana (del ' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 1, 4) + ' al ' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 1, 4) + ').',
  @asunto = 'Listado de datos de la semana del ' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -7, getdate()), 112), 1, 4) + ' al ' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 7, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 5, 2) + '/' +
  substring(convert(char(8), dateadd(dd, -1, getdate()), 112), 1, 4)
FROM
        ReportSchedule rs
            INNER JOIN subscriptions s
                ON rs.subscriptionID = s.subscriptionID
            INNER JOIN dbo.[catalog] c
                ON rs.reportID = c.itemID
WHERE
  c.[path] = '/Listado/Listado_Semana_' + convert(char(8), dateadd(dd, -7, getdate()), 112)+ '_' + convert(char(8), dateadd(dd, -1, getdate()), 112)

update dbo.[Catalog] set [path] = @path where itemID = @reportID

update subscriptions set
   ExtensionSettings = 
      replace(replace(cast(ExtensionSettings as nvarchar(max)), @body, 'Se adjunta listado con todos los datos de la última semana.'), @asunto, '@ReportName')
where SubscriptionID = @subscriptionID

Y ya está, hemos personalizado el asunto, el cuerpo del mensaje y el nombre del fichero. Pero con la misma táctica puede modificarse lo que se precise.

Deja un comentario


Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies