Filtrar datos en un DataTable

Una variante a la utilizacion de DataView y el método Select

Fecha: 28/Jun/2005 (28-06-2005)
Autor: Bruno Capuano (bcapuano@gmail.com)

 


Usualmente cuando trabajamos con un objeto DataTable, nos vemos en la necesidad de filtrar los datos del mismo. Para esto podemos usar un DataView, asociado al DataTable, o utilizar el método Select() del DataTable para retornar un set de datos, aplicándoles un criterio.
 
El único inconveniente que posee el método Select() , es que retorna un Array de DataRow . La forma usual de trabajar con este método seria
 


Sub Sample1()
  Dim dt As DataTable   Dim sort As String   Dim filter As String   Dim rows As DataRow()   ' get data   dt = getdata()
  ' sort and filter data   rows = dt.Select(filter, sort)   ' work with selected rows   For Each dr As DataRow In rows     ' some work   Next End Sub

Sin embargo, ya que Ado.Net nos brinda un modelo de objetos más que poderoso, parece poco apropiado trabajar con un Array.
Una solución que cree para este problema, fue la siguiente función


		
Function SelectDataTable(ByVal dt As DataTable, ByVal filter As String,	ByVal sort As String) As DataTable
  Dim rows As DataRow()
  Dim dtNew As DataTable
  ' copy table structure
  dtNew = dt.Clone()
  ' sort and filter data
  rows = dt.Select(filter, sort)
  ' fill dtNew with selected rows
  For Each dr As DataRow In rows
    dtNew.ImportRow(dr)
  Next
  ' return filtered dt
  Return dtNew
End Function


La misma  aplica un filtro en una DataTable y con el Array de DataRow que retorna, crea una nueva tabla y la retorna. El código del primer ejemplo, quedaría de la siguiente manera


Sub Sample2()

  Dim dt As DataTable
  Dim dtNew As DataTable

  ' get data
  dt = getdata()

  ' sort and filter data
  dtNew = SelectDataTable(dt, "Filter", "sort")

  ' work with selected rows
  For Each dr As DataRow In dtNew.Rows
    ' some work
  Next

End Sub


Otra opción es heredar de DataTable y agregar este método :D.
En la nueva versión de Ado.Net, este problema estará solucionado (eso espero).

Sino podemos votarlo en el site de feedback para productos Microsoft -->
http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=5421ba0b-0474-41c4-ac6f-8ce226b28ae8

Ante cualquier duda, pueden escribirme a  bcapuano@gmail.com

Saludos

El Bruno

http://spaces.msn.com/members/brunocapuano.

 


ir al índice