NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!
UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI
Olá pessoal,
Nesta quinta etapa de nosso tutorial trabalharemos coma visualização dos resultados.
Abra o VS .Net 2003, pois daremos continuidade a implementação de nosso WebService.
Abra o arquivo EnqueteService.asmx. O próximo passo agora é criar o serviço que armazena os valores percentuais de cada item da enquête. O código que vamos mostrar logo abaixo, primeiramente obtém o total de votos de uma determinada enquete, depois usamos o próprio código SQL para tornar os valores inteiros em valores relativos, ou percentuais, dividindo seu valor real pelo total de votos e depois multiplicando por 100, veja. Então, digite o código como mostrado abaixo:
//Descrição do serviço
[WebMethod(Description="Obtém o percentual de votos de uma determinada enquete")]
public DataSet ObterPercentualDosVotos(int IDEnquete)
{
//Abre a conexão para executar um comando
Conexao.Open();
// Instancia o objeto OleDbommand para obter o total de votos de uma determinada enquete
OleDbCommand OleDbCmd1=new OleDbCommand("Select Sum (Votos) from TbItens where IDEnquete=" + IDEnquete +"",Conexao);
int TotalDeVotos;
//Atribui o total de votos a vairável criada
TotalDeVotos=Convert.ToInt32(OleDbCmd1.ExecuteScalar());
//Cria um novo Adapter para armazenar a porcentagem dos votos de cada Item
OleDbDataAdapter oleDbAdp=new OleDbDataAdapter("Select (Votos/" + TotalDeVotos +" *100 ) as VotosPercentuais,CorDoGrafico,Texto from TbItens where IDEnquete=" + IDEnquete + "",Conexao);
//Cria um novo DataSet
DataSet dsPercentual=new DataSet();
//Anexa os dados do Adapter ao DataSet criado
oleDbAdp.Fill(dsPercentual,"PercentuaisDeVotos");
//Encerra a conexão.
Conexao.Close();
Conexao.Dispose();
return dsPercentual;
}
Ok, agora criaremos a interface que consumirá este serviço. Faça novamente a referência ao projeto.
Crie um novo arquivo chamado Resultado.aspx. Insira os controles conforme a imagem abaixo:
PlaceHolder – ID=Ph
Panel – Este deve ser colocado sob o PlaceHoldes, pois é apenas para determinar a área do gráfico.
O que vamos fazer agora é criar um gráfico de barras com os Itens de uma determinada enquête. Estes itens devem possuir cores diferentes. Por isso, vamos criar um controle do tipo Panel. Ele será criado dinamicamente, pois precisamos ajustar sua cor, sua largura de acordo com os dados da enquête. Segue abaixo o código que gera o gráfico de barras:
private void DesenharGrafico(int IDEnquete)
{
//Faz referência ao serviço
localhost.EnqueteService es=new Enquetes.localhost.EnqueteService();
//Cria um DataSet e armazena nele os dados do serviço ObterPercentualDeVotos
DataSet ds=es.ObterPercentualDosVotos(IDEnquete);
//Cria uma matriz com as possíveis cores para as barras:::Configure da forma que quiser
Color[]
cor={Color.Firebrick,Color.DarkCyan,Color.MediumVioletRed,Color.DarkGreen};
//Variável contadora para selecionar a cor da barra
int x;
//Início do loop
//Incrementa x enquanto não atingir todos os itens da tabela
for(x=0;x<ds.Tables[0].Rows.Count;x++)
{
//Percorre todas as linhas(rows) da tabela
foreach(DataRow row in ds.Tables[0].Rows)
{
//Cria um Label dinamicamente para exibir o texto do Item
Label lb=new Label();
//Formata o label
lb.Text=row[2].ToString();
lb.Font.Name="Arial";
lb.Font.Size=FontUnit.XSmall;
//Indica que a cor da fonte do label será a mesma da barra
lb.ForeColor=cor[x];
//Cria o Panel dinamicamente::Este representará a barra de cada item
Panel pn=new Panel();
//Indica o valor percentual do Item na propriedade ToolTip(Dica de Tela)
pn.ToolTip=row[0].ToString() + " %";
//Indica que a largura do Panel representa o gráfico de barra
pn.Width=Convert.ToInt32(row[0]);
//Altura da barra
pn.Height=20;
//Cor da barra
pn.BackColor=cor[x];
//Renderiza o Label através do PlaceHolder
Ph.Controls.Add(lb);
//Renderiza o Panel através do PlaceHolder
Ph.Controls.Add(pn);
//Incremento da variável x::É necessário fazer para evitar a repetição das cores e dos gráficos
x=x+1;
}
}
}
Ok, o código acima apresenta algumas novidades, como o uso dos PlaceHolder para renderizar os controles criados dinamicamente.
A cor do texto e da barra são as mesmas. Você pode determinar outras cores, desde que o número de cores disponíveis de cores no Array seja maior ou igual ao número de itens, e que também sejam adicionados através do prefixo Color.NomeDaCor, pois,esta matriz armazena valores da classe System.Drawing.Color.
Vamos fazer um teste neste código. Faça a chamada da rotina no Page_load() passando como parâmetro o IDEnquete de uma enquête existente e que contenha votos.
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
DesenharGrafico(1);
}
}
Vejam que os gráficos foram desenhados corretamente. Agora, posicione o mouse sobre as barras para ver o valor percentual:
Vejam que o resultado aparece. Uma Dica: Se você achou que o tamanho das barras está muito pequeno em relação à área do gráfico, basta aumentar sua escala alterando o seguinte trecho do código:
pn.Width=Convert.ToInt32(row[0]);
para
pn.Width=5* Convert.ToInt32(row[0]);
Vejam que multipliquei o tamanho da barra por 5. Você pode usar o valor que melhor se ajustar na sua aplicação. Vejam:
Escala ajustada para 8X
Ainda não concluímos precisamos fazer com que a página principal da enquete chame esta página. Abra o arquivo VisualizarEnquete.aspx.
Agora vamos apenas adicionar uma linha de código para que o botão btnResultado funcione:
No final da rotina MostrarEnquete, acrescente o seguinte trecho do código:
btnResultado.Attributes.Add("onclick","window.open('Resultado.aspx?idenquete=" + IDEnquete +"')");
Este trecho fará com que os resultados a serem carregados são referentes a enquete visualizada.
Para terminar falta apenas uma modificação no arquivo Resultado.aspx.
No page_load, altere o código da chamada da rotina para o código abaixo:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
DesenharGrafico(Convert.ToInt32(Request.QueryString["idenquete"]));
}
}
Isto conclui mais esta etapa do tutorial. Vamos ao teste final:
Mais uma enquete criada....
Exibição dos resuitados....
Valeu pessoal. Na próxima etapa estaremos concluindo finalmente este tutorial. Para dicas,sugestões, críticas ou elogios, o email é
Um grande abraço!
Lano de Castro