Ferramentas para Relatórios

Para quem está desenvolvendo aplicações comerciais em .Net, uma dúvida muito comum é como criar os relatórios da aplicação. Se você usa o Microsoft SQL Server, poderá usar o Reporting Services (), que é um excelente ferramenta para relatórios.

Mas se você usa outros bancos de dados, ou está criando uma aplicação multi-banco, talvez o Reporting Services não seja uma boa opção, mas não se preocupe pois existem várias alternativas e excelentes ferramentas para relatórios, vejamos algumas delas que considero muito boas:

1. PrintDocument: componente do Visual Studio onde você precisará desenhar o relatório manualmente, não é a maneira mais eficaz para um relatório, mas pode ser útil em alguns casos. Conheça mais em:

2. SQL Reporting Services: faz parte do Microsoft SQL Server e é uma ferramenta gratuita, mesmo nas versões Express. É simples de utilizar e possui grande variedade de templates. Os relatórios ficam armazenados dentro do SQL Server. Conheça mais em: http://msdn.microsoft.com/pt-br/library/ms159106.aspx

3. DevExpress XTraReports: é uma ferramenta realmente excelente, apesar de ser paga, não é muito cara e depois de instalar o componente você terá um novo template para um item de projeto do tipo XTraReport, onde você cria relatórios realmente fantásticos. Você tem total controle sobre todas as partes do relatório e pode escrever o código em C# ou VB.Net dentro do Visual Studio. Os relatórios são compilados junto com a aplicação e você precisa somente distribuir as DLLs do componente. Um ponto que não gosto muito é que não tem um Designer muito amigável para o usuário final, caso você queira permitir que seus usuários modifiquem os relatórios. Ele também expota os relatórios para um dezena de formatos, como PDF, JPG, Word, Excel, HTML, etc. Conheça mais em: http://www.devexpress.com/products/net/reporting/
A DevExpress é muito conhecida também pela sua suite de componentes, que vale a pena você conhecer.

image

4. StimulReport: é uma ferramente excelente e muito simples de utilizar, trabalha por padrão com Ribons no Designer o que facilita muito a vida do desenvolvedor, permite controlar totalmente o relatório, assim como o XTraReports, mas ao contrário deste, o relatório não é compilado junto com a aplicação, ficando em um arquivo separado. Neste caso ou você mantém o arquivo separado ou cria um mecanismo para armazená-lo no banco de dados. A grande vantagem desta ferramenta é a facilidade de se modificar um relatório em tempo de execução, simplesmente clicando em um botão EDIT. Ele permite também que os formulários para os filtros do relatório, por exemplo, sejam feitos juntamente com o relatório, o que facilita muito a nossa vida. Você precisará também enviar junto com a aplicação as DLLs do componente. AO Stimul tem também uma interface toda em WPF, o que lhe confere um visual bem mais moderno. Ele também expota os relatórios para um dezena de formatos, como PDF, JPG, Word, Excel, HTML, etc. Conheça mais em: http://www.stimulsoft.com/

image

É claro que existem vários outros componentes para relatórios, mas estes são os que eu considero muito produtivos. É isto aí, acho que deu para ter uma idéia de que caminho tomar no desenvolvimento de relatórios para aplicações.

[]s,
Carlos dos Santos.

EFProfiler– Entity Framework Profiler

Se você está trabalhando com EF4, provavelmente já se perguntou se os comandos SQL gerados estão realmente otimizados, ou talvez quando você tem algum problema de performance. Para responder a isto existem várias ferramentas de análise, ou profilers, e um destes é o EFProfiler.

A ferramenta é bastante simples, você baixa um executável do site www.efprof.com e segue as instruções contidas no arquivo “How to use.txt”.

Para o profiler funciona, você precisa adicionar a referência de um DLL do Profiler ao seu projeto:

image

Depois, no arquivo principal do projeto, você executa o inicializador do profiler:

   1: static void Main(string[] args)

   2: {

   3:     // Profiler

   4:     HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();

   5:  

   6:     TesteEntities dc = new TesteEntities();

   7:  

   8:     var dados = from c in dc.Cliente

   9:                 select c;

  10:     foreach (var linha in dados)

  11:     {

  12:         Console.WriteLine(linha.Nome);

  13:     }

  14: }

No exemplo acima, temos uma simples consulta ao banco de dados.

Agora abra o profiler e execute sua aplicação, os resultados irão aparecer na tela:

image

É isto aí pessoal, bom profiler para vocês!

[]s,

Carlos dos Santos.

Windows Forms – atualizando o formulário de dentro de uma Thread

É relativamente comum termos uma aplicação que precise usar uma ou mais threads para realizar algum processo demorado onde o usuário não precise ficar esperando, mas às vezes é necessário também que esta thread faça algum tipo de interação com a tela, talvez atualizando alguma informação, barra de progresso, enfim, mostrar ao usuário que algo está acontecendo.

Uma tarefa relativamente simples, mas que pode causar um certo transtorno justamente por ser uma thread. Veja a aplicação abaixo em Windows Forms:

