SharePoint 2010: A vueltas con las vistas móviles de nuevo!

Pues eso, como el tema de acceso móvil en SharePoint 2010 es algo que genera muchas dudas en cuanto al soporte que tiene, he decidido preparar este resumen de referencias y comentarios al respecto:

Otras referencias:

Si en lugar de crear aplicaciones nativas estamos buscando una experiencia web en el dispositivo móvil, tendremos que recurrir a crear nuestra propia vista móvil y detectar cuando se accede a nuestros sitios de SharePoint para qué automáticamente se realice la correspondiente redirección:

El curso para Windows Phone también tiene un apartado al respecto.

Espero haber recogido en esta recopilación todas las posibilidades con respecto al trabajo con SharePoint 2010 desde dispositivos móviles.

Eventos: Disponibles para descarga los materiales del evento sobre SharePoint Foundation!

Ayer por la tarde, y gracias a la comunidad IT Pro de España, tuve la oportunidad de realizar un WebCast en torno a la piedra angular de SharePoint 2010 que no es otro que SharePoint Foundation 2010. Desde aquí quería agradecer tanto a Samuel López la invitación a realizar el WebCast y a todos los asientes al mismo su participación. Aunque Samuel colgará tanto el video como la presentación en el sitio de IT Pro, he aprovechado para subir la ppt y el material de las demos a SUGES…podéis descargaros todo desde este enlace. Además, y al hilo de lo visto, os dejo las referencias para que os descarguéis otras herramientas que se vieron durante la charla:

Finalmente, y como recordatorio, tenéis los foros de MSDN, TechNet y Office 365 para plantear consultas y qué os podamos ayudar tod@s l@s que habitualmente colaboramos en los mismos:

Windows Azure: Otra oferta más…para que no tengas disculpas para no probarlo!

Pues eso, que pocas disculpas le quedan ya a cualquiera para no probar Windows Azure ya que Microsoft acaba de publicar una nueva oferta de uso gratuito durante un año, esta vez para miembros del programa WebSiteSpark orientado a pequeñas empresas cuya actividad gira en torno al desarrollo web. El offering incluye los siguientes elementos (valorados en $1400):

  • 375 hours of a small compute instance
  • 20GB of storage capacity; 1M storage transactions
  • 1GB Web Edition SQL Database
  • 25 GB out (worldwide) CDN; 500,000 CDN transactions
  • And more!

Podéis leer la noticia en el blog del equipo de Windows Azure.

image

SharePoint 2010: Como inventariar componentes en nuestro entorno (III)!

Siguiendo con la serie de artículos sobre posibilidades que tenemos para inventariar componentes de SharePoint que hemos instalado o desplegado en nuestro entorno de SharePoint, en esta ocasión vamos a ver otra posibilidad que tenemos disponible a través del uso del modelo de objetos de SharePoint que por ejemplo nos permite:

  • Enumerar las Features disponibles en un cierto ámbito. Por ejemplo, a nivel de sitio de SharePoint:
   1: using (SPSite spsColeccionSitios= 

   2:     new SPSite("http://demo2010a:100/"))

   3: {

   4:     using (SPWeb spwSite=spsColeccionSitios.OpenWeb())

   5:     {

   6:         //Features

   7:         foreach (SPFeature spfFeature in spwSite.Features)

   8:         {

   9:             Console.WriteLine("DefinitionId - {0} | Definition - {1}",

  10:                 spfFeature.DefinitionId, spfFeature.Definition);

  11:         } 

  12:     }

  13: }

  • La salida por pantalla que se obtiene es la siguiente:

image

 

  • Yendo un poco más allá, para enumerar las soluciones instaladas a nivel de granja basta conque accedamos a la colección de soluciones disponible a partir del objeto SPFarm que representa el nivel más alto en la jerarquía de objetos de SharePoint:
   1: static void FarmSolutionsInventory()

   2: {

   3:     SPSolutionCollection spColeccionSoluciones =

   4:             SPFarm.Local.Solutions;

   5:     Console.WriteLine("There are {0} solutions installed in the farm",

   6:         spColeccionSoluciones.Count);

   7:     foreach (SPSolution spSolucion in spColeccionSoluciones)

   8:     {

   9:         Console.WriteLine(spSolucion.DisplayName);

  10:     }

  11: }

