SharePoint Latin Rotating Header Image

Visual Studio 2008

Programando con Listas en Windows SharePoint Services 3.0

Aquí un entrenamiento que di hace muchos años para una empresa en la que trabajé como líder de practica de colaboración. Básicamente preparé esta presentación para mostrar a programadores como manejar listas y elementos de forma programática a fin de introducirlos al mundo de la programación SharePoint.


Durante una revisión a un respaldo me encontré con los archivos fuente de este WebCast y decidí compilarlo como video para subirlo a mi canal de Youtube. Si por alguna razón sigues dando soporte a plataforma SharePoint 2007 (MOSS o WSS 3.0) en temas de programación este video sin duda es una referencia que te permitirá entender los fundamentos de programación de listas en SharePoint.


Además, creo que los temas aquí mencionados también aplican para SharePoint 2010 J



Oportunidad de Negocio

Si usted tiene la necesidad de dar una solución basada en tecnología para resolver algún problema de negocio y requiere de un especialista técnico capaz de hacer su visión realidad, entonces le pido que descargue y llene el siguiente cuestionario inicial de oportunidad y lo haga llegar a haarongo@prodigy.net.mx con la finalidad de revisarlo, evaluarlo y potencialmente producir una propuesta de solución. Gracias!



Inspirado por el artículo Peter Bright sobre WinRT

microsoft-_net-framework-4

 

