LINQ - Agrupar por meses

Neste poste vou mostrar um exemplo de uma instrução LINQ para agrupar uma lista por meses, contar os registos de cada grupo e somar valores (neste exemplo é dinheiro).
Está a ser primeiro ordenado por anos, e depois por meses.

var encomendas = from enc in Lista
group enc by new
{

enc.DataPagamento.Value.Year,
enc.DataPagamento.Value.Month
}
into g
select new
{
Mes = g.Select(n => n.DataPagamento.Value.Month).First(),
TotalLiquido = g.Sum(n => (Decimal) n.TotalLiquido),
TotalEncomendas = g.Count()
};
Posted por Guilherme Cardoso | with no comments

ASP.NET - Actualizar UpdatePanel por codebehind com imagem "Loading"

Por vezes, temos de criar vários UpdatePanel nas nossas páginas, principalmente quando utilizamos vários ContentTemplate na MasterPage.
Actualizar o controlo UpdatePanel por codebehind é bastante simples.

  • Primeiro temos de definir o UpdateMode como conditional, de modo a que fique assim: <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
  • Quando o quisermos actualizar por codebehind, só temos de recorrer ao método Update e depois fazer DataBind.
    UpdatePanel2.Update();
    UpdatePanel2.DataBind();

Enquanto ele está a actualizar, podemos mostrar uma imagem em no centro do ecrã. Muitas vezes é utilizado com círculos em constante movimento, outras vezes com imagens a dizer "Loading.." ou "A Actualizar..".
Para isto só precisamos de utilizar um UpdateProgress que vem incluido na .NET 3.5 e o controlo AlwaysVisibleControlExtender da AjaxControlToolkit (download aqui) para manter sempre a imagem no centro do ecrã e fixa.

 

<asp:UpdateProgress DynamicLayout="false" ID="UpdateProgress2" runat="server">
    <ProgressTemplate>
            <asp:Image ID="ImagemActualizar" runat="server" ImageUrl="~/Imagens/ajax-loader.gif" />
    </ProgressTemplate>
</asp:UpdateProgress>

<cc1:AlwaysVisibleControlExtender ID="AlwaysVisibleControlExtender1"
 runat="server" TargetControlID="UpdateProgress2"
 HorizontalSide="Center" VerticalSide="Middle" HorizontalOffset="0">
</cc1:AlwaysVisibleControlExtender>

Podemos declarar estes dois controlos no inicio do conteúdo de uma MasterPage, que depois é aplicado ás outras páginas todas.

Para gerarem as imagens, têm bastantes websites com geradores que dão logo o endereço da imagem já em .gif ou .png:
http://ajaxload.info/
http://www.loadinfo.net/
http://www.sanbaldo.com/wordpress/1/ajax_gif/
http://www.webscriptlab.com/

Posted por Guilherme Cardoso | with no comments

SQL Server 2005 Management Studio Express - Erro 29506

Num post anterior (link) escrevi sobre um problema de compatibilidade entre o SQL Server 2005 Express e o Windows 7. Além deste problema, podemos receber um erro ao instalar o SQL Server 2005 Management Studio Express, com o código 29506.

Este erro deriva do facto de ser um pacote de instalação, e não podermos executar como administrador indo ás propriedades do pacote "Executar como Administrador".
No entanto a solução é bastante simples:

  • Menu Iniciar -> Todos os Programas -> Acessórios
  • Com um click na linha de comandos escolhemos "Executar como Administrador".
  • Na consola alteramos a directoria para onde se encontra o pacote de instalação (por defeito com o nome SQLServer2005_SSMSEE ou SQLServer2005_SSMSEE_x64). Para não complicar muito, o melhor é colar o pacote de instalação na raiz do C: e para mudar-mos para essa directoria, executamos o comando na linha de comandos cd c:\
  • Agora vamos executar o pacote. Se for o pacote normal, fazemos o comando (temos de escrever o ponto final como está a negrito)  .\SQLServer2005_SSMSEE.msi
    Se for a versão 64 bits, o comando é .\SQLServer2005_SSMSEE_x64.msi

