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: