sábado, 19 de julio de 2014

Botón para reactivar Citas desde la barra de comandos

Una de las cosas que mas me gustan de colaborar en las comunidades de Dynamics CRM, es que cada día aprendo cosas nuevas.

Y cuando digo cada día, es CADA DÍA! hace poco me han comentado que las actividades podrían ser reabiertas, y esto es algo que antiguamente no se podía hacer, pero que en algún momento de las releases, rollups, etc. lo han abierto.

Esta funcionalidad abre un montón de nuevas oportunidades, como por ejemplo que se puedan reabrir actividades desde workflows.

En este caso, lo que voy a hacer es crear un botón en el “Command bar” para reactivar una Cita ya cerrada.

Para esto lo primero que tengo que hacer es añadir el botón en ese menú con el Ribbon Workbench :

image

La configuración del botón sería la siguiente:

image

El comando a llamar sería una función de Javascript llamada “Activar”:

image

La regla de visualización y activación del botón estarán relacionadas al estado del registro, en este caso, solamente se mostrará cuando el registro este desactivado (Completado):

image

Publicamos, y de esta manera ya tenemos un nuevo botón relacionado con Citas completadas (en el formulario).

Por otra parte, tengo un WebResource (new_actividad.js de javascript) con el siguiente código:

function Activar(Id)
{
   var EntityName="appointment";
   var State="3";
   var Status="5";
  
   
    SetStateRequest(EntityName, Id, State, Status);
 
    window.location.reload(true);

}

function SetStateRequest (_entName,_entId,_state, _status) {
    var requestMain = ""
    requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    requestMain += "  <s:Body>";
    requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
    requestMain += "      <request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
    requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>EntityMoniker</c:key>";
    requestMain += "            <c:value i:type=\"a:EntityReference\">";
    requestMain += "              <a:Id>" + _entId + "</a:Id>";
    requestMain += "              <a:LogicalName>" + _entName + "</a:LogicalName>";
    requestMain += "              <a:Name i:nil=\"true\" />";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>State</c:key>";
    requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain += "              <a:Value>" + _state + "</a:Value>";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>Status</c:key>";
    requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain += "              <a:Value>" + _status + "</a:Value>";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "        </a:Parameters>";
    requestMain += "        <a:RequestId i:nil=\"true\" />";
    requestMain += "        <a:RequestName>SetState</a:RequestName>";
    requestMain += "      </request>";
    requestMain += "    </Execute>";
    requestMain += "  </s:Body>";
    requestMain += "</s:Envelope>";
    var req = new XMLHttpRequest();
    req.open("POST", _getServerUrl(), false)
    // Responses will return XML. It isn't possible to return JSON.
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
    var successCallback = null;
    var errorCallback = null;
    req.onreadystatechange = function () { SetStateResponse(req, successCallback, errorCallback); };
    req.send(requestMain);
}

function SetStateResponse   (req, successCallback, errorCallback) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            if (successCallback != null)
            { successCallback(); }
        }
        else {
          
        }
    }
}
function _getServerUrl   () {
    var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
    var serverUrl = "";
    if (typeof GetGlobalContext == "function") {
        var context = GetGlobalContext();
        serverUrl = context.getServerUrl();
    }
    else {
        if (typeof Xrm.Page.context == "object") {
            serverUrl = Xrm.Page.context.getServerUrl();
        }
        else
        { throw new Error("Unable to access the server URL"); }
    }
    if (serverUrl.match(/\/$/)) {
        serverUrl = serverUrl.substring(0, serverUrl.length - 1);
    }
    return serverUrl + OrgServicePath;
}

Publicamos todo, y ahora voy a una Cita Completada:

image

Y haciendo “click” en el botón “Activar”, conseguimos reabrir la Cita:

image

La solución no administrada completa la dejo disponible para la descarga:

jueves, 17 de julio de 2014

Iconos de orígenes de Casos

Una de las nuevas funcionalidades o cambios en Dynamics CRM 2013 con el SP1, es la aparición (la vuelta) de los iconos en las vistas. En realidad no es igual que en versiones anteriores, sino que tienen un aspecto mas funcional ya da mas información acerca de los Casos.

Según el origen del Caso (Teléfono, Email, Web, Facebook, Twitter), no enseña en las vistas una imagen como se muestra en la siguiente tabla:

image

Lo que está buena de esta funcionalidad, es que nos permite además añadirle imágenes adicionales en caso de añadir nuevos valores en este campo (incident_caseorigincode).

Lo que hago entonces es añadir un nuevo valor “Otro” (con valor 100000000):

image

Luego me creo un nuevo icono como WebResource (.PNG) con el nombre “Incident_orgincode_icon100000000.png”. En el nombre se debe introducir en el lugar del “100000000” el número del picklist que se desea relacionar:

image

Luego vamos a los casos, y al primero le selecciono como “Origen” = Otro:

image

y en la vista se ve así:

image

un saludo!

miércoles, 9 de julio de 2014

Proyecto Siena con datos de Dynamics CRM Online

Hola a todos, no se estarán actualizados acerca de lo que voy a hablar hoy, pero es acerca del proyecto Siena.

Este proyecto es una solución de Microsoft, para permitir la creación de Apps en formato Modern UI, sin necesidad de desarrollar. Para mas información e instalarlo ir al store: http://apps.microsoft.com/windows/es-es/app/microsoft-project-siena/5ae47651-e8f3-4e41-aab7-e19ab1b80180

Hoy lo que intentaré mostrar es como utilizar Siena con datos de CRM, que aunque aún no hay conexión directa contra CRM Online, podemos encontrar un “Workaround” utilizando Excel. Es muy sencillo y los resultados desde mi punto de vista son geniales.

En el siguiente ejemplo, voy a mostrar datos de Cuentas de CRM en una app creada con Siena.

Voy a empezar exportando datos de mi CRM Online:

image

Luego abrimos el Excel, seleccionamos los datos y les damos formato de Tabla, ya que para Siena es un requerimiento darle este formato:

image

Luego debemos guardar el Excel como Excel de 2013 en formato xlsx:

image

Luego tenemos que instalarnos Siena, abrirlo:

image

Vamos a DataSources:

image

Desde aquí se pueden seleccionar diferentes orígenes de datos en este caso seleccionamos Excel:

image

Seleccionamos el Excel:

image

Importamos los datos:

image

y así tenemos los datos:

image

Seleccionamos una Galería para añadir:

image

De tipo Text Gallery:

image

Y seleccionamos la tabla anterior como origen de datos de la galería:

image

Finalmente damos al boton derecho, file->Publish:

image

Rellenamos la información para publicar y damos a publicar:

image

Seleccionamos una carpeta, aceptamos y luego estará publicado:

image

image

Entonces, en donde hemos definido la publicación, tenemos esto:

image

También se puede ejecutar un preview dando al boton derecho y ejecutarlo:

image

y así se ve nuestra app:

image

un saludo

viernes, 4 de julio de 2014

Workflows síncronos y Outlook en modo offline

Hola a todos, hoy hablaremos de una de esas funcionalidades que han mejorado considerablemente con CRM 2013. Esta no es otra que la posibilidad de ejecutar Workflows (flujos de trabajo) en tiempo real.

El tema es que no todo en Dynamics CRM es online o síncrono, y el principal ejemplo de esto, es la posibilidad de trabajar con Dynamics CRM de forma desconectada (offline mode).

El otro día se me cruzó por la cabeza que ocurre cuando estoy en modo desconectado desde el Outlook, y lanzo un proceso de estos en tiempo real. Entonces me planteé probarlo y escribir este artículo para compartir mis resultados.

En primer lugar me he creado un Workflow sencillo, síncrono que en las creaciones de cuentas, ponga en el campo “Teléfono” el valoe 666666666 como se muestra a continuación:

SNAGHTML14806b27

Entonces nos vamos a offline desde el Outlook:

image

Vamos a crear una nueva Cuenta y vemos que el workflow síncrono no se ha ejecutado ya que el campo de Teléfono no se ha actualizado:

image

Nos volvemos a conectar con CRM:

image

Y vemos que el workflow se ha ejecutado:

image

COMENTARIOS: Los workflow síncronos, son una maravilla, permiten que nuestros desarrollos necesarios en plugins sean menores, pero a diferencia de los Plugins, solo funcionan en el server side, y en el cliente de Outlook no se disparan cuando esta en offline.

Si queremos comprobar si este workflow en tiempo real se ha disparado desde un sitio u otro, lo que se me ocurre sería en el formulario de la entidad, añadir un campo, donde guardar el resultado de context.client.getClientState() y si es “offline”, entonces evitar que se ejecute nuestro plugin.