A instalação vai correr então com privilégios de Administrador, e sem problemas.

Posted por Guilherme Cardoso | 1 comment(s)
Filed under:

SQL Server 2005 Express e Windows 7

Para quem utiliza o SQL Server 2005 com o Windows 7 deve ter reparado no aviso no início da instalação.
É necessário correr o executável em modo de compatibilidade. Fica aqui a dica para quem quiser instalar o SQL Server 2005 Express numa máquina com o Windows 7 (ou Vista) instalados.

O download pode ser feito aqui: http://www.microsoft.com/downloads/details.aspx?familyid=220549b5-0b07-4448-8848-dcc397514b41&displaylang=en

Posted por Guilherme Cardoso | 1 comment(s)
Filed under:

Walppaper - Calendários de Julho

Como fiz no mês de Junho, este Mês vou voltar a postar alguns wallpapers.
Podem ver o artigo da SmashingMagazine aqui (link).

 

Some Old Stuff - autor: Thais Trizoli

Some-old-stuff in Desktop Wallpaper Calendar: July 2010

 

Moving Iceberg - Autor: M. Nur Lanta Adena

Moving-iceberg in Desktop Wallpaper Calendar: July 2010

 

Summer Days - Autor: Sasha Bell

Summer-days in Desktop Wallpaper Calendar: July 2010

 

Kings New Clothes - Autor: Yuri Klebanov

Kingsnewclothes in Desktop Wallpaper Calendar: July 2010

 

In the Village - Autor: NataliyaCS

In-the-village in Desktop Wallpaper Calendar: July 2010

 

Fonte: http://www.smashingmagazine.com/2010/06/30/desktop-wallpaper-calendar-july-2010/

Posted por Guilherme Cardoso | with no comments
Filed under:

LINQPad - Um quadro de aprendizagem de LINQ !

Ao fim de tanto tempo a escrever instruções LINQ, correr o código e preencher Gridviews finalmente veio à minha vida enquanto programador o LINQPad!
Esta ferramenta permite-nos mesmo isso: escrever instruções LINQ (ou SQL) e através de um Click (ou do F5 para aqueles que já têm um dedo habituado a ir lá fazer o debug) o LINQPad corre a instrução e devolve-nos logo o resultado numa tabela na mesma janela. Excelente!

É muito boa para treinar-mos LINQ porque não temos de esperar aqueles segundos chatos de correr a aplicação, e actualizar a página. Como é tão rápido, fazemos mais tentativas sem acharmos "secantes". Além que tem incorporado os exemplos do livro C# 3.0 (e 4.0) in a Nutshell.

Actualmente existem duas versões para download: para a framework 3.5 e 4.0.
No canto inferior esquerdo, se formos à janela Samples encontramos bastantes exemplos e ainda a opção para fazer download de mais (que falei no inicio).

Além de ter suporte para C# e VB, também suporta Entity Framework (nas conexões adicionamos o nosso modelo do EF e ele praticamente faz o resto!).

É também importante referir que numa versão paga, temos acesso ao intellisense no LINQPad, isto é, à medida que vamos escrevendo o código ele vai-nos dando as sugestões e possibilidades de propriedades/objectos, como o Visual Studio faz.

Podem fazer download gratuíto do LINQPad aqui: http://www.linqpad.net/

Posted por Guilherme Cardoso | 1 comment(s)
Filed under: ,

Sys undefined - Como resolver

Para quem já recebeu esta mensagem de erro (Sys undefined) e procurou soluções como eu, é bem provável que tenham perdido muito tempo a mexer e remexer no Web.Config da vossa aplicação mas este erro pode persistir.

Este erro ocorre quando tentamos aceder cedo demais à namespace Sys. Isto porque o ScriptManager (ou ToolScript Manager) injecta Javascript para o AJAX Framework, o ScriptManager e o UpdatePanel mas na posição onde ele se encontra. Vi alguns artigos a explicarem que é preciso definir dentro da tag head a referência à namespace Sys:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(End);


