[Aviso]: WebCasts del maratón de SharePoint postpuestos…en breve nueva fecha!

Como muchos de los asistentes saben, por problemas técnicos (más bien por un error con las fechas) hemos tenido que postponer los 4 últimos WebCasts de la maratón de ponencias sobre SharePoint 2013 celebrada durante la jornada de ayer…en breve les avisaremos de la nueva fecha y de los horarios para los WebCasts restantes y completar así el círculo de WebCasts. En este post de Fabián Imaz podéis ver el detalle de los WebCasts pendientes de realizar.

Por otro lado, aprovecho para agradecer a ponentes y asistentes su participación en la maratón…en los 9 webcasts realizados hemos tenido una media de entre 40-50 asistentes con picos de casi 70 asistentes…se nota que hay hambre por SharePoint 2013. Todas las presentaciones y los vídeos del maratón los iré dejando en esta carpeta de SUGES para facilitar su descarga.

image

Anuncios

SharePoint 2013: Como habilitar el botón “Contectar con Outlook” en listas y bibliotecas!

Conforme uno va enredando con SharePoint 2013, tiene que buscarle “los tres pies al gato” para conseguir hacer qué ciertas funcionalidades estén disponibles para el usuario. En este caso, os voy a mostrar como habilitar el botón “Conectar con Outlook” en listas y bibliotecas de documentos de un cierto sitio:

  • Por defecto, en todo sitio ese botón está deshabilitado.
  • Para habilitarlo, tendremos que hacer uso del botón adyacente qué permite agregar el sitio actual (si no lo está) como sitio de SharePoint para la integración con Office.
  • A continuación, refrescamos la biblioteca y listo, el botón “Conectar con Outlook” ya aparece habilitado.
image image image
  • Si pulsamos el botón, aparece el diálogo de sincronización de la biblioteca con Outlook. Pulsamos “Aceptar” en el mismo.
  • A continuación, se abre Outlook 2013 dónde tendremos que confirmar que vamos a conectar la biblioteca o lista concreta de SharePoint para ser accedida desde Outlook.
  • Una vez que el proceso de sincronización concluye, veremos la biblioteca sincronizada en Outlook.
image image image

SharePoint 2013: Errores en el despliegue de aplicaciones (I)!

Con este post quiero iniciar una serie de posts relativos a posibles errores que uno se puede encontrar al crear aplicaciones para SharePoint 2013 y proceder a realizar su despliegue. En este caso, el error de marras que me encontré en Visual Studio 2012 (VS 2012) es el que se produjo al desplegar una aplicación de tipo “Hello World” y qué en concreto dice lo siguiente en VS 2012: "Error occurred in deployment step ‘Install app for SharePoint’: The System Account cannot perform this action". Lógicamente, mi primera reacción fue: “qué coj… dice” ya qué en mi entorno de pruebas estoy trabajando normalmente con una cuenta de administración y lógicamente ni por asomo me esperaba este tipo de error. Cómo sabéis, la famosa cuenta del sistema no es más que un literal para la cuenta de administración…pero para el despliegue de aplicaciones hay que tener cuidado el usuario que utilizas qué no puede ser la cuenta del sistema…y más en concreto, no puede ser la cuenta qué hayas utilizado para la instalación de tu ambiente de SharePoint…y ahí es dónde está el error como bien he podido comprobar esta mañana en un entorno diferente en el qué las cuentas de configuración e instalación de SharePoint y componentes asociados no tienen nada qué ver con la cuenta que se use para desarrollar y desplegar aplicaciones.

Por lo tanto, para evitarte este primer error tan bonito ten cuidado en como realizas la instalación de tu ambiente de SharePoint 2013 y procura seguir las recomendaciones y buenas prácticas (vamos no lo hagas con prisas como lo hice yo) en lo que a cuentas para configuración e instalación se refiere: http://technet.microsoft.com/en-us/library/ee662513.aspx.

Finalmente, a modo de disculpa y también para constar algo que estoy viendo con SharePoint 2013, este tema (como muchos otros) de momento no está documentado y hay que buscar mucho por ahí para tener una idea o pista de a qué se debe el problema…en este caso, este post de Kirk Evans arroja algo de luz al respecto:http://blogs.msdn.com/b/kaevans/archive/2012/11/27/creating-high-trust-sharepoint-apps-with-microsoft-office-developer-tools-for-visual-studio-2012-preview-2.aspx

SharePoint 2013: Novedades en Business Connectivity Services (III)!

Siguiendo con la serie de posts sobre las novedades que se incorporan en Business Connectivity Services (BCS) en SharePoint 2013, en esta ocasión vamos a ver como podemos consultar datos de negocio expuestos por BCS a través del modelo de objetos en cliente (novedad para BCS). Pero antes os recuerdo los posts previos de la serie:

Para ver el modelo de objetos en cliente de BCS en acción, necesitamos en primer lugar una lista externa creada a partir del correspondiente Tipo de Contenido Externo (ECT) ya sea con Visual Studio 2012 (VS 2012) o con SharePoint Designer 2013 (SP 2013):

  • En mi caso, dispongo de una lista externa Contactos creada a partir de un sencillo ECT denominado Contacto que cuenta con dos finders: VisualizarContacto y VisualizarContactos.

image

  • En VS 2012 creamos un proyecto de tipo aplicación de consola y añadimos las referencias necesarias para trabajar con el modelo de objetos en cliente de SharePoint 2013 y de BCS: Microsoft.SharePoint, Microsoft.SharePoint.Client.Runtime y Microsoft.BusinessData.
  • Añadimos las siguientes directivas using necesarias para poder utilizar el modelo de objetos en cliente.
   1:  using MO_Cliente = Microsoft.SharePoint.Client;
   2:  using Microsoft.BusinessData.MetadataModel;
   3:  using Microsoft.BusinessData.MetadataModel.Collections;
   4:  using BCS_Runtime= Microsoft.BusinessData.Runtime;
   5:  using Microsoft.BusinessData;
  • Para poder consultar los datos expuestos a través de la entidad Contacto por medio del modelo de objetos en cliente tenemos que realizar lo siguiente:
    • Como siempre, definir una instancia de ClientContext especificando la Url del sitio.
    • A continuación, a partir de un ojeto de tipo Web podremos crear una instancia de la entidad (objeto Entity) utilizando para ello el método GetEntity del objeto Web que recibe el espacio de nombres para el modelo de BDC y el nombre de la entidad.
    • A partir del objeto Entity podemos obtener fácilmente la instancia del sistema de negocio utilizando para ello los objetos LobSystem y LobSystemCollection.
    • A partir del sistema de negocio, ya podemos ejecutar los finders definidos para la entidad y procesar los resultados. Esto lo conseguimos con los objetos FilterCollection y EntityInstanceCollection.
    • Finalmente, procesamos el resultado de la consulta y sacamos por pantalla los datos de cada registro expuesto por Contacto.

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

   1:         static void ConsultarEntidadBCS()
   2:          {
   3:              try
   4:              {
   5:                  using (MO_Cliente.ClientContext ctx =
   6:                      new MO_Cliente.ClientContext(
   7:                          "http://winsrv2012/IT/"))
   8:                  {
   9:                      MO_Cliente.Web wWeb = ctx.Web;
  10:                      ctx.Load(wWeb);
  11:   
  12:                      //Instancia de una entidad del ECT y del sistema de negocio
  13:                      Entity eEntity =
  14:                          ctx.Web.GetEntity(
  15:                          "CRMECT.CRMModel", "Contacto");
  16:                      LobSystem lobSistema = eEntity.GetLobSystem();
  17:   
  18:                      //Colección de instancias de sistemas de negocio
  19:                      LobSystemInstanceCollection lsic =
  20:                          eEntity.GetLobSystem().GetLobSystemInstances();
  21:                      ctx.Load(lsic);
  22:                      ctx.ExecuteQuery();
  23:     
  24:                      //Sistema de negoco concreto
  25:                      LobSystemInstance lobSystemInstance = lsic[0];
  26:                      // Accedemos a la colección de filtros para un cierto "Finder"
  27:                      FilterCollection fCollection = 
  28:                          eEntity.GetFilters("VisualizarContactos");
  29:                      
  30:                      //Acceso a los datos de negocio
  31:                      EntityInstanceCollection eicResultado= 
  32:                          eEntity.FindFiltered(fCollection, 
  33:                          "VisualizarContactos", lobSystemInstance);
  34:                      ctx.Load(eicResultado);
  35:                      ctx.ExecuteQuery();
  36:                      int iContador = 1;
  37:                      foreach (var r in eicResultado)
  38:                      {
  39:                          Console.WriteLine("Registro # {0}", iContador);
  40:                          Console.WriteLine(" -> ID: " + r.FieldValues["IDContacto"]);
  41:                          Console.WriteLine(" -> Nombre: " + r.FieldValues["sNombre"]);
  42:                          Console.WriteLine(" -> Apellidos: " + r.FieldValues["sApellidos"]);
  43:                          Console.WriteLine(" -> Dirección: " + r.FieldValues["sDireccion"]);
  44:                          Console.WriteLine(" -> E-Mail: " + r.FieldValues["sEMail"]);
  45:   
  46:                          iContador = iContador + 1;
  47:                       }
  48:                  }
  49:              }
  50:              catch (Exception ex)
  51:              {
  52:                  Console.WriteLine(
  53:                      "Error: ", ex.Message);
  54:              }
  55:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • La correspondiente salida por pantalla es la siguiente:

image

 

Referencias:

SharePoint 2013: Copia rápida de datos en listas!

Si tenéis la necesidad de copiar registros de forma rápida en una lista partiendo de datos qué se encuentren en una hoja Excel por ejemplo, el proceso es bastante directo:

  • En primer lugar, necesitáis disponer de los datos en origen.
  • A continuación necesitaréis una lista cuya estructura sea idéntica al origen de datos. En este caso fijaros que se trata de una lista qué tiene las mismas columnas que la tabla de datos Excel.
  • Para hacer un simple “Copiar & Pegar” de registros, pulsáis el botón “Edición rápida” de la cinta de forma que se muestra la lista en modo vista de hoja de datos. Copiáis los datos desde el origen y simplemente los pegáis en la lista.
  • Para confirmar la copia de los datos, en la misma cinta pulsáis el botón “Ver” y listo.
image image image

SharePoint Online: Como crear una Custom action para crear un documento en línea (III)!

Siguiendo con la serie de post sobre como crear una custom action para crear documentos en línea con las Office Web Applications en SharePoint Online (SPO), en esta ocasión vamos a ver la aproximación programática. Antes de empezar os recuerdo los posts previos de la serie:

Para añadir una acción a la ribbon de forma programática a una biblioteca en concreto creamos en Visual Studio 11 Beta (VS 11 Beta) un proyecto de tipo SharePoint 2010 Project:

  • Le añadimos una feature al mismo y a continuación un Feature Event Receiver.
  • Codificamos el método FeatureActivated() del manejador para añadir la acción a la ribbon de una biblioteca. Como veis, el truco está en usar la clase SPUserCustomAction y configurarla de forma adecuada.
   1: public override void FeatureActivated(SPFeatureReceiverProperties properties)

   2: {

   3:     SPWeb spwWeb = (SPWeb)properties.Feature.Parent;

   4:     SPList splList = spwWeb.Lists.TryGetList("Docs");

   5:     SPUserCustomAction spucCustomAction = splList.UserCustomActions.Add();            

   6:     spucCustomAction.Location = "CommandUI.Ribbon";            

   7:     spucCustomAction.Title = "CreateWord";

   8:     //Definición del comando

   9:     spucCustomAction.CommandUIExtension =

  10:         @"<CommandUIExtension>

  11:             <CommandUIDefinitions>

  12:                 <CommandUIDefinition Location=""Ribbon.Documents.New.Controls._children"">

  13:                     <Button Id=""CreateWord"" Sequence=""1982"" TemplateAlias=""o1"" Command=""CreateWordCommand"" 

  14:                     Image32by32=""~site/SPOCustomActionResources/WordImage.png"" 

  15:                     CommandType=""General"" LabelText=""Crear Word (2)"" />

  16:                 </CommandUIDefinition>

  17:             </CommandUIDefinitions>

  18:             <CommandUIHandlers>

  19:                 <CommandUIHandler Command =""CreateWordCommand"" 

  20:                     CommandAction=""https://miccantabria.sharepoint.com/sites/DesSPO/_layouts/CreateNewDocument.aspx?id=https://miccantabria.sharepoint.com/sites/DesSPO/template.dotx&amp;SaveLocation=https://miccantabria.sharepoint.com/sites/DesSPO/Documentos%20compartidos&amp;Source=%20https://miccantabria.sharepoint.com/sites/DesSPO/Documentos%20compartidos/Forms/AllItems.aspx&amp;DefaultItemOpen=1;""/>

  21:             </CommandUIHandlers></CommandUIExtension>";

  22:     spucCustomAction.Update();

  23: }

  • Una vez que todo está listo, publicamos la solución en SPO, la activamos y tras activar la correspondiente feature comprobamos que la acción personalizada aparece en la Ribbon.

image

Referencia:

SharePoint Online: Migrando un flujo de trabajo desde un plan E3 a un plan P1 (II)!

Siguiendo con el artículo anterior sobre migración de un flujo por defecto de SharePoint Online desde un plan E3 a un plan P1, en este artículo vamos a ver si dicha migración ha servido para algo o por el contrario nos quedamos con las ganas de poder usar estos flujos en planes P1…de momento adelanto que el resultado obtenido me lo esperaba y luego os cuento el motivo:

  • Lo primero que haremos es asegurarnos en nuestro sitio de SharePoint Online para un plan P1 de que la característica relativa al flujo de trabajo está activada. Para ello, accedemos a la administración del sitio y luego a la administración de características.
  • Cómo se aprecia, la característica no está activada. La activamos.
  • Navegamos a una biblioteca de documentos del sito para añadirle dicho flujo de trabajo.
image image image
  • Como vemos, el flujo de trabajo aparece como disponible para ser utilizado. Realizamos las configuraciones pertinentes y pulsamos “Siguiente”.
  • Y pum, petardazo que lo crió…el problema parece que se da al intentar provisionar el formulario InfoPath de asociación…simplemente SharePoint Online en un plan P1 no es capaz, y como decía al principio esto no me sorprende ya que en principio los servicios de formularios InfoPath no están incluidos entre las características de SharePoint Online en planes P1.
image image

Pues nada, hasta aquí llega este pequeño experimento sobre migrar flujos de trabajo entre planes E y P1 de SharePoint Online.