En mi caso todo empezó con MS-DOS 3.0 pero esa es otra historia. Yo tomé el barco de Microsoft desde 1997, como programador inicié con Visual Basic 5, tuve la oportunidad de utilizar la suite de Office 97 y experimentar lo que fue OLE 2.0, ya como programador Visual Basic 6 construí aplicaciones profesionales que hacían uso de componentes COM construidos por mí y también tuve la oportunidad de compartir con PowerBuilder funcionalidad gracias a COM. El primer libro de programación que compré fue Developing COM/ActiveX Components With Visual Basic 6 de Dan Appleman. Ya durante los cursos oficiales de Visual Basic 6 pude conocer lo que fue Distributed COM (DCOM) y Microsoft Transaction Server (MTS).  A la par HTML y lo que Microsoft llamó DHTML también eran parte de las técnicas de programación que tuve que aprender y dominar, en particular ASP y VBScript fueron para mí una gran oportunidad profesional, en la universidad pude construir aplicaciones web para procesos escolares, así que mí experiencia en ASP mejoró mucho. Después de durar un tiempo construyendo aplicaciones Windows y Web tanto para empresas como para los últimos semestres de pronto escuchamos del Beta de .NET en MSDN, un buen amigo mío lo descargó no sé de dónde y pudimos ver en primer instancia lo que significó el nuevo modelo e acceso a datos, la evolución de DAO por ADO y de ADO a ADO.NET. Recuerdo que el simple el hecho de tener DataSets y DataTables con respecto a Recordsets fue increíble. La posibilidad de trabajar Offline y usar DataSet.WriteXml() para llevarnos los datos en XML y poder trabajar fuera de línea nos dio una y refrescante alternativa. El poder serializar objetos para persistirlos también fue algo emocionante. Tratar de asimilar los tipos de datos por valor y por referencia también fue retador. El 13 de Febrero de 2002 se liberó Visual Studio .NET 2002 en San Francisco, CA donde Bill Gates presidio el lanzamiento y dejó ver la visión que ha venido empujando a Microsoft desde ya hace mucho tiempo "La información disponible a cualquier hora, en cualquier lugar y desde cualquier dispositivo". En ese lanzamiento Grady Booch tuvo una participación durante una demostración justamente hablando de modelado y de ahí conocí el mundo de UML, Design Patterns, etc. También a Tim Huckaby fue parte del Iron Developer contest con quien después tuve la oportunidad de trabajar aquí y algunos otros Speakers en especial a Ari Bixhorn y Chris de DPE de Microsoft. Increíble el lanzamiento y dejó ver todo una nueva visión. En aquel entonces los recursos de capacitación disponibles eran pocos, el .NET Show con Robert Hess y Erica Wiechers, LearVisualStudio.NET con Bob Tabor que después lo hicieron MVP, también me fascinó el concepto del programa VBTV Cheap Show de Chris and Ari donde de una manera muy cómica y relajada dieron a conocer Visual Basic .NET. Tuve la oportunidad de hacer un proyecto en ASP.NET usando Visual Studio .NET 2003 para un evento nacional de la universidad, ahí fue mi primer presentación técnica ante ejecutivos y director nacional de la institución, toda una experiencia nueva pero tan familiar a la vez. Estuve trabajando por un tiempo como programador ASP y de pronto llegó la oportunidad para ser programador .NET de una empresa de software para gobierno importante en mi ciudad. Inicie con Visual Studio .NET 2003 creando aplicaciones ASP.NET 1.1. En ese entonces surge Pattern & Practices y pude conocer el podcast de .NET Rocks de Carl Franklin. Los blogs empezaron a ser más populares. Trabaje bastante con Visual Studio .NET 2003, recibí el nombramiento MVP en el 2004, tome el riesgo y me fui a la ciudad de México a trabajar como instructor y conferencista, surgió Visual Studio 2005 y tuve la oportunidad de participar en el lanzamiento del producto dando platica de ASP.NET 2.0 y conociendo a personas con las sigo frecuentando y que también son MVPs. Lo que más me llamó la atención en aquel entonces fue el modelo proveedor de ASP.NET para soportar la extensibilidad y la implementación de mecanismos muy interesantes para fortalecer la integración. Una vez más Visual Studio 2005 y .NET Framework 2.0 introdujeron muchas mejoras para los programadores en especial el modelo proveedor y sin duda el uso de Generics como parte del modelo de programación y en el caso de Windows Forms el Clickonce Deployment, de hecho .NET Framework 2.0 fue la base de otras versiones de .NET Framework, básicamente se han ido apilando nueva funcionalidad. A mediados entre 2005 y 2008 Microsoft busca unificar los paradigmas de desarrollo y crea WCF, WF, WPF y CardSpace como parte del .NET Framework 3.0. Cabe mencionar que SharePoint 2007 fue construido sobre .NET Framework 2.0 y 3.0. Un cambio radical de nuevo en el modelo de programación y en la forma de construir soluciones conectadas, visualmente atractivas y procesos de negocio. En el 2008 se liberó Visual Studio 2008 con el .NET Framework 3.5 donde por fin LINQ pudo florecer y posicionarse como la respuesta para abstraer el lenguaje que normalmente usamos para manipular una base de datos. LINQ nos dio la posibilidad de seguir usando el lenguaje de programación que conocemos para expresar de forma unificada consultas a bases de datos, colecciones de objetos, archivos XML y cualquier otra fuente de datos para la cual existiera un proveedor, adicional fue la base de Entity Framework como el ORM de Microsoft. Sin duda .NET Data Services (la implementación RESTFull) fue otro nuevo y refrescante enfoque para facilitarnos la construcción de aplicaciones conectadas. También .NET Framework 3.5 y Visual Studio 2008 han sido críticos para la evolución de la plataforma .NET ya que se introdujo de forma muy básica la posibilidad del paralelismo y la noción de facilitarnos la escritura de programas capaces tomar ventaja de los diferentes procesadores y núcleos que el hardware tiene. Se introdujo extensiones para trabajar con patrones como MVC y MVVM para web como para cliente. Ya en la versión .NET Framework 4.0 y Visual Studio 2010 florecieron los patrones con nuevas plantillas de proyecto, pudimos tener integrado en el lenguaje una serie de clases para facilitarnos la escritora y uso de aplicaciones paralelas y asíncronas. Y sin duda Visual Studio fue re construido ofreciendo una UI basada en WPF con un bonche de mejoras para depuración, visualización de código, documentación, análisis, diagramas etc. Visual Studio 2012 también ya fue liberado y sus características a la par del sistema operativo han venido a revolucionar la forma en que construimos aplicaciones así como también el ecosistema para distribuirlas.

Todo este texto ha sido inspirado por un artículo que leí hace un par de días y que quiero recomendar ampliamente para aquel programador avanzado y principiante. Este artículo se llama "Turning to the past to power Windows’ future: An in-depth look at WinRT" y da una explicación del pasado para entender mejor el presente y sin duda el futuro. Si realmente estas interesado en el mundo Microsoft tienes que leerlo.

Usando los controles de SharePoint en WebParts

Sin duda, con el poder viene la responsabilidad. En pasados días publiqué un post acerca de cómo utilizar los controles de ASP.NET y toda su experiencia gloria dentro de WebParts de SharePoint. Sin embargo, al utilizar esta estrategia un conjunto de consideraciones subsecuentes deberán ser contempladas como hacer uso de los mismos controles SharePoint dentro de estos WebParts.