Isto vai continuar a resultar em erro, porque o ScriptManager encontra-se depois da secção onde muitos nos aconselham a recorrer ao Sys. Uma das formas apresentadas no blog Encosia é escrever o código Javascript não na tag head mas sim após o controlo ScriptManager.
Essa solução funciona, mas mesmo assim há outra forma melhor para fazer ist0 (também apresentada por eles).

O controlo ScriptManager (O ToolScriptManager trabalha da mesma forma na declaração de ficheiros Javascript) permite-nos declarar ficheiros Javascript para que não sejam usados antes dele.

<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="Init.js" />
</Scripts>
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
Conteúdo
</ContentTemplate>
</asp:UpdatePanel>


O ficheiro Init.js pode ficar assim:

function CarregarTeclado() {
$('#TextBoxPass').keypad();
$('#TextBoxReferencia').keypad();
}
function End(sender, args) { }


function AppInit(sender) {
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(End);
}
Sys.Application.add_init(AppInit);
Sys.Application.add_load(CarregarTeclado);

Desta forma estamos a recorrer à namespace Sys através do próprio controlo ScriptManager, o que implica que não hajam erros por recorremos antes do controlo ser declarado.
Na função AVossaFuncao podem carregar os script jQuery que utilizam para menus, efeitos de slideshow, etc.

Actualização 07/0/2010: É importante que as funções sejam criadas antes de as utilizar-mos com o Sys (como mostrei no exemplo de cima já corrigido).

NHibernate 2.0 - Introdução

Nas próximas semanas vou dedicar algum tempo livre a estudar o NHibernate.

Já ouvi falar muito bem deste ORM mas quando comecei a tentar estudá-lo e aprender a utilizá-lo comecei a achar que era bastante complicado! Agora que começo a entender melhor a arquitectura dele começo a reparar que não é tão complicado assim, o meu problema foi encontrar material para estudar. Para ser sincero estou fechado no quarto desde ontem ao final da tarde, só para conseguir entender o que vou escrever neste artigo..

Por isso decidi começar a escrever uma jornada de artigos sobre a iniciação de NHibernate! Á medida que for aprendendo novos recursos vou postando no meu blog.
No final do post vou deixar alguns links úteis sobre NHibernate.

Se acontecer alguem reparar em erros por favor avise-me, ainda estou a iniciar-me neste ORM e gostava de ganhar boas bases nele.

Quem quiser fazer download do projecto pode fazê-lo aqui: http://github.com/guilherme-cardoso/NHibernate---Introdu--o/downloads

 

 


NHibernate

O NHibernate é um ORM baseado noutro ORM para Java, o Hibernate. A função dele é mapear a classe do nosso projecto com a base de dados sem termos de nos preocupar com comandos SQL.

Mais abaixo na parte dos métodos, vamos reparar em três interfaces usadas (á excepção da IQuery que vai ficar mais para a frente):

  • ISession - representa uma  pela conecção com a base de dados
  • ITransaction - representa uma transacção controlada pelo NHibernate
  • IQuery - representa uma consulta á base de dados

Estas três interfaces pertencem á assembly NHibernate.dll

Um bom exemplo que posso mostrar de onde a utilização de um ORM ia facilitar-me bastante a vida enquanto programador é um post que escrevi há pouco mais de um ano aqui: http://pontonetpt.com/blogs/guilhermecardoso/archive/2009/05/19/P29173.aspx Infelizmente esse método de uso de DataTables e DataSets ainda é o método de aprendizagem na maioria das Escolas Profissionais.

 


Instalação

Ao contrário do Entity Framework que já vem incorporado no Visual Studio, o NHibernate requere uma instalação manual.
É muito simples, basta fazer-mos download do NHibernate (link). Quando criar-mos um novo projecto adicionamos as seguintes referências:

  • NHibernate.dll (NHibernate-2.1.2.GA-bin\Fluent NHibernate)
  • NHibernate.ByteCode.Castle.dll (NHibernate-2.1.2.GA-bin\Fluent NHibernate)
  • Castle.Core.dll (NHibernate-2.1.2.GA-bin\Fluent NHibernate)

