[Opinión]Mis experiencias como “Analista”.

Como primer punto de este post de opinión, voy a exponer los motivos de porque lo escribo:

– El otro día por Twitter hablaba con Jorge Serrano (http://geeks.ms/blogs/jorge/ o http://twitter.com/#!/J0rgeSerran0) acerca de obviar “cosas” a la hora de realizar Documentos de Análisis de Requisitos, cosas que se dan por supuesto (porque tienen que ser así…)

– El otro motivo, pese a no ser un “experto” en ALM, me he encontrado con situaciones muy curiosas durante los 3 últimos años.

Me encuentro trabajando en un cliente desde hace algo mas de 3 años. La situación del proyecto desde el principio no fue la ideal, porque para mi desgracia, mientras estábamos analizando tuvimos que empezar a desarrollar ( y no quiero hablar de tecnología que ese es otro cantar).

Nunca había trabajado en el sector del cliente en el que estoy trabajando, por lo que he aprendido muchos nuevos conceptos, y aun me queda porque es un no parar de aparecer nuevos conceptos.

El empezar a desarrollar cuando los documentos funcionales, y requisitos no están cerrados del todo, puede generar millones de errores.

En este cliente tenemos todo tipo de documentos, ARS (Análisis de Requisitos), DTS (Diseño Técnico del Sistema), EF (Especificación funcional), Documentos de Prueba…

ARS y EF están muy ligados, puesto que el segundo digamos que implementa el primero.

Para que fuera todo mas perfecto, a parte de tener que esperar a finalizar los documentos de Análisis para empezar a desarrollar, lo que sería estupendo sería que el Cliente lea y apruebe los documentos para que realmente sepa lo que se va a hacer y que si algo no está claro o este mal definido se reanalice.

Me he encontrado en numerosas ocasiones con las siguientes situaciones:

  • El cliente a pesar de haber “leído y aprobado” los documentos, no conoce una parte concreta de la aplicación.
  • Un requerimiento definido, “obvia” datos que el equipo de desarrollo debe conocer, puesto que el Cliente piensa, que todo el equipo de Desarrollo es “EXPERTO” en su sector.
  • El desarrollador implementar de manera errónea un requerimiento.

Después de tanto tiempo, se hace muy difícil acordarte de todas las funcionalidades implementadas en el sistema, porque ha ido creciendo de forma anual, cambios, etc. En parte entiendo, que el Cliente, pueda no conocer partes de la aplicación porque es una aplicación bastante grande, separada en módulos, y hay partes que se usan a lo mejor de forma anual.

Lo que no logro entender, y es una discusión que mantengo a menudo con mi Jefe, es que el cliente nos considere “Expertos” en su Sector. Lo primero decir es que nunca me podré considerar experto en nada, ni siquiera en programación, porque ya sabéis como es nuestro mundillo, que siempre está evolucionando, y segundo, si el mismo cliente tiene dudas acerca de su Sector, ¿como pretenden que alguien ajeno a su Sector, sea de su mismo nivel?

El tercer punto prefiero no comentarlo, porque son cosas que no deberían ocurrir, pero que si un programador no lee la documentación técnica pasa lo que pasa.

Bueno, me gustaría que dejéis vuestras opiniones y cosas con las que os hayáis encontrado a lo largo de vuestra experiencia profesional.

 

Saludos

BASICO: SQL(2) – Para Iniciarse

Hace unos días publique una primera entrada de la serie sobre SQL.

Hoy os voy a hablar sobre las acciones más comunes que hacen las aplicaciones, es decir, Insertar, Actualizar y Borrar datos.

 

Insertar Datos

Se hace indispensable, que un usuario pueda llevar a cabo la inserción de datos en una tabla, para registrar cualquier cosa, Clientes, facturas, pedidos, etc..

La sintaxis para poder insertar datos en una tabla es del estilo:

Podemos separar en 2 partes la consulta:

1) Donde vamos a almacenar los datos:

En la sentencia se refiere a las palabras reservadas “Insert Into”, a continuación se va a indicar el Nombre de la tabla que va a guardar los campos.

De manera opcional, se van a indicar los campos que vamos a insertar. Son opcionales, puesto que si no los informamos el motor de SQL va a pensar que vamos a guardar todos los campos.( y en el orden que se han definido en la tabla)

