ADO .NET - Incluindo uma coluna calculada em um DataTable
O que você faria se tivesse que exibir o valor calculado para cada linha de um objeto DataTable ?
Se você esta demorando muito para responder ou talvez não tenha idéia de como resolver este problema continue lendo o artigo...
A resposta é ....
Uma forma simples de resolver é definir uma coluna com uma expressão para realizar o cálculo na tabela e em seguida exibir o cálculo.
Esta solução cria um DataTable contendo as 5 linhas da tabela Products do banco de dados Northwind onde uma coluna contendo uma expressão para calcular o preço para cada registro é incluída na tabela e o resultado pode ser exibido na sua aplicação.
Recursos usados neste artigo:
Dica: Após baixar o banco de dados Northwind.mdf descompacte-o para uma pasta e abra o Management Studio e execute o script SQL para gerar o banco de dados.
Abrindo o banco de dados no Management Studio temos :
Observe que a tabela produtos possui as colunas UnitPrice e UnitsInStock. O que iremos fazer é criar uma coluna com uma expressão para calcular o valor dessas duas colunas e exibí-las em um formulário windows forms.
Eu vou criar um projeto do tipo Windows Application o Visual Basic 2008 com o nome colunaCalculada_DT;
No formulário padrão form1.vb vamos incluir um controle ListBox - lstResultado e dois controles Button: btnSair e btnExibir conforme o leiaute abaixo:
Defina os seguintes imports no formulário:
Imports System.Data
Imports System.Data.SqlClient
A seguir no evento Click do botão de comando Exibir inclua o seguinte código:
Private Sub btnExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click Dim sqlCon As String = "Data Source=.\SQLEXPRESS;Integrated security=SSPI;Initial Catalog=Northwind;" Dim sql As String = "SELECT TOP 5 * FROM Products" ' Usa a DataAdapter para preencher o DataTable Dim da As New SqlDataAdapter(sql, sqlCon) Dim dt As New DataTable() da.Fill(dt) ' Cria uma coluna e Inclui uma expressão na coluna da tabela dt.Columns.Add(New DataColumn("totalCalculado", GetType([Decimal]), "UnitPrice * UnitsInStock")) lstResultado.Items.Add("Cod. Preço Estoque Total ") For Each row As DataRow In dt.Rows lstResultado.Items.Add(Convert.ToString(row("ProductID")) & " " & _ Convert.ToString(row("UnitPrice")) & " " & _ Convert.ToString(row("UnitsInStock")) & " " & _ Convert.ToString(row("totalCalculado"))) Next End Sub |
Uma coluna com a expressão calculada contém um valor que é calculado a partir de valores de outras colunas na mesma linha, ou a partir de um agregado de linhas na tabela ou em tabelas relacionadas.
O DataType da coluna precisa ser compatível com o valor retornado pela expressão.
Uma coluna coma expressão de cálculo é incluída na tabela ou através de um construtor DataColumn que toma a expressão para a coluna como um terceiro argumento (o que usamos neste exemplo) ou pela definição da propriedade Expression da coluna para a expressão.
No exemplo , uma coluna com a expressão chamada totalCalculado é criada com o tipo de dados Decimal. A coluna calcula o valor total em estoque para um produto usando a coluna UntPrice * UnitsInStock.
Depois da coluna ser incluida na
tabela, as propriedades RowFilter ou Sort do DataView vinculado a
tabela com a expressão columa pode ordenar ou filtrar os dados
da mesma forma que qualquer outra coluna.
O código para linguagem C# é exibido a seguir:
void BtnExibirClick(object sender, EventArgs e) { string sqlConnectString = "Data Source=(local);" + "Integrated security=SSPI;Initial Catalog=Northwind;"; string sqlSelect = "SELECT TOP 5 * FROM Products"; // Usa a DataAdapter para preencher o DataTable SqlDataAdapter da = new SqlDataAdapter(sqlSelect, sqlConnectString); DataTable dt = new DataTable(); da.Fill(dt); // Cria uma coluna e Inclui uma expressão na coluna da tabela dt.Columns.Add(new DataColumn("totalCalculado", typeof(Decimal),"UnitPrice * UnitsInStock")); lstResultado.Items.Add("Cod. , Preço , Estoque , Total"); foreach (DataRow row in dt.Rows) lstResultado.Items.Add(row["ProductID"] + " "+ row["UnitPrice"] + " " + row["UnitsInStock"] + " " +row["totalCalculado"]); } |
Executando o projeto iremos obter:
Aguarde mais artigos sobre ADO .NET.
Pegue o projeto completo aqui: colunaCalculada_DT.zip
Referências:
José Carlos Macoratti