Para mais tarde voltar a criar projectos sem ter de fazer download do NHibernate novamente, extraí o download para uma pasta no C:/ e sempre que quero criar novos projectos, adiciono as referências apartir de lá.

O uso de uma proxy é requirido pelo NHibernate. Neste exemplo estou a usar a Castle mas não vou falar dela neste artigo pois não sei do que se trata! Mais tarde lá irei.

 


Configuração

Para configurar o NHibernate vi em bastantes tutoriais criarem o arquivo hibernate.cfg.xml e quando é chamado o método Configure() da assembly NHibernate.Cfg.Configuration o NHibernate vai procurar esse arquivo e aplicar as configurações.

Eu preferi criar dentro do próprio Web.Config.
Aseguir á tag <ConfigSections> (percente à <configuration) adiciona-mos uma nova secção para depois adicionar-mos a configuração do NHibernate com o nome dessa secção (hibernate-configuration):

<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>

Aseguir á tag </configSections> é que inseri a configuração do NHibernate.

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="dialect">
NHibernate.Dialect.MsSql2005Dialect
</property>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
Server=Computador\SQLEXPRESS;
Database=NHibernate;
Integrated Security=True;
</property>
<property name="proxyfactory.factory_class">
NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle
</property>
</session-factory>
</hibernate-configuration>

Vão precisar de alterar o nome do vosso servidor SQL na propriedade connection.connection_string. O nome aparece quando iniciam o SQL Server 2005 (na caixa de diálogo para conectarem-se ao servidor).

Estou a usar um servidor SQL Server 2005. Se não estiverem a trabalhar com estas base de dados, podem ver um artigo que o Leandro Ribeiro escreveu sobre base de dados suportadas pelo NHibernate: http://pontonetpt.com/blogs/leandroribeiro/archive/2008/02/22/P26588.aspx

 


Mapeamentos

Configurado o NHibernate vamos criar os mapeamentos.
Agora a início vou fazer os mapeamentos usando arquivos .XML (tradicional do NHibernate), mas mais para a frente vou recorrer ao Fluent NHibernate. O Fluent NHibernate permite-nos fazer os nossos mapeamentos em código (ao invés de arquivos XML)  e também tem a particularidade de criar mapeamentos automáticos apartir das nossas entidades (não sei se para NHibernate também exista algo que crie em XML mas para já não vale a pena ver isso).

Para estruturar melhor o nosso projecto, vamos criar uma pasta com o nome Mapeamentos. Dentro dessa pasta vamos criar um arquivo XML com o nome Noticias.hbm.xml.
Um aspecto importante é a extensão .hbm.xml. O NHibernate vai reconhecer todos os arquivos que contenham hbm antes da extensão .xml como arquivos de mapeamento.

Antes de começar-mos a escrever o nosso mapeamento vamos utilizar um esquema xml que vinha no download que fizemos a ínicio para que o Visual Studio e o IntellIsense nos facilite o trabalho enquanto estivermos a escrever o código. O arquivo chama-se nhibernate-mapping.xsd e está dentro da pasta Required_Bins. Para alterar-mos o esquema entramos dentro do ficheiro Noticias.hbm.xml, metemos o cursor dentro da área de código como se fossemos escrever algo e na janela das propriedades vai aparecer um campo com o nome Schemas. Aí vamos indicar onde está o ficheiro nhibernate-mapping.xsd

Para já vamos criar apenas uma tabela com o nome Noticias e três colunas: Id, Titulo e Corpo.

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NH" namespace="NH.Dominio">
<class name="Noticias" table="Noticias">
<id name="Id" column="Id">
<generator class="native" />
</id>
<property name="Titulo"></property>
<property name="Corpo"></property>
</class>
</hibernate-mapping>

A namespace NH.Dominio está a indicar onde temos a Entidade referente a este mapeamento (que vamos criar aseguir).
A coluna Id é representada com a própria tag <id> e como neste exemplo é de auto-incrementação, defenimos a generator com a class native.

As propriedades são as restantes tabelas.

 


Entidades

As entidades são escritas em código. São os objectos dos nossos mapeamentos.
Dentro da pasta Dominio vamos criar um arquivo de classe com o nome Noticias.cs.
Vamos criar uma classe (tabela) com o nome Noticias e declarar 3 objectos: Id, Titulo e Corpo

namespace NH.Dominio
{
public class Noticias
{
public virtual Int32 Id { get; set;}
public virtual string Titulo { get; set; }
public virtual string Corpo { get; set;}
}
}

É preciso atribuir a propriedade virtual ás variáveis para que o NHibernate possa trabalhar com elas.

 


Contexto

Esta camada vai ser responsável ligação entre o nosso programa e o NHibernate, que por sua vez se liga á base de dados.

public class Contexto
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
 if(_sessionFactory == null)
{
string directoria = System.Web.HttpContext.Current.Server.MapPath(@"~/Dominio/");
NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration();
configuration.AddXmlFile(directoria + "Noticias.hbm.xml");
configuration.Configure();
_sessionFactory = configuration.BuildSessionFactory();

}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}

Ela apenas vai criar uma nova sessão se a mesma ainda não tiver sido criada (na condição _sessionFactory == null).
É também aqui que vamos incluir o nosso mapeamento das Noticias nas configurações do NHibernate. Eu criei a string directoria para obter indicar o caminho quando adicionei o arquivo XML.

 


Métodos CRUD (Create, Read, Update e Delete)

Agora que temos o NHibernate configurado, criá-mos os mapeamentos e entidades podemos escrever os métodos CRUD.

Os métodos CRUD vamos colocar numa camada á parte que vamos criar, a camada Dal.cs. Isto vai ajudar-nos a manter a esturutra do nosso programa organizada.

Inserir

public void Noticias_Adicionar(Noticias noticia)
{
using (ISession session = Contexto.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(noticia);
transaction.Commit();
}
}

 

Apagar

public void Noticias_Apagar(Noticias noticia)
{
using (ISession session = Contexto.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(noticia);
transaction.Commit();
}
}

O método para apagar uma notícia é semelhante ao de inserir. A diferença que notamos é na interface session, em vez de salvar-mos chamamos o método Delete para apagar a notícia em questão.
Correcção: Não é necessário fechar a sessão (Session.Close) como eu a início expliquei pois ao bloco using, a variável Session vai ficar liberada da memória automaticamente.

Actualizar

public void Noticias_Actualizar(Noticias noticia)
{
using (ISession session = Contexto.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Update(noticia);
transaction.Commit();
}
}

Mais uma vez, a única diferença que notamos é o Update.

Ler por ID

public Noticias Noticias_Devolver_PorId(int id)
{
using (ISession session = Contexto.OpenSession())
{
return session.Get<Noticias>(id);
}
}

Retornar uma Lista

public List<Noticias> Noticias_Devolver()
{
using (ISession session = Contexto.OpenSession())
{
return session.CreateCriteria(typeof(Noticias)).List<Noticias>();
}
}


O método em cima mostra como retornar uma Lista. Se virem este projecto (o link está no inicio do artigo), eu estou a preencher uma DropDownListrecorrendo a este método. Basta indicarmos o DataSource da DropDownLis (DropDownListNoticias.DataSource = dal.NoticiasDevolver();

 

E prontos, este foi o meu primeiro artigo relacionado com NHibernate.
Agora vou tentar analisar melhor o que aprendi nestas horas (se soubessem o que foram as minhas últimas 32 horas á custa disto!) e tentar melhorar o código que escrevi, nomeadamente o da classe contexto.

Aproveito para agradecer ao Ricardo Peres por me ter encaminhado um pouco e para pedir desculpas à Mafalda pelo tempo ausente ;)

 