2) Valores que vamos a guardar:

A partir de la palabra reservada “Values” se van a exponer todos los valores de los campos, que hemos indicado en la primera parte de la sentencia, y en el orden en el que han sido escritos, para hacerlo de forma correcta.

Es muy importante que los datos, se escriban de manera adecuada, y usando los caracteres delimitadores “ ‘”  con las cadenas de texto, si son fechas hacerlo de manera correcta.

Se pueden utilizar funciones a la hora de realizar inserciones. Estas funciones serán las que permita el motor SQL que estemos utilizando.

Como he dicho, en el Titulo es un post Básico, hay mas sentencia SQL para Insertar Datos, que si me pedís os expondré con mucho gusto.

Actualizar Datos

Otra sentencia muy importante de cara al usuario es poder modificar datos en sus tablas.

La sintaxis para ello será similar a:

Podemos separar la sentencia en 3 partes:

1) Tabla de Destino de la Actualización:

La parte de la sentencia Indica por UPDATE, nos va a permitir indicar el nombre de la tabla que va a ser actualizada.

2) Campos a Actualizar y sus valores:

En la segunda parte de la sentencia, a través de la palabra reservada SET, va a comenzar el bloque de campos que vamos a actualizar.

Para cada Campo a Actualizar se va a poner el nuevo valor que va a tener con el formato requerido por el campo (al igual que en la inserción)

Para separar los campos que se van a actualizar se va a realizar a través de “ , “.

3) Filtro de los registros a actualizar

Aunque la tercera parte de la sentencia es opcional, cabe destacarla, para que, a no ser que queramos llevar a cabo una actualización masiva de datos (por ejemplo actualizar el precio de todos los productos un 15%), nos refiramos a un conjunto de registros bien definidos.

El apartado Where es igual que el que os indicaba en el primer post de la serie.

 

Borrar Datos

La última sentencia que vamos a ver en este post es el borrado de Datos.

La sintaxis sería similar a:

 

Podemos dividir la sentencia en 2 partes:

1) Tabla que se va a ver afectada:

En la primera parte de la sentencia vamos a definir la acción a desarrollar, en este caso “DELETE FROM” (Borrar)  y la tabla que va a “sufrir” el borrado.

2) Filtro de los registros a borrar:

La segunda parte es opcional, al igual que en el caso anterior la parte 3, pero es importante indicarla a no ser que queramos borrar todos los datos de la tabla.

El apartado Where es igual que el que os indicaba en el primer post de la serie.

Nota:

Como he dicho, en el Titulo es un post Básico, hay mas sentencia SQL para Insertar Datos, que si me pedís os expondré con mucho gusto.

Bueno espero que os haya gustado, y si tenéis cualquier duda ya sabéis donde estoy.

Saludos

MVC3 Release Candidate

Esto es un no parar, ayer salió la Release Candidate de MVC3, anunciada por ScottGu.

Podéis descargaros la nueva versión de aquí y ver las Notas de la descargar aquí.

¿Qué novedades trae esta versión?

– Soporte Intelisense para las vistas Razor:

(Una imagen vale más que mil palabras)

– Nuevos Atributos Interesantes:

    1. ControllerSessionStateAttribute: Es un atributo para poder, digamos, alterar el uso de la Session.
      El atributo recibe un valor de tipo SessionStateBehavior, el cual es una enumeración con los siguientes valores:
      • Default: Es el valor por defecto, que tenga la aplicación.
      • Disabled: Inhabilita el uso de Session en el controlador. Utilizar una variable de Session con este valor, va a provocar una excepción.
      • ReadOnly: Solo va a permitir consultar valores de Session, es decir, la escritura en variables de Session nos provocará una excepción.
      • Required:Va a permitir leer y escribir en las variables de Session.

      • [ControllerSessionStateAttribute(System.Web.SessionState.SessionStateBehavior.Required)]
            public class EjemploController : Controller

    2. Atributos de Validación: Se han introducido algunos nuevos atributos como son:
      • SkipRequestValidation: es el equivalente al que hace unos días publique aquí. Nos va a permitir evitar la validación del código para elementos que no deseemos, por ejemplo un editor de texto… En el siguiente ejemplo muestro ambos atributos, cuyo resultado va a ser el mismo.
      • [ValidateInput(false)]
        [SkipRequestValidation]
        public string Message { get; set; }
         
      • CompareAttribute: Imaginaros, la típica situación donde tenemos una vista para crear usuarios, con una contraseña y otra caja de texto para validar la contraseña.
        Este atributo, nos va a permitir a nivel de propiedad, establecer una comparación con otra propiedad de nuestro Modelo de una manera muy sencilla:

                [Required]
        public string Contraseña { get; set; }
                [Required]
                [Compare(«Contraseña»)]
                public string RepiteContraseña { get; set; }

                        Además del campo con el que comparar se pueden indicar las siguientes propiedades:

                            – ErrorMessage

                            – ErrorMessageResourceName

                            – ErrorMessageResourceType

      • Remote: Este es un atributo más que interesante, debido a que nos va a permitir realizar una validación cuando estemos editando un modelo, al igual que podríamos realizarla con JQuery, pero teniendo el código en el controlador. El atributo tiene varías sobrecargas, pero quizás la mas sencilla sea:
      • [Remote("Funcion","Controller")]
        public string Topic { get; set; }
        

                        Está sobrecargar recibe 2 parámetros:

                         – Nombre de la función que se va a ejecutar para la validación.

                         – Controlador donde se encuentra la función a ejecutar

                         Es de entender, que el valor de retorno de la función tendrá que ser de tipo Boolean(bool)

Hay más novedades en esta “Release”, pero no voy a entrar a detallar más, os dejo que juguéis un poco con ella, estoy convencido de que os va a gustar.

 

Se me olvidaba comentar que os paséis por el Blog de Eduard para ver el tema de Unobstrusive Ajax!!!

Un saludo.

Mas Helpers de MVC3

que Continuando con los distintos Helpers que han sido introducidos, Redes Sociales y Bing o Los WebGrid y WebChart, entre otros, os voy a hablar de otros novedosos, y que hoy en día se antojan casi como necesarios.

 

HELPER VIDEO:

¿Quién no se ha visto en la necesidad de incrustar un video flash, o un video Media Player en una web con WebForms?

Bueno, pues el equipo de MVC ha introducido este nuevo Helper, para “facilitarnos” el trabajo. Presenta los siguientes métodos, para mostrar distintos tipos de videos:

– Flash (Video con formato Flash): El único parámetro requerido es la ruta del fichero a reproducir, el resto de parámetros son los siguientes:

– MediaPlayer (Video con formato WMP): El único parámetro requerido es la ruta del fichero a reproducir, el resto de parámetros son los siguientes:

 

<%= Video.MediaPlayer("http://boss.streamos.com/wmedia/ume/thewho/mygeneration.asx")%>

– SilverLight: Requiere los parametros de Ruta, ancho y alto, y además presenta los parámetros:

 

 

LINKSHARE VIDEO:

Algo que está muy en auge, como os indicaba, son las distintas redes sociales, y compartir la información que encontramos en Internet en ellas.

Por ejemplo, aquí mismo al finalizar este artículo, os vais a encontrar con una barra para compartir el Post, ya sabéis difundir el mensaje Lengua fuera (Bueno solo si os gusta, jeje).

Al grano, en MVC3 se ha incluido el Helper LinkShare, el cual de una manera muy sencilla nos va a permitir poner una barra de “Compartir” en nuestras vistas:

<%: LinkShare.GetHtml("Comparte Mi Sitio") %>

El único parámetro requerido es el Nombre del Sitio a compartir. Otros parámetros:

Y el resultado:

 

Bueno por hoy ya os he dado algo de caña para que veáis lo que Mola MVC y las nuevas ventajas de MVC3.

 

Un saludo

Helpers Redes Sociales en MVC3

En varios BLOGS, se habían anunciado para MVC3 helpers para aportar una rápida integración con las Redes sociales (Twitter, FaceBook…), Buscadores (Bing)…

 

Si ya tenemos en nuestro entorno instalada la Beta 3 de MVC, vamos a crear un nuevo proyecto de ejemplo.

 

Una vez creado, vamos a agregar un paquete a través de NUPACK, para poder incluir los Nuevos Helpers. Para ello, pulsamos con el botón derecho en el proyecto y elegimos “Add package reference”:

Seleccionaríamos “microsoft-web-helpers” y pulsamos en aceptar.

Una vez realizado, a la carpeta de referencias se habrá añadido la referencia “Microsoft.Web.Helpers.dll”. Para que funcione de manera correcta vamos a compilar el proyecto.

 

Bien una vez instalado y compilado, vamos a ir a nuestra vista por defecto para hacer unos pequeños ejemplos, que voy a poner con una vista normal (no Razor):

TWITTER Helper:

Vamos a empezar con Twitter (que me gusta más :p Mi Twitter):

Si en nuestra vista tecleamos “<%= “ o "<:”

Podremos ver los contenidos que nos va a mostrar el Intellisense. Bien si tecleemos Twitter nos va a aparecer nuestro nuevo Helper.

¿Qué métodos presenta?:

– Profile: Nos permite mostrar el contenido de nuestro perfil en Twitter. Aunque el único parámetro obligatorio es twitterUserName, os dejo una imagen con los distintos parámetros:

Como quedaría el código, de manera simple:

    <%: Twitter.Profile("jtorrecilla")%>

Cuando ejecutamos nuestra vista quedaría algo así:

– Search: El otro método disponible es el método de Búsqueda. Al igual que con el método Profile, tiene varios parámetros, pero el único obligatorio es: SearchQuery, Os dejo una imagen con el resto de parámetros.

El código quedaría así:

    <%=Twitter.Search("MVC") %>

El resultado de una búsqueda sencilla sería:

 

 FACEBOOK Helper:

Seguro que cada vez que vas a alguna web / blog te encuentras con el típico botón de “Me gusta” para publicarlo en FaceBook, pues ha llegado a MVC el Helper, que te lo permite hacer de una forma muy sencilla.

 

El único método de este Helper es “LikeButton”. Presenta varios parámetros, todos ellos opcionales, y los podeis ver aquí:

 

En código un ejemplo sencillo sería:

 <%= Facebook.LikeButton("http://geeks.ms/blogs/jtorrecilla/") %>

Y el resultado (antes y después de pulsar en Me Gusta):

 BING Helper:

Este Helper nos va a permitir incrustar el buscador de BING, en nuestras vistas con 2 sencillo métodos:

– SearchBox: El código sería muy sencillo, aunque el método puede recibir distintos parámetros, todos ellos opcionales: Url del sitio, y Tamaño de la Caja que se va a visualizar.

    <%=Bing.SearchBox() %>

Visualización Ejemplo:

– AdvancedSearchBox: Igual que el anterior con los siguientes parámetros:

 

Bueno después de la parrafada que os he soltado, solo espero que os sea de utilidad.

Un saludo.

BASICO: SQL(I) – Para Iniciarse

 

Cuando empecé a estudiar programación, más en concreto el DAI, me picaba mucho el gusanillo de los lenguajes de programación, pero no con menos interés, también lo hacia el acceso a datos (BD, Ficheros…) Por ello, puse especial interés en adquirir, lo que yo creo que es, una buena base de SQL.

Desde hace menos tiempo, participo activamente en los foros de MSDN, y me he encontrado en innumerables ocasiones, con gente que desconoce totalmente el manejo o acceso a los datos.

Por otro lado, a través de Twitter, hemos mantenido activos varios debates muy interesantes:

  • Migraciones de VB6 a .NET
  • ¿Debe conocer el programador SQL?

Creo, que dentro de poco vamos a ver ambos debates a través de algún que otro evento, en el que espero participar de forma activa.

Bueno después de está introducción, me voy a permitir, escribir unas pequeñas líneas introductorias,(puesto que YO soy de los que piensan que el Programador debe conocer SQL) para ayudar a aquellos programadores que se quieren animar con SQL.

Voy a dividir el tema en 3 Partes:

  • Consulta de Datos (Este POST)
  • Inserción, Modificación y Borrado de Datos.

En primer lugar, quiero comentar que voy a abstraerme de la Base de Datos (Relacional) sobre lo que voy a escribir porque el lenguaje SQL es común a los distintos motores de BD que vayamos a encontrarnos (Oracle, SQL Server, MySql…) con algunas peculiaridades o funciones distintas, pero la base en si es la misma.

Consulta de Datos

¿Qué pretende un programador con una consulta contra la Base de Datos? Obtener un conjunto de resultados para llevar a cabo una acción, o representación, que al final le va a aportar algún resultado al Usuario de la aplicación que estamos desarrollando.

Podríamos descomponer una sentencia de consulta en las siguientes partes:

  1. Selección
  2. Origen de Datos
  3. [Filtrado]
  4. [Agrupaciones]
  5. [Orden]

Un ejemplo de una sentencia completa:

Si os fijáis en la imagen, las líneas se van a corresponder con los apartados que os indicaba anteriormente.

Para construir una sentencia necesitamos tener mínimo los apartados 1 y 2, siendo los otros opcionales.

1) Selección:

En este apartado vamos a definir, que datos queremos mostrar en la consulta, es decir, aquellos campos de nuestro Origen de datos, para que el usuario pueda interactuar.

Para poder realizar una consulta vamos a necesitar hacer uso de la palabra reservada “SELECT”.

A continuación, podremos definir un listado de campos del origen de datos, o utilizar el “*” para listar todos los campos del Origen de Datos, aunque esta ultima opción personalmente no me gusta, porque puede llevar a errores.

Cuando estamos listando campos, podemos realizar algunas acciones:

  • Asignarles Alias para cambiar el nombre de la columna. Imaginaos, que tenemos un campo llamado c00013341, que en realidad es el Código de Empleado, si en pantalla mostramos c00013341, posiblemente el Usuario nos pregunte que significa.
  • Usar Funciones: No voy a entrar a listar las distintas funciones, pero si me pedís algún ejemplo os lo publicaré.
  • Usar Funciones de Grupo: Funciones para Totalizar, Sumar… para ello, será importante el apartado 4.
  • Mostrar Literales…

2) Origen de Datos:

El Origen de Datos es la fuente donde se encuentran almacenados los Datos que queremos mostrar al usuario, o que queremos utilizar.

Por lo general, el Origen de Datos puede ser uno de los siguientes elementos:

  • Una o varias tablas de la Base de Datos.
  • Una Vista de la Base de Datos.
  • Una subconsulta.

La consulta, mas sencilla será aquella que se realice sobre una tabla.

 

En el momento en el que entran en juego varias tablas, o una mezcla de los distintos tipos que os indicaba, será necesario enlazar los datos a través del apartado 3 (Filtrado), o a través de la clausula JOIN, para evitar tener un producto cartesiano de resultados, que tened por seguro, no es lo que desea obtener el usuario.

3) Filtrado:

Este apartado, que es el primero opcional, nos va a permitir filtrar resultados de la consulta.

Por ejemplo, Dame todos los empleados cuya año de Nacimiento esté comprendido entre 1975 y 1980.

La palabra clave para iniciar el filtrado de datos es “WHERE”.

Que operadores podemos utilizar para filtrar datos:

  • “=” El operador de Igualdad.
  • “<>” El operador de Distinto.
  • “<” o “>” Menor o Mayor que.
  • “<=” o “=>” Menor o igual o Mayor o igual que.
  • “Between” Un valor entre varios posibles.
  • “IN” un valor disponible de una lista o  consulta.
  • “NOT IN” un valor que no coincida con un elemento de una lista o  consulta.

4) Agrupaciones:

Existe la posibilidad de utilizar funciones de grupo (SUM, COUNT, MAX…), pero para poder realizarlas, es necesario que a través de la cláusula GROUP BY, Indiquemos cuales son los valores, por los que vamos a agrupar nuestra consulta.

En el primer ejemplo, os hacia una consulta en la que agrupando por el nombre de la empresa, iba a sacar cuantas existían con el mismo nombre.

Ejemplo:

5) Ordenación

Por último, otra de las posibilidades de las consultas, es la ordenación de los resultados, por alguno de los campos de la consulta.

Para poder llevar a cabo una ordenación, será necesario usar la palabra reservada “ORDER BY”

Un ejemplo de su uso sería:

 

ORDER BY NOMBRE_EMPRESA [ASC | DESC]

 

Donde [ASC | DESC], será el tipo de Orden Ascendente o Descendente según deseemos.

 

Bueno, perdón por el ladrillo que os he metido.

Espero que os sea de utilidad, y en los próximos días publicaré la segunda parte.

Saludos!!