Y hasta aquí llega este tercer artículo sobre como inventariar componentes en un entorno de SharePoint. Finalmente os dejo la referencia a los posts previos de la serie:

Office 365: ¿Se soporta las carpetas públicas en Exchange Online?

Pues la respuesta es qué no, ya que si bien la plataforma base de Exchange Online que es Exchange 2010 si que incluye soporte (opcional) de public folders, su homólogo en Office 365 no. La recomendación pasa por usar SharePoint Online (SPO) como sustitutivo de las carpetas públicas de Exchange. Podéis leer más información al respecto en:

El tablet de Microsoft ya está aquí: Microsoft Surface!

Pues eso, ayer (ya de madrugada en España) Microsoft hizo publico en Los Ángeles el misterioso anuncio que nos tenía a todos intrigados y que no es otro que la llegada del tan esperado tablet bajo la marca de Surface. La verdad es qué el “trasto” tiene una pinta estupenda como podéis ver en el video que Microsoft ha preparado al respecto:

Para conocer algún detalle más sobre el tablet de Microsoft os recomiendo este artículo de Mary-Jo Foley y el sitio oficial. Más fotos aquí.

SharePoint 2010: Como inventariar componentes en nuestro entorno (II)!

Como os comentaba en este artículo, una de las formas que tenemos para inventariar componentes en nuestro entorno de cara a una posible migración de nuestro ambiente de SharePoint es mediante el uso de STSADM y la opción enumallwebs. Si bien esta aproximación es válida para el caso de migraciones desde SharePoint 2007 a 2010, cuando hablamos de actualizar o mover instalaciones de SharePoint 2010 también podemos aprovechar la potencia que nos da Windows PowerShell y en concreto el cmdlet Get-SPWeb que nos permite obtener información similar a la que nos da enumallwebs:

  • Para conocer la sintaxis de uso de Get-SPWeb, ejecutaremos en la consola de administración de SharePoint 2010 Get-Help Get-SPWeb.
  • A partir de aquí, podemos empezar a jugar con Get-SPWeb para comenzar a inventariar artefactos. Por ejemplo, para listar las características disponibles basta con ejecutar la siguiente secuencia de comandos PowerShell:
   1: $SharePointSite=Get-SPWeb –Identity "http://demo2010a:100"

   2: $SharePointSite.Features

  • Por supuesto, la salida de la secuencia anterior se podría volcar en un archivo.
image image image

Y haciendo algo más elaborado, podemos crear un script que enumere todos las colecciones de sitios por cada aplicación web, todos los sitios por cada colección y acceder a la información de inventariado que nos permita tener todo controlado de cara a mover nuestro ambiente de SharePoint de forma exitosa.

CompartiMOSS: El # 12 ya está disponible para descarga!

Pues eso, como han comentado el amigo Gustavo y el amigo Fabián, acaba de ver la luz una nuevo número de CompartiMOSS y ya vamos por el 12 que viene lleno de artículos interesantes…desde aquí agradecer a todos los autores el contenido de calidad que han preparado. Los artículos que forman parte de este número son los siguientes:

  • Editorial
  • Desarrollo de aplicaciones Metro en Windows 8 conectadas a SharePoint (Edin Kapic)
  • Usuarios externos en SharePoint Online en Office 365 (Alberto Diaz Martin)
  • Novedades en Desarrollo para SharePoint Onpremise y Online con Visual Studio 2012 RC (Juan Carlos González Martín )
  • Exposición de un sitio web con autenticación por claims usando ADFS – Parte 2 (Diego Gatti)
  • 10 puntos para entender a Project Server 2010 (Juan Pablo Pussacq Laborde)
  • Entrevista con Vielka Rojas
  • River, el foro avanzado de SharePoint (Luis Máñez)
  • Movimiento de documentos a gestor documental (DMS) desde SharePoint 2010 (Angel Suárez Guisuraga)
  • ALM y SharePoint (I) (David Martos)
  • Introducción a PowerView sobre SharePoint 2010 (Pablo Álvarez Doval)
  • Diseño de Granjas de Servicios: Gobernabilidad de SharePoint para Corporaciones y Naciones (Juan Andrés Valenzuela Jofré )
  • Metadatos Administrados en SharePoint 2010 (Carlos Ariel Dantiags)
  • ControlPoint – Explora, Protege, Analiza y Controla (Tony Carballo)