Alguns links úteis:
NHibernate Portugal (mailling list na google): http://groups.google.com/group/nhpt
NHusers (mailling list na google): http://groups.google.com/group/nhusers
NHibernate fórum: https://forum.hibernate.org/viewforum.php?f=25

Share |

Resharper 5

Apesar de não ser nenhuma novidade a versão actual do Resharper decidi criar este artigo para os desactualizados como eu!

O Resharper é um plugin que é integrado no Visual Studio (actualmente é compatível com a versão 2010) que adiciona bastantes recursos que aumentam a produtividade e qualidade do código que escrevemos.
O que me deixou mais surpreendido quando instalei este plugin foi as sugestões e dicas que ele me deu para as minhas classes. Pequenos pormenores que eu não notava como alterar o nome do método Vendedor_ID para VendedorId, não declarar os parâmetros com maiúsculas, entre outros. O exemplo de baixo mostra isso mesmo.

Para mim, as sugestões deste plugin são óptimas porque são pormenores que de outra forma eu não saberia se estavam correctos ou não. O mais engraçado é que tenho noção que nem 5% das funcionalidades do Resharper eu devo estar a usar ou saber que posso usar. Com o tempo... ;)

Apesar de não ser gratuito, as licenças para estudantes são 49 euros (mais barato que as licenças normais de uso pessoal a 199 euros).
Mais informações: http://www.jetbrains.com/resharper/

Share |

Posted por Guilherme Cardoso | with no comments

Várias CSS consoante a resolução do Browser ou do monitor

Um problema comum que os Web Designers enfrentam são as diferentes resoluções utilizados pelos clientes.
Este aspecto é bastante importante. Temos de ter em consideração que os visitantes do website não vão ter a mesma resolução que nós, o mesmo dispositivo e muitas vezes javascript activado ou não.
Isto leva-nos a ter de criar várias alternativas para a estrutura do website. Uma delas é recorrer a percentagens para definir valores de tamanhos. Outra é aplicar folhas de estilo consoante a largura.

Neste artigo vou mostrar algumas formas de utilizar folhas de estilo consoante a resolução, seja da janela do browser ou do monitor.


Recorrendo a uma norma W3C (sem Javascript)


Existe uma norma W3C que nos permite utilizar folhas de estilo consoante a largura:

<link rel="stylesheet" media="screen and (min-device-width: 800px)" href="800.css" />

O código de cima vai aplicar a folha de estilo apenas se o ecrã tiver 800 pixeis de largura ou mais.
No entanto isso é a largura do dispositivo (seja ele um monitor de 22 polegadas ou um telemóvel). Algo também interessante é utilizar consoante o tamanho da janela do navegador

<link rel="stylesheet" media="screen and (min-width: 700px) and (max-width: 900px)" href="700-900.css" />

O código de cima vai aplicar a folha de estilo apenas se a janela do navegador tiver uma largura entre 700 e 900 pixeis. A alteração usada foi na propriedade da largura, em vez de min-device-width (em relação ao dispositivo) estamos a usar a min-width.

 

Função simples que recorre a jQuery


Outra forma simples de fazer isto é recorrendo a jQuery.
O que vamos fazer é criar várias folhas de estilo consoante os tamanhos que quisermos e apenas incluímos uma. É importante ao incluír essa folha de estilo, dar-lhe a propriedade do ID para aceder-mos por JavaScript.

<link id="size-stylesheet" rel="stylesheet" type="text/css" href="menos701.css" />

Agora precisamos de defenir as regras a utilizar. Esta função é bastante simples, e para ser utilizada apenas temos de ter o jQuery actualizado.

function AjustarTamanho(width) {
width = parseInt(width);
if (width < 701) {
$("#size-stylesheet").attr("href", "menos701.css");
} else if ((width >= 701) && (width < 900)) {
$("#size-stylesheet").attr("href", "701-900.css");
} else {
$("#size-stylesheet").attr("href", "mais900.css");
}
}

$(function() {
AjustarTamanho($(this).width());
$(window).resize(function() {
AjustarTamanho($(this).width());
});
});

 

 

Pluging jQuery browserSizr

