miércoles, 14 de noviembre de 2012

Instalación del cliente HTML Preview 2 para LightSwitch

Ya se encuentra disponible una versión de previa (Preview) del cliente HTML para Microsoft Visual Studio LightSwitch. Gracias a este cliente es posible generar además de aplicaciones en Silverlight aplicaciones enteramente HTML + Javascript que se pueden ejecutar en cualquier dispositivo con un simple navegador.


La idea del equipo de LightSwitch es hacer un modulo que se complemente con las opciones ya disponibles, por tanto el aspecto de la aplicación generada con este cliente HTML esta pensado para dispositivos móviles táctiles con tamaño muy variable. Para el uso en equipos de sobremesa lo mejor es seguir utilizando el cliente actual en Silverlight que permite aprovechar la potencia y tamaño  de estos dispositivos.

Como todavía es una versión Preview, es necesario seguir unos pasos para poder instalarla. Para empezar es necesario disponer de Visual Studio 2012 versión RTM (final). El método de instalación es a través de Microsoft Web Platform Installer, y está incluido dentro del paquete de herramientas de desarrollo para Microsoft Office que se puede descargar a través del siguiente enlace:

Una vez instalado, si tenemos nuestro Visual Studio 2012 en otro idioma que no sea el Ingles, nos aparecerá un error si intentamos crear un proyecto HTML de LightSwitch. Para solucionarlo debemos instalar el paquete de idioma en ingles del siguiente enlace:



Una vez instalado, cambiamos el idioma del interfaz al idioma Ingles entrando en Herramientas -> Opciones -> Configuración internacional -> Idioma


Ahora ya podemos crear un proyecto HTML creando un nuevo proyecto y eligiendo el tipo "LightSwitch HTML Application" dentro de la plantillas de LightSwitch:


Una cosa que hay que tener en cuenta es que aunque una aplicación HTML de LightSwith usa entidades y pantallas igual que las aplicaciones de LightSwitch utilizadas hasta el momento, la estructura de la aplicación internamente es totalmente distinta por lo que ahora hay que habituarse a desarrollar aplicaciones con este nuevo tipo de entorno.

jueves, 4 de octubre de 2012

Como borrar los valores de configuración de los usuarios

Una interesante característica de las aplicaciones realizadas con Microsoft LightSwitch es la posibilidad de guardar la configuración de cada usuario en determinados elementos visuales tales como por ejemplo el ancho de las columnas o el tipo de ordenación en las rejillas. Esto se realiza automáticamente por el entorno de LightSwitch sin necesidad de indicarlo a la hora de diseñar nuestra aplicación.

Pero también puede ser necesario eliminar esta configuración del usuario para restaurarlo a los valores por defecto de la aplicación. Para hacer esto hay dos formas posibles dependiendo del tipo de aplicación que tengamos:

Si es una aplicación LightSwitch de tipo escritorio, estas preferencias se encuentra en nuestra carpeta Documentos (Documents) dentro de Microsoft\LightSwitch\Settings\<ApplicationName>.<ApplicationVersion>.<LightSwitchProjectGUID>. Simplemente debemos borrar esta ultima carpeta que se generará de nuevo la siguiente vez que ejecutemos nuestra aplicación con los valores por defecto.

Si la aplicación LightSwitch es de tipo web, las preferencias las guarda Silverlight en su caché que se puede acceder desde el menú de Programas, Microsoft Silverlight. Una vez dentro elegimos la pestaña Almacenamiento para la aplicación y veremos la configuración de todas nuestra aplicaciones de tipo Silverlight incluidas por supuesto las de LightSwitch:


En esta opción debemos pulsar el botón Eliminar... para borrarlo. Si no queremos que se vuelvan a guardar las configuraciones de nuestras aplicaciones, podemos desmarcar la casilla Habilitar almacenamiento para la aplicación que viene en la parte de abajo.


jueves, 16 de agosto de 2012

Disponible Visual Studio 2012



Desde hoy se encuentra disponible para la descarga de subscriptores a MSDN la nueva versión de Visual Studio 2012 que como ya hemos comentado antes en anteriores entradas tiene incluido LightSwitch.