Se puede descargar desde el sitio de SkunkWorks (http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx) o visite el sitio de CompartiMOSS en Facebook (http://www.facebook.com/group.php?gid=128911147140492). Como siempre, desde la dirección de la revista os invitamos a colaborar en la misma con nuevos artículos en torno a SharePoint y tecnologías y plataformas afines.

SharePoint 2010: ¿Se soporta la integración de Reporting Services con SQL Server Express?

Pues siempre había pensado que la respuesta era que sí, lamentablemente preparando alguna demo para el webcast sobre SharePoint Foundation 2010 de la semana que viene y tras pegarme un par de “leches” configurando la integración de un SQL Server Express + Advanced Services, me puse a investigar los errores infames que me daba la configuración de integración y llegue a esta referencia en la que claramente se afirma que no esta soportado…vaya #fail, y os dejo el bonito error en la página de configuración de los parámetros de integración:

image

SharePoint 2010: Añadiendo propiedades a la Toolpart (IV)!

Siguiendo con la serie de posts sobre como añadir propiedades a la toolpart de configuración de una WebPart, en esta ocasión vamos a ver como añadir estas propiedades a través de la definición de una clase de tipo EditorPart. Pero antes de empezar, os dejo la referencia a los artículos previos de la serie:

El ejemplo que os voy a comentar es relativo a como crear una EditorPart para poder definir propiedades personalizadas que luego se utilicen en una WebPart de tipo visual (para una WebPart de tipo clásico la filosofía es la misma). Lo primero que tenemos que tener claro es que una Editor Part no es más que un control hospedado en una zona de WebParts específica denominada EditorZone, es decir, a todos los efectos es como una WebPart sólo que hereda de la clase base EditorPart. Es esta clase la que proporciona el vínculo  entre la WebPart en cuestión y la EditorPart asociada. Para poder añadir propiedades personalizadas a nuestra WebPart a través de una EditorPart:

  • En primer lugar, en la clase que representa nuestra WebPart tenemos que sobreescribir el método CreateEditorParts() que es el que nos permite devolver una o varias EditorParts que interactúen con nuestra WebPart. Este método devuelve una colección de EditorParts Además, habitualmente se añade una propiedad de tipo WebBrowsableObject que devuelve la instancia de WebPart actual.
   1: public override EditorPartCollection CreateEditorParts()

   2: {

   3:     List<EditorPart> epEditorParts = new List<EditorPart>();

   4:     epEditorParts.Add(new FContactoToolPart());

   5:     return new EditorPartCollection(epEditorParts);

   6: }

   7:  

   8: object IWebEditable.WebBrowsableObject

   9: {

  10:     get { return this; }

  11: }

  • Creamos una clase que herede de EditorPart y en la que configuraremos los elementos que queremos añadir a la Toolpart de nuestra WebPart, es decir, tanto la distribución de las propiedades que formarán parte del la ToolPart, como el tipo de la misma y cualquier otra información adicional:
    • Esta configuraciones las realizaremos en el método CreateChildControls(). Por ejemplo, una parte de implementación tipo sería la siguiente:
   1: /// <summary>

   2: /// Añade los controles de la ToolPart

   3: /// </summary>

   4: protected override void CreateChildControls()

   5: {

   6:     ////******************************************

   7:     ////Tabla

   8:     ////******************************************       

   9:     tblContenedor = new Table();

  10:  

  11:     //Fila para la Url de la Intranet

  12:     tblRow = new TableRow();

  13:  

  14:     //Etiqueta para la Url de la Intranet

  15:     tblCell=new TableCell();

  16:     tblCell.Controls.Add(new LiteralControl("Url de la Intranet"));

  17:     tblRow.Cells.Add(tblCell);

  18:  

  19:     //Caja de texto para la Url de la Intranet

  20:     txtIntranetUrl = new TextBox();

  21:     txtIntranetUrl.ID = "txtIntranetUrl";

  22:     txtIntranetUrl.Text = wpOrigen.IntranetUrl.ToString();

  23:     tblCell = new TableCell();

  24:     tblCell.Controls.Add(txtIntranetUrl);

  25:     tblRow.Cells.Add(tblCell);

  26:  

  27:     //Añadimos la fila a la tabla                    

  28:     tblContenedor.Rows.Add(tblRow);

  29:  

  30:     //Fila para la Url de la Web

  31:     tblRow = new TableRow();

  32:  

  33:     //Etiqueta para la Url de la Web

  34:     tblCell = new TableCell();

  35:     tblCell.Controls.Add(new LiteralControl("Url de la Web"));

  36:     tblRow.Cells.Add(tblCell);

  37:  

  38:     //Caja de texto para la Url de la Web

  39:     txtWebUrl = new TextBox();

  40:     txtWebUrl.ID = "txtWebUrl";

  41:     txtWebUrl.Text = wpOrigen.WebUrl.ToString();

  42:     tblCell = new TableCell();

  43:     tblCell.Controls.Add(txtWebUrl);

  44:     tblRow.Cells.Add(tblCell);

  45:  

  46:     //Añadimos la fila a la tabla

  47:     tblContenedor.Rows.Add(tblRow);

  48:  

  49:     //Añadimos la tabla a la colección de controles

  50:     this.Controls.Add(tblContenedor);  

  51:  

  52:     base.CreateChildControls();

  53: }

    • A continuación lo que se suele hacer es añadir implementaciones de los métodos ApplyChanges() y SyncChanges() que permiten guardar cambios realizados en la WebPart editada o bien cargar datos de configuración de la misma:
   1: /// <summary>

   2: /// Aplica los cambios realizados en la Toolaprt

   3: /// </summary>

   4: /// <returns></returns>

   5: public override bool ApplyChanges()

   6: {

   7:     EnsureChildControls();

   8:     FContactoCIINWP wpOrigen = 

   9:         (FContactoCIINWP)this.WebPartToEdit;

  10:                         

  11:     if (!string.IsNullOrEmpty(Page.Request.Form[txtIntranetUrl.UniqueID]) &&

  12:         !string.IsNullOrEmpty(Page.Request.Form[txtWebUrl.UniqueID]))

  13:         if (txtIntranetUrl.Text!="" && txtWebUrl.Text!="")

  14:         {

  15:             wpOrigen.IntranetUrl = txtIntranetUrl.Text;

  16:             wpOrigen.WebUrl = txtWebUrl.Text;

  17:             return true;

  18:         }

  19:  

  20:     return false;

  21: }

  22:  

  23: /// <summary>

  24: /// Sincroniza los cambios realizados!

  25: /// </summary>

  26: public override void SyncChanges()

  27: {

  28:     EnsureChildControls();

  29:     FContactoCIINWP wpOrigen = (FContactoCIINWP)this.WebPartToEdit;

  30:     txtIntranetUrl.Text = wpOrigen.IntranetUrl.ToString();

  31:     txtWebUrl.Text = wpOrigen.WebUrl.ToString();

  32: }

  • Y con esto y un bizco…digo, el resultado obtenido sería como sigue:

image