Este plugin jQuery permite-nos na mesma folha de estilo, criar várias classes para diferentes tamanhos da resolução e usa-as consoante o tamanho do Browser.
Podem ver mais informações aqui: http://www.csslab.cl/2009/07/22/jquery-browsersizr/

 

Less Framework

Less Framework é uma framework CSS que cria estruturas flexíveis em colunas.
Em termos de compatibilidade suporta  Chrome, Safari 3.0+, Firefox 3.0+, Opera 10+ e Internet Explorer 7+.

Pessoalmente nunca testei esta framework mas para quem tiver mais curiosidade fica aqui a referência: http://lessframework.com/

| More

Walppaper - Calendários de Junho

Todos os meses mudo o meu Walppaper. De certa forma isto quebra um bocado a rotina de olhar para o Ambiente de Trabalho e ver o mesmo fundo, e se escolhermos fundos que estejam relacionados com um tema actual ou o próprio mês, mete a sua piada!

Este mês vou postar 5 walpappers que a Smashing Magazine publicou. Podem ver o artigo detalhado aqui (link).

Spring to Summer - autor: Natanael Fernández

 

Spring-to-summer in Desktop Wallpaper Calendar: June 2010

 

2010 Campeonato Mundial de África - autor: Davide Vicariotto

 

Seagull - autor: Indeziner

Seagull1 in Desktop Wallpaper Calendar: June 2010

 

Live design - autor: Klement Grgić

June-joys in Desktop Wallpaper Calendar: June 2010

 

Midnight Moon - autor: Dan King

Midnight-moon in Desktop Wallpaper Calendar: June 2010

 

Fonte: http://www.smashingmagazine.com/2010/05/31/desktop-wallpaper-calendar-june-2010/

 

| More

Posted por Guilherme Cardoso | with no comments
Filed under: ,

ASP.NET Chart Control Pie - Gráfico de Fatias

Num post anterior expliquei um problema comum com o controlo do Chart Control da Microsoft.
Neste post vou dar um exemplo de como criar um gráfico em fatias (Pie). Cada fatia irá corresponder a um distrito, e o valor a apresentar será o volume de encomendas de todos os clientes (consoante o distrito). Para consultar a base de dados estou a usar LINQ To Entities mas facilmente adaptam isto à ORM que estiverem a usar.

Para utilizar-mos o Chart Controls da Microsoft, fazemos este download (link).
Após feito o download executamos o executável e se necessário reiniciamos o Visual Studio. No nosso projecto adiciona-mos a referência System.Web.DataVisualization. Se formos alojar a nossa aplicação num servidor Web e não instalar-mos a dll no servidor, convém irmos à lista de referências, seleccionamos a System.Web.DataVisualization e a System.Web.DataVisualization.Design e na propriedade Copy Local usamos True.

Exemplo Gráfico em Fatias

As tabelas que estou a usar são 3:
Encomendas
- Na tabela de Encomendas precisamos de um campo com o valor líquido dessa encomenda e uma chave primária
Clientes
- A tabela Clientes vamos precisar de um campo com uma chave primária para criar-mos uma relação à tabela Encomendas
Distritos
- Basta-nos um campo com o nome do distrito e outro com a chave primária

Um ponto importante ao utilizarmos este controlo é a directoria onde vamos armazenar as imagens temporárias geradas pelo controlo. No meu caso precisei de alterar as permissões do utilizador para ter acesso à pasta, e criei-a dentro da App_Data por uma questão de privacidade.
No nosso Web.Config adiciona-mos uma nova chave na appSettings onde definamos as propriedades deste controlo, por exemplo:

<appSettings>
<add
key="ChartImageHandler" value="storage=file;timeout=20;URL=/App_Data/MicrosoftChartControls/" />


O valor da propriedade timeout indica em segundos o tempo que a imagem é alojada. Como isto é um projecto Web, 20 segundos chegam bem para o cliente descarregar a imagem para os ficheiros temporários.