En ese sentido, debido a que sin problema alguno puedo utilizar el GridView y/o cualquier control ASP.NET al principio suena atractiva la posibilidad pero como siempre la realidad se asoma y nos muestra al que un día fue novedoso control Calendar de ASP.NET y con todo el debido respeto, hoy no es la mejor opción para la captura de una fecha dentro de una forma en SharePoint, al menos la mejor opción es usar el mismo control que se usa en SharePoint, ¿estás de acuerdo?


Vamos a nuestro Web User Control y registramos los controles web de SharePoint. Estos son los controles mejorados que SharePoint internamente utiliza en su capa de presentación.


image


Después dentro de nuestro código Markup agregamos el control SharePoint que requerimos:


image


Lo interesante es que tenemos una gama de controles de SharePoint disponibles.


image


A continuación dentro del código hacemos referencia al control de SharePoint para poder adjuntar algún evento o leer su valor.


image


Y el resultado es:


image


Estos controles cuentan con validaciones, propiedades y eventos que podemos utilizar a nuestro favor. Créditos a Luis Edmundo Teos por el reto y escenario.


Suerte!

Programación ASP.NET en WebParts de SharePoint

Si eres un de desarrollador ASP.NET que se está iniciando en desarrollo SharePoint este ejemplo puede ser de utilidad. Básicamente, usaremos un enfoque de desarrollo de WebParts basado en el uso de Web User Controls de ASP.NET 2.0.

Antes que nada utilizaremos las siguientes herramientas:

Dentro de nuestro servidor de desarrollo SharePoint cargamos Visual Studio 2008 y elegimos la creación de un proyecto SharePoint en blanco, este proyecto lo nombraremos ASPNETWebPart.

clip_image002

Especificaremos que el nivel de confianza de esta solución SharePoint sea Full Trust y la razón es que usaremos un método Page.LoadControl que requiere de permisos elevados para ejecutarse, me parece que la razón es porque este método lee de la ruta de archivos SharePoint “12 hive” y para ello requiere que el proceso w3wpg.exe solicite los permisos necesarios.

clip_image004

Usando la solución generada por Visual Studio 2008 dentro del Solution Explorer agregamos un nuevo Empty Web Site de ASP.NET llamado ASPNETWebPArtsWebSite ubicándolo en la misma carpeta creada por nuestro proyecto anterior.

clip_image006

Dentro de nuestro proyecto ASPNETWebPartWebSite agregamos un Web User Control llamado ASPNETWebUserControl y es muy importante que no deseleccionemos el cuadro de verificación Place Code in separate file.

clip_image008

Esto nos crea un simple archivo con extensión .ascx dentro de nuestro proyecto ASP.NET. A estas alturas podremos realizar cualquier funcionalidad ASP.NET. Solo hay que asegurarnos de no generar dependencias a otras carpetas como App_Code, tratemos de generar todo el código y funcionalidad sobre el Web User Control. En mi caso usare las características de vinculación de controles de ASP.NET para crear el más humilde de los GridView de ASP.NET. Podemos crear una página Defaullt.aspx para probar el funcionamiento del mismo. A continuación agregare un cuadro de texto , un botón y un label.

clip_image010

El resultado es un código Markup que podría tener sin duda código C#. En la sección de Script runat=”Server” estarían los eventos disparados por los controles de nuestro Web User Control. Solo que para propósitos de este ejemplo quiero hacer que los eventos sean disparados desde un WebPart de SharePoint y no necesariamente desde aquí.

A continuación en nuestro proyecto SharePoint agregamos un elemento de tipo Template, el cual nos creara un archivo dentro de la ruta interna de archivos de SharePoint o más conocida como 12 hive “C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\”.

clip_image012

Eliminamos el archivo generado TemplateFile.txt y agregamos la carpeta CONTROLTEMPLATES y dentro la carpeta ASPNETWebParts. Esto permite incluir en nuesdttro paquete de deployment generado por nuestro proyecto SharePoint una nueva carpeta que será aprovisionada de forma confiable en la ruta 12 hive de cada Web Front End de la granja SharePoint. Agregara una nueva carpeta llamada ASPNETWebParts. Dentro de esta carpeta agregaremos como elemento existente nuestro archivo .ascx. El resultado es algo asi:

clip_image014

Ya casi terminamos, a continuación agregamos el código de un WebPart de SharePoint que nos permitirá cargar en tiempo de ejecución el .ascx recién desarrollado. Dentro de nuestro proyecto ASPNETWebPart damos clic derecho y agregamos un nuevo elemento de tipo Web Part bajo el nombre ASPNETWebPart. En realidad puede ser cualquier nombre.

