none
BUSQUEDA CON FILTROS RRS feed

  • Pregunta

  • Hola amigos necesito de su ayuda nuevamente, mi problema esta en realizar una busqueda con filtros:

    Este es mi PROCEDIMIENTO ALMACENADO que busca por codigo y por descripcion si lo ejecuto desde la BD funciona correctamente el problema es en el VISUAL BASIC.

    PROCEDIMIENTO:

    CREATE PROCEDURE sp_BuscarBodegaFiltro
      @codigoBodega AS INT = NULL,
      @nombreBodega AS VARCHAR(50) = NULL
    AS
    
    SELECT idBodega,
           codigoBodega,  
           obra_idObra, 
           nombreBodega  
      FROM bodega
     WHERE ((@codigoBodega IS NULL) OR (codigoBodega = @codigoBodega))
        AND ((@nombreBodega IS NULL) OR (nombreBodega LIKE '%' + @nombreBodega + '%'))
    

     


    Cuando realizo la busqueda por codigo no hay ningun problema pero cuando realizo mi busqueda por DESCRIPCION me arroja el siguiente ERROR.

    La conversión de la cadena "" enel tipo 'Integer no es válida'

    Este es la funcion que esta en el evento click del boton

        Dim auxNegocio As New NegocioBodega
        Dim i As Integer
    
        'ACA ES DONDE ME ARROJA EL ERROR, Me reclama porque en el txtNumeroBodega es un Integer y nolo puede convertir a ""
        For i = 0 To auxNegocio.MostrarBodegaConFiltro(Me.txtNumeroBodega.Text, Me.txtDescripcion.Text).Count - 1 
          Dim objAcce As New Bodega
          objAcce = auxNegocio.MostrarBodegaConFiltro(Me.txtNumeroBodega.Text, Me.txtDescripcion.Text).Item(i)
          table = (Session("Tabla"))
          row = table.NewRow()
          row("codigoBodega") = objAcce.CodigoBodega
          row("obra_idObra") = objAcce.Obra_idObra
          row("bodega_idBodega") = objAcce.NombreBodega
          table.Rows.Add(row)
          GridView1.DataSource = table
          GridView1.DataBind()
          Session.Add("Tabla", table)
        Next i
    

    Muchas Gracias espero su ayuda.

    • Editado JonaGuitar domingo, 5 de febrero de 2012 3:27
    domingo, 5 de febrero de 2012 3:25

Respuestas

  • porque en el codigo usas dos lugares para invocar

    auxNegocio.MostrarBodegaConFiltro(Me.txtNumeroBodega.Text, Me.txtDescripcion.Text)

    eso no esta nada bien, no es una buena practica

    deberias hacerlo solo una

    algo como ser

     

    Dim NumeroBodega As Integer = 0
    
    If Not Int32.TryParse(txtNumeroBodega.Text, NumeroBodega) Then
    	MessageBox.Show("debe ingresar un valor numerico")
    	Return
    End If 
    
    Dim auxNegocio As New NegocioBodega
    Dim listAcce As New List(Of Bodega) = auxNegocio.MostrarBodegaConFiltro(NumeroBodega, Me.txtDescripcion.Text)
    
    Dim table As DataTable = DirectCast(Session("Tabla"), DataTable)
    
    For Each objAcce As Bodega To listAcce
    
      Dim row As DataRow = table.NewRow()
      row("codigoBodega") = objAcce.CodigoBodega
      row("obra_idObra") = objAcce.Obra_idObra
      row("bodega_idBodega") = objAcce.NombreBodega
      table.Rows.Add(row)
     
    Next 
    
    Session("Tabla") = table
    
    GridView1.DataSource = table
    GridView1.DataBind()
    

    compara tu codigo con este que proporciono para que veas la diferencia  ycomo validar el ingreso de datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 5 de febrero de 2012 11:38

Todas las respuestas

  • El metodo MostrarBodegaConFiltro de seguro toma como parametros al meno un entero, por lo que debera hacer la conversion de lugar para poder pasarlo al SP y retornar un entero para hacer la comparacion en el bucle WHILE

     

    While i <= auxNegocio.MostrarBodegaConFiltro(Convert.ToInt32(Me.txtNumeroBodega.Text), Me.txtDescripcion.Text).Count - 1

     

     


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    My Blog

    domingo, 5 de febrero de 2012 3:42
  • porque en el codigo usas dos lugares para invocar

    auxNegocio.MostrarBodegaConFiltro(Me.txtNumeroBodega.Text, Me.txtDescripcion.Text)

    eso no esta nada bien, no es una buena practica

    deberias hacerlo solo una

    algo como ser

     

    Dim NumeroBodega As Integer = 0
    
    If Not Int32.TryParse(txtNumeroBodega.Text, NumeroBodega) Then
    	MessageBox.Show("debe ingresar un valor numerico")
    	Return
    End If 
    
    Dim auxNegocio As New NegocioBodega
    Dim listAcce As New List(Of Bodega) = auxNegocio.MostrarBodegaConFiltro(NumeroBodega, Me.txtDescripcion.Text)
    
    Dim table As DataTable = DirectCast(Session("Tabla"), DataTable)
    
    For Each objAcce As Bodega To listAcce
    
      Dim row As DataRow = table.NewRow()
      row("codigoBodega") = objAcce.CodigoBodega
      row("obra_idObra") = objAcce.Obra_idObra
      row("bodega_idBodega") = objAcce.NombreBodega
      table.Rows.Add(row)
     
    Next 
    
    Session("Tabla") = table
    
    GridView1.DataSource = table
    GridView1.DataBind()
    

    compara tu codigo con este que proporciono para que veas la diferencia  ycomo validar el ingreso de datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 5 de febrero de 2012 11:38
  • ademas porque conviertes a un datatable si esto no hace falta

    podrias asignar directo el objeto que recuperas del metod del negocio

    Dim NumeroBodega As Integer = 0
    
    If Not Int32.TryParse(txtNumeroBodega.Text, NumeroBodega) Then
    	MessageBox.Show("debe ingresar un valor numerico")
    	Return
    End If 
    
    Dim auxNegocio As New NegocioBodega
    Dim listAcce As New List(Of Bodega) = auxNegocio.MostrarBodegaConFiltro(NumeroBodega, Me.txtDescripcion.Text)
    
    Session("Tabla") = listAcce
    
    GridView1.DataSource = listAcce
    GridView1.DataBind()
    

    imagine que MostrarBodegaConFiltro() devuelve un List(Of Bodega) sino es asi cambialo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 5 de febrero de 2012 11:40
  • ademas porque conviertes a un datatable si esto no hace falta

    podrias asignar directo el objeto que recuperas del metod del negocio

     

    Dim NumeroBodega As Integer = 0
    
    If Not Int32.TryParse(txtNumeroBodega.Text, NumeroBodega) Then
    	MessageBox.Show("debe ingresar un valor numerico")
    	Return
    End If 
    
    Dim auxNegocio As New NegocioBodega
    Dim listAcce As New List(Of Bodega) = auxNegocio.MostrarBodegaConFiltro(NumeroBodega, Me.txtDescripcion.Text)
    
    Session("Tabla") = listAcce
    
    GridView1.DataSource = listAcce
    GridView1.DataBind()
    

    imagine que MostrarBodegaConFiltro() devuelve un List(Of Bodega) sino es asi cambialo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Leandro probe lo que tu me entregaste y me resulto a la perfeccion. pero hay un pequeño detalle:


    la idea es que el usuario pueda filtrar POR CODIGO o por DESCRIPCION

    por eso recibe como parametro un NumeroBodega y txtDescripcion.Text

    entonces si yo realizo la busqueda por la descripcion me arrojara un error diciendo que debo ingresar un valor numerico la idea es que donde yo ingrese el CODIGO me permita un valor null asi el usuario podra buscar solo por descripcion.

     

    espero que me hayas entendido gracias.


    lunes, 6 de febrero de 2012 21:43
  • es que debes asignar ambos parametros

    solo que sino viene info en este asignas un DbNull.Value

    If String.IsNulOrEmpty(descripcion) Then

       cmd.Parameters.AddWithValue("@nombreBodega ", DbNull.Value)

    else

       cmd.Parameters.AddWithValue("@nombreBodega ", descripcion)

    End If

     

    lo mismo haces con el numero, si se envia vacio o un valor que no deberia aplciar el filtro lo anulas asignando un DbNull.Value

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 6 de febrero de 2012 21:51
  • es que debes asignar ambos parametros

    solo que sino viene info en este asignas un DbNull.Value

    If String.IsNulOrEmpty(descripcion) Then

       cmd.Parameters.AddWithValue("@nombreBodega ", DbNull.Value)

    else

       cmd.Parameters.AddWithValue("@nombreBodega ", descripcion)

    End If

     

    lo mismo haces con el numero, si se envia vacio o un valor que no deberia aplciar el filtro lo anulas asignando un DbNull.Value

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    y este codigo lo tendria que colocar dentro del evento del boton junto con el codigo anterior????
    lunes, 6 de febrero de 2012 22:03