SharePoint Latin Rotating Header Image

January, 2006:

WebCast sobre Visual Studio 2005


Estaré impartiendo unos WebCast a finales de mes y en febrero. Te invito a que compartas conmigo la visión de Microsoft para construir soluciones de información conectadas bajo la plataforma .NET de Microsoft utilizando Visual Studio 2005. Te invito, regístrate y te espero los siguientes días:




  • Estaré impartiendo unos WebCast a finales de mes y en febrero. Te invito a que compartas conmigo la visión de Microsoft para construir soluciones de información conectadas bajo la plataforma .NET de Microsoft utilizando Visual Studio 2005. Te invito, regístrate y te espero los siguientes días:

    • Desarrollo de Aplicaciones Web de punta con Visual Studio 2005 y ASP .net 2.0
      En esta sesión veremos las características principales de ASP .net 2.0 que permiten reducir la complejidad del desarrollo de aplicaciones Web mientras que se incrementa la productividad del desarrollador. MasterPages, Profile, DataSource Controls, Security, Site Navigation, etc. Esta presentación se ofreció durante el lanzamiento de Visual Studio 2005 en el track Developer. Presentado por Haaron González, MVP, MCP MCAD, MCT. 23/01/2006 1:00 P.M (GMT-05:00) Eastern Time Hora oriental (EE.UU. y Canadá)

    • Desarrollo de Clientes Inteligentes con Visual Studio 2005 y Windows Forms 2.0
      En esta sesión veremos las características principales de Windows Forms 2.0 que permiten a los desarrolladores construir aplicaciones conectadas e inteligentes fáciles de instalar, mantener y desarrollar con alto nivel responsivo. Data Source, ClickOnce, ToolStrip Controls, Background Worker Component, etc. Esta presentación se ofreció durante el lanzamiento de Visual Studio 2005 en el track Developer.. Presentado por Haaron González, MVP, MCP MCAD, MCT. 06/02/2006 1:00 P.M. (GMT-05:00) Eastern Time Hora oriental (EE.UU. y Canadá)

    • Administrando el Ciclo de Vida de Desarrollo de Software con Visual Studio 2005 Team System
      En esta sesión veremos cuál es la visión de Microsoft para apoyar a los equipos de desarrollo para mejorar su comunicación y la predicción del éxito de los proyectos de desarrollo a través de herramientas conectadas que integran en una sola fundación las actividades de los múltiples roles involucrados en la producción de una solución de información. Team Architect, Team Tester, Team Developer, Project Management. Presentado por Haaron González, MVP, MCP MCAD, MCT. 13/02/2006 1:00 P.M. (GMT-05:00) Eastern Time Hora oriental (EE.UU. y Canadá)

    • Mejoras del .net Framework 2.0
      En esta sesión veremos las nuevas características del .net Framework 2.0 que mejoran la calidad del desarrollo e incrementan la productividad del programador haciendo mucho más sencillo, eficiente y claro el código de una aplicación. Generics, Anonymous Methods, Partial Classes, My Namespace. Presentado por Haaron González, MVP, MCP MCAD, MCT. 20/02/2006 1:00 P.M. (GMT-05:00) Eastern Time Hora oriental (EE.UU. y Canadá)

Programando Smart Tags en Word con Visual Studio Tools for Office System

El escenario es el siguiente, necesitamos que Word pueda reconocer a través de los Smart Tags todas las claves de nuestros clientes para poder solicitar información adicional del mismo mientras escribimos sobre el documento. Para lograrlo utilizamos Visual Studio Tools for Office System para asociar a nuestro documento la capacidad de leer un servicio web que obtenga la información de los clientes y que además permita programar los Smart Tags.



Realmente es muy sencillo hacer realidad este escenario:



Como ves a traves de los terminos “Terms“ asociados a nuestro documento podemos identificar el valor de la clave de nuestro cliento y asociarle un Smart Tag el cual cuenta con una serie de acciones “Actions“ asociadas que realizar ciertas actividades. Como MessageBox.Show mostrado a continuacion:



El código para hacer realidad esto lo muestro a continuación:


1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4:
5: using Microsoft.Office.Tools.Word;
6:
7: namespace WordDocument1
8: {
9:     class Customer : SmartTag
10:     {
11:        
12:         localhost.Service ws = new WordDocument1.localhost.Service();
13:
14:         public Customer() : base(“http://schemas.microsoft.com/dpe/2005/vsto#PlexITService”, “PlexITService”)
15:         {
16:             System.Data.DataSet ds;
17:             ds = ws.GetCustomers();
18:            
19:            
// asociamos cada CustomerID a la coleccion de terminos que Word
20:
           
// entendera como Smart Tags
21:
            foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
22:             {
23:
24:                 Terms.Add(dr["CustomerID"].ToString());
25:             }
26:
27:             ds.Dispose();
28:
29:            
// Creamos las acciones que pueden suceder para cada termino reconocido
30:
           
// como Smart Tag
31:
            Action CompanyNameAction = new Action(“Show Customer – CompanyName”);
32:             Action ContactNameAction = new Action(“Show Customer – ContactName”);
33:             Action AddressAction = new Action(“Show Customer – Address”);
34:
35:            
// Creamos los manejadores de evento para cada accion
36:
            CompanyNameAction.Click += new ActionClickEventHandler(CompanyNameAction_Click);
37:             ContactNameAction.Click += new ActionClickEventHandler(ContactNameAction_Click);
38:             AddressAction.Click += new ActionClickEventHandler(AddressAction_Click);
39:
40:            
// Asociamos un arreglo de acciones a la coleccion Actions
41:
            Actions = new Action[] { CompanyNameAction, ContactNameAction, AddressAction };
42:         }
43:
44:        
// Manejador de la accion Address
45:
        void AddressAction_Click(object sender, ActionEventArgs e)
46:         {
47:             System.Data.DataSet ds = ws.GetCustomersByID(e.Text);
48:
49:             foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
50:             {
51:
52:                 ShowValues(“Address”, dr);
53:             }
54:             ds.Dispose();
55:         }
56:
57:        
// Manejador de la accion ConctactName
58:
        void ContactNameAction_Click(object sender, ActionEventArgs e)
59:         {
60:             System.Data.DataSet ds = ws.GetCustomersByID(e.Text);
61:
62:             foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
63:             {
64:
65:                 ShowValues(“ContactName”, dr);
66:             }
67:             ds.Dispose();
68:         }
69:
70:        
// Manejador de la accion CompanyName
71:
        void CompanyNameAction_Click(object sender, ActionEventArgs e)
72:         {
73:             System.Data.DataSet ds = ws.GetCustomersByID(e.Text);
74:
75:             foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
76:             {
77:
78:                 ShowValues(“CompanyName”, dr);
79:             }
80:             ds.Dispose();
81:         }
82:
83:        
// Muestra el valor seleccionado
84:
        private void ShowValues(string column, System.Data.DataRow dr)
85:         {
86:                               
87:                 System.Windows.Forms.MessageBox.Show(dr[column].ToString());
88:            
89:         }
90:       
91:     }
92: }


OJO: Este codigo no es para produccion, es solo codigo de demostracion con propositos de mostrar como funciona el programar Smart Tags en Word utilizando Visual Studio Tools for Office System.

InfoPath, SharePoint, Web Services

No se por que, pero últimamente cuando doy platicas sobre la visión que tiene Microsoft respecto a Office System como un cliente inteligente, siempre salen dudas respecto a la arquitectura de este tipo de soluciones. La tendencia y la apuesta de Microsoft en hacer que Office System se convierta en la nueva interfase de usuario para la creación de soluciones de información inteligentes cada vez más se posicionan en la industria, el motivo es porque las herramientas que proveen ofrecen una ventaja competitiva para rápidamente crear soluciones inteligentes.


Seguro has escuchado sobre Windows SharePoint ServicesSharePoint Portal Server y Office System 2003 y que ambos trabajan para habilitar múltiples escenarios de colaboración sin embargo yéndonos a un paso mas adelante, utilizar toda esta plataforma de colaboración para construir soluciones conectadas viene la promesa y la respuesta para solucionar rápidamente de manera productiva y eficaz muchas problemáticas y escenarios que hemos venido enfrentando, por ejemplo, trabajar desconectado, sincronización de datos, fácil implementación, acceso a orígenes datos, etc.



Una posible arquitectura de un cliente inteligente que funciona con la plataforma Office System puede ser la siguiente:



  • Data Entry (entrada de datos): aquí podemos utilizar los productos de la familia Office System como nuestra interfaz de usuario, por ejemplo Word, Excel, Outlook pero sin duda alguna el producto que ha sido diseñado para esta labor es InfoPath. Infopath nos permite generar formularios electrónicos  que cuenten con capacidades de validación y de publicación del contenido capturado. Además de que pueden trabajar desconectado ya que podemos almacenar el formato localmente y seguir capturando información, una vez terminada la captura procedemos a publicar el contenido.
  • Data Processing: Aquí podemos verlo como nuestra plataforma de implantación y despliegue, Windows Server 2003 es un poderoso servidor que ofrece internamente Windows Sharepoint Services el portal de colaboración de Microsoft. Este portal es sin costo y se ejecuta sobre este sistema operativo y permite desplegar fácilmente en una intranet o en Internet formularios InfoPath de tal manera que los usuarios acceden al portal y solicitan el llenado de un formulario, este formulario se llena localmente y cuando se requiere el usuario lo publica ya capturado a este mismo portal.
  • Web Services: Son el mecanismos de interoperabilidad permitiéndonos extraer la información de nuestra bases de datos empresariales y exponer esta misma a todos los cliente que la requieran. XML ves el estándar que permite representar y auto contener información independientemente del proveedor o plataforma de datos utilizada. Además InfoPath cuenta con conectores a servicios Web permitiéndonos publicar nuestro contenido del formulario a un servicio Web y este servicio Web a su vez a una base de datos empresarial.


Un ejemplo practico puede ser:



Los usuarios acceden a Sharepoint Services o a Sharepoint Portal Server para invocar el formulario y empezar a llenarlo localmente, esto quiere decir que puedo grabarlo local y trabajar con el sin tener que estar conectado, para formularios con una compleja captura puede funcionar perfectamente.



Los usuarios solo seleccionan Fill Out This Form y automáticamente se cargara un Formato de Gastos dentro de una instancia local de InfoPath, el usuario procede a llenarla y a grabar la información.



En InfoPath podemos especificar que nuestro formato se publique en multiples lugares, por ejemplo, en este ejemplo este formulario lo publique a un Servicio Web encargado de obtener la información capturada e insertarla en una base de datos. Ademas tambien publique este formulario dentro del Portal Sharepoint y la envie por correo electronico.



El resultado es:


 



Como ven esta arquitectura puede llegar a ser para algunos escenarios de mucha utilidad. Esperando clarificar el concepto de este tipo de soluciones me despido

Programando codigo administrado para formualrios InfoPath

De por si InfoPath cuenta con muchas características que prácticamente no requiere de una sola línea de código para realizar cualquier tipo de funcionalidad común. La fundación de capa lógica de negocio normalmente es nuestro esquema y puede provenir de nuestros Servicios Web XML o desde el esquema de nuestras bases de datos previendo la estructura y algunas reglas de validación que nuestro formularios detecta y refuerza las reglas de negocio expresadas, adicional a esto Infopath permite asociar reglas, caculos, validación de datos y formateo condicional de campos así que prácticamente la necesidad de escribir código es nula.

Pero dicho esto, aquí dejo unas razones para escribir código administrado en formularios InfoPath:

  • Conexiones de datos: Cuando requerimos conectador directamente a algún origen de datos sin tener que utilizar servicios Web.
  • Automatización: Cuando requerimos persistir datos en el cliente para poder soportar totalmente escenarios desconectados. 
  • Task Panes: Cuando queremos apoyarnos con información contextual dentro de nuestro task pane mientras que trabajamos con el formulario. 
  • Encriptación: Cuando trabajamos con datos sensitivos que necesitamos manejarlos con seguridad. 
  • Rastreo y Logeo: Cuando requerimos establecer instrumentación en nuestros formularios. 
  • Validaciones y cálculos avanzados: Cuando necesitamos realizar complejos cálculos financieros o estadísticos

En ocasiones me he encontrado en situaciones así, donde requiero asociar y escribir código administrado para mis formularios InfoPath, afortunadamente con Enterprise Library podemos aprovechar mucha funcionalidad y agregar servicios adicionales para nuestros formularios de Infopath.

Pero en este post quiero platicarte como puedes escribir código administrado que se ejecute sobre el .NET Framework 2.0 para realizar operaciones adicionales en algunos controles de un formulario InfoPath. Primero asumo que cuentas con Visual Studio 2005 y que además tienes instalado Visual Studio Tools for Office System ahora hay que descargar el InfoPath Toolkit for Visual Studio 2005.

Creamos un proyecto de tipo InfoPath y seleccionamos finalizar en el asistente. Visual Studio 2005 y el la plantilla de InfoPath se encargan de crear un formulario en una instancia nueva de InfoPath en tiempo de diseño.

  1. Arrastramos un control TextBox sobre el formulario.
  2. Damos doble clic sobre el control y manipulamos algunas de sus propiedades: 
    • Field Name: customerID
    • Damos clic en el botón Data Validation 
    • Se carga un dialogo llamado Data Validation en donde seleccionaremos un evento OnBeforeChange para este control y damos clic en el botón Edit.
  3. En este momento se carga Visual Studio 2005 y se genera un manejador de evento para este control específico.

Lo que hace es utilizar un atributo para asociar a nuestro elemento “/my:myFields/my:customerID” que se encuentra dentro del esquema de InfoPath a un evento “InfoPathEventType.OnBeforeChange” que será ejecutado en nuestro código administrado. Lo que aremos a continuación es mostrar el valor capturado por el usuario:

[InfoPathEventHandler(MatchPath="/my:myFields/my:customerID", EventType=InfoPathEventType.OnBeforeChange)]
public void customerID_OnBeforeChange(DataDOMEvent e)
{ e.XDocument.UI.Alert(e.Source.text); }

De esta manera podemos leer información capturada en un formulario InfoPath en código administrado .NET.

FileUpload Control

En ASP.NET 1.0/1.1 podíamos subir archivos usando el control HTML FileUpload. Este control utilizaba un elemento de tipo <input type=”file”> en el código HTML de la pagina web para permitirle al usuario final subir un archivo al servidor. Además, teníamos que especificar en la etiqueta <form> el atributo enctype=”multipart/form-data”. En ASP.NET 2.0 tenemos un nuevo control de servidor en el ToolBox llamado FileUpload que facilita el proceso de subir archivos al servidor.


En el aspx agrega esto:


1: <form id=“form1″ runat=“server”>
2:
<div>
3:
<asp:FileUpload ID=“FileUpload1″ runat=“server” /><br />
4:
<asp:Button ID=“Button1″ runat=“server” OnClick=“Button1_Click” Text=“Subir” />
5:
</div>
6:
</form>

En el code behind agrega esto:

1: protected void Button1_Click(object sender, EventArgs e)
2:     {
3:         if (FileUpload1.HasFile == true)
4:         {
5:            
6:                 FileUpload1.SaveAs(“C:\\Temp\\” + FileUpload1.FileName);
7:                 Label1.Text = “Archivo: “ + FileUpload1.PostedFile.FileName;
8:         }        
9:     }

Ya soy un Microsoft Certified Trainer

Hoy por la mañana recibí un correo que he venido esperando el ultimo mes pero que por motivos que aun desconozco el proceso tardo mas tiempo de lo previsto. Ya soy MCT (Microsoft Certified Trainer) sin duda esta semana ha sido de buenas noticias, ayer me informaron que una vez mas seré MVP en este 2006 y hoy al conectarme a Internet el primer correo que recibo es de notificación que he sido aceptado en el programa MCT. En verdad que estoy contento este es uno de los tantos sueños que alguna vez trace para mí y que poco a poco y con mucho trabajo se han ido cristalizando en realidades. A trabajar se ha dicho!!!!

MVP 2006

Agradezco a Microsoft por considerarme valioso y darme el nombramiento MVP una vez más. Desde que recibí este nombramiento puras cosas buenas me han sucedido en lo profesional y también en lo personal. Mientras mas aprendo mas me doy cuenta que menos se, así que, a seguir trabajando y compartiendo.


Aquí dejo unas estadísticas de pláticas, eventos, conferencias y briefings que impartí en el 2005 aquí en México:


Platicas Audiencia
Aproximada
Ciudad Estado
9 845 Mexicali Baja California
9 638 Mexico Distrito Federal
8 430 Monterrey Nuevo Leon
5 55 Tijuana Baja California
1 45 Leon Guanajuato
1 18 Culiacan Sinaloa
1 10 Jalapa Veracruz
Totales
34 2041

 


1000 gracias…

verdaderamente valioso

Special Holiday Episode III: Connecting People, Programs and Devices Using WinFX

PreviousPage en ASP.NET

Una de las actividades que recurrentemente realizamos cuando desarrollamos una aplicación Web utilizando ASP.NET es la de pasar datos entre formulario Web. Cuantas veces no te ha ocurrido que requieres acceder a controles de la forma anterior y en ocasiones utilizamos los objetos Session, Cache, Cookies o el QueryString para persistir los datos entre postbacks o entre múltiples paginas, es muy común este escenario y por esa razón desde la versión 1.1 del .NET Framework ya contabamos con un sencillo mecanismos adicional para referenciar los datos de un formulario anterior en otro actual, solo que no contaba con una implementacion bien definida, era algo asi como un truco con el VIEWSTATE y aspectos de la clase Page. 


 


Pero ahora en  ASP.NET 2.0 han mejorado este tipo de escenario haciendo más elegante su implementación. La clase PreviousPage nos permite acceder a miembros de la clase de la página anterior permitiéndonos entre otras cosas referenciar los valores  y propiedades de los controles. 


 


Aquí te dejo un sencillo ejemplo.


 


En la página inicial colocamos nuestros controles los exponemos como propiedades, ejemplo:


 


1: public partial class _Default : System.Web.UI.Page
2: {
3:
4:     public TextBox pp_Nombre
5:     {
6:         get { return TextBox1; }
7:     }
8:     public TextBox pp_Telefono
9:     {
10: get { return TextBox2; }
11:    
12:     }
13:     protected void Page_Load(object sender, EventArgs e)
14:     {
15:
16:     }
17: }

En la segunda página, justamente en la página donde queremos referenciar los datos de una pagina anterior, agregamos la siguiente directiva:

 

<%@ PreviousPageType VirtualPath=”~/Default.aspx”  %>

 

Esta directiva nos permite especificar que deseamos leer información de la página anterior y a través del atributo VirtualPath especificamos la página anterior, con esto,  ASP.NET se encarga de auto generar de manera tipada los controles de la página anterior en una clase llamada PreviousPage permitiéndonos tener acceso y referenciar los miembros de la clase de la página anterior.

 

En la segunda página solo escribimos el siguiente código para leer nuestros datos:

 

 1: public partial class Default2 : System.Web.UI.Page
 2: {
 3:     protected void Page_Load(object sender, EventArgs e)
 4:     {
 5:         Label1.Text = PreviousPage.pp_Nombre.Text;
 6:         Label2.Text = PreviousPage.pp_Telefono.Text;

 7: 
 8:     }
 9: }

Este fue un pequeno tip para referenciar los datos de nuestra apgina anterior en un formulario actual.