Esta nueva versión incluye una gran variedad de mejoras como un nuevo tema por defecto, más moderno y en linea con el estilo Metro de Microsoft, acceso y publicación de datos en formato OData, integración con Active Directory, nuevos tipos de datos de negocio y muchas cosas más. También están trabajando en un cliente HTML que estará disponible como un complemento para Visual Studio 2012 muy pronto.

Podéis encontrar más detalles sobre este lanzamiento y los recursos disponibles en el blog del equipo de LightSwitch.

jueves, 9 de agosto de 2012

Creación dinámica de nombres de columnas en una rejilla editable

LightSwitch nos da la capacidad de importar datos de numerosas fuentes. Estos datos se pueden mostrar al usuario final en una rejilla editable (grid) por la simple creación de pantallas de tipo rejilla editable.

Los nombres de las columnas de la rejilla se corresponden con los nombres de los campos de la tabla que importamos. Esto funciona para la mayoría de los casos, pero en ciertas situaciones se necesita que estos nombres sean dinámicos. Por ejemplo, considera una aplicación para el Top 5 de coches del año con la base de datos diseñada de la siguiente manera:

CarRating
AttributeName
Car1
Car2
Car3
Car4
Car5
Frenado
Bueno
Muy bueno
Bueno
Bueno
Bueno
Aceleración
Excelente
Malo
Muy bueno
Muy bueno
Bueno
Velocidad
Excelente
Excelente
Muy bueno
Bueno
Malo
Manipulación
Muy bueno
Excelente
Malo
Malo
Bueno
Car
Name
Ranking
BMW
5
Mercedes
4
Porsche
3
Aston Martin
2
Ferrari
1

Ahora queremos mostrar la tabla de clasificación de coches pero en lugar de "Car1", Car2 ", etc..., en nuestros nombres de las columnas queremos leer de la tabla "Car", obtener los 5 mejores coches y sustituir los nombres de las columnas con los nombres que se obtienen de la tabla.

Con el fin de hacer eso, empezaremos con la creación de las 2 tablas anteriores: CarRating y Car. CarRating tendrá campos de tipo cadena llamados AttributeName, Car1, Car2, Car3, Car4 y Car5. La tabla Car tendrá un campo de tipo cadena llamado Name y un campo tipo entero denominado Ranking.

Aquí está la imagen de las tablas tal como se ve en LightSwitch:



A continuación, creamos una pantalla de tipo rejilla para CarRating. Así que haz clic con el boton derecho en el nodo de pantallas desde el Explorador de Soluciones y despues haz clic en Agregar pantalla. Selecciona la plantilla de rejilla editable y selecciona CarRatings como origen de datos y el nombre CarRatingsGridScreen.

Ahora desde el Explorador de Soluciones, haz clic en el CarRatingsGridScreen y selecciona Ver código de pantalla.

Esto te llevará al editor de código. Reemplaza todo el código con lo siguiente (asegúrate de que el nombre de espacio de nombres es coherente con el resto de los archivos de código de usuario):

VB
Imports System.Collections.Generic
Imports System.Linq
Imports Microsoft.LightSwitch
Imports Microsoft.LightSwitch.Presentation
Imports Microsoft.LightSwitch.Presentation.Extensions
Imports System.Windows.Controls
Imports Microsoft.LightSwitch.Threading
Namespace LightSwitchApplication
    Partial Public Class CarRatingsGridScreen

        Private Sub CarRatingsGridScreen_Created()
            AddHandler Me.FindControl("grid").ControlAvailable, AddressOf CarRatingsGrid_ControlAvailable
        End Sub

        Private Sub CarRatingsGrid_ControlAvailable(sender As Object, e As ControlAvailableEventArgs)
            UpdateColumnNames(DirectCast(e.Control, DataGrid))
        End Sub

        Private Sub UpdateColumnNames(carRatingsGrid As DataGrid)
            Me.Details.Dispatcher.BeginInvoke(
                Sub()

                    Dim top5Cars = Me.DataWorkspace.ApplicationData.Cars.OrderBy(Function(car) car.Ranking).Take(5).Execute()

                    Dim carNames As String() = top5Cars.[Select](Function(car) car.Name).ToArray()

                    Dispatchers.Main.BeginInvoke(
                        Sub()
                            Dim rowTemplate As IContentItem = DirectCast(carRatingsGrid.DataContext, IContentItem).ChildItems(0)

                            For index As Integer = 0 To carNames.Length - 1
                                'start with the second column of the grid
                                rowTemplate.ChildItems(index + 1).DisplayName = carNames(index)
                            Next

                        End Sub)

                End Sub)
        End Sub
    End Class
