Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema de filtro en Data Adapter

Estas en el tema de Problema de filtro en Data Adapter en el foro de .NET en Foros del Web. Hola. Estoy empezando con .net y tengo un par de dudas, a ver si podeis resolvermelas. Realizo una conexion a una base de datos por ...
  #1 (permalink)  
Antiguo 18/12/2012, 17:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 9 meses
Puntos: 0
Problema de filtro en Data Adapter

Hola. Estoy empezando con .net y tengo un par de dudas, a ver si podeis resolvermelas.

Realizo una conexion a una base de datos por medio de un dataadapter (creo que se dice asi). Este adaptador por lo que he entendido leyendo, lo que hace es meter en una variable llamada tabla los datos que obtengo de la base de datos.

Entonces en ese momento lo que estoy haciendo es cerrando la conexion a la base de datos y trabajando en modo desconectado, asi libero recursos del servidor y todo funciona mas rapido.

Pues aqui viene mi duda. Se como realizar un Select para obtener los datos de una base de datos. De hecho la variable tabla la lleno con todos los datos que necesito y los cargo en un listview que se llena al cargar el formulario. Pero ahora lo que quiero hacer es filtrar los registros segun lo que se rellene en unos textbox que tengo preparados a tal efecto y no se como hacerlo.

Supongo que al adaptador no se le podra enviar un segundo select. He descubierto la manera de filltrar por medio de un solo texbox con el siguiente codigo:

Código:
 
       Lst_HistoricoFabricacion.Items.Clear()

        For i As Integer = 0 To Tabla.Rows.Count - 1
            If (Tabla.Rows(i).Item("Referencia").ToString) = Txt_ReferenciaHistoricoFabricacion.Text Then
                Dim item As ListViewItem
                item = New ListViewItem(Tabla.Rows(i).Item("Referencia").ToString)
                'Agrego los demas datos a los SubItems de item
                item.SubItems.Add(Tabla.Rows(i).Item("Lote").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Nº_HR").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Cant_Inicial").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Fecha_Inicio").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Cant_Fin").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Fecha_Fin").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Obs_Produccion").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Obs_Pedido_Material").ToString)
                item.SubItems.Add(Tabla.Rows(i).Item("Reg").ToString)
                'Agrego el item a la colección de listViewItem's de Lst_Operaciones.
                Lst_HistoricoFabricacion.Items.Add(item)
            End If
        Next (i)

Pero el problema que no se resolver es como filtrar por varios campos a la vez. Ya que si filtro por el primero, si uso este codigo para el segundo me va a borrar los datos del primer filtro y me va a dejar solo los que coincidan con el segundo texbox. Hay alguna manera de solucionar esto o tengo que trabajar directamente con la base de datos sin utilizar un daptador por medio de un command??
  #2 (permalink)  
Antiguo 19/12/2012, 14:32
Avatar de jhonjairo00  
Fecha de Ingreso: noviembre-2010
Ubicación: Bogotá D.C.
Mensajes: 31
Antigüedad: 14 años
Puntos: 6
Respuesta: Problema de filtro en Data Adapter

Hola

Bueno, si lo que quieres es hacer filtros usando expresiones que tomas desde varios TextBox lo que puedes hacer es filtrar directamente el DataTable y luego llenas tu ListView con lo que te quede en la DataTable, usando el método Select de este objeto. Mira el ejemplo así es más gráfico

Código vb:
Ver original
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim expression As String
  3.         Dim sortOrder As String
  4.  
  5.         expression = "Referencia = '" & TextBox1.Text & "' and Lote = '" & TextBox2.Text &"'"
  6.         ' También se pueden usar expresiones de ordenamiento.
  7.        sortOrder = "Nº_HR DESC"
  8.  
  9.         ' Se retorna un arreglo de filas.
  10.        Dim Rows() As DataRow = Tabla.Select(expression, sortOrder)
  11.        
  12.         For Each _row As DataRow In foundRows
  13.             Dim item As ListViewItem
  14.             item = New ListViewItem(_row.Item("Referencia").ToString)
  15.             'Agrego los demas datos a los SubItems de item
  16.            item.SubItems.Add(_row.Item("Lote").ToString)
  17.             item.SubItems.Add(_row.Item("Nº_HR").ToString)
  18.             item.SubItems.Add(_row.Item("Cant_Inicial").ToString)
  19.             item.SubItems.Add(_row.Item("Fecha_Inicio").ToString)
  20.             item.SubItems.Add(_row.Item("Cant_Fin").ToString)
  21.             item.SubItems.Add(_row.Item("Fecha_Fin").ToString)
  22.             item.SubItems.Add(_row.Item("Obs_Produccion").ToString)
  23.             item.SubItems.Add(_row.Item("Obs_Pedido_Material").ToString)
  24.             item.SubItems.Add(_row.Item("Reg").ToString)
  25.             'Agrego el item a la colección de listViewItem's de Lst_Operaciones.
  26.            Lst_HistoricoFabricacion.Items.Add(item)
  27.         Next
  28.                
  29.     End Sub

De esta forma ya los datos que se muestran quedarán filtrados...

Espero te sirva...
  #3 (permalink)  