image

É uma tela bem simples, com um botão e uma barra de progresso. Agora vamos imaginar que este form tenha o código abaixo, que cria uma thread que atualiza a progressBar1:

   1: public partial class Form1 : Form

   2: {

   3:     private bool threadAtiva = false;

   4:  

   5:     public Form1()

   6:     {

   7:         InitializeComponent();

   8:     }

   9:  

  10:     private void btnIniciar_Click(object sender, EventArgs e)

  11:     {

  12:         

  13:         Thread processo = new Thread(new ThreadStart(ExecutaThread));

  14:         processo.Start();

  15:  

  16:         progressBar1.Maximum = 100;

  17:         progressBar1.Value = 0;

  18:  

  19:         threadAtiva = true;

  20:     }

  21:  

  22:     void ExecutaThread()

  23:     {

  24:         while (threadAtiva)

  25:         {

  26:             if (progressBar1.Value > 99)

  27:             {

  28:                 threadAtiva = false;

  29:                 return;

  30:             }

  31:             progressBar1.Value++;

  32:             progressBar1.Refresh();

  33:         }

  34:     }

  35: }


O código acima está correto, mas ao executar e clicar no botão iniciar, aparece o seguinte erro:

image

O erro acontece porquê a janela da aplicacação (UI) está executando em uma thread e agora nós temos outra thread executando o nosso processo e tentando atualizar a tela. Então como resolver isto ?

Simplesmente usando um Invoker:

   1: void ExecutaThread()

   2:        {

   3:            while (threadAtiva)

   4:            {

   5:                if (progressBar1.Value > 99)

   6:                {

   7:                    threadAtiva = false;

   8:                    return;

   9:                }

  10:                this.Invoke(new MethodInvoker(delegate()

  11:                {

  12:                    progressBar1.Value++;

  13:                    progressBar1.Refresh();

  14:                }));

  15:            }

  16:        }

Agora estamos atualizando a tela ou seja, o progressBar1 usando um Invoker que está sendo executando sob a thread principal, ou seja, o formulário. Neste exemplo eu usei o MethodInvoker() com um método anônimo, mas você poderia ter criado um método e chamado sem problemas e com isto você pode ter várias thread rodando e atualizando a interface do usuário.

É isto aí pessoal, espero que dica seja útil para vocês.

Um abraço e até a próxima.

Carlos dos Santos.

Consultas Genéricas com Linq

No conceito de orientação a objeto, sempre temos em mente criar códigos que possam ser reutilizados dentro da aplicação ou mesmo em aplicações diferentes, e neste contexto eu tenho sido questionado sobre como é possível usar Linq, que é totalmente orientado a objeto e fortemente tipado, e ainda sim criar códigos reusáveis.

Aproveitando esta situação, vou mostrar como é possível criar um método de consulta usando Linq, que serve para consultar praticamente qualquer entidade (tabela) do seu modelo, ou seja, iremos criar uma consulta totalmente genérica, e um dos possíveis lugares que você pode utilizar este tipo de método, é em uma rotina de consulta que você chama em todo o seu sistema, por exemplo.

Para o nosso exemplo, vamos criar um projeto console bem simples, lembrando que usaremos o Visual Studio 2010 com o Entity Framework 4:

image

Agora vamos adicionar o modelo do Entity Framework, para este exemplo usaremos o banco de dados Northwind, caso você não o tenha, baixe aqui. Para adicionar o modelo, clique com o botão direito do mouse sobre o seu projeto e vá em Add/New Item, ou CTRL + SHIFT + A e selecione Data e depois ADO.Net Entity Data Model. Escolha Generate from database e crie a conexão com o seu banco de dados Northwind. Selecione algumas tabelas, por exemplo: Categories, Products, Customers:

image

Criado o arquivo EDMX, vamos para o método de Consulta:

   1: static ObjectQuery<DbDataRecord> Consulta(string query, ObjectContext ctx)

   2: {

   3:     return new ObjectQuery<DbDataRecord>(query, ctx);

   4: }

Observação: adicione os seguintes namespaces:

using System.Data.Objects;

using System.Data.Common;

Parece que ficou complicado, mas é muito simples. Estamos retornando um objeto genérico do tipo DbDataRecord, e dentro do método, estamos retornando um novo ObjectQuery, que nos permite criar consultas dinamicamente. Vejamos um exemplo de chamada do método:

   1: static void Main(string[] args)

   2: {

   3:     NorthwindEntities ctx = new NorthwindEntities();

   4:  

   5:     var dados = Consulta("select c.ProductName,c.UnitPrice from Products as c" , ctx);

   6:  

   7:     foreach (DbDataRecord linha in dados)

   8:     {

   9:         Console.WriteLine(linha["ProductName"] + " - " + linha["UnitPrice"]);

  10:     }

  11: }

Primeiro criamos o contexto para o banco de dados Northwind, depois chamamos o método Consulta passando a nossa query e o contexto. Veja que a query se parece muito com uma consulta SQL, e neste caso estamos trazendo o ProductName e o UnitPrice da tabela Products.