End Namespace

C#
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.LightSwitch;
using Microsoft.LightSwitch.Presentation;
using Microsoft.LightSwitch.Presentation.Extensions;
using System.Windows.Controls;
using Microsoft.LightSwitch.Threading;
namespace LightSwitchApplication
{
    public partial class CarRatingsGridScreen
    {
        partial void CarRatingsGridScreen_Created()
        {
            this.FindControl("grid").ControlAvailable += CarRatingsGrid_ControlAvailable;
        }

        void CarRatingsGrid_ControlAvailable(object sender, ControlAvailableEventArgs e)
        {            
            UpdateColumnNames((DataGrid)e.Control);
        }

        private void UpdateColumnNames(DataGrid carRatingsGrid)
        {
            this.Details.Dispatcher.BeginInvoke(() =>
            {                

                var top5Cars = this.DataWorkspace.ApplicationData.Cars.OrderBy(car => car.Ranking).Take(5).Execute();
                
                string[] carNames = top5Cars.Select(car => car.Name).ToArray();

                Dispatchers.Main.BeginInvoke(() =>
                {
                    IContentItem rowTemplate = ((IContentItem)carRatingsGrid.DataContext).ChildItems[0];
                                        
                    for (int index = 0; index < carNames.Length; index++)
                    {
                        //start with the second column of the grid
                        rowTemplate.ChildItems[index + 1].DisplayName = carNames[index];
                    }
                });
            });
        }
    }
}

En el código anterior, lo primero que estamos haciendo es el registro de controlador de eventos con el evento CarRatingsGrid_ControlAvailable de nuestro DataGrid. Esto está ocurriendo en el método CarRatingsGridScreen_Created.

Cuando la rejilla de datos en la pantalla aparece, nuestro método CarRatingsGrid_ControlAvailable se disparará. Este método tiene un argumento de tipo ControlAvailableEventArgs desde la cual podemos obtener el control real de Silverlight.

A continuación pasamos el control al método UpdateColumnNames desde CarRatingsGrid_ControlAvailable. Dado que el método se ejecuta en el subproceso principal, vamos al hilo lógico para obtener los 5 primeros nombres de coches y almacenarlos en una matriz (no podemos acceder a los datos del DataWorkspace en el hilo principal). Entonces volvemos al hilo principal y establecemos los nombres de columnas en la rejilla.

Ahora bien, para comprobar que funciona, tendremos que agregar unos cuantos registros en la tabla "Car". Así que crearemos una pantalla de rejilla editable para la tabla de coches y añadiremos unos pocos registros. Despues abre una nueva instancia de la CarRatingsGridScreen, debe tener los nombres de las columnas actualizadas.

Aquí está una captura de cómo deben ser las las pantallas en tiempo de ejecución:



A pesar de este post es sobre la configuración de los nombres de las columnas de forma dinámica, se puede extender a cualquier tipo de manipulación del interfaz de usuario. Por ejemplo, podemos obtener un identificador para un control de cuadro de texto en una pantalla y establecer su fondo en amarillo sobre la base de un cálculo, o podemos cambiar el color de la fuente de una celda de la rejilla de datos. El mismo concepto se aplica - obtener un identificador para el control de Silverlight subyacente y cambiar cualquier propiedad que deseemos en el proceso del interfaz de usuario.

Este texto es una traducción de un articulo original del Babar Ismail Dynamically setting column names on an editable grid.


miércoles, 4 de julio de 2012

Cuentos de personalizaciones avanzadas en LightSwitch

El siguiente texto es una traducción de una parte del articulo publicado en el MSDN Magazine por Jan Van der Haegen titulado "Tales of Advanced LightSwitch Client Customizations".

El Mega-Filtro

Voy a ser honesto: mis conocimientos de SQL Server están actualmente un poco oxidados. ¿Quién me puede culpar por recurrir a LightSwitch con su diseñador de consultas visual impresionante que se adapta a todas mis necesidades? Bob, el gerente de una gran cadena de distribución con tiendas en numerosos países, me pidió un software para ayudarle a manejar el back-end de los negocios de la compañía. En concreto, quería una pantalla que le permitiera navegar por los tickets desde diversos puntos.

Esto es lo que me dijo Bob: "Un ticket proviene de una tienda en particular que pertenece a una cadena en particular, que se encuentra en una ciudad o región en particular. Está hecho para un cliente en particular, por un empleado en particular, en una fecha y hora determinada, y que contiene las ventas de unos determinados artículos, abonados con una forma de pago determinada. Sólo en raras ocasiones nuestros empleados están interesados ​​en consultar los tickets y lo hacen únicamente filtrando por la fecha de inicio o el importe total. Pero tenemos algunos casos que filtramos por las categorías que acabo de mencionar. " 

Historias como esta por lo general significan que el cliente no tiene realmente un caso en mente, pero quiere una aplicación haga lo que desea, cuando él quiera. Teniendo en cuenta que el cliente siempre tiene la razón, empecé a pensar en una mega-consulta que pudiera atender las necesidades de Bob.

Yo puedo crear una consulta muy grande en el diseñador de consultas LightSwitch sin mucho esfuerzo, pero he simplificado la consulta requerida porque una versión más realista  no cabría en una sola pantalla y no sería capaz de mostrarle toda la consulta (Figura 1).

Figura 1 - Una consulta avanzada en LightSwitch

La Figura 2 muestra una pantalla generada a partir de la consulta en la Figura 1. En la barra de comandos, hice clic en Agregar pantalla ("Add Screen") y luego seleccioné la pantalla de búsqueda de datos ("Search Data Screen"). De forma predeterminada, LightSwitch crea una pantalla y la abre en modo diseño.

Figura 2 - Pantalla generada desde la consulta de la Figura 1

En tiempo de ejecución, Bob puede ahora buscar tickets con cualquier combinación de los parámetros opcionales que se muestran en la Figura 3: Identificador de tienda, Cliente, Importe (mínimo o máximo), Hora de inicio y Hora de fin.

Figura 3 - Pantalla de búsqueda con los criterios de filtro

Bob probablemente no ha memorizado el identificador de cada tienda, de modo que el campo de búsqueda no es muy útil tal como está. Tiene que ser capaz de seleccionar una tienda por su nombre en lugar de tener que introducir el identificador manualmente.

Al igual que todas las cosas en LightSwitch, estamos a sólo un par de clics para darle a Bob lo que quiere. En el diseñador de pantalla, hice clic en el botón Agregar elemento de datos ("Add Data Item") en la barra de comandos, y después agregué una nueva propiedad local ("Local Property") de tipo Shop (Entity) como se muestra en la Figura 4 .

Figura 4 - Ventana Agregar elemento de datos ("Add Data Item")

Desde el lado izquierdo de la pantalla de diseño, arrastré esta entidad Shop al centro de la pantalla y eliminé el control de identificador de tickets, ya que no sería necesario. Despues puedo cambiar el control que está siendo utilizado por un Combobox ("Auto Complete Box") o un Selector de ventana modal ("Modal Window Picker"), que encaja en nuestra solución particular. La Figura 5 muestra el resultado de estas modificaciones en el árbol visual.

Figura 5 - Enlazando los filtros de la consulta en la pantalla de diseño

Esto se encarga de los controles, pero en la capa ViewModel (en el lado izquierdo de la pantalla de diseño), observe que el parámetro de consulta ShopId sigue vinculado a la propiedad local TicketShopId, que ya no aparece en la pantalla. Para corregir esto, he seleccionado ShopId en el panel de propiedades y cambiado el valor de enlace ("Parameter Binding")  a ShopId, como se puede ver en la Figura 5. La próxima vez que inicie la aplicación, la sección de criterios de filtro tiene un selector de ventana modal (o un combobox si hubiera querido) donde antes estaba el identificador de tienda, como se muestra en la Figura 6.

Figura 6 - Mejora en la pantalla de búsqueda

Cuando se hace clic en ... (puntos suspensivos) a la derecha de la caja de la tienda, se abre una ventana de selección modal como se ve en la Figura 7. Desde ahí, Bob y sus empleados pueden seleccionar la tienda en particular que desean revisar.

Figura 7 - Seleccionar tienda en una ventana modal

Bob quiere tener todas las posibilidades de uso que se le ocurra en una única pantalla (no es algo que recomiendo, porque la creación de una pantalla alrededor de cada proceso de negocio por separado o caso de uso es más efectivo). Eso es lo que Bob quería, sin embargo, para que le sirva de ayuda hay que repetir este proceso para parámetros tales como empleado, cadena, región, forma de pago, cliente, estación de trabajo, artículo, clasificación y otras categorías posibles que puedan surgir.

lunes, 11 de junio de 2012

Cliente HTML para LightSwitch

El equipo de LightSwitch acaba de anunciar en una nota la próxima disponibilidad de un cliente para LightSwitch en HTML5. Esta es una noticia que estaba esperando impacientemente y me ha sorprendido algo aunque ya existían algunos rumores.
Con esta actualización, que estará disponible en las próximas semanas, las aplicaciones realizadas en LightSwitch podrán tener una parte cliente realizada en Silverlight como hasta ahora aprovechando todo su potencial visual y/o un cliente en HTML especialmente indicado para dispositivos móviles.
Este cliente HTML esta diseñado con HTML5 y CSS3 apoyándose en el conocido framework de JQuery Mobile, lo cual permite utilizar la gran cantidad de plugins que existen para él.
Según nos comenta el equipo de LightSwitch, el modulo de HTML vendrá con dos temas definidos por defecto (Dark y Light) en los cuales han estructurado detalladamente con comentarios las hojas de estilos para que puedan ser modificadas y adaptadas por los desarrolladores al gusto de cada uno.

Para ver más, pueden mirar en el blog del equipo de LightSwitch donde se indican más detalles (en inglés).

sábado, 2 de junio de 2012

¿Que hay de nuevo sobre LightSwitch en Visual Studio 2012 RC?

Desde el pasado 31 de Mayo está disponible la nueva versión de Visual Studio 2012 Release Candidate (RC) que como ya hemos comentado trae LightSwitch incorporado. En esta nueva versión preliminar se han incorporado las siguientes mejoras que nos interesan:

Nuevo Shell y Theme por defecto.   En marzo pasado, se publicó una vista previa del Cosmopolitan LightSwitch Shell y Theme en la galería de VS para dar a las aplicaciones LightSwitch una aspecto más moderno y corporativo. Desde entonces se ha realizado diversas mejoras, arreglado errores  visuales y mejorado la legibilidad (por ejemplo, se han agregado líneas en los grid de datos). Este shell será el utilizado por defecto para nuevos proyectos.

Logotipo incluido en la pantalla de inicio de sesión. Se ha añadido el logotipo de la aplicación en la pantalla de inicio de sesión para aplicaciones que utilizan la autenticación de formularios. Se mostrará una vez que se implemente la aplicación.

Rendimiento.   Se ha mejorado el rendimiento de las operaciones de datos básicos, que a su vez mejora muchos escenarios de aplicación (carga de datos, ordenación, paginación, refresco de pantallas, etc.) También se ha mejorado la experiencia en tiempo de diseño - esto significa una carga más rápida de los proyectos, vinculados a las fuentes de datos, la creación de pantallas y tablas, y la construcción de proyectos (F5).

Simplificada la publicación en Azure. Se ha simplificado significativamente el flujo de trabajo requerido para publicar aplicaciones LightSwitch en Azure. Estas mejoras no están en el RC publicado, en su lugar, estará disponible como un add-on. Estén atentos para más información sobre esto próximamente.

viernes, 1 de junio de 2012

Error al ejecutar un proyecto copiado que utiliza XtraReports

     En uno de mis proyecto en LightSwitch utilizo para los informes la extensión XtraReports para LightSwitch del fabricante DevExpress. He de reconocer que está muy bien conseguido aunque todavía le falta algunos detalles para que sea más fácil de usar en LightSwitch.
El problema me surge cuando copio el proyecto desde un equipo a otro distinto. Ambos equipos tienen exactamente la misma configuración en todo pero al ejecutar el proyecto copiado me aparece el siguiente error "No se puede cargar el archivo o ensamblado 'DevExpress.Xpf.Printing.v11.1.Core'":


Como se deduce del mismo el problema está en algún componente del XtraReports. Después de dar muchas vueltas encontré la siguiente solución en el foro oficial de DevExpress. Para arreglarlo hay que seguir los siguientes pasos (si haces click en las imágenes que hay a continuación puedes verlas más grandes):

- Primero seleccionamos el proyecto y con el botón derecho del ratón seleccionamos la opción de Propiedades. Dentro de Propiedades nos vamos a Extensiones y desmarcamos la extensión de DevExpress XtraReports:

- Una vez hecho nos pedirá reiniciar Visual Studio, pero antes de hacerlo realizamos el siguiente paso. En el menú superior del explorador del soluciones cambiamos la vista a modo File View:



- Abrimos el proyecto ClientGenerated y dentro de él buscamos el fichero Config.xml haciendo doble click para editarlo. Borramos todas la lineas que hagan referencia a los componentes de DevExpress:

- Guardamos, reiniciamos Visual Studio y volvermos a cargar el proyecto para que coja los cambios realizados.
- Volvemos a cambiar la vista a Logical View y volvemos a activar la extensión DevExpress XtraReports:

- Cambiamos de nuevo a la vista File View, seleccionamos el proyecto Server, y dentro de References seleccionamos todas las referencias a los componentes DevExpress:

- Marcamos la opción de Copia local a True.
- Hacemos lo mismo en el proyecto ServerGenerated:
- Por último volvemos a generar de nuevo el proyecto con la opción del menú Generar -> Volver a generar solución.

Con todos estos pasos ya podemos ejecutar nuestro proyecto y debe funciona correctamente sin ningún mensaje de error.


viernes, 2 de marzo de 2012

Visual Studio 11 Beta disponible

El pasado día 29 de febrero, dentro de la conferencia de MVPs de Microsoft, se hizo pública entre otras cosas la nueva versión beta de Visual Studio. Ahora mismo tiene en nombre clave Visual Studio 11 pero posiblemente cuando salga al mercado sobre el verano (todavía no hay una fecha oficial) se llamará Visual Studio 2012.

Entre importantes mejoras que podemos encontrar en esta nueva versión está la inclusión de Lighswitch como un tipo de proyecto más al mismo nivel que el resto de tipos de aplicaciones disponibles hasta el momento y no como un producto adicional como esta hasta ahora. Esto demuestra el apoyo por parte de Microsoft del producto Lightswitch y de la tecnología Silverlight en general.
Para los que seguimos los detalles de esta herramienta desde hace tiempo no nos sorprende esta decisión y despeja las dudas sobre la continuidad del producto de ciertos programadores. Además en esta nueva versión se pueden ver grandes mejoras como el soporte para el acceso a datos mediante OData y la inclusión de nuevos tipos de datos.

La descarga de Visual Studio 11 Beta está disponible en la web de Microsoft y es completamente funcional:


El aspecto rebosa el estilo Metro por todas partes:


La instalación de esta versión no afecta a la instalación previa de Visual Studio Lightswitch 2011 y los proyectos se convierten a la nueva versión sin muchos problemas. Aunque como es una beta solo se debe usar para probar ya que puede haber cambios en la versión definitiva.