Configurado o controlo, falta-nos escrever o código para preencher o gráfico.
Como se trata de um gráfico em fatias, para lidar com os valores do eixo do X e do eixo do Y vou usar duas arrays: uma string para o nome dos Distritos (eixo do X) e uma decimal para o valor líquido das encomendas de todos os clientes desse distrito (eixo do Y).
Para saber-mos o tamanho das arrays contamos os Distritos presentes na tabela. Por exemplo:

var distritos = from dist in contexto.Distritos
select dist;
decimal aux1;
decimal[] eixoY = new decimal[distritos.ToList().Count()];
string[] eixoX = new string[distritos.ToList().Count()];
int index = 0;

A variável aux1 vou utilizar como auxiliar para somar o valor das encomendas de cada Distrito, e a index é para adicionar-mos as entradas nas arrays nos índices correctos.

O que agora precisamos de fazer é percorrer todos os Distritos num ciclo, e por cada Distrito vamos seleccionar todas as encomendas cujos Clientes pertençam a esse Distrito (vamos unir a tabela Clientes e Encomendas na instrução). Vamos percorrer noutro ciclo essas mesmas Encomendas, e somando o valor delas (na variável aux1), para depois adicionar-mos à array (daí a variável index).

foreach (var s in distritos)
{
var cli = from encomendas in contexto.Encomendas
join clientes in contexto.VendedoresClientes on cl.IDcliente equals enc.IDcliente
where clientes.IDdistrito == s.IDdistrito
select new
{
IDcliente = clientes.IDcliente,
distrito = s.distrito,
total = encomendas.total
};
aux1 = 0;
foreach (var pa in cli)
{
aux1 = aux1 + Convert.ToDecimal(pa.total);
}

eixoY[index] = aux1;
eixoX[index] = s.distrito.ToString();
index = index++;
}

O código em cima mostra como criar os dois ciclos e adicionar os valores na arrays. É importante na instrução SQL ter a clausula onde o cliente tenha que pertencer ao Distrito do ciclo que estamos a percorrer (guardado na variável s).

Por fim, usamos as arrays para preencher o gráfico e defenimos algumas propriedades ao gráfico para ficar um gráfico de Fatias (Pie). Também adicionei uma legenda para mostrar os Distritos.

ChartDistritos.Series[0].Points.DataBindXY(eixoX, eixoY);

ChartDistritos.Series[0].ChartType = SeriesChartType.Pie;
ChartDistritos.ChartAreas[0].Area3DStyle.Enable3D = true;
ChartDistritos.Legends.Add(new Legend("D"));
ChartDistritos.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true;
ChartDistritos.Legends["D"].Title = "Distritos";

 

A equipa da Microsoft que desenvolveu este controlo para .NET disponibilizou-nos um projecto onde eles mostram os exemplos dos gráficos que existem, o código fonte em C# e VB e também nos permitem personalizar gráficos e consultar o código gerado. Podem fazer download deste projecto aqui (link).
Num projecto em que lidemos com Encomendas, a utilização de gráficos é muito útil e fácil de recorrer.

| More

Comunidade PontoNetPT há um tempito atrás

Hoje encontrei um site interessante, o Internet Archive que funciona como biblioteca online onde podemos consultar sites antigos que são guardados.
O mais engraçado é que ainda encontrei vários registos guardados do www.pontonetpt.com !

Dezembro 15, 2003

 

Abril 03, 2004


Dezembro 24, 2006

Posted por Guilherme Cardoso | with no comments

ASP.NET Chart Control - Durante um PostBack

Para se utilizar o controlo Chart apartir de um PostBack é necessário alterar o HttpHandler do ChartImg.axd, caso contrário recebemos a mensagem de erro: Erro ao executar pedido subordinado para ChartImg.axd

No Web.Config procuramos a linha:

<add path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
validate="false" />

Alteramos para:

<add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
validate="false" />

O atributo que estamos a adicionar é o Post.
Para quem não conhece este controlo é muito útil para criar gráficos. Podem ver mais informações aqui.

Mais Entradas Página seguinte »