Referências de código personalizado e assembly em expressões no Designer de Relatórios (SSRS)

É possível adicionar referências ao código personalizado inserido em um relatório ou aos assemblies personalizados criados e salvos no seu computador e implantados no servidor de relatório. Use o código inserido para constantes personalizadas, funções complexas ou funções usadas várias vezes em um mesmo relatório. Use assemblies de código personalizado para manter o código em um único local e compartilhá-lo para uso por vários relatórios. O código personalizado pode incluir novas constantes, variáveis, funções ou sub-rotinas personalizadas. É possível incluir referências somente leitura em coleções internas, como a coleção de Parâmetros. No entanto, não é possível passar conjuntos de valores de dados do relatório para funções personalizadas. Especificamente, não há suporte para agregações personalizadas.

Observação sobre segurançaObservação sobre segurança

Para cálculos de detecção de hora avaliados uma vez em tempo de execução e que você deseja manter com o mesmo valor ao longo do processamento do relatório, considere se uma variável de relatório ou uma variável de grupo deve ser usada. Para obter mais informações, consulte Usando referências de coleções de variáveis de grupo e de relatório (Construtor de Relatórios 3.0 e SSRS).

O Designer de Relatórios é o ambiente de criação preferido para usar para adicionar o código personalizado a um relatório. O Construtor de Relatórios 3.0 oferece suporte ao processamento de relatórios que tem expressões válidas ou que incluem referências a assemblies personalizados em um servidor de relatório. O Construtor de Relatórios não fornece um modo de adicionar uma referência a um assembly personalizado.

ObservaçãoObservação

Observe que, durante uma atualização de um servidor de relatório, os relatórios que dependem de assemblies personalizados podem exigir etapas adicionais para concluir a atualização. Para obter mais informações, consulte Usando o Supervisor de Atualização para preparar para atualizações.

ObservaçãoObservação

É possível criar e modificar definições de relatórios (.rdl) no Report Builder 3.0 e no Designer de Relatórios no Business Intelligence Development Studio. Cada ambiente de criação fornece diferentes maneiras de criar, abrir e salvar relatórios e itens relacionados. Para obter mais informações, consulte Projetando e implementando relatórios usando o Designer de Relatórios (Reporting Services) na Web em microsoft.com.

Neste artigo

Trabalhando com código personalizado no Construtor de Relatórios 3.0

Incluindo referências em funções usadas frequentemente

Incluindo referências em funções usadas com menor frequência

Incluindo referências em assemblies externos

Incluindo código inserido

Incluindo referências a parâmetros de código

Incluindo referências a código de assemblies personalizados

Trabalhando com código personalizado no Construtor de Relatórios 3.0

No Construtor de Relatórios, você pode abrir um relatório de um servidor de relatório que inclui referências a assemblies personalizados. Por exemplo, você pode editar relatórios que são criados e implantados usando o Designer de Relatórios no Business Intelligence Development Studio. Os assemblies personalizados devem ser implantados no servidor de relatório.

Não é possível fazer o seguinte:

  1. Adicionar referências ou instâncias de membros de classes a um relatório.

  2. Visualizar um relatório com referências a assemblies personalizados no modo local.

Ícone de seta usado com o link Voltar ao InícioVoltar ao Início

Incluindo referências em funções usadas frequentemente

Use a caixa de diálogo Expressão para exibir uma lista categorizada de funções comuns internas do Reporting Services. Quando você expande Funções Comuns e clica em uma categoria, o painel Item exibe a lista de funções incluídas em uma expressão. As funções comuns incluem classes dos namespaces do .NET Framework System..::..Math e System..::..Convert e funções de biblioteca em tempo de execução do Visual Basic. Por conveniência, é possível exibir as funções usadas mais frequentemente na caixa de diálogo Expressão, onde elas são listadas por categoria: Texto, Data e Hora, Matemática, Inspeção, Fluxo do Programa, Agregação, Financeira, Conversão e Diversas. As funções usadas com menor frequência não são exibidas na lista, mas ainda podem ser usadas em uma expressão.

Para usar uma função interna, clique duas vezes no nome da função no painel Item. Uma descrição da função é exibida no painel Descrição e um exemplo de chamada da função é exibido no painel Exemplo. No painel de código, quando você digita o nome da função seguido por um parêntese esquerdo (, a ajuda do IntelliSense exibe cada sintaxe válida para a chamada de função. Por exemplo, para calcular o valor máximo de um campo denominado Quantity em uma tabela, adicione a expressão simples =Max( ao painel Código e use as marcas inteligentes para exibir todas as sintaxes válidas possíveis para a chamada da função. Para concluir este exemplo, digite =Max(Fields!Quantity.Value). 

Para obter mais informações sobre cada função, consulte System..::..Math, System..::..Convert e Membros da biblioteca em tempo de execução do Visual Basic no MSDN.

Ícone de seta usado com o link Voltar ao InícioVoltar ao Início

Incluindo referências em funções usadas com menor frequência

Para incluir uma referência em outros namespaces de CLR usados com menor frequência, você deve usar uma referência totalmente qualificada, por exemplo, System.Text..::..StringBuilder. O IntelliSense não tem suporte no painel de código da caixa de diálogo Expressão para essas funções usadas com menor frequência.

Para obter mais informações, consulte Membros da biblioteca em tempo de execução do Visual Basic no MSDN.

Incluindo referências em assemblies externos

Para incluir uma referência em uma classe em um assembly externo, você deve identificar o assembly para o processador de relatório. Use a página Referências da caixa de diálogo Propriedades do Relatório para especificar o nome totalmente qualificado do assembly a ser adicionado ao relatório. Na expressão, você deve usar o nome totalmente qualificado para a classe no assembly. As classes em um assembly externo não são exibidas na caixa de diálogo Expressão. Você deve fornecer o nome correto para a classe. Um nome totalmente qualificado inclui o namespace, o nome da classe e o nome do membro.

Ícone de seta usado com o link Voltar ao InícioVoltar ao Início

Incluindo código inserido

Para adicionar código inserido a um relatório, use a guia Código da caixa de diálogo Propriedades do Relatório. O bloco de código criado pode conter vários métodos. Os métodos no código inserido devem ser gravados no Microsoft Visual Basic e devem ser baseados em instância. O processador de relatórios adiciona referências para os namespaces System.Convert e System.Math. Use a página Referências da caixa de diálogo Propriedades do Relatório para adicionar referências a assemblies adicionais. Para obter mais informações, consulte Como adicionar uma referência de assembly a um relatório (SSRS).

Os métodos no código inserido são disponibilizados por meio de um membro do Code definido globalmente. Você os acessa consultando o membro do Code e o nome do método. O exemplo a seguir chama o método ToUSD que converte o valor no campo StandardCost para um valor em dólar:

=Code.ToUSD(Fields!StandardCost.Value)

Para fazer referência às coleções internas no código personalizado, inclua uma referência no objeto Report interno:

=Report.Parameters!Param1.Value

Os exemplos a seguir mostram como definir algumas constantes e variáveis personalizadas.

Public Const MyNote = "Authored by Bob"
Public Const NCopies As Int32 = 2
Public Dim  MyVersion As String = "123.456"
Public Dim MyDoubleVersion As Double = 123.456

Embora as constantes personalizadas não apareçam na categoria de Constantes na caixa de diálogo Expressão (que exibe apenas constantes internas), é possível adicionar referências a elas a partir de qualquer expressão, conforme mostrado nos exemplos a seguir. Em uma expressão, uma constante personalizada é tratada como uma Variant.

=Code.MyNote
=Code.NCopies
=Code.MyVersion
=Code.MyDoubleVersion

O exemplo a seguir inclui a referência e a implementação de código da função FixSpelling que substitui o texto "Bicycle" para todas as ocorrências do texto "Bike" no campo SubCategory.

=Code.FixSpelling(Fields!SubCategory.Value)

O código a seguir, quando inserido em um bloco de código de definição de relatório, mostra uma implementação do método FixSpelling. Este exemplo mostra como usar uma referência totalmente qualificada para a classe StringBuilder do Microsoft .NET Framework.

Public Function FixSpelling(ByVal s As String) As String
   Dim strBuilder As New System.Text.StringBuilder(s)
   If s.Contains("Bike") Then
      strBuilder.Replace("Bike", "Bicycle")
      Return strBuilder.ToString()
      Else : Return s
   End If
End Function

Para obter mais informações sobre coleções de objetos internos e sua inicialização, consulte Usando referências globais internas e referências de usuário (Construtor de Relatórios 3.0 e SSRS) e Inicializando objetos assembly personalizados.

Ícone de seta usado com o link Voltar ao InícioVoltar ao Início

Incluindo referências a parâmetros de código

É possível fazer referência à coleção de parâmetros globais por meio de código personalizado em um bloco de código da definição do relatório ou em um assembly personalizado fornecido. A coleção de parâmetros é somente leitura e não possui iteradores públicos. Não é possível usar uma construção For Each do Visual Basic para percorrer a coleção. É preciso saber o nome do parâmetro definido na definição de relatório antes de referenciá-lo no código. No entanto, é possível iterar através de todos os valores de um parâmetro de vários valores.

A tabela a seguir inclui exemplos de como fazer referência à coleção interna de Parameters no código personalizado:

Descrição

Referência em expressão

Definição de código personalizado

Passando uma coleção de parâmetros globais inteira para código personalizado.

Esta função retorna o valor de um parâmetro de relatório específico MyParameter.

=Code.DisplayAParameterValue(Parameters)

Public Function DisplayAParameterValue(

ByVal parameters as Parameters) as Object

Return parameters("MyParameter").Value

End Function

Passando um parâmetro individual para código personalizado.

Este exemplo retorna o valor do parâmetro passado. Se o parâmetro for um parâmetro de vários valores, a cadeia de caracteres de retorno será uma concatenação de todos os valores.

=Code.ShowParametersValues(Parameters!DayOfTheWeek)

Public Function ShowParameterValues(ByVal parameter as Parameter)
 as String
   Dim s as String 
   If parameter.IsMultiValue then
      s = "Multivalue: " 
      For i as integer = 0 to parameter.Count-1
         s = s + CStr(parameter.Value(i)) + " " 
      Next
   Else
      s = "Single value: " + CStr(parameter.Value)
   End If
   Return s
End Function

Ícone de seta usado com o link Voltar ao InícioVoltar ao Início

Incluindo referências a código de assemblies personalizados

Para usar assemblies personalizados em um relatório, você deve primeiro criar o assembly, torná-lo disponível para o Designer de Relatórios, adicionar uma referência ao assembly no relatório e usar uma expressão no relatório para fazer referência aos métodos contidos nesse assembly. Quando o relatório é implantado no servidor de relatório, você deve também implantar o assembly personalizado no servidor de relatório.

Para obter informações sobre como criar um assembly personalizado e torná-lo disponível para o Reporting Services, consulte Usando assemblies personalizados com relatórios.

Para consultar o código personalizado em uma expressão, você deve chamar o membro de uma classe dentro do assembly. A maneira de fazer isso depende do método ser estático ou baseado em instância. Os métodos estáticos dentro de um assembly personalizado estão disponíveis globalmente dentro do relatório. É possível acessar métodos estáticos em expressões especificando o namespace, a classe e o nome do método. O exemplo a seguir chama o método ToGBP que converte o valor do StandardCost de dólar em libra esterlina:

=CurrencyConversion.DollarCurrencyConversion.ToGBP(Fields!StandardCost.Value)

Os métodos baseados em instância estão disponíveis por meio de um membro do Code definido globalmente. Você os acessa fazendo referência ao membro do Code, seguido pelo nome da instância e do método. O exemplo a seguir chama o método da instância ToEUR, que converte o valor do StandardCost de dólar em euro:

=Code.m_myDollarCoversion.ToEUR(Fields!StandardCost.Value)
ObservaçãoObservação

No Designer de Relatório, um assembly personalizado é carregado uma vez e não é descarregado até que o Visual Studio seja fechado. Se você visualizar um relatório, fizer alterações em um assembly personalizado usado no relatório e visualizar o relatório novamente, as alterações não serão exibidas na segunda visualização. Para recarregar o assembly, feche e abra o Visual Studio novamente e visualize o relatório.

Para obter mais informações sobre como acessar o código, consulte Acessando assemblies personalizados por meio de expressões.

Ícone de seta usado com o link Voltar ao InícioVoltar ao início

Passando coleções internas para assemblies personalizados

Se quiser passar coleções internas, como Globals ou Parameters, para um assembly personalizado para processamento, adicione uma referência de assembly do seu projeto de código ao assembly que define as coleções internas e acesse o namespace correto. Dependendo do tipo de relatório para o qual você desenvolve o assembly personalizado, em um servidor de relatório (relatório de servidor) ou em um relatório que é executado localmente em um aplicativo .NET (relatório local), o assembly a ser referenciado muda. Consulte os detalhes a seguir.

  • Namespace: Microsoft.ReportingServices.ReportProcessing.ReportObjectModel

  • Assembly (relatório local): Microsoft.ReportingServices.ProcessingObjectModel.dll

  • Assembly (relatório de servidor): Microsoft.ReportViewer.ProcessingObjectModel.dll

Como o conteúdo das coleções Fields e ReportItems pode mudar de forma dinâmica no tempo de execução, não se prenda a ele em chamadas ao assembly personalizado (por exemplo, em uma variável de membro). A mesma recomendação costuma se aplicar a todas as coleções internas.