MSCRM 2011: Contador de registros

12 01 2011

Finalmente ya sabemos cómo modificar el límite máximo (preestablecido en 5000) del contador de registros de las listas. Recordad que en la nueva versión 2011, en la parte inferior izquierda de la vista se muestra el número total de registros. Pues bien existía la limitación a 5000 registros y no sabíamos cómo eliminar este límite. Pues bien, ya sabemos que para modificar este valor máximo debemos modificar en la base de datos MSCRM_CONFIG, en la tabla DeploymentProperties, la entrada TotalRecordCountLimit:





MSCRM 2011: Error de informe, Error al capturar la extensión de datos tras instalar un Language Pack

4 01 2011

Tras instalar el Language Pack de Catalán en un servidor con CRM 2011 RC he intentado acceder al menú de activación del idioma en Configuración/Administración/Idiomas. Al acceder a esta opción me aparece el error Error de Informe. Error al capturar la extensión de datos:

En el visor de eventos de Windows he detectado que cuando se produce este error se crean dos entradas:

A partir de la segunda entrada he intuido que el problema podía venir por algún tema con el Reporting Services y, efectivamente, he comprobado que el servicio SQL Server Reporting Services estaba parado. Tras reiniciar el servicio, he podido acceder sin problema a la configuración del idioma.





MSCRM 2011: Descarga de plantilla para la importación de datos

2 01 2011

Una opción muy interesante de CRM 2011 es la posibilidad de descargar una plantilla por entidad para la importación posterior de datos. Desde la lista de registros de cualquier entidad disponemos de una opción en el ribbon Download Template for Import (sub opción en el botón Import Data).

Esta opción nos descarga un archivo Excel en formato XML (en este ejemplo se descargó el archivo para la entidad Account). El archivo descargado tiene por nombre el nombre de esquema de la entidad. Si mantenemos el nombre del archivo y, por supuesto, el formato de las columnas al introducir datos, el proceso de importación será extremadamente simple como veremos más adelante.

Al abrir el archivo XML en Excel observamos que se ha creado una columna para cada uno de los atributos de la entidad. Asimismo observaremos que al situarnos sobre cualquier columna se nos muestra una descripción del tipo de atributo así como algunas características a tener en cuenta para ese atributo. Por ejemplo, se indica los atributos obligatorios o se recuerda que los lookup deben contener información de la entidad asociada que ya exista en el momento de la importación. Incluso para aquellos atributos de tipo picklist se nos muestra un combo para seleccionar los valores correctos!!!.

Una vez rellenados los valores en las correspondientes columnas de todos los registros a importar (en el ejemplo tan sólo importamos un registro con algunos atributos completados) podemos usar la opción Import Data (subopción del botón Import Data del ribbon). Si mantenemos el nombre y el formato del archivo de plantilla descargado anteriormente, el proceso de importación será extremadamente simple. A continuación mostramos los pasos seguidos en la importación del archivo de ejemplo anterior:

Seleccionamos el archivo a importar (el que se ha modificado a partir de la plantilla descargada):

Nos muestra un resumen del proceso de importación, en este punto podríamos modificar los tipos de campos, las asociaciones… en el caso de mantener el nombre y el formato del archivo descargado el proceso realiza el matching y la asociación a la entidad de forma automática:

Seleccionamos si admitimos duplicado o no y el propietario de los registros importados (sólo para aquellos en los que no se indique en la columna propietario un valor!):

Una vez creado el proceso de importación se muestra un mensaje desde donde podemos acceder automáticamente a la opción Import del Área de Trabajo para ver el estado del proceso de importación iniciado:

Una vez completado el proceso de importación observaremos que el estado pasa a Completed y se muestra el número de registros importados totalmente, parcialmente y los errores:

En nuestro ejemplo, el registro introducido en el archivo Excel (XML) se ha importado correctamente y podemos verlo tanto en la vista de Active accounts como en el formulario de detalle:

Una opción muy interesante para la carga de datos sobre todo en la versión OnLine. En la versión OnLine todas las migraciones de OnPremise a OnLine requerirán una carga de datos (pues no podemos migrar la organización a partir de la base de datos).





MSCRM 2011: Utilizar REST Endpoint desde JScript y JQuery (Google Maps)

2 01 2011

Una de las aportaciones más interesantes a nivel de desarrollo en CRM 2011 es la posibilidad de realizar llamadas REST Endpoint desde JScript. Esta posibilidad permite utilizar de forma muy simple y desde página HTML operaciones CRUD sobre CRM.

