VB.NET - DataView : Ordenação e filtragem de dados

Um DataView permite criar diferentes visões dos dados armazenados em um DataTable permitindo diversos critérios para ordenação e filtragem de dados. Apesar disto tenha em mente que um DataView não pode ser tratado com uma tabela e não permite visões de tabelas combinadas. Não permite também que se inclua o exclua colunas que não existam na tabela original.

Em meu artigo - VB .NET - ADO.NET - Uma visão geral III : DataView. - já tratei das principais propriedades do objeto DataView e a forma como podemos criar um DataView. Nas vamos recordar:

Obs: Leia também os artigos que abordam o DataView :

VB.NET - Filtrando valores NULL em um DataView.
VB .NET - Preenchendo uma combobox.

Criando um DataView

Existem duas maneiras de se criar um DataView:

1- Criar uma referência a propriedade DefaultView da tabela de origem :

Dim dvProdutos As DataView = ds.Tables("Produtos").DefaultView

2- Usando o construtor do DataView atribuindo os parâmetros necessários que são :

Ex:

dvTeste = New DataView(ds.Tables("Produtos"), "ProductName like '%'", "ProductName ASC",  DataViewRowState.OriginalRows)

Onde temos:

ds.Tables.("Productos")   é a o DataTable de origem
"ProductName Like '%'" é a string com o filtro
"ProductName ASC" é o critério de Ordenação
DataViewRowState                  é o estado dos registros a ser exibidos

Ordenando e filtrando dados com o DataView

A propriedade Sort do DataView permite definir critérios simples e critérios múltiplos de ordenação de colunas onde se pode incluir os parâmetros ASC para ordenação Ascendente ou DESC para ordenação Descendente.

A propriedade ApplyDefaultSort pode ser usada para criar um critério de ordenação padrão de acordo com a chave principal do DataTable que será aplicado quando a propriedade Sort é uma cadeia vazia. Ela obtêm ou define um valor que indica se a ordenação padrão.

Para o exemplo que vamos mostrar a cadeia de ordenação é feita assim:

'Cria a cadeia de ordenação
Dim vCadeia As String = "UnitsInStock " & IIf(optAscStock.Checked, "ASC", "DESC")
vCadeias &= ", UnitsOnOrder " & IIf(optAscOrden.Checked, "ASC", "DESC")
'Ordenar o DataView
dvProdutos.Sort = vCadeia

Podemos usar também os métodos Find ou FindRows para filtrar os dados de um DataView.

As opções do estado dos registros DataViewRowState na criação da visão usando o construtor são as seguintes:

Para que você compreenda melhor como usar a teoria e trabalhar com objetos DataView vou usar o exemplo da colaboração de  Fernando Luque Sánchez.

Trata-se de um projeto VB.NET no qual estaremos acessando a tabela Products do banco de dados Northwind.mdb e realizando diversas ordenações e filtragens dinâmicas criadas em tempo de execução pela opção do usuário.

O formulário principal abaixo mostra as opções de ordenação e filtro que o usuário poderá selecionar.

 

O código da carga do formulário , evento Load , é o seguinte :

 

Private Sub CargaFormulario(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        'Define um array e preenche a Combo con las letras 
        Dim aLetras() As String = {"<TODOS>", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", _
                                             "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
        cboLetraInicial.Items.AddRange(aLetras)
        cboLetraInicial.SelectedIndex = 0

        'Define um array e preenche a Combo com operadores
        Dim aOperadores() As String = {"<", "<=", "=", ">=", ">"}
        cboOperador.Items.AddRange(aOperadores)
        cboOperador.SelectedIndex = 0
     'Define um array e preenche a Combo com os nomes dos campos da tabela Products
        Dim aCampos As String() = {"ProductId", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder"}
        cboCampos.Items.AddRange(aCampos)
        'Conexão com  a base de dados
        Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\teste\Northwind.mdb")
        Dim daProdutos As New OleDbDataAdapter("Select ProductId, ProductName, UnitPrice, UnitsInStock, UnitsOnOrder from Products", cn)
        'define o dataset
        Dim ds As New DataSet
        daProdutos.Fill(ds, "Produtos")
        'define o titulo e cor do titulo 
        With drgProductos
            .CaptionText = "Produtos Registrados"
            .CaptionForeColor = Color.Red
            .ReadOnly = True
        End With

        'O ordenamento dos produtos tem a seguinte ordem padrão
        lblFiltroActual.Text = "Todos"
        lblOrdenActual.Text = "ProductName ASC"

        'Para filtrar precisamos do dataview
        dvProdutos = New DataView(ds.Tables("Produtos"), "ProductName like '%'", "ProductName ASC", DataViewRowState.OriginalRows)
        'Origem do  Grid
        drgProductos.DataSource = dvProdutos
    End Sub

A rotina para fazer a ordenação usando uma única chave é a seguinte:

  Private Sub OrdenarUnica(ByVal sender As System.Object,  ByVal e As System.EventArgs) Handles cmdOrdenCampos.Click

        'ORDENA o dataview com uma chave
        If cboCampos.SelectedIndex = -1 Then
            MessageBox.Show("Selecione o campo para ordenar...", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If
        'Cadeia de ordenamento
        Dim vOrdemCadeia As String = cboCampos.SelectedItem & " " & IIf(optASCcampos.Checked, "ASC", "DESC")
        dvProdutos.Sort = vOrdemCadeia
        drgProductos.DataSource = dvProdutos
        lblOrdenActual.Text = vOrdemCadeia
    End Sub

 

A rotina para fazer a ordenação usando duas chaves é a seguinte:

Private Sub OrdenarDois(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOrdenar.Click

        'ORDENA o dataview com duas chaves
        'vamos usar ...UnitsInStock y UnitsOnOrder 
        'Comprovar se há registros...
        If dvProdutos.Count = 0 Then
            MessageBox.Show("Sem registros para ordenar...", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        'criar a cadeia de Ordenação
        Dim vCadeiaDados As String = "UnitsInStock " & IIf(optAscStock.Checked, "ASC", "DESC")
        vCadeiaDados &= ", UnitsOnOrder " & IIf(optAscOrden.Checked, "ASC", "DESC")
        'Ordenar a visão
        dvProdutos.Sort = vCadeiaDados
        drgProductos.DataSource = dvProdutos
        lblOrdenActual.Text = vCadeiaDados

    End Sub

Efetua a filtragem de dados pela letra selecionada:

Private Sub FiltrarLetraInicial(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdFiltroLetra.Click
        Dim vCadeiaFiltro As String
        If cboLetraInicial.Text = "<TODOS>" Then
            vCadeiaFiltro = "ProductName like '%'"
        Else
            vCadeiaFiltro = "ProductName like '" & cboLetraInicial.Text & "%'"
        End If
        'Aplicar o Filtro
        dvProdutos.RowFilter = vCadeiaFiltro
        drgProductos.DataSource = dvProdutos
        lblFiltroActual.Text = vCadeiaFiltro
    End Sub

 

Efetua o filtro pelas unidades:

 Private Sub FiltroUnidades(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFiltroUnidad.Click

        Dim vCadeiaFiltro As String
        vCadeiaFiltro = "UnitsInStock " & cboOperador.SelectedItem & " " & txtUnidades.Text.ToString
        'Aplicar o Filtro
        dvProdutos.RowFilter = vCadeiaFiltro
        drgProductos.DataSource = dvProdutos
        lblFiltroActual.Text = vCadeiaFiltro

    End Sub

Abaixo um exemplo de uma tela com o resultado de um processamento do projeto:

Pegue o código completo aqui: dataviewFiltro.zip

Por hoje é só isto... Até mais

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti