Neste post, irei falar sobre os relatórios que são imprescindíveis em qualquer projeto, independente da complexibilidade.

Demonstrarei um exemplo que utiliza o excel como base, a grande vantagem neste caso é flexibilidade para o usuário que mais habituado com as ferramentas do office conseguirá adaptar, formatar e personalizar os dados extraídos conforme sua necessidade.

Vamos começar ?!

Criei uma página aspx (listagem 1).

No aspx: inclui uma label

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GerandoRelatorioExcel.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblMensagem" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

Listagem 1 - Código da página.

No aspx.cs (listagem 2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

// namespace para StringBuilder
using System.Text;

namespace GerandoRelatorioExcel
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GerarExcel();
        }

        private void GerarExcel()
        {
            StringBuilder excel = new StringBuilder();

            try
            {
                //Gera o cabeçalho do relatório
                excel.Append(GerarCabecalho());

                //Gera os registros do relatório
                excel.Append(GeraRegistros());

                //Se estiver definido como true, o ASP.NET processará toda a página e depois de concluído, mandará o output para o cliente
                //Se estiver definido como false, o ASP.NET já irá enviando o output para o cliente na medida em que a página vai sendo processada
                HttpContext.Current.Response.BufferOutput = false;

                //Limpa o response
                HttpContext.Current.Response.Clear();

                //Nome dado para salvar o relatório. Por exemplo: relatório gerado dia 30/03/2009 vai ter o nome de: rel_participants_30/03/2009
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=rel_participants_" + DateTime.Now.ToString("d") + ".xls");

                //Tipo de aplicação que será gerado o relatório. Aqui será p excel.
                HttpContext.Current.Response.ContentType = "application/ms-excel";                

                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode;

                //StringBuilder excel vai receber tudo que está no response
                HttpContext.Current.Response.Write(excel.ToString());

                //Envia imediatamente ao browser todo o conteúdo em buffer
                HttpContext.Current.Response.Flush();

                //Finaliza o response e é exibido até a linha onde se encontra o comando
                HttpContext.Current.Response.End();
            }
            catch
            {
                //A label criada no aspx só serve para mostrar a mensagem de erro, caso ocorra problemas ao gerar o relatório
                lblMensagem.Text = "Ocorreu um erro durante geração do relatório. Tente novamente.";
            } 
        }

        private string GeraRegistros()
        {
            StringBuilder registros = new StringBuilder();

            /*Aqui inclui diretamente os valores que aparecerão no relatório. 
              Mas vcs criarão seus métodos para trazer os registros
            */
           
            //Preenchimento dos campos que mostrarei no meu relatório
            registros.Append(DateTime.Now.ToString("d") + "\t");
            registros.Append("Fernanda Sallai" + "\t");
            registros.Append("Fernanda Sallai" + Environment.NewLine);           

            return (registros.ToString()); 
        }       

        /// 
        /// Gerar cabeçalho
        /// 
        /// 
        private string GerarCabecalho()
        {
            StringBuilder cabecalho = new StringBuilder();

            cabecalho.Append("Data" + "\t");
            cabecalho.Append("Nome" + "\t");         
            cabecalho.Append("Login" + Environment.NewLine);

            return (cabecalho.ToString()); 
        }
    }
}

Listagem 2 - Código para gerar o relatório.

Realizados todos esses passos, ao acessar essa página irá ser exibida a caixa de diálogo e o relatório nas figuras 1 e 2:

Figura 1 - Opção de abrir ou salvar relatório.

Figura 2 - Relatório gerado.

Projeto disponível: GerandoRelatorioExcel.rar (20,57 kb)


Em um projeto desenvolvido recentemente existem quatro páginas de listagens de conteúdos e cada uma irá listar 10 itens por vez.

Para isso criei um método de listagem que recebe como parâmetros limite de itens por página e total de itens encontrados.

Para manutenções futuras, por exemplo, alteração da quantidade de itens para 20 e não precisar ficar mudando nas 4 páginas, criei no web.config uma chave que conterá a quantidade de itens tornando assim disponível para todo o projeto, vejamos abaixo:

No Web.config:

<configuration> 
 <appSettings>
   <add key="limitOfItems" value="10"/>   
 </appSettings>
</configuration>

 Inclui uma chave chamada limitOfItems com o valor 10 dentro da tag appSettings:

Aspx.cs da página:

Inclui o namespace:

using System.Configuration;

E no evento Page_Load

A variável limit irá receber a quantidade de itens.

int limit = Convert.ToInt32(ConfigurationSettings.AppSettings["limitOfItems"]);

E para finalizar basta passar a variável limit no método de listagem.


O novo serviço criado pelo Google é http://books.google.com/ que facilitará a busca por conteúdos em livros.

Para os livros protegidos por direitos autorais só poderão ser visualizados os dados bibliográficos e conteúdos parciais.

 

 


Este texto recebi por email e achei muito interessante pelo modo de demonstrar que precisamos primeiramente nos analisar e verificar se as mudanças não deverão ocorrer em nós mesmos... O texto segue abaixo: 

Uma consulta bem ao sabor dos ventos do momento.

"Devido a essa crise que começou do nada e ninguém sabe quando vai terminar, o faturamento de uma certa empresa sofreu um baque no mês passado, a empresa ficou 32% abaixo do objetivo. E esse mês as coisas também não vão bem. Por isso, na semana passada, a diretoria reuniu os funcionários e o diretor geral disse que numa situação como essa, cada funcionário precisa ser um agente de mudança. Ninguém entendeu bem o que ele quis dizer. Isso significa que de agora em  diante, cada um vai ter autonomia para promover mudanças?"

Claro... que não. Um sistema em que cada um pode mudar o que acha que deve mudar, não gera o progresso, gera o caos.

O diretor geral não estava se referindo a mudanças radicais de processo, mas a simples mudanças individuais de atitude.

Primeiro, ele espera que os funcionários acomodados se tornem mais ativos, e os lentos se tornem mais rápidos.

Segundo, o diretor geral não espera que alguém da área industrial saia dando palpites sobre a metodologia comercial, nem que a contabilidade comece a opinar sobre a cor da embalagem do produto.

Ser um agente de mudanças significa antes de tudo, reavaliar o próprio trabalho.

Se houver uma maneira de executar o melhor, ou mais rápido ou com menor custo, uma proposta nesse sentido deve ser apresentada ao chefe imediato.

Se a soma dessas pequenas mudanças não fizer com que o faturamento volte aos níveis do ano passado, pelo menos ela fará com que comece a existir uma consciência maior de todos, com relação aos custos. E isso influirá na lucratividade, que é o que realmente interessa.

Como seres humanos normais que somos, nós sempre temos ótimas sugestões para mudar o que os outros estão fazendo.

Ser um agente de mudança significa entender que a mudança não começa pelos outros, mas por nós mesmos.


Fernanda Sallai

Sem a curiosidade que me move, que me inquieta, que me insere na busca, não aprendo nem ensino - Paulo Freire