jueves, 16 de octubre de 2008

tryCast en C#

Quien siga este blog, además de yo mismo, sabrá que estoy con mis primeros pasos en C# después de un porrón de años programando en Visual Basic.NET.

Y unas entradas atrás le decía adiós a las conversiones con .tryCast(,.

Pero no, me he equivocado, como me va a pasar muchas veces en este aprendizaje. Si que puedo seguir haciendo mi TryCast como antes. De echo casi igual que antes. La única diferencia es que a la variable del tipo esperado le tengo que señalar que es de salida añadiéndole por delante el término "out".

int.tryCast(textBox1.text, out int)

P.D. Insisto, cuidadín con las Mayúsculas. Si en vez de int pones Int, te casca.

miércoles, 15 de octubre de 2008

Y ahora C#

... y ahora, como buen consultor todoterreno, me han propuesto un proyecto precioso pero en C#.

Y ahora que lo estoy catando por primera vez en la vida, me encuentro con cosas MUY diferentes con el Visual Basic:
  1. Es Case Sensitive!! no es lo mismo string nombre que string Nombre...
  2. Pero aún: Button es un objeto de tipo botón. Pero button es el nombre de una variable.
  3. Me tengo que olvidar de mi queridísimo TryCast() y tengo una cosa mü rara que es algo como (tipofinal) objetoOriginal.
  4. Echo muy de menos los End. Las } me confunden como la noche.
  5. Me dá la sensación que el Intellisense no funciona tan bien como en VB.
Pero bueno, una cosilla más que aprender en este increíblemente rico, desde el punto de vista de aprendizaje, año.

martes, 14 de octubre de 2008

Ahora IT

"La vida te da sorpresas"

Hace dos semanas mi manager me ha abierto de nuevo la puerta del mundo de la administración de sistemas al patrocinarme la empresa un curso de preparación para la certificación MSCE/MSCD.

Si bien el horario es un infierno (de 7 a 10 de la noche), hemos tenido la enorme suerte de que el profesor SABE y sabe contarlo.

Y así me veo, tan contento y tan feliz descubriendo aquellas herramientas maravillosas del WindowsXP que me hubieran echo la vida MUCHO más fácil en los tiempos en que mi empresa aún existía.

Ahora, cada día salgo del trabajo (dentro de un ratito), me subo a mi montura mecánica y me voy ilusionado a ver que cosas nuevas aprendo.

Y dentro de nada empezamos a destripar Windows 2003 server.