Antiguo 19/12/2012, 14:37
Avatar de jhonjairo00  
Fecha de Ingreso: noviembre-2010
Ubicación: Bogotá D.C.
Mensajes: 31
Antigüedad: 14 años
Puntos: 6
Respuesta: Problema de filtro en Data Adapter

Hola perdona, se me fueron un par de errores

Código vb:
Ver original
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim expression As String
  3.         Dim sortOrder As String
  4.         Lst_HistoricoFabricacion.Items.Clear()
  5.  
  6.         expression = "Referencia = '" & TextBox1.Text & "' and Lote = '" & TextBox2.Text &"'"
  7.         ' También se pueden usar expresiones de ordenamiento.
  8.        sortOrder = "Nº_HR DESC"
  9.  
  10.         ' Se retorna un arreglo de filas.
  11.        Dim Rows() As DataRow = Tabla.Select(expression, sortOrder)
  12.        
  13.         For Each _row As DataRow In Rows
  14.             Dim item As ListViewItem
  15.             item = New ListViewItem(_row.Item("Referencia").ToString)
  16.             'Agrego los demas datos a los SubItems de item
  17.            item.SubItems.Add(_row.Item("Lote").ToString)
  18.             item.SubItems.Add(_row.Item("Nº_HR").ToString)
  19.             item.SubItems.Add(_row.Item("Cant_Inicial").ToString)
  20.             item.SubItems.Add(_row.Item("Fecha_Inicio").ToString)
  21.             item.SubItems.Add(_row.Item("Cant_Fin").ToString)
  22.             item.SubItems.Add(_row.Item("Fecha_Fin").ToString)
  23.             item.SubItems.Add(_row.Item("Obs_Produccion").ToString)
  24.             item.SubItems.Add(_row.Item("Obs_Pedido_Material").ToString)
  25.             item.SubItems.Add(_row.Item("Reg").ToString)
  26.             'Agrego el item a la colección de listViewItem's de Lst_Operaciones.
  27.            Lst_HistoricoFabricacion.Items.Add(item)
  28.         Next
  29.                
  30.     End Sub
  #4 (permalink)  
Antiguo 22/12/2012, 07:51
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Problema de filtro en Data Adapter

Hola. Gracias jhonjairo00 por tu interes. He conseguido solucionarlo despues de darle muchas vueltas.

Lo que yo queria hacer era cargar todos los datos de la tabla mediante una sola conexion a la BBDD y que luego todos los filtros que se hicieran, no requiriesen de mas conexiones. Mas que nada porque la tabla contiene bastantes registros y al estar los filtros colocados en los eventos textchanged de los textbox, se ralentizaba un poco el tema. De ahi que quisiera usar un adptador y filtrar sobre el para no realizar mas conexiones.

Al final lo he solucionado asi:

Código:
  Private Sub FiltrarDatos()

        If Tabla.Rows.Count = 0 Then
            Exit Sub
        End If

        Dim StrFiltro As String = Nothing
        Dim FiltroCompleto As String = Nothing

        If Txt_ReferenciaHistoricoFabricacion.Text <> "" Then
            If StrFiltro = "" Then
                StrFiltro = StrFiltro & " Referencia= '" & Txt_ReferenciaHistoricoFabricacion.Text & "'"
            Else
                StrFiltro = StrFiltro & " and Referencia=  '" & Txt_ReferenciaHistoricoFabricacion.Text & "'"
            End If
        End If
        If Txt_HRHistoricoFabricacion.Text <> "" Then
            If StrFiltro = "" Then
                StrFiltro = StrFiltro & " Nº_HR=  '" & Txt_HRHistoricoFabricacion.Text & "'"
            Else
                StrFiltro = StrFiltro & " and Nº_HR=  '" & Txt_HRHistoricoFabricacion.Text & "'"
            End If
        End If

.............

     FiltroCompleto = StrFiltro
        Dim Filtro As New DataView(Tabla)
        Filtro.RowFilter = FiltroCompleto
        Dim i As Integer
        Dim Lista As ListViewItem = Nothing
        Dim fila As DataRowView
        Lst_HistoricoFabricacion.Items.Clear()
        For Each fila In Filtro
            For i = 0 To Lst_HistoricoFabricacion.Columns.Count - 1
                If i = 0 Then
                    Lista = Lst_HistoricoFabricacion.Items.Add(fila(i).ToString)
                    Lista.Tag = fila
                Else
                    Lista.SubItems.Add(fila(i).ToString)
                End If
            Next
        Next

Seguramente haya una forma mejor de hacerlo pero a mi me ha funcionado asi. Gracias otra vez
  #5 (permalink)  
Antiguo 26/12/2012, 09:24
Avatar de jhonjairo00  
Fecha de Ingreso: noviembre-2010
Ubicación: Bogotá D.C.
Mensajes: 31
Antigüedad: 14 años
Puntos: 6
Respuesta: Problema de filtro en Data Adapter

Hola 41b3r70

Pues me alegra que lo hayas solucionado, y aunque hayan otras formas "mejores o peores" lo importante es que funcione, al final al usuario eso es lo que le interesa...

Saludos

Etiquetas: adapter, data, net, textbox, filtros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:19.