Depois executamos um foreach() para mostrar os dados, usando o DbDataRecord para acessar os campos da consulta. Vejamos outro exemplo, agora trazendo dados também da tabela Categories:

   1: var dados = Consulta("select c.ProductName,c.UnitPrice,c.Categories.CategoryName from Products as c" , ctx);

   2:  

   3:             foreach (DbDataRecord linha in dados)

   4:             {

   5:                 Console.WriteLine(linha["ProductName"] + " - " + linha["UnitPrice"]+" - "+linha["CategoryName"]);

   6:             }


E para finalizar um exemplo com consulta condicional:

   1: var dados = Consulta("select c.ProductName,c.UnitPrice,c.Categories.CategoryName from Products as c where c.UnitPrice < 10" , ctx);

   2:  

   3:             foreach (DbDataRecord linha in dados)

   4:             {

   5:                 Console.WriteLine(linha["ProductName"] + " - " + linha["UnitPrice"]+" - "+linha["CategoryName"]);

   6:             }



Acredito que este simples exemplo possa ajudar no desenvolvimento de sua aplicação e mostre também a quantidade de funcionalidades existentes no Entity Framework 4.

[]s,

Carlos dos Santos.

Certificação .Net 4– Windows Developer

Pessoal,

 

Acabei de passar em mais uma prova beta do .Net 4.0 – Windows Developer 4. Lembrando que estas provas beta são lançadas gratuitamente antes do lançamento oficial do produto e servem para avaliar o conteúdo da prova, pois eles sempre têm mais questões que o normal, cerca de 80 questões cada prova, mas elas valem como certificação oficial, caso você passe.

 

 

cer

Abraços,
Carlos dos Santos.

Certificação em .Net 4.0

Pessoal,

Eu passei na prova beta do .Net 4.0 – Windows Application. Estas provas beta são lançadas gratuitamente antes do lançamento oficial do produto e servem para avaliar o conteúdo da prova, pois eles sempre têm mais questões que o normal, cerca de 80 questões cada prova, mas elas valem como certificação oficial, caso você passe.

No meu caso, eu fiz 3 provas do .Net 4.0 e recebi o resultado da primeira delas. Fiquem atentos pois estas provas são abertas a qualquer pessoa.

net4

Abraços,
Carlos dos Santos.

Agile Brazil 2010

Eu estive na quinta e sexta-feira (24 e 25/06) em Porto Alegre/RS para a Agile Brasil 2010 – Conferência Brasileira sobre Métodos Ageis de Desenvolvimento de Software e foi um evento realmente espetacular.

Primeiro por reencontrar vários amigos, depois pelos palestrantes, como Martin Flowler, um dos grandes influenciadores das metodologias ágeis. Nestes dias tivemos várias palestras e workshops , de alto nível, onde pudemos aumentar nosso conhecimento e trocar idéias.

Foi interessante também assistir ao jogo da seleção brasileira durante o evento, que foi transmitido nos telões do auditório principal e até serviram pipocas, show!!!

Para quem não foi, eu definitivamente recomendo que vá no próximo ano, onde teremos o keynote de abertura com Ken Schwaber, fundador da Scrum.org.

foto1
Martin Fowler no keynote de abertura.

foto2
Eu e o André Nobre.

foto3
Philippe Kruchten no keynote da sexta-feira

foto4
Jogo da Seleção Brasileira
foto5foto6
Movimentação durante o evento.
foto7

Fechamento do evento.

Abraços,
Carlos dos Santos

Professional Scrum Master

Pessoal, eu acabei de passar na prova do Professional Scrum Master (www.scrum.org). Agora só falta fazer a Professional Scrum Developer, que é baseada no Visual Studio Team System 2010.

Após realizar este segunda prova, eu poderei ministrar cursos oficiais de Scrum pela Scrum.Org.

Abraços,
Carlos dos Santos.

Palestra na Faccar de Rolândia/PR sobre Visual Studio 2010

Eu estive na Faculdade Paranaense – FACCAR, de Rolância/PR na última sexta-feira (11/06), para ministrar uma palestra sobre Visual Studio 2010 e as novidades da plataforma.

Neste evento, tive a oportunidade de mostrar recursos como programação dinâmina, paralelelismo, Entity Framework 4, WPF e Silverlight.

Gostaria de agradecer ao convite do Prof.Zanete e espero voltar mais vezes para mostrar os avanços tecnológicos da plataforma .Net

Vejam as fotos:

DSC04926 DSC04927 DSC04928 DSC04929

[]s,
Carlos dos Santos.

Scrum para o VSTS 2010

A Microsoft acaba de liberar o template Beta de Scrum para o Team Foundation Server 2010. Eu já tive oportunidade de trabalhar com ele na semana passada durante um curso de Professional Scrum Developer e está realmente muito bom.

Conheça o novo template no link: http://blogs.msdn.com/b/aaronbjork/archive/2010/05/25/announcing-team-foundation-server-scrum-v1-0-beta.aspx

[]s,
Carlos.