Wednesday, April 6, 2011

Cómo validar una entrada De datos numérica

KeyWords: ASP.NET, VB.NET, Validar, Entrada de Datos

Cuando se manejan formularios, al momento de insertar los datos a una base de datos éstos deben coincidir con el tipo (cadena, entero, fecha, etc.) que estamos utilizando.

Como controles AJAX, hay un extender que se llama FilteredTextBoxExtender al cual podemos decirle qué tipo de entrada quiere para una caja de texto, incluso podemos customizarlo a nuestro agrado. Pero en el caso que se necesite sólo números (para este ejemplos nos centraremos en validar a INTEGER), el código .aspx sería así:







Cuando ejecutemos el proyecto, veremos que no nos permitirá typear letras ni otros caracteres a parte de números. Pero sí podremos typear lo siguiente: "111111111111111111111111111111111111111111111111"

Definitivamente eso nos daría una excepción. Para controlarla, yo utilizo el "TryParse" como en el siguiente código, en el CodeBehind:


Protected Sub btnValidar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnValidar.Click
If Me.txtEntrada.Text.Length > 0 Then
Dim i As Integer = 0
If Not Integer.TryParse(Me.txtEntrada.Text, i) Then
Me.lblMensaje.Text = "La entrada debe ser un valor numérico."
Else
Me.lblMensaje.Text = "Good!"
End If
End If
End Sub


=) HaPPy CoDiNg!

Tuesday, April 5, 2011

Cómo cargar Un combo / dropdownlist dentro De Un gridview

KeyWords: TemplateField, DropDownList en GridView

Para poder agregar un combo o dropdownlist dentro de un gridview, es necesario utilizar una columna templeteada (TempleateField).

El siguiente código en el archivo .aspx



 
    Prueba de Combo 
                                                            
     
                                                                
  
 
 


Dentro del evento del GridView llamado RowDataBound, el siguiente código


Protected Sub grvPrueba_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grvPrueba.RowDataBound
 Try
 If e.Row.RowType = DataControlRowType.DataRow Then
  Dim combo As DropDownList = DirectCast(e.Row.FindControl("cboComboPrueba"), DropDownList)
   combo.ClearSelection()
   If combo IsNot DBNull.Value Then
      Me.prcCargarComboGridView(combo)
   End If
  End If
 Catch ex As Exception
  Throw ex
 End Try
End Sub


El siguiente código es la función que hace cargar los datos al dropDonwList. Insertalo en cualquier lugar de tu CodeBehind:


Public Sub prcCargarComboGridView(ByVal cboCombo As DropDownList)
Dim objNegocio As New clsClaseNegocios
Dim dtDatosParaCargarElCombo As DataTable = objNegocio.fncGetDatos()
  cboCombo.DataSource = dtDatosParaCargarElCombo 
            cboCombo.DataTextField = "nombre"
            cboCombo.DataValueField = "codigo"
            cboCombo.DataBind()
    End Sub


Quedaría como se muestra en la siguiente imágen:




=) HaPPy CoDiNg!

Monday, April 4, 2011

Cómo cambiar el valor De una columna De Un gridview En tiempo De ejecución

KeyWords: ASP.NET, VB.NET, GRIDVIEW

Resulta que la consulta SQL que le bindeas a tu GridView tiene un campo byte que cada número significa algo. Por ejemplo. 0: Iniciado. 1: Vigente. 2:Cancelado. 3:Terminado, etc. Y lo cierto es que no quieres mostrar este dato como número sino como texto.

Te doy tres alternativas para una solución.

Solución 1

Utilizando una columna normal (BoundField), en el evento del GridView llamado "RowDataBound", y suponiendo que la columna a la que se quiere modificar sea la 0, insertas el siguiente código:

Protected Sub grvPrueba_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grvPrueba.RowDataBound
        Try
            
            If e.Row.RowType = DataControlRowType.DataRow Then 

                   Select Case e.Row.Cells(0).Text
                    Case 0
                        e.Row.Cells(0).Text = "Iniciado"
                    Case 1
                        e.Row.Cells(0).Text = "Vigente"
                    Case 2
                        e.Row.Cells(0).Text = "Cancelado"
                    Case 3
                        e.Row.Cells(0).Text = "Terminado"
                End Select


            End If
        Catch ex As Exception
            Throw ex
        Finally

        End Try
    End Sub

Solución 2

Utilizando una columna templeteada (TemplateField), le pones un label y llamas a una función en la cual le das el número y te devolverá el valor correspondiente.

El siguiente código, en el .aspx



fncGetEstado es la función
estado es el campo de base de datos, ese campo numérico en el se registran los estados en forma de número.

El siguiente código en el codeBihind

Public Function fncGetEstado(ByVal estado As Byte) As String

        Select Case estado
            Case 0
                Return "Iniciado"
            Case 1
                Return "Vigente"
            Case 2
                Return "Cancelado"
            Case 3
                Return "Terminado"

        End Select

    End Function

Solución 3

Otra posible solución sería que directamente hagas la modificación en tu consulta SQL y así cuando la bindees a tu GridView ya no tendrás que hacer nada. La consulta SQL sería así.

SELECT columna1, columna2, CASE columna3 WHEN 0 THEN 'Iniciado' WHEN 1 THEN 'Vigente' WHEN 2 THEN 'Cancelado' WHEN 3 THEN 'Terminado' AS estado
FROM tabla1

Ojo que ahora la columna ya no será "columna1", sino que en tu GridView debes enlanzarlo con "estado" la cual es la columna ya procesada.

=) HaPPy CoDiNg!

Wednesday, March 30, 2011

Cómo pasar Los datos De un gridview a Un datatable

ASP.NET, VB.NET

Se podría dar el caso de que las celdas de un GridView sean generadas o ingresadas por el usuario en tiempo de ejecución. Es decir, lo que se muestra en el GridView no son datos bindeados.

Para poder recuperar estos datos, no existe un método como tal. Por tanto, hay que programarlo.

Es sencillo, primero hay que crear la estructura del DataTable. Por ejemplo:

Public Sub prcCrearEstructuraDatatable()
        Dim dt As New DataTable
        dt.Columns.Add("inProdNcod")
        dt.Columns.Add("inProdCodg")
        dt.Columns.Add("vtLisDPrec")
        dt.Columns.Add("vtLisDDsct")
        dt.Columns.Add("vtLisDMoni")
        dt.Columns.Add("vtLisDMarg")
        dt.Columns.Add("vtLisMNcod")
        dt.Columns.Add("vtLisDNcod")
        Me.ViewState("dtDetalle") = dt
    End Sub


(Meto el DataTable dentro de un ViewState para luego poder manipular la tabla en cualquier momento)

Luego de haber cargado los datos al Gridview, los cuales se desea guardarlos, le hacemos un For Each y metemos en cada fila del DataTable lo que hay en cada celda del GridView, las celdas que deseemos. Para ello, recuperamos la estructura del DataTable la cual está en el ViewState. Y al final, hacemos el caso inverso, asignamos lo que hay en el DataTable ahora al ViewState (esto es para la manipulación posterior de los datos)

Public Function fncCargarDataTable(ByRef strMensaje As String) As Boolean
    Me.prcCrearEstructuraDatatable()
    Dim dt As DataTable = Me.ViewState("dtDetalle")
    If Me.grvListaDePrecios.Rows.Count > 0 Then
        For Each fila As GridViewRow In Me.grvListaDePrecios.Rows
            Dim f As DataRow = dt.NewRow()
            Dim txtDescuento As TextBox = DirectCast(fila.Cells(6).Controls(1), TextBox)

            f("inProdNcod") = DirectCast(fila.Cells(8).Controls(1), Label).Text
            f("inProdCodg") = fila.Cells(1).Text
            f("vtLisDPrec") = DirectCast(fila.Cells(4).Controls(1), TextBox).Text
            f("vtLisDDsct") = IIf(txtDescuento.Text = "", "0", txtDescuento.Text)
            If txtDescuento.Text = "" Then
                txtDescuento.Text = "0"
            End If
            f("vtLisDMoni") = DirectCast(fila.Cells(4).Controls(7), DropDownList).SelectedValue
            f("vtLisDMarg") = DirectCast(fila.Cells(5).Controls(1), Label).Text
            f("vtLisMNcod") = Me.ViewState("EstadoID")
            f("vtLisDNcod") = DirectCast(fila.Cells(9).Controls(1), Label).Text

            dt.Rows.Add(f)
        Next
        Me.ViewState("dtDetalle") = dt
    Else
        strMensaje = "Debe generar la lista de precios antes de guardarla."
        Return False
    End If
    Return True
End Function

=) HaPPy CoDiNg!

Monday, March 28, 2011

Como quitar Los ceros que genera el AVG de SQL

Me topé con el lio de que cuando ejecuto la siguiente consulta sql, en el resultado del AVERAGE o promedio, me agrega hasta 6 dígito después del punto. Si el resultado no tuviera decimales, le agrega en total 6 molestosos ceros.

SELECT p.inProdCodg, p.inProdDesc, AVG(a.inPxalCuni) AS COSTO
FROM dbo.inProd p INNER JOIN dbo.inPxAl a ON a.inProdNcod=p.inProdNcod
GROUP BY p.inProdCodg, p.inProdDesc

Una solución? Hacerle un CAST
El tipo de dato de la columna de la cual saco el promedio es DECIMAL(14,2)

Por tanto, la consulta sql quedaría así:

SELECT p.inProdCodg, p.inProdDesc, CAST(AVG(a.inPxalCuni) AS DECIMAL(14,2)) AS COSTO
FROM dbo.inProd p INNER JOIN dbo.inPxAl a ON a.inProdNcod=p.inProdNcod
GROUP BY p.inProdCodg, p.inProdDesc


=) Happy Coding!