Feliz Natal e Feliz 2012
Olá amigos.
Devido ao meu casamento e a minha monografia de BI (que ainda estou desenvolvendo) não consegui escrever muitos artigos esse ano. Espero que em 2012 isso não aconteça.rs.
Esse é o último post de 2011 e desejo a você, caro amigo, um feliz natal e um feliz 2012 que você tenha muita paz, saúde e alegrias.
Obrigado por me acompanhar em 2011 e continue nos prestigiando em 2012, prometo muitos conteúdos novos.
Saudações.
Marcos Aguiar Jr.
WPF: DataGrid – Parte 3
Nessa terceira parte do artigo vamos aprender a fazer uma coluna com link para um endereço da internet.
Para esse exemplo criei uma nova tela no Visual Studio com um grid e um botão carregar conforme imagem abaixo:
No evento do botão carregar crie o seguinte código:
private void btnCarregar_Click(object sender, RoutedEventArgs e)
{
DataSet dsConsulta = new DataSet();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
conn.Open();
string strComando = "select VendorID, AccountNumber," +
" Name, " +
" PurchasingWebServiceURL," +
" CreditRating," +
" PreferredVendorStatus," +
" ActiveFlag" +
" from Purchasing.Vendor" +
" where PurchasingWebServiceURL is not null";
SqlCommand cmd = new SqlCommand(strComando, conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dsConsulta, "TABLE");
}
this.dgLink.DataContext = dsConsulta.Tables[0];
}
As colunas de nosso grid devem ser criadas da seguinte forma:
<DataGrid AutoGenerateColumns="True" Height="299" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dgLink" VerticalAlignment="Top" Width="466" ItemsSource="{Binding}"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=VendorID}" Header="Vendor ID" /> <DataGridTextColumn Binding="{Binding Path=AccountNumber}" Header="Account Number" /> <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" /> <DataGridHyperlinkColumn Header="Purchasing Web Service URL" Binding="{Binding PurchasingWebServiceURL}"> <DataGridHyperlinkColumn.ElementStyle> <Style> <EventSetter Event="Hyperlink.Click" Handler="DG_Hyperlink_Click"/> </Style> </DataGridHyperlinkColumn.ElementStyle> </DataGridHyperlinkColumn> </DataGrid.Columns> </DataGrid>
Criamos uma coluna do tipo DataGridHyperlinkColumn e definimos para ela um estilo. Dentro desse estilo definimos um evento Click e o evento (DG_Hyperlink_Click).
Agora vamos programar esse evento:
Hyperlink link = e.OriginalSource as Hyperlink; Process.Start(link.NavigateUri.ToString());
Criamos um objeto Hyperlink que irá receber as informações do link no grid, em seguida chamamos esse endereço. Se o endereço aponta um site que será aberta com o padrão web browser, se for uma pasta ela será aberta no explorer, se é um arquivo que será aberto com o aplicativo padrão associado a ele.
Execute o código e veja o resultado.
No próximo artigo vamos aprender novas funcionalidades o datagrid.
Até a próxima.
Curso: Dominando o SQL Server 2008 – Promoção
O curso Dominando o SQL Server 2008 que eu desenvolvi e é oferecido em parceria com o portal iMasters está em promoção de 20% de desconto. Aproveitem a oportunidade de se preparar para o mercado de trabalho, estudando em casa (online) de forma prática.
Qualquer dúvida pode entrar em contato comigo.
Obrigado.
WPF: DataGrid – Parte 2
Na primeira parte do arquivo (caso não tenha lido acesse aqui) aprendemos como popular nosso DataGrid, especificar as colunas e os tipos de colunas. Como prometido vamos aprender a colocar uma imagem no DataGrid. Vamos continuar a utilizar a aplicação de exemplo do artigo anterior.
Primeiro passo é alterar nossa consulta anterior. Estamos utilizando nesse exemplo a base de dados do AdventureWorks. Nossa consulta irá partir da tabela Product até chegar na tabela Product Photo que contém a imagem do produto:
SELECT PRO.ProductID,
PRO.Name,
PRO.ProductNumber,
PRO.color,
IMG.ThumbNailPhoto
FROM Production.Product PRO
INNER JOIN Production.ProductProductPhoto PPR
ON PPR.ProductID = PRO.ProductID
INNER JOIN Production.ProductPhoto IMG
ON PPR.ProductPhotoID = IMG.ProductPhotoID
Essa consulta irá trazer uma coluna chamada ThumbNailPhoto que possui uma imagem no formato binário.
Agora vamos alterar nosso código C# para acessar essa nova consulta, faça a alteração no evento click do botão Carregar;
private void btnCarregar_Click(object sender, RoutedEventArgs e)
{
DataSet dsConsulta = new DataSet();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
conn.Open();
string strComando = "SELECT PRO.ProductID, " +
" PRO.Name, " +
" PRO.ProductNumber, " +
" PRO.color, " +
" IMG.ThumbNailPhoto " +
" FROM Production.Product PRO " +
"INNER JOIN Production.ProductProductPhoto PPR " +
" ON PPR.ProductID = PRO.ProductID " +
"INNER JOIN Production.ProductPhoto IMG " +
" ON PPR.ProductPhotoID = IMG.ProductPhotoID";
SqlCommand cmd = new SqlCommand(strComando, conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dsConsulta, "TABLE");
}
this.dgTeste.DataContext = dsConsulta.Tables[0];
}
Agora é a parte interessante, vamos alterar o código XAML. No artigo anterior aprendemos sobre os tipos de colunas e um deles foi o DataGridTemplateColumn. Com esse tipo de coluna podemos definir qual objeto estará dentro da célula, pode ser um TextBlock, um CheckBox ou um componente Image que é o que vamos utilizar, veja o código abaixo:
<DataGridTemplateColumn Header="Imagem" Width="SizeToCells" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding ThumbNailPhoto}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Esse código deve ficar dentro da tag <DataGrid.Columns>. Criamos uma coluna do Tipo DataGridTemplateColumn. Dentro da coluna definimos a tag DataTemplate que onde definimos nosso componente. No componente Image definimos o Source onde setamos a imagem, no caso Binding (significa que vem da fonte de dados do DataGrid) e a coluna que contem a imagem.
Veja como ficou nosso exemplo:
Bem simples, não? Na próxima tarde desse artigo vamos aprender como utilizar a coluna DataGridHyperlinkColumn, a congelar colunas e outras funcionalidades.
Obrigado e até o próximo artigo.
Um Gênio que parte – Morre Steve Jobs
A vida as vezes prega uma peça na gente, levando pessoas geniais cedo. Isso acontece em vários segmentos, seja no esporte, política, na música. Pois no dia de hoje ela levou um gênio da TI. Uma pessoa que nunca fez faculdade mas que tinha uma visão além dos demais. Hoje o mundo perde Steve Jobs, criado da Apple, dono da maior empresa de animação do mundo, a Pixar e inventor do IPod, IPhone e IPad.
Jobs tinha o dom de criar uma necessidade nas pessoas que não existia, foi assim com IPad. Me diga se um dia você pensou que teria essa necessidade? Jobs não investia em pesquisa para saber o que o cliente deseja, se baseada na frase de Ford: “Henry Ford disse que, se tivesse questionado seus clientes sobre o que queriam, a resposta seria um cavalo mais rápido“, afirmou, em entrevista à revista “Fortune” em 2008.
Teve a visão de criar smartphones para pessoas comuns, de investir na música digital enquanto o restos pensavam como evitar a pirataria do CD.
Criar uma empresa inovadora, ser expulso dela, voltar depois de anos, tirar essa empresa da falência e a torna-la a maior do mundo, esse foi sem dúvida um feito que pouquíssimas pessoas no mundo voltarão a repetir.
Fica aqui minha pequena homenagem a Steve Jobs com a tradução da nota oficial da Apple:
“A Apple perdeu seu gênio criativo e visionário, o mundo perdeu um ser humano maravilhoso. Aqueles que foram sortudos o suficiente para conhecer e trabalhar com Steve perderam um grande amigo e um mentor. Steve deixa uma companhia que apenas ele poderia ter construído e o seu espírito será a base da Apple para sempre”
Steve, muito obrigado.
WPF: DataGrid – Parte 1
WPF em suas primeiras versões não possuía um grid, porém na versão .NET 4.0 a Microsoft corrigiu essa “falha”. Nós últimos dias tive estudado sobre esse componente (estou desenvolvendo meu primeiro projeto em WPF) e vou compartilhas com vocês um pouco desse aprendizado.
Como de costume, gosto de explicar e ao mesmo tempo desenvolver o projeto, então abra o Visual Studio, crie um projeto WPF Application, no meu exemplo o nome ficou WPF_DataGrid. Na página MainWindows coloque um DataGrid e um botão, conforme abaixo:
Tela Iniciada
Para esse exemplo vou utilizar o banco de dados AdventureWorks que você acha de forma fácil para download na internet. No evento Click do botão carregar, faça uma conexão com a base do SQL Server e uma consulta na tabela Product conforme código abaixo:
private void btnCarregar_Click(object sender, RoutedEventArgs e)
{
DataSet dsConsulta = new DataSet();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT ProductID, Name, ProductNumber, color FROM Production.Product", conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dsConsulta, "TABLE");
}
}
Agora vamos ao nosso DataGrid. Coloquei o nome de dgTeste. No código XAML, localize o grid e coloque a opção ItemsSource=”{Binding}:
<DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dgTeste" VerticalAlignment="Top" Width="479" ItemsSource="{Binding}" />
É através do ItemsSource que informamos qual a fonte de dados o DataGrid ira acessar. Nesse exemplo a fonte de dados é dinâmica então apenas informamos que será um Binding (ligação de dados), poderíamos usar a opção Path para especificar a fonte (o que não faremos).
Em nosso DataGrid, altere a propriedade AutoGeneraterColumns para True. e no final do nosso método carregar coloque:
this.dgTeste.DataContext = dsConsulta.Tables[0];
Execute o botão carregar e você terá o resultado abaixo:
Aprendemos como carregar o DataGrid de forma automática. Agora vamos supor, que mesmo minha consulta trazendo 4 colunas, queremos somente exibir 3 colunas e também queremos mudar o título da coluna. Nesse caso temos que criar as colunas na mão através do código XAML.
Primeiro passo é voltar a opção AutoGeneraterColumns para False.
Em seguida coloque uma Tag fechando o DataGrid e colocar a Tag de coluna, veja abaixo:
<DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left"
Margin="12,12,0,0" Name="dgTeste" VerticalAlignment="Top" Width="479" ItemsSource="{Binding}">
<DataGrid.Columns>
</DataGrid.Columns>
</DataGrid>
Agora temos que definir as colunas, podemos utilizar 5 opções:
DataGridCheckBoxColumnpara valores booleanosDataGridComboBoxColumnpara valores enumeráveisDataGridHyperlinkColumnpara valores UriDataGridTemplateColumnpara mostrar todos os tipos de dados, definindo o modelo de célula própriaDataGridTextColumnpara mostrar valores de texto
<DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left"
Margin="12,12,0,0" Name="dgTeste" VerticalAlignment="Top" Width="479" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=ProductID}" Header="Código Produto" />
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Nome" />
<DataGridTextColumn Binding="{Binding Path=ProductNumber}" Header="Nº Produto" />
</DataGrid.Columns>
</DataGrid>
Criamos três colunas, onde no Binding informamos a qual Path cada coluna irá representar, no caso colocamos o nome das colunas que utilizamos em nossa consulta SQL. A propriedade Header é o nome que será exibido na coluna do DataGrid. Executando nossa aplicação veja como ficará:
Bem pessoal encerramos por aqui a primeira parte do artigo, salve a aplicação e aguardem o próximo artigo onde vamos aprender a colocar uma imagem no DataGrid e algumas outras propriedades disponíveis.
Até a próxima.
Treinamento: Dominando o SQL Server 2008
Pessoal, estou a algum tempo sem escrever artigo e agora revelo o motivo.
Fui convidado pela iMasters a preparar um treinamento de SQL Server 2008 online. E após um longo trabalho consegui desenvolver esse treinamento que já está disponível na iMasters PRO.
Desenvolvi o treinamento voltado para profissionais ou estudantes que atuam no desenvolvimento de aplicativos baseados em banco de dados SQL Server.
Você pode conferir o índice do treinamento no link acima.
O valor é de R$ 79,90 reais e pode ser parcelado em 3x.
Espero que gostem e pretendo criar novos treinamentos.
E agora posso me dedicar a novos artigos (se a monografia deixar)
.
Até a próxima.
Conceitos e Desenvolvimento com o SharePoint 2010
Quer aprender uma introdução ao SharePoint 2010? A Microsoft disponibiliza esse link de SharePoint 2010 com conteúdo para introdução ao tema.
O treinamento é dividido em três partes:
1 – Introdução ao SharePoint com Visual Studio 2010.
2 – Criando Aplicação SharePoint.
3 – Tirando proveito das funcionalidades do SharePoint 2010
Observe que existem outros treinamento que a Microsoft disponibiliza, como de Windows Phone, Visual Studio Team System, etc. Pesquise..
Aproveite e bons estudos.
Fonte: Fernando Carmo
Partial Class – Parte 2
No artigo anterior expliquei com que são partial class e como utiliza-las. Nessa segunda parte do artigo vamos utilizar Partial Class com Entity Framework.
Para esse exemplo criei 3 tabelas em uma base de dados SQL Server, o script está logo abaixo:
CREATE TABLE [dbo].[UF]( [CD_UF] [nchar](2) NOT NULL, [DS_UF] [nchar](10) NULL, CONSTRAINT [PK_UF] PRIMARY KEY CLUSTERED ( [CD_UF] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [dbo].[MUNICIPIO]( [CD_MUNICIPIO] [numeric](10, 0) NOT NULL, [NM_MUNICIPIO] [varchar](100) NULL, [CD_UF] [nchar](2) NULL, CONSTRAINT [PK_MUNICIPIO] PRIMARY KEY CLUSTERED ( [CD_MUNICIPIO] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[MUNICIPIO] WITH CHECK ADD CONSTRAINT [FK_MUNICIPIO_UF] FOREIGN KEY([CD_UF]) REFERENCES [dbo].[UF] ([CD_UF]) GO ALTER TABLE [dbo].[MUNICIPIO] CHECK CONSTRAINT [FK_MUNICIPIO_UF] GO CREATE TABLE [dbo].[PESSOA]( [CD_PESSOA] [numeric](10, 0) NOT NULL, [NM_PESSOA] [varchar](100) NULL, [CD_MUNICIPIO] [numeric](10, 0) NULL, CONSTRAINT [PESSOA_PK] PRIMARY KEY CLUSTERED ( [CD_PESSOA] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[PESSOA] WITH CHECK ADD CONSTRAINT [PESSOA_MUNICIPIO_FK] FOREIGN KEY([CD_MUNICIPIO]) REFERENCES [dbo].[MUNICIPIO] ([CD_MUNICIPIO]) GO ALTER TABLE [dbo].[PESSOA] CHECK CONSTRAINT [PESSOA_MUNICIPIO_FK] GO
Insira alguns valores nessa tabela para utilizarmos em nosso exemplo.
Com valores preenchidos, abra o Visual Studio e crie um projeto do tipo Library Class em C#. Coloquei o nome do projeto de PartialClassWithEntity. Clique com o botão direito sobre o projeto em Add New Item selecione ADO.NET Entity Data Model. Chamei o arquivo de Partial.edmx.
Em Entity Data Model selecione Generate from database e clique em next. Na próxima tela você precisa selecionar a conexão com a base de dados que criamos nossas tabelas anteriormente. Talvez seja necessário você criar a conexão. Com a conexão criada marque a opção – Yes, include the sensitive data in the connection string – e a opção Save entity connection settings in App.Config as e coloque um nome para sua conexão entity no meu caso está PartialEntity e clique em next.
Na próxima tela selecione as 3 tabelas que criamos anteriormente e clique em Finish para que as entidades sejam criadas conforme a imagem abaixo.

Com o projeto Library pronto vamos adicionar outro projeto a solução clique na solution e em add new project.
Selecione um projeto do Tipo Console em C# com o nome de ConsolePartial. Com o projeto criado clique com o botão direito sobre ele e em Add Reference, selecione a guia Projects e o projeto PartialClassWithEntity que possui o Entity Framework.
Volte em Add new Reference, porém selecione a guia NET e selecione a biblioteca System.Data.Entity. Também copie o arquivo App.config do projeto PartialClassWithFramework para o projeto ConsolePartial (copie não recorte).
No arquivo Program.cs escreva o seguinte código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PartialClassWithEntity;
namespace ConsolePartial
{
class Program
{
static void Main(string[] args)
{
using (PartialEntity ef = new PartialEntity())
{
IQueryable iqbPessoa = from p in ef.PESSOA select p;
foreach (PESSOA p in iqbPessoa)
{
Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO));
}
}
Console.Read();
}
}
}
Executando o código será possível visualizar os dados que inserimos na tabela PESSOA, porém veja que não conseguimos trazer a descrição da UNIDADE FEDERATIVA (UF). É claro que podemos concatenar a descrição da unidade federativa como no exemplo abaixo:
Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1} - {2}", p.NM_PESSOA, p.MUNICIPIO.NM_MUNICIPIO, p.MUNICIPIO.UF.DS_UF));
Porém e se a entidade PESSOA já tivesse uma propriedade com o nome do município concatenado com o nome da unidade federativa?
Volte ao projeto PartialClassWithEntity (nosso projeto Library) e crie uma nova class chamada PESSOA, a classe deve ser criada conforme abaixo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PartialClassWithEntity
{
public partial class PESSOA
{
public string NM_MUNICIPOUF
{
get { return MUNICIPIO.NM_MUNICIPIO + " - " + MUNICIPIO.UF.DS_UF; }
}
}
}
Veja que criamos uma propriedade chamada NM_MUNICIPIOUF que quando realizamos o get, ele concatena os campos NM_MUNICIPIO E DS_UF. Compile o projeto class e altere o projeto console com a linha abaixo:
Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));
Pronto, através da partial class criamos uma nova propriedade para nossa class do entity framework, sendo que essa propriedade não faz relação com nenhuma coluna da tabela PESSOA. Podemos criar outras propriedades que podem ser úteis, utilizo partial em várias vezes em projeto com EF.
Lembre que a class partial deve estar na mesma namespace da classe principal senão o compilador vai entender como sendo duas classes diferentes. Outro detalhe importante, veja que o foreach está dentro do Using, isto porque para que nossa propriedade NM_MUNICIPOUF seja populada o Entity precisa estar aberto, caso ele esteja fechado um exception irá acontecer. Veja abaixo a maneira de como o código não irá funcionar.
static void Main(string[] args)
{
IQueryable<PESSOA> iqbPessoa = null;
using (PartialEntity ef = new PartialEntity())
{
iqbPessoa = from p in ef.PESSOA select p;
}
foreach (PESSOA p in iqbPessoa)
{
Console.WriteLine(string.Format("Nome Pessoa: {0} - Município/UF: {1}", p.NM_PESSOA, p.NM_MUNICIPOUF));
}
Console.Read();
}
Executando o código acima uma exception (The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.) será exibida.
Espero que tenha gostado e até a próxima.