P.D. Eso sí, con mi mujer apenas cruzo unas palabras que se va a trabajar antes de yo levantarme y cuando vuelvo yo del curso ella ya está en la cama :(

miércoles, 8 de octubre de 2008

Ordenar, paginar y buscar en un GridView con Datasource

En mi entrada anterior estaba metido en una página Web sencilla en donde se visualiza un GridView con capacidades de paginación, ordenación y búsqueda.

Como buen desarrollador me lié a escribir código y clases para controlar que cuando paginara no me desordenara, y que cuando buscara me mantuviera la última posición de la página y el orden adecuado.

Y cuando llevaba tropecientas mil líneas y una entrada en este mi blog, leí en una página de MSDN que Microsoft aconsejaba hacer estas operaciones con una conexión a un Datasource.

Le eché una ojeada y me lleve la desagradable sorpresa que me ponía todo el código en la página aspx.

Dándole vueltas, recordé que todo lo que hay en la pantalla lo puedo gestionar desde el “code behind” y dejé solamente la invocación al control en el aspx:
<asp:sqldatasource id="SqlDataSource" runat="server">
El siguiente contratiempo es que yo intento mantener una clara estructura de tres capas (a saber, presentación, negocio y dato), aunque sea en un proyecto enano como este. Por lo cual empecé por detrás y me fui a la capa de datos en donde comprobaba el parámetro de cadenaDeBusqueda (string) para saber si tenía que utilizar una cadena de SQL u otra.

Public Class accesoDatos

Public Function cadenaComandoSelect(ByVal cadenaBusqueda As String) As String
Dim sql As New StringBuilder

' Bandera que indica si estoy entrando en el bucle For Each por primera vez.
Dim primeraPagina As Boolean = True

sql.Append("SELECT ")
sql.Append("* ")
sql.Append("FROM Tabla ")

' Si hay parámetros de búsqueda...
If cadenaBusqueda <> String.Empty Then

' Lo despieza por palabras usando el espacio como separador.
Dim palabrasBusqueda() As String = cadenaBusqueda.Split(" ")

' Y por cada palabra hace una búsqueda en todos los campos
For Each palabra As String In palabrasBusqueda
'Si es la primera vez que entra en el bucle añade el Where y pone a false la bandera
If primeraPagina = True Then
sql.Append("WHERE ")
primeraPagina = False

Else
' Si estamos entrando en otro bucle, añade el AND' para hacer restrictivas las búsquedas.
sql.Append(" AND ")
End If

sql.Append("(campoTablaSQL LIKE '%" & palabra & "%' OR ")
sql.Append("campoTablaSQL1 LIKE '%" & palabra & "%')")

Next
End If

Return sql.ToString

End Function
End Class


Cómo os habréis dado cuenta, realmente no conecto aquí con la base de datos, pero en mi opinión prefiero tener todas las cadenas SQL juntas en esta capa. Me es más sencillo para el mantenimiento y evolución de la aplicación.

Después me voy a la capa de negocio, en donde tengo las reglas del idem que trata los datos que van y vienen de datos y presentación, y creo un método que envía la cadena de búsqueda y devuelve la cadena SQL de SELECT apropiada.

Public Class Articulo
Public cadenaBusqueda As String
Dim datos As New accesoDatos

Public Function comandoSelect() As String
Return datos.cadenaComandoSelect(cadenaBusqueda)
End Function

End Class

Por último me voy a la capa de código de la capa de presentación y realizo la conexión de GridView con el SqlDatasource.

Dim articulo As New Articulo

Public Sub inicializaAdaptadorSQL()

articulo.cadenaBusqueda = txtbBuscar.Text

SqlDataSource.ConnectionString = ConfigurationManager.ConnectionStrings("conexionStringSQL").ToString
SqlDataSource.SelectCommand = articulo.comandoSelect

gvArticulos.DataSourceID = "SqlDataSource"

End Sub


Y con esto cumplo dos paradigmas en mi forma de desarrollar. Primero, intentar picar el menos código posible. Y conseguir el que el mantenimiento futuro sea el más sencillo.

Es una ruptura del modelo de las capas porque realmente realizo la llamada a los datos desde la capa de presentación, y lo de POO me los salte a la torera, pero cuando comparo las 5 horas que llevaba contra los 15 minutos en que termine la conexión y el GridView adquirió las actuaciones que necesitaba… pues como que no hay color.

Perdonar si he publicado un campo de la clase como público sin pasarlo por una propiedad, que sería lo suyo, pero así reduzco el texto del código de ejemplo.

martes, 7 de octubre de 2008

Ordenar un GridView por sus columnas.

Esto es una técnica básica en la correcta interacción del usuario con una tabla de datos. Que pueda ordenar la tabla de acuerdo a una columna dada, y en orden descendente o ascendente.

Primero nos aseguraremos que nuestro GridView permite ordenaciones y que las columnas permitan ser ordenadas:

<asp:GridView ID="gvGridView" AutoGenerateColumns="false" runat="server" AllowSorting="True">

<Columns>
<
asp:BoundField DataField="Campo" HeaderText="Titulo Columna" SortExpression="Campo" />
Columns>

asp:GridView>

Después utilizaremos dos propiedades que van a persistir los valores de la tabla de datos que alimenta al GridView, para no tener que traer los datos de la base de datos en cada ordenación (cambio ancho de banda por menos llamadas a la base de datos), y el orden ascendente o descendente de la ordenación.

Private Property dtTabla() As DataTable

Get

Return ViewState("dtTabla ")

End Get

Set(ByVal value As DataTable)

ViewState("dtTabla ") = value

End Set

End Property

Private Property orden() As String

Get

Return ViewState("orden")

End Get

Set(ByVal value As String)

ViewState("orden") = value

End Set

End Property

Se supone que en algún punto del código cargamos los datos recuperados de la base de datos dentro de la propiedad dtTabla, para así hacerlos persistentes. Por lo cual lo siguiente que hacemos es el método de ordena()

Private Sub ordena(ByVal campo As String)

If orden = "ASC" Then

orden = "DESC"

Else

orden = "ASC"

End If

dtTabla.DefaultView.Sort = campo & " " & orden

gvGridView.DataSource = dtTabla.DefaultView

gvGridView.DataBind()

End Sub

Aquí lo único de reseñar es que utilizamos el View por defecto que toda DataTable tiene, y lo utilizamos para ordenar y cargar el GridView.

Por último incluimos en el evento de ordenación del GridView la llamada al método ordena.

Protected Sub gvGridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvGridView.Sorting

ordena(e.SortExpression)

End Sub