A continuación os muestro una aplicación de este sistema de consulta REST en una página que he creado como WebResource. Esta página permite introducir una ciudad y, a partir de este texto, realizar una consulta de las cuentas de esa ciudad y mostrarlas en un mapa Google Maps. Este web resource lo utilizo posteriormente en un Dashboard.

El proceso de creación de este ejemplo ha sido:

1. En primer lugar he creado una nueva página HTML que contiene las llamadas a los webresource que posteriormente comentaré, así como la lógica de introducción de la ciudad, la búsqueda y la representación del mapa con las cuentas de la ciudad introducida. El código de la página creada es:

<html>
<head>
  <title>JScript OData Operations</title>
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <script src="../ClientGlobalContext.js.aspx"></script>
  <script src="Scripts/jquery1.4.1.min.js" type="text/javascript"></script>
  <script src="Scripts/CrmODataJQuery.js" type="text/javascript"></script>
  <script type="text/javascript" src="<a href="http://maps.google.com/maps/api/js?sensor=false">http://maps.google.com/maps/api/js?sensor=false"></script</a>>
  <script type="text/javascript">

    var geocoder;
    var map;

    // Create map
    function ShowMap() {
      // Add Map
      var mapOptions = {
        zoom: 14,
        center: new google.maps.LatLng(-34.397, 150.644),
        mapTypeControl: true,
        mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU },
        navigationControl: true,
        navigationControlOptions: { style: google.maps.NavigationControlStyle.ZOOM_PAN },
        mapTypeId: google.maps.MapTypeId.ROADMAP
      }
      map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
      geocoder = new google.maps.Geocoder();
    }

    //Search CRM records
    function Search() {
      retrieveMultiple("AccountSet", "?$filter=substringof('" + txt_search.value + "', Address1_City)", SearchCompleted, null);
      if (geocoder)
        SetMarker(txt_search.value, txt_search.value, false);
    }

    //Callback - Search Success
    function SearchCompleted(data, textStatus, XmlHttpRequest) {
      // Locate address with Geocoder
      if (geocoder) {
        //Plot CRM Accounts on the map
        if (data && data.length > 0) {
          for (var i = 0; i < data.length; i++) {
            var searchAddress = data[i].Address1_Line1 + ", " + data[i].Address1_City;
            SetMarker(searchAddress, data[i].Name, true);
          }
        }
      }
    }

    // Add marker and center map
    function SetMarker(address, name, showmarker) {
      geocoder.geocode({ 'address': address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var pos = results[0].geometry.location;
          map.setCenter(results[0].geometry.location);
          // Add Marker
          if (showmarker) {
            var marker = new google.maps.Marker({
              map: map,
              position: results[0].geometry.location,
              title: name
            });
          }
        }
        else {
          alert("Geocode was not successful for the following reason: " + status);
        }
      });
    }
  </script>
  <style type="text/css">
    html
    {
      height: 100%;
    }
    body
    {
      height: 100%;
      margin: 0px;
      padding: 0px;
    }
    #map_canvas
    {
      height: 100%;
    }
  </style>
</head>
<body onload="ShowMap(); Search();">
  <table style="width: 100%; height: 100%;">
    <tr>
      <td>
        <div style="height: 20px">
          <input id="txt_search" type="text" value="Barcelona" />
          <input id="btn_search" type="button" value="Buscar" onclick="Search();" />
        </div>
      </td>
    </tr>
    <tr style="height: 100%; width: 100%">
      <td><div id="map_canvas"></div></td>
    </tr>
  </table>
</body>
</html>

2. He creado un WebResource con la página creada en el punto anterior. El nombre del webresource lo he iniciado con un / para poder referenciar los scripts que a continuación comento

3. He creado un WebResource para los scripts de ejemplo que podéis encontrar en el SDK de CRM 2011 (y que son los encargados de realizar propiamente las llamadas JScript y JQuery). En concreto los scripts creados son Scripts/CrmODataJQuery.js y Scripts/jquery1.4.1.min.js

4. Finalmente, he añadido el nuevo webresource en un nuevo Dashboard titulado Resumen de cuentas por ciudad

Por supuesto este ejemplo se puede adaptar a vuestras necesidades (visualización de cuentas, contactos, leads… por cualquier otro atributo). Como he indicado en otros artículos en que utilizamos Google Maps, las posibilidades de visualización de información són muy amplias. En este ejemplo tan sólo hemos mostrado la ubicación de las cuentas con un pin, al situarsse sobre el pin se muestra el nombre de la cuenta.