clip_image016

Abrimos el código de nuestro WebPart y agregaremos lo siguiente:

  1. Una variable miembro de tipo UserControl, esta se utilizara como un placeholder de todo el ASPNETWebUserControl.ascx.
  2. Sobre escribimos el método Render para escribir en el flujo de salida de nuestro WebPart el contenido del WebUserControl.
  3. Múltiples variables miembro que representan cada uno de los controles que existen en nuestro archivo ASPNETWebUserControl.ascx
  4. En el evento CreateChaldControls hacemos una instancia de UserControl mediante Page.LoadControl y de cada uno de los controles;

Básicamente podremos tener el control de la funcionalidad desde el WebPart y esto facilita el hacer uso del modelo de objetos de SharePoint para leer datos de otras listas o hacer querys que podamos usar para después presentarlos en el Web User Control.

using System;

using System.Runtime.InteropServices;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Serialization;

using Microsoft.SharePoint;

using Microsoft.SharePoint.WebControls;

using Microsoft.SharePoint.WebPartPages;

namespace ASPNETWebPart

{

[Guid("7625d718-fb33-4bbc-b05f-2f1ff0dd4a88")]

public class ASPNETWebPart : System.Web.UI.WebControls.WebParts.WebPart

{

public ASPNETWebPart()

{

this.ExportMode = WebPartExportMode.All;

}

protected override void Render(HtmlTextWriter writer)

{

this.ascxControl.RenderControl(writer);

}

UserControl ascxControl;

Button button1;

TextBox textbox1;

Label label1;

GridView gridView1;

protected override void CreateChildControls()

{

base.CreateChildControls();

ascxControl = (UserControl)Page.LoadControl(@"/_controltemplates/ASPNETWebParts/ASPNETWebUserControl.ascx");

button1 = (Button)this.ascxControl.FindControl("Button1");

textbox1 = (TextBox)this.ascxControl.FindControl("TextBox1");

label1 = (Label)this.ascxControl.FindControl("Label1");

gridView1 = (GridView)this.ascxControl.FindControl("GridView1");

button1.Click += new EventHandler(button1_Click);

this.Controls.Add(ascxControl);

}

void button1_Click(object sender, EventArgs e)

{

label1.Text = textbox1.Text;

}

}

}

El resultado:

clip_image018

Manipulación programática de archivos de Microsoft Project *.mpp con .NET

Si por alguna extraña razón cósmica en este mundo ultra moderno de la programación de software bajo plataforma .NET  te encuentras con la necesidad de manipular programáticamente archivos de Microsoft Office te recomiendo uses el proyecto open source MPXJ.

La biblioteca MPXJ permite la lectura y escritura de diversos formatos de archivo de Microsoft Project usando un API en .NET o Java.  Estas API ofrecen clases que representan los componentes de un archivo de Project como Tareas, Recursos, Calendario, Asignaciones, etc. Y los métodos para poder acceder, operar y manipular dichos objetos.

Estoy seguro que este modelo de objetos te permitirá darte una idea de cómo inter operar con Project desde tus aplicativos. En mi caso, con la ayuda de @juankaram “que en definitiva fue estratégica su intervención”, tuvimos que integrar en SharePoint un WebPart lector de archivos de Project.

El resultado:

landetrabajo

Como leer datos de nuestros formularios InfoPath programaticamente

Cuando trabajamos con formularios InfoPath y estos los tenemos que leer programáticamente desde un flujo de trabajo construido con Visual Studio  y hospedado sobre SharePoint tenemos múltiples alternativas para manipularlos.

Alternativa 1: Usar una clase Stream y XmlDocument

SPFile file = workflowProperties.Item.File;
if (file.Exists)
{

                Stream binFile = file.OpenBinaryStream();

                XmlDocument doc = new XmlDocument();
                doc.Load(binFile);

                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-06-18T06:49:06");

                this.info = doc.SelectSingleNode("/my:misCampos/my:solicitudNumber", nsmgr).InnerText;

                binFile.Dispose();


}


Esta alternativa nos da acceso a la información mediante un XmlDocument. Se tiene que conocer el esquema y mediante rutas XPath accedemos a sus miembros. Ademas hay que realizar la conversión de tipos de forma explicita.



Alternativa 2: Usar un serializador y deserializador



Debido a que nuestros formularios InfoPath hacen uso del estándar XML utilizamos el comando xsd del .NET Framework nos permite leer el esquema y generar el código de una clase que sirve como enlace entre el archivo XML y un objeto .NET instanciado. Para poder implementar esta técnica debemos de obtener el xsd de nuestro InfoPath, para lograrlo debemos de guardarlo y utilizar la opción de extraer los archivos del InfoPath “extract form files” ubicada en el menú “File”. Esto nos guarda en una carpeta los archivos que constituyen nuestro InfoPath, entre ellos myschema.xsd.



clip_image002



Después desde nuestra consola de comandos de Visual Studio invocamos la instrucción:



clip_image004



Y con esto tenemos toda una clase “myschema.cs” que representa el esquema de nuestro InfoPath. Esta clase hay que agregarla al Visual Studio en nuestro proyecto y ahora si mediante serializacion podemos transformar un archivo InfoPath a un objeto instanciado. El siguiente codigo muestra como obtener una instancia de la clase que representa la forma de iniciacion de un flujo de trabajo. este codigo puede ir dentro de nuestra actividad OnWorkflowActivated



XmlSerializer serializer = new XmlSerializer(typeof(myFields));
XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(workflowProperties.InitiationData));
myFields initForm = (myFields)serializer.Deserialize(reader);


Nos apoyamos de los siguientes metodos concretos:



 private myFields DeserializeFormData(string xmlString)
        {
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(myFields));
                myFields data = (myFields)serializer.Deserialize(stream);
                return data;
            }
        }

        private string SerializeFormData(ModificationForm form)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(myFields));
                serializer.Serialize(stream, form);
                return Encoding.UTF8.GetString(stream.GetBuffer());
            }
        }


Esta alternativa resulta interesante ya que el xsd genera la clase que realizar las transformaciones de datos complejos, esto quiere decir que en caso de utilizar el Contact Selector dentro de nuestro formulario el xsd lo soporta y nos genera las propiedades correspondientes para manejar una estructura de este tipo haciéndonos la vida mucho más fácil a la hora de leer tipos de datos persona. El unico problema es que en caso de cambiar algun campo dentro de nuestro InfoPath hay que de neuvo generar la clase correspondiente al esquema e importarlo de nuevo a nuestro proyecto.



Alternativa 3: Usar la clase Form



Cuando utilizamos flujos de trabajo hospedados sobre Office SharePoint Server 2007 podemos hacer la referencia a la clase Forms. Esta clase cuenta con métodos auxiliares que nos facilitan la transformación y manejo de datos entre otros. Tenemos por ahí el método XmlToHastable que nos regresa una coleccion de tipo HastTable donde el índice representa cada campo de nuestro formulario InfoPath.



Hashtable formData = Form.XmlToHashtable(workflowProperties.AssociationData);


aprobadores = Contact.ToContacts((string)formData["aprobadores"], workflowProperties.Web);
dias = (string)formData["dias"];


Bien pues estas son algunas de las alternativas disponibles para la manipulación programática de formularios InfoPath bajo contexto de ejecución hospedado sobre SharePoint.

Code de Webcast de Flujo de Trabajo con InfoPath

Damas y caballeros aquí les dejo el proyecto de código de Visual Studio 2008 que generé durante el WebCast de Construccion de Flujos de Trabajo con Formularios InfoPath 2007. Espero les sirva y muchas gracias por haberme seguido todos hasta el final.

Saludos.

Invitación a eventos en línea sobre desarrollo SharePoint en Mayo del 2009

clip_image002

Estimados lectores interesados en el desarrollo SharePoint, durante el próximo mes de mayo del presente año estaré presentando una serie de charlas sobre SharePoint y tengo el gusto de invitarle a presenciar de manera virtual esta seria de conferencias virtuales “webcast” a través de los eventos en línea de Microsoft Latam.

Queda usted cordialmente invitado a las siguientes charlas:

Sin más por el momento espero poder contar con su amable presencia.

Estaremos transmitiendo en vivo la plática de la comunidad Tijuana.NET

tijuana

 

La plática que estaré dando hoy 25 de marzo para la comunidad de Tijuana.NET la podrás presenciar remotamente en línea vía live meeting. Para poder ver  requerás instalar el Cliente de Livemeeting 2007 y despues acceder a la charla Introducción de Productos y Tecnología SharePoint para Desarrolladores .NET

Lo que veremos es:

Que puede hacer por mi SharePoint, como empezar a desarrollar en SharePoint, arquitectura de WSS, arquitectura de MOSS, beneficios de SharePoint para programadores .NET, personalizando con SharePoint Designer 2007 y personalizando con Visual Studio 2008.

Te esperamos!