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