CREANDO UNA CLASE PARA FILTRAR VB.NET
hola a todos hoy os traigo una clase con la que generar filtros para nuestras consultas de sql o de nuestros dataviews o donde lo queramos usar.
Primero el video y el codigo explicado:
En esta clase utilizaremos una propiedad con la cual vamos a establecer el tipo de union entre los “where” que tenga nuestra clase.
Dos enumerados para el tipo de where y otro para el filtro que se va a utlizar.
Pues bien, lo primero es crear la case. a la que yo llame filter
Y crear un nuevo contructor con una variable para establecer el tipo de filtro. la cosa de momento queda asi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public Class Filtrar Public Enum TipoOperacion [AND] [OR] End Enum Public Enum TipoFiltro Igual MayoroIgual MenoroIgual Contiene End Enum Private Sub New() End Sub Dim StrTipoOperacion As String = "" Public Sub New(ByVal TipoOperacion As TipoOperacion) Me.New Select Case TipoOperacion Case TipoOperacion.AND StrTipoOperacion = " AND " Case TipoOperacion.OR StrTipoOperacion = " OR " End Select End Sub End Class |
Ya tendriamos el tipo de union entre “wheres” que se van a utilizar.
Ahora lo que necesitamos es el tipo de filtro = ,>= ,<= ,>,<, para lo que crearemos el enumerado y una funcion que sea capaz de traducir ese tipo de operador , con los datos que queremos filtrar y un objeto que sea capaz de almacenarlos, yo en este ejemplo utilizo un diccionario(integer,string)
con lo que quedaria asi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Private LineasFiltro(-1) As String Public Function Añadir(ByVal Campo As String, ByVal Tipofiltro As TipoFiltro, ByVal Valor As String) ReDim Preserve LineasFiltro(UBound(LineasFiltro) + 1) Dim StrFiltro As String Select Case Tipofiltro Case TipoFiltro.Igual StrFiltro = " = " Case TipoFiltro.MayoroIgual StrFiltro = " >= " Case TipoFiltro.MenoroIgual StrFiltro = " <= " Case TipoFiltro.Contiene StrFiltro = " like " End Select If StrFiltro = " like " Then LineasFiltro(UBound(LineasFiltro)) = Campo & StrFiltro & "'%" & Valor & "%'" Else LineasFiltro(UBound(LineasFiltro)) = Campo & StrFiltro & "'" & Valor & "'" End If End Function |
Ya casi lo tenemos, ahora necesitamos un compositor de datos para que nos devuelva un string completo con el where ya construido.
pues bien cree una funcion ToString que me devuelve la cadena, teniendo en cuenta que la ultima union no tiene que llevar el operador.
con lo que la funcion ToString queda asi:
1 2 3 4 5 6 7 8 9 10 11 |
Public Function DevolverFiltro() As String Dim Strb As New StringBuilder For i As Integer = 0 To LineasFiltro.Length - 1 If LineasFiltro.Length - 1 = i Then Strb.AppendLine(LineasFiltro(i)) Else Strb.AppendLine(LineasFiltro(i) & StrTipoOperacion) End If Next Return Strb.ToString End Function |
A continuacion todo el codigo seguido . Un Saludo a todos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
Imports System.Text Public Class Filtrar Public Enum TipoOperacion [AND] [OR] End Enum Public Enum TipoFiltro Igual MayoroIgual MenoroIgual Contiene End Enum Private Sub New() End Sub Dim StrTipoOperacion As String = "" Public Sub New(ByVal TipoOperacion As TipoOperacion) Me.New Select Case TipoOperacion Case TipoOperacion.AND StrTipoOperacion = " AND " Case TipoOperacion.OR StrTipoOperacion = " OR " End Select End Sub Private LineasFiltro(-1) As String Public Function Añadir(ByVal Campo As String, ByVal Tipofiltro As TipoFiltro, ByVal Valor As String) ReDim Preserve LineasFiltro(UBound(LineasFiltro) + 1) Dim StrFiltro As String Select Case Tipofiltro Case TipoFiltro.Igual StrFiltro = " = " Case TipoFiltro.MayoroIgual StrFiltro = " >= " Case TipoFiltro.MenoroIgual StrFiltro = " <= " Case TipoFiltro.Contiene StrFiltro = " like " End Select If StrFiltro = " like " Then LineasFiltro(UBound(LineasFiltro)) = Campo & StrFiltro & "'%" & Valor & "%'" Else LineasFiltro(UBound(LineasFiltro)) = Campo & StrFiltro & "'" & Valor & "'" End If End Function Public Function DevolverFiltro() As String Dim Strb As New StringBuilder For i As Integer = 0 To LineasFiltro.Length - 1 If LineasFiltro.Length - 1 = i Then Strb.AppendLine(LineasFiltro(i)) Else Strb.AppendLine(LineasFiltro(i) & StrTipoOperacion) End If Next Return Strb.ToString End Function End Class |
Ahora solo te queda probarlo en tu form, aqui te dejo el codigo de ejemplo
1 2 3 4 5 6 7 8 9 10 11 12 |
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim ClFiltro As New Filtrar(Filtrar.TipoOperacion.AND) ClFiltro.Añadir("Nombre", Filtrar.TipoFiltro.Igual, "Jose") ClFiltro.Añadir("Apellidos", Filtrar.TipoFiltro.Contiene, "Pe") Dim strWhere As String = ClFiltro.DevolverFiltro End Sub End Class |