DataSets são elementos importantíssimos no desenvolvimento de relatórios, independente da ferramenta que você estiver utilizando. Afinal de contas, são eles que definem a estrutura de campos que os relatórios poderão exibir. Com o Report Viewer não poderia ser diferente – ele também utiliza o conceito de DataSets na definição dos relatórios.
Um grande desafio que temos quando a nossa aplicação vai crescendo é: como conseguimos manter a imensa quantidade de DataSets ou classes de dados no nosso projeto sem que tudo acabe ficando uma verdadeira bagunça? Não seria muito legal se pudéssemos criar a estrutura de campos do Report Viewer sem DataSet ou classe? No Crystal Reports temos os arquivos TTX para nos ajudar com essa tarefa, mas e quanto ao Report Viewer? Ele tem algo parecido?
Por padrão, no Report Viewer nós só conseguimos definir a estrutura de campos dos relatórios com DataSets tipados ou classes de dados. Para resolver essa limitação, eu estive trabalhando algumas horas em uma pequena ferramenta que vai nos ajudar a editar a definição de campos dos relatórios do Report Viewer sem que nós precisemos criar DataSets tipados ou classes de dados no nosso projeto.
No artigo de hoje eu vou mostrar para você como é que essa ferramenta funciona. Gostou da ideia? Então vamos lá!
Como são definidos os DataSets do Report Viewer?
Antes de prosseguirmos, é importante entendermos a maneira como o Report Viewer salva a definição dos DataSets no arquivo RDLC. Não sei se você sabe, mas os arquivos RDLC são basicamente XMLs com uma estrutura pré-estabelecida. Ao abrirmos um arquivo RDLC em um editor de texto, teremos uma ideia de como esses arquivos são estruturados:
Como já era de se imaginar, as estruturas dos DataSets do relatório também estão definidas nesse XML, mais especificamente dentro das tags “DataSources” e “DataSets“. Veja só um exemplo dessa definição:
Independentemente da maneira que nós utilizemos para adicionar um DataSet no Report Viewer (seja através de DataSets tipados, classes de dados ou serviços), o arquivo RDLC conterá essas duas tags onde a estrutura de campos será definida.
Com isso em mente, se nós quisermos adicionar, remover ou alterar campos de um DataSet do nosso relatório (ou até mesmo criar um novo DataSet), nós só temos que alterar o conteúdo dessas tags.
Apresentando o Report Viewer DataSet Editor
Se eu chegasse aqui e falasse que nós teremos que editar essas tags manualmente no arquivo RDLC, você provavelmente riria da minha cara. As chances são grandes de quebrarmos alguma coisa na estrutura do arquivo se nós começarmos a editar o seu conteúdo manualmente.
Pensando nisso, eu investi algumas horas na criação de uma ferramenta que faz a leitura do arquivo RDLC, mostra a estrutura dos DataSets do relatório em um grid e permite adicionar, alterar ou remover campos, bem como criar novos DataSets para o relatório:
Essa ferramenta, a qual eu dei o singelo nome de “Report Viewer DataSet Editor“, é open source e o código está disponível no GitHub. Como você pode notar, o projeto está bem no começo. Ainda não adicionei descrição do projeto, comentários, etc. E não repare no código! Ele está bem rudimentar, sem testes de unidade e com uma estrutura bem simples por enquanto.
Eu testei a ferramenta com alguns relatórios de exemplo e ela funcionou muito bem. Mas, ainda tem muito para testar e evoluir. Caso você queira contribuir, é só mandar um pull request lá no GitHub.
Para utilizar essa ferramenta, baixe a última release neste link. Como o executável não está assinado, se você tentar rodar a aplicação em um computador com Windows 10, o SmartScreen vai falar que a aplicação não é confiável. Obviamente, essa aplicação é confiável (você pode ver o código fonte no próprio GitHub), portanto ignore essas mensagens do SmartScreen:
Se por algum motivo você não confiar no executável, baixe o código fonte no GitHub e compile você mesmo utilizando o Visual Studio.
Criando um novo relatório
Para demonstrar o funcionamento dessa ferramenta, vamos criar um novo projeto do tipo “Windows Forms Application” e, dentro desse projeto, vamos adicionar um novo relatório, dando o nome de “Relatorio.rdlc” para o arquivo que será criado:
Nota: caso você não encontre o item “Report”, veja como adicionar o Report Viewer no Visual Studio 2015 e no Visual Studio 2017.
Com o arquivo RDLC criado, vamos abri-lo com o Report Viewer DataSet Editor para definirmos um novo DataSet e a sua estrutura de campos. Como o relatório ainda não tem nenhum DataSet definido, o ComboBox “DataSet” e o grid aparecerão em branco. A única opção nesse caso é clicarmos no botão “New DataSet” para criarmos um novo DataSet nesse relatório. Vamos dar o nome de “DataSetRelatorio” para o novo DataSet que será criado:
Em seguida, vamos adicionar as colunas desse DataSet. Para simplificarmos, vamos criar somente duas colunas do tipo “String” – uma chamada “Nome” e outra chamada “Sobrenome“:
Salve as alterações clicando no botão “Save changes“:
Pronto! A partir daí, se voltarmos no designer do nosso relatório, nós veremos que o “DataSetRelatorio” estará disponível:
Vamos montar um layout bem simples para o relatório, adicionando somente uma tabela com as duas colunas (nome e sobrenome):
Alimentando o relatório através de um DataGridView
Agora que nós temos o nosso relatório montado, vamos ver como podemos alimentá-lo sem utilizar nenhuma classe ou DataSet. Imagine que nós tenhamos uma janela com um DataGridView, contendo as colunas “Nome” e “Sobrenome“:
Como o método de carregamento de dados do Report Viewer suporta não só DataTables, mas também, coleções enumeráveis, nada impede que nós criemos um Enumerable dos dados do DataGridView para mandarmos para o relatório. Isso é muito fácil de ser implementado, utilizando LINQ.
Para não perdermos tempo montando um formulário para exibirmos os dados desse relatório, vamos utilizar o formulário que eu criei no meu artigo onde eu mostro como carregar múltiplos relatórios do Report Viewer com o mesmo formulário. Uma vez adicionado esse formulário no projeto, veja como fica fácil o código para montarmos uma coleção enumerável utilizando os dados do DataGridView:
// C# private void btRelatorio_Click(object sender, EventArgs e) { var dadosRelatorio = from DataGridViewRow linha in dataGridViewNomes.Rows select new { Nome = linha.Cells["Nome"].Value, Sobrenome = linha.Cells["Sobrenome"].Value }; FormRelatorio.ShowReport("ReportViewerSemDataSet.Relatorio.rdlc", true, new Dictionary<string, object>() { { "DataSetRelatorio", dadosRelatorio.AsEnumerable() } }); }
' VB.NET Private Sub btRelatorio_Click(sender As Object, e As EventArgs) Handles btRelatorio.Click Dim DadosRelatorio = From linha In dataGridViewNomes.Rows Select New With {.Nome = linha.Cells("Nome").Value, .Sobrenome = linha.Cells("Sobrenome").Value} FormRelatorio.ShowReport("ReportViewerSemDataSet.VB.Relatorio.rdlc", True, New Dictionary(Of String, Object)() From {{"DataSetRelatorio", DadosRelatorio.AsEnumerable()}}) End Sub
Execute a aplicação, preencha o grid com alguns dados, chame o relatório e veja o resultado:
Ahá! Aí está um relatório do Report Viewer que foi construído e carregado sem a utilização de DataSets tipados ou classes de dados. Bacana, não é mesmo?
Concluindo
O fato de sempre termos que definir DataSets tipados ou classes de dados para desenharmos o layout dos nossos relatórios do Report Viewer pode fazer com que o nosso projeto se torne bem bagunçado. Imagine um projeto com 50 relatórios. Muito provavelmente esse projeto terá inúmeros DataSets tipados ou classes de dados que só servem para desenharmos e carregarmos os relatórios.
No artigo de hoje eu apresentei para você a ferramenta open-source que eu estou desenvolvendo, o Report Viewer DataSet Editor. Essa ferramenta permite a definição e alteração dos DataSets do relatório sem que precisemos criar DataSets tipados ou classes de dados no nosso projeto. Isso facilita bastante a nossa vida e deixa o nosso projeto mais limpo.
Atenção! Essa ferramenta ainda está bem crua! Eu testei com alguns relatórios e funcionou perfeitamente, porém, você deve utilizá-la por sua conta e risco. Lembre-se sempre de fazer um backup do seu arquivo RDLC antes de aplicar as alterações!
Antes de me despedir, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado, ficará sabendo em primeira mão sobre o artigo da próxima semana e receberá também dicas “bônus” que eu só compartilho por e-mail. Além disso, você já deve ter percebido que eu recebo muitas sugestões de temas e eu costumo dar prioridade às sugestões vindas de inscritos da minha newsletter. Inscreva-se utilizando o formulário logo abaixo.
Até a próxima!
André Lima
Image by Pixabay used under Creative Commons
https://pixabay.com/en/document-agreement-documents-sign-428338/
The post Definindo a estrutura de campos do Report Viewer sem DataSet ou classe appeared first on André Alves de Lima.