MSCRM 2011: Google Maps WebResource

1 01 2011

A continuación os describo como implementar un webresource de tipo HTML en CRM 2011 que aprovecha el API de Google Maps para mostrar, por ejemplo, la ubicación de una cuenta en el formulario de detalle de cuenta. Por supuesto este ejemplo puede servir para crear nuevos webresource con el API de Goggle Maps para otras entidades o incluso para otras funcionalidades.

En otros artículos del blog había mostrado como utilizar el API de Google Maps para mostrar una ubicación de una cuenta en MSCRM 4.0. Con la aparición de los webresource en CRM 2011 y en concreto, los de tipo HTML, hemos creído oportuno convertir las viejas utilidades de MSCRM 4.0 en webresource de CRM 2011. En este ejemplo se utiliza (a diferencia del ejemplo que publicamos para MSCRM 4.0) la versión 3 del API de Google Maps (anteriormente usábamos la versión 2). Una de las mejoras que aporta esta nueva versión del API de Google Maps es el hecho de no necesitar una clave para cada servidor en el que utilicemos nuestra página. Sin embargo, sigue teniendo el problema que no podemos utilizar el API en entornos SSL (HTTPS) con lo que, en el caso de querer publicar páginas que utilicen el API en CRM 2011 OnLine (publicado en HTTPS) deberíamos disponer de una licencia de Google Maps (opción de pago).

Encontrareis toda la información necesaria sobre el API de Google Maps en http://code.google.com/intl/es/apis/maps/documentation/javascript/.

Para implementar el visualizador de la ubicación de una cuenta mediante un webresource de tipo HTML que utiliza el API de Google Maps debemos proceder del siguiente modo:

1. Creamos una página HTML con el visor de mapas. Esta página HTML recupera la información de la cuenta en la que ubicaremos el webresource. Como podéis imaginar esta parte podeis adaptarla a vuestras necesidades (atributos, entidad asociada…). El código de la página HTML es:

<html>
<head>
<title>Visualizador de mapas</title>
<script src="ClientGlobalContext.js.aspx"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
var geocoder;
var map;

function ShowMap() {
// Get data from Account form
var address = parent.document.getElementById("address1_line1").value + ", " + parent.document.getElementById("address1_city").value;
var name = parent.document.getElementById("name").value;

// Add Map
var mapOptions = {
zoom: 16,
mapTypeControl: true,
mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU },
navigationControl: true,
navigationControlOptions: { style: google.maps.NavigationControlStyle.ZOOM_PAN },
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

// Locate address with Geocoder
geocoder = new google.maps.Geocoder();
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var pos = results[0].geometry.location;
map.setCenter(results[0].geometry.location);

// Add Marker
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
var contentString = "<p style='font-family: Calibri; font-size: 12px;'><B>" + name + "</B><BR>" + address + "</p>";
var infowindow = new google.maps.InfoWindow({ content: contentString });
infowindow.open(map, marker);

// Add panorama window
var panoramaOptions = {
position: pos,
navigationControl: false,
pov: {
heading: 34,
pitch: 10,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(document.getElementById("map_pano"), panoramaOptions);
map.setStreetView(panorama);
}
else {
alert("Geocode was not successful for the following reason: " + status);
}
});
}
}
</script>
</head>
<body style="border-width: 0px; padding: 0px; margin: 0px" onload="ShowMap();">
<table style="width: 100%; height: 100%;">
<tr>
<td style="width: 75%; height: 100%;">
<div id="map_canvas" style="width: 100%; height: 100%">
</div>
</td>
<td style="width: 25%; height: 100%;">
<div id="map_pano" style="width: 100%; height: 100%">
</div>
</td>
</tr>
</table>
</body>
</html>

2. Creamos un nuevo webresource en una solución de CRM 2011. Debemos darle un nombre y una descripción al webresource. Seleccionar el tipo de webresource HTML y adjuntar el archivo HTML creado en el paso anterior (en este ejemplo, ShowMap2011_v3.html)

3. Añadimos el webresource a un formulario de la entidad Account

4. Al introducir los atributos Nombre de cuenta, Calle 1 y Ciudad y guardar, el sistema mostrará la ubicación de la cuenta en el nuevo webresource

Como comentaba al principio del artículo, el API de Google Maps no se puede usar (en formato gratuito) en entornos HTTPS por tanto, si utilizáis este webresource en CRM 2011 OnLine al acceder a una cuenta se mostrará una alerta de seguridad como esta:

En entornos OnPremise sin SSL este problema no aparecerá.