martes, 16 de septiembre de 2014

Anuncio de CRM 2015 para el Q4’ 2014

Hola a todos, hoy ha sido un día muy especial para todo el mundo de las comunidades de Dynamics CRM, ya que hoy se ha anunciado de forma oficial la nueva versión de CRM 2015!

Estará disponible a finales de 2014 (Q4 2014) y trae muchísimas sorpresas Winking smile.

Pueden acceder a mas información aquí:

http://www.microsoft.com/en-us/news/press/2014/sep14/09-16crmpr.aspx?WT.mc_id=CIC_TWITTER_Product%20Feature_20140916_%25click_time%25_89008567_MSDynamicsCRM&linkId=9638286

A partir de hoy ya podré publicar artículos comentando nuevas funcionalidades, y son muchas. Para todos aquellos a los que apenas han empezado con CRM 2013, o que ni siquiera han tocado el SP1, pues ahora ya tienen el siguiente.

Seguramente esto no quede aquí y sigan sacando mas y mas cambios mejoras, el equipo de producto no para y están acelerando cada vez mas, así que lo único que nos queda es aliniearnos con ellos y acelerar!

Happy CRMing!

martes, 9 de septiembre de 2014

Utilizando el formulario de Login de la SDK desde Powershell

Esta semana, he comentado como utilizar el control de login desde un desarrollo .NET en C# para reutilizar la conexión y hacer lo que queramos.

Hoy lo que voy a comentar es como utilizarlo desde Powershell. Cada día esta mas de moda el tema de los devops (development/operations) y creo que Powershell es una gran herramienta que une estos dos mundos.

Al final, muchas de las cosas que se hacen en Powershell, no suelen gustar a los desarrolladores porque en suelen tratar temas de sistemas, y a los de sistemas a veces no les gusta porque hay que ponerse a desarrollar. Creo que hay que tirar barreras abajo y encontrar sinergias.

El ejemplo de hoy, es una clara manifestación de lo que comento.

El formulario que hemos visto que viene en la librería Microsoft.Xrm.Tooling.Connector de la SDK, puede ser utilizado también desde Powershell para automatizar procesos con CRM, por ejemplo los despliegues.

Lo primero que hay que hacer es abrir el Powershell con permisos de administrador:

image

Una vez aquí, vamos a la carpeta donde tenemos la SDK\bin y ejecutamos “Set-ExecutionPolicy -ExecutionPolicy RemoteSigned” y confirmamos con la “s”:

image

Luego ejecutamos “.\RegisterXRMTooling.ps1” y luego “Add-PSSnapin Microsoft.Xrm.Tooling.Connector” para añadir el “snapin”:

image

Una vez hecho esto, ya podemos conectarnos con el formulario de conexión ejecutando la instrucción “$CRMConn = Get-CrmConnection –InteractiveMode”:

image

Una vez conectado, la variable “$CRMConn” me devuelve la siguiente información de conexión:

image

Espero, les haya servido de algo, para intentar automatizar despliegues. Hay mas información en este artículo: http://technet.microsoft.com/en-us/library/dn647420.aspx

 

un saludo!

viernes, 5 de septiembre de 2014

Utilizando el formulario de Login del XRM tooling de la SDK

Hola, en este post, os mostraré como utilizar el formulario de Login que viene en la SDK a partir de la version 6.1.xxx como parte de XRM Tooling.

La utilización de estos controles, nos resuelven todo el tema de conexión con Dynamics CRM, pidiendo los datos necesarios para conectarnos.

Para utilizar este control lo primero que hay que hacer es bajarse la última versión de la SDK e instalar los templates que vienen en el fichero: \Templates\CRMSDKTemplates.vsix

Una vez instalado esto, abrimos el Visual Studio y creamos un proyecto de este tipo:

image

Luego añadimos el nuevo elemento de tipo control de login:

image

Luego, si nos aparece el siguiente error, es porque faltaría añadir una referencia (.dll):

image

Añadimos como referencia la dll que falta que viene en la SDK aqui: \Bin\Microsoft.Xrm.Tooling.Ui.Resources.dll y así ya veremos el control en el diseñador:

image

Ahora vamos a probarlo. dame a F5 para depurar y nos aparece el siguiente botón:

image

Hacemos click y nos muestra la ventana de login:

image

Introducimos las credenciales, y luego nos conecta:

image

image

Ahora la pregunta es: ¿y como uso esa conexión?. Para responder a esto primero vamos a ver como se recupera esta conexión y lo podemos ver en el fichero MainWindow.xaml.cs:

image

Para utilizar la conexión realizada y validada, recogemos ctrl.CrmConnectionMgr.CrmSvc, y ya podemos seguir adelante como muestro a continuación:

image

Facil, bonito, útil y a veces totalmente necesario!

abrazo!

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.