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

sábado 4 de octubre de 2008

Cómo hacer un request.serverVariables dentro de una clase.

En mis últimos coletazos antes de dos meses de curso para la certificación en Windows2003, si vuelvo a sistemas, estoy haciendo un panel de control de una página web en Visual Studio 2008 y me he encontrado con una vieja dificultad que ahora, después de dos años de estudios constantes en desarrollo, me parece tan simple que me es difícil creer las horas que me volvió loco este “problemilla”.

Básicamente lo que quiero es introducir en un módulo una variable que tome su valor de un httprequest de la variable de sistema que me indica la dirección física de mi carpeta de la web en el servidor. Esto se usa, sobre todo, para los directorios en donde cargas y recuperas ficheros (en este caso fotos).

Si lo pones en el fichero aspx.vb directamente, dentro de un método, todo funciona bien. Pero para ponerlo en una clase que no tenga conexión directa con el mundo real , la cosa casca.

La solución que me funciona es:

• Importas la clase System.Web.HttpContext. Así le abres una puerta a las comunicaciones http que realices desde la parte “exterior” de la aplicación.
• Para decirle que utilice la conexión actual, osea la que está abierta en ese momento, le especificas que es Current y entonces, si que puedes recuperar la variable de servidor a través de la comunicación http.

Imports System.Web.HttpContext
Dim ruta as string = Current.Request.ServerVariables("APPL_PHYSICAL_PATH")

Y yá ta.

viernes 3 de octubre de 2008

Guille Community Tour 2008

Bueno, hace ya unos añitos me vi en la disyuntiva de dejar mi querido/odiado asp y ver qué había de nuevo en la programación Web de Microsoft.

Empecé a descubrir que existía algo muy reciente que era muchísimo más de lo que yo había visto antes. Con extrañas cosas como el code behind, la OOP, el IDE Visual Studio y todo un mundo que, a los que venían de VB6 le sonaba y mucho, me dejaron perplejo.

San Google aún no tenía los niveles olímpicos (por el Olimpo) actuales y, en busca de manuales o tutoriales, les pregunté a todos mis conocidos de donde poder encontrar información sobre el tema de la novísima plataforma .NET.

Y alguien me comento de una página Web muy buena de un tal “El Guille”.

La sorpresa no se vé, pero empieza por go...

El año pasado decidí que tenía que plasmar en papel de título los conocimientos que tantos años desarrollando tenía dentro de mi cabeza. Y para ello me apunte a la excelente CampusMVP para realizar los estudios de la certificación 70-536. Y mira por donde uno de mis tutores era Guillermo Son, lo cual indica la excelente calidad de los profesores de este centro de estudios online.

Como habréis leído en este blog, últimamente estoy asistiendo a las reuniones mensuales de MAD.NUG y en la última reunión me llevé la alegría del anuncio de una charla sobre las novedades de Visual Basic 9.0 por parte del tan respetado Guille.

Asique, esta vez sin corbata y en vaqueros, me planto en las oficinas de Microsoft a las siete de la tarde y veo la mayor concentración de MVP por metro cuadrado desde el enorme evento de presentación de la plataforma 2008, en la primavera de este año.
(Perdón por las fotos, me han salido movidas todas).

El guille, el rosa de las diapositivas y el proyecto miAmiguito... ;)

Por supuesto, para uno de los que se han comprado el libro del Guille, importaba más cómo contaba las cosas El Guille, que lo que contaba que ya lo teníamos en su excelente manual. Pero en casi todas las charlas a las que asisto, me hago una lista de palabras que recordar por describir cada una de ella un hecho o “feeling” en la reunión que con solo evocarla me describe la situación.

Punto y coma. Era una reunión de desarrolladores en Visual Basic con dos pequeñas islas de C# (uno de ellos nada más ni nada menos que Luis Fraile y su Mac…). Por lo cual medio en serio medio en broma se hablaba con muchas risas de los “punto y coma” y sus desventajas, ventajas e influencias en la evolución de Visual Studio y sus lenguajes. Me llamó la atención de la omnipresente comparativa con C# que me indica, muy a mi pesar, que es el momento de interesarse por el “enemigo”.

Option Strict. Yo, todos los que estábamos en la sala lo utilizamos por defecto. Pero El Guille hizo muchísimo hincapié es lo indispensable que es tenerlo activado para obtener un código limpio que, cuando el intellisense no respondió como debía a causa de tenerlo Off y vimos que era ello la causa del error, como novatos, nos sorprendimos de su utilidad. No valoras algo hasta que te falta… :)

Microzof. Vizua Eztudio. Me sorprendió mucho el acento cerrado del Guille. Me sorprendió mucho que no molestaba en lo más mínimo para entender lo que decía y que en las palabras en inglés no se le nota. Y tiene el “duende “de los buenos comunicadores tanto o más que cuando escribe. Nos jartamos de reír (ir al punto final) y las dos horas largas se nos hicieron muy cortas.

Generosos, la cola para poner nuestros 5€ para Juanma.

Tiempo. Por mi parte me hubiera quedado una hora más cautivado por la retorica y el planteamiento de la charla. Los comentarios y las risas. Igual que en la anterior. Se me hacen muy cortas las dos horas. Tanto, seguramente, como largas a los pobres de Microsoft que quieren cerrar y tiene que esperar a esta pandilla de Frikis riéndose de palabros como GoTo.

GOTO. Llorábamos de risa cuando el Guille, con su guasa, nos cuenta que para un mini desarrollo para el móvil puso un… GOTO. Si, si, estás leyendo bien. Un puro y duro GOTO de los tiempos de los números de fila y el “spaguetti software”. He de reconocer que el ver a mi referencia en el código limpio usando el máximo exponente de lo que no hay que hacer, me hizo sentir un poquito menos culpable por tantas y tantas “chapuzas” que me he visto hacer en estos años. Y la jartá de reír fue memorable.

Al finalizar la charla, fui uno de los pocos valientes que nos quedamos a tomar unas cervecitas y, he de reconocer, que nunca había estado en una mesa con tanto talento junto. A la foto me remito. Lo más curioso es que hablamos de motos, de gatos, de viajes de trabajos pero nada, nada de código, patrones, etc.

Cuatro MVP alrededor de una mesa. Luis Fraile, David Salgado, Guillermo Son y José Luís La Torre.

Vamos, un placer.