lunes, 24 de noviembre de 2014

Advertencias/Errores Entidad CITAS Microsoft Dynamics CRM 2013

El día de hoy estuve trabajando sobre unos errores específicos con respecto a las Citas en Microsoft Dynamics CRM 2013, éstos errores aparecen como “Leyendas o Advertencias” (los típicos Warnings de Microsoft) en la parte superior de los registros de la entidad “Citas” en el módulo de Actividades de Microsoft Dynamics CRM 2013.

Todos estos errores se pueden corregir, realizando ciertas configuraciones a nivel de usuario y a nivel de sistema. Veamos de que se trata:



El primer error: *Error general del motor de Programación* es así o menos informativo, dado que solo nos menciona un “Error General”. Googleando un poco, Microsoft cuenta con un artículo de KB que explica la razón de este error, el artículo lo podrás consultar aquí(el artículo es para una versión pasada de CRM, pero en general es el mismo caso en MSCRM Dynamics 2013).
A grandes rasgos nos menciona que éste error surge cuando hemos quitado o falta algún componente necesario para programar la cita, en mi caso específico se trata del campo “Razón para el Estado” este campo contiene información acerca de cómo se debe programar las horas de esta cita, si las horas deben marcarse como “Libres, Provisionales o No Disponible”, esto le indicará al motor de programación de CRM si deberá o no “Reservar” las horas que dure cita, para evitar programar mas de una cita al mismo tiempo. Por el contrario, si en el campo “Razón para el Estado” seleccionamos el valor de “Libre”, la cita se programara pero se podrán programar otras citas en el mismo horario. Así como ese valor, pueden faltar por ejemplo la hora de inicio, la hora de fiscalización, o algún otro dato que estemos manipulando con algún desarrollo en JS y sea necesario para la programación de la cita.



Éstos otros errores tiene que ver directamente con la configuración de usuario. Para programar una cita CRM toma en cuenta las horas laborales del usuarios que crea la cita, si el horario en que se programa la cita esta fuera del "Horario Laboral" configurado en las opciones del usuario, se podría presentar alguno de las dos advertencias. Para solucionarlo se puede verificar que el horario laboral del usuario sea el correcto. Navegando en la parte superior derecha dando clic en el Engrane (Configuración)-->Opciones-->Ficha Actividades



De entre todos los casos el más curioso es esta advertencia, tratando de encontrar información en Internet no tuve mucho éxito, verifique que tipo de datos se guardaban en ese campo y dí muchas vueltas, sin embargo el error no es de "Tipo de dato" es mas bien de duración. CRM tiene un apartado donde se configura la duración máxima de una cita definida en días (en mi caso se crean Citas que pueden durar 1 mes o más) entonces debemos configurar que la duración máxima de una cita sea de X días. Para lograrlo debemos ir al módulo "Configuración-->Administración-->Configuración del Sistema-->Ficha Calendario"


jueves, 24 de julio de 2014

Configuración y sincronización con el Cliente Outlook Dynamics CRM 2013

Para realizar la sincronización de CRM con Outlook debemos descargar “Microsoft Dynamics CRM 2013 para Microsoft Office Outlook (cliente de Outlook)” de acuerdo a nuestro equipo en la siguiente liga: http://www.microsoft.com/es-mx/download/details.aspx?id=40344 
  
X86 para versiones de 32 Bits: CRM2013-Client-ESN-i386.exe 
X64 para versiones de 64 Bits: CRM2013-Client-ESN-amd64.exe
  
Así mismo deberemos descargar “Paquete acumulativo de actualizaciones 2 para Microsoft Dynamics CRM 2013 (KB 2919956)“ desde la siguiente liga: http://www.microsoft.com/es- ES/download/details.aspx?id=42272

Los archivos a descargar son:  
X86 para versiones de 32 Bits:  Cliente:  CRM2013-Client-KB2919956-ESN-i386.exe
                                             Lenguaje:  CRM2013-Mui-KB2919956-ESN-i386.exe

X64 para versiones de 64 Bits:  Cliente:  CRM2013-Client-KB2919956-ESN-amd64.exe      
                                             Leguaje:  CRM2013-Mui-KB2919956-ESN-amd64.exe  
*Para cualquier versión se instala primero la actualización del Cliente y al finalizar se solicitara la del Lenguaje.   

Instalación y sincronización. 

Una vez terminada la instalación del Cliente y de sus actualizaciones (cliente y lenguaje) buscaremos el “Asistente de Configuración”*
*El asistente de configuración requiere que Outlook no esté en ejecución. CERRAR EL PROGRAMA ANTES DE INICIAR
  

Una vez abierto el asistente, observaremos la siguiente pantalla. En la URL ingresaremos la URL de nuestro Servidor CRM (On-Premise) o seleccionamos CRM Online y daremos clic en Probar Conexión.  


Si el servidor esta disponible el asistente nos solicitara nuestras credenciales de acceso*, las mismas que utilizamos para ingresar al portal Web de CRM.  
*La nomenclatura es exactamente la misma que en el portal Web de CRM dominio\usuario (CONTOSO\zaidel P.E.)
 
  
Si nuestras credenciales son correctas el “Asistente para configuración” cargara la organización por default y colocara el mismo nombre como “Nombre para mostrar” en el Cliente Outlook, damos clic en Aceptar para que comience la sincronización*. 


Finalizada la sincronización, tendremos la organización lista y relacionada con nuestro cliente Outlook.

NOTA: Para éste procedimiento se considera un entorno con Windows 8, 8.1 y Microsoft Officce Outlook 2013.

martes, 29 de abril de 2014

Windows CMD 'Net use': Como usarlo en equipos remotos.

Escenario


Copiar archivos de un equipo a otro usando un login existente en el equipo remoto.

Net Use


NET USE se utiliza para conectar y usar un recurso compartido en la red, ya sea una ubicacion, una unidad e incluso un dispositivo.

La sintaxis de este comando es la siguiente: 


net use [{devicename | *}] [\\computername\sharename[\volume] [{password |*}]] [/user:[domainname\]username] [/user:[dotteddomainname\]username] [/user:[username@dotteddomainname] [/home {devicename| *} [{password | *}]] [/persistent:{yes | no}] [/smartcard] [/savecred] [/delete] [/help] [/?]

Donde:

\\ComputerName
Nombre del equipo que controla el recurso compartido, si este nombre contiene espacios en blanco, escriba la doble barra diagonal inversa (\\) y el nombre de entre comillas (" "). El nombre del equipo puede contener entre 1 y 15 caracteres.
\ShareName
Nombre de red del recurso compartido.
\volume
Especifica el volumen de NetWare en el servidor. Se debe disponer Servicios Cliente para NetWare (Windows Workstation) o Servicio de Puerta de Enlace para Netware (Windows Server) deben estar instalados y en ejecutandose para conectarse a los servidores NetWare.
password
Contraseña requerida para obtener acceso al recurso compartido. Solicita la contraseña. La contraseña mostrará al escribirla.
/USER
Especifica un nombre de usuario diferente para la conexión.
DomainName
Especifica otro dominio. Si este valor se omite el dominio actual con sesión iniciada.
UserName
Especifica el nombre de usuario con el que se inicia sesión.
/SMARTCARD
Especifica que la conexión debe usar las credenciales una tarjeta inteligente.
/SAVECRED
Especifica que se deben guardar el nombre de usuario y la contraseña. Este modificador se omitirá a menos el comando solicite un nombre de usuario y la contraseña.
/HOME
Conecta un usuario a su directorio principal.
/DELETE
Cancela una conexión de red y quita la conexión lista de conexiones persistentes.
/PERSISTENT
Controla el uso de conexiones de red persistente valor predeterminado es la última configuración
YES
Guarda las conexiones a medida que se establece restaura en el siguiente inicio de sesión.
NO
No guarda la conexión establecida, ni las conexión subsiguientes; las conexiones existentes se restable en el siguiente inicio de sesión. Use el modificador /DELETE para quitar las conexiones persistentes

Ejemplo:

Para conectarnos a una carpeta compartida de un servidor  con la direccion de red *10.10.10.1* que esta dentro del dominio: ATX con usuario Daniel y la contraseña D123456 se ocuparia la siguiente sintaxis

net use z: \\10.10.10.1\*RecursoCompartido*\Fotos D123456 /User:ATX\Daniel

Con este comando "montaremos" la carpeta compartida en 10.10.10.1 en z:
Para finalizar la conexion basta con ejecutar net use

z: \delete

domingo, 23 de febrero de 2014

Vista dinámica en campo LookUp con JavaScript CRM 2011

En Microsoft Dynamics CRM 2011 contamos con varios tipos de campos:
  • Línea de texto única.
  • Conjunto de opciones
  • Dos opciones
  • Imagen
  • Número entero
  • Número de punto flotante
  • Numero decimal
  • Divisa
  • Varias líneas de texto
  • Fecha y hora
  • Búsqueda(Éstos últimos son de nuestro interés en ésta entrada del blog)
Los campos de búsqueda o "LookUp" nos proporcionan el listado de TODOS los registros que contiene una entidad 'B' que éste relacionada con la entidad 'A' en la que hayamos creado el campo Búsqueda. 

Veamos un ejemplo:
Tendremos tres entidades relacionadas, entidad 'A' llamada: Cliente, entidad 'B' llamada: Tienda y entidad 'C' llamada: Zona; ahora bien, nuestro formulario de la entidad 'A' contiene toda la información de nuestro cliente, entre esa información contamos con dos campos LookUp: 'Zona' y 'Tienda', hasta aquí todo suena bien, sin embargo, supongamos que los usuarios de Microsoft Dynamics CRM 2011 capturan la información de 'Zona' y 'Tienda' pero una vez que seleccionan la zona, deben elegir UNA tienda de todas las que se encuentren en la zona seleccionada, pero 'Zona' contiene 50 opciones y 'Tienda' contiene 300 registros. 

Bueno, para lograrlo, podemos hacer uso de las 'Vistas', éstas nos dan la posibilidad de filtrar los registros de una entidad de acuerdo a ciertas condiciones que nosotros podemos definir. Para éste ejemplo: Listar únicamente las 'Tiendas' que pertenezcan a la 'Zona X'.
A partir de ésto parece sencillo deducir que podríamos generar una vista por cada una de nuestras zonas, pero ésto tiene un inconveniente, contamos con 50 Zonas diferentes!, tendríamos que elaborar 50 Vistas diferentes(eso suena tedioso e ineficiente).

Pero contamos con otra alternativa. Aplicar una vista dinámica a un campo Lookup con JS(JavaScript). En el caso específico que planteamos, filtraremos el lookup de 'Tienda' para que se enlisten únicamente las tiendas que pertenezcan a la zona seleccionada en el lookup 'Zona'.

Vayamos a la solución(a partir de ahora todo el código es JS):
Para aplicar una vista dinámica a un campo lookup necesitamos 3 cosas importantes
  • Un criterio de filtrado.
  • Aplicar ese filtro.
  • Mostrar los resultados.
Entonces, para el ejemplo, nuestro "Criterio de filtrado" será el valor de nuestro campo 'Zona', el cual obtendremos con el siguiente código:
var zona = Xrm.Page.getAttribute("new_zona").getValue();

Cabe recordar que al obtener el valor de los campos lookups en Microsoft Dynamics CRM 2011 nos arrojara un objectObject() que manejaremos como un Array. el cual contiene, entre otros atributos, id, name, entityType. Los cuales podremos recuperar con la siguiente notación: 
  1. object().id: contiene el ID único que genera Microsoft Dynamic CRM 2011 para identificar cada registro.
  2. object().name: contiene el valor que se muestra al usuario.
  3. object().entityType: describe la entidad a la que pertenece el registro en cuestión.
Así pues obtendremos:
alert("ID: "+zona.id+" Nombre: "+zona.name+" Entidad: "+zona.entityType);
ID: {25986987-4065-A267-4889-637E6438B4E0} Nombre: Zona A Entidad: new_zona

Ahora, una vez obtenido nuestro criterio de filtrado necesitamos aplicarlo, y como lo dice el título de esta entrada, lo aplicaremos en una "Vista" dinámica con filtro personalizado. Para ello primeramente necesitaremos realizar una "Búsqueda Avanzada" con los criterios de filtrado que necesitamos.

Una vez que estemos seguros de que nuestra "Búsqueda Avanzada" nos arroje los resultados que queremos, descargaremos el FecthXML que se genero con nuestra búsqueda.

Para obtener algo como ésto:

Antes de poder utilizar éste código XML en nuestro JS debemos hacer unas modificaciones.
  • Cambiar las comillas dobles ["] por comillas simples['](MUY IMPORTANTE!)
  • Agregar comilla doble["] al principio y al final de cada linea
  • Agregar un [+] al final de cada línea excepto la última
  • Agregar un [;] al final de la última línea
Quedando algo como ésto:


Llegados a éste punto, tendremos que identificar dos elementos que serán los que nos posibilitaran crear "Vistas" dinámicas para filtrar nuestro campo lookup 'Tienda'. ´Dichos elementos son los atributos uiname y value de la etiqueta condition. El primero contiene el "nombre" que ve el usuario(Zona A) y el segundo contiene el ID({25986987-4065-A267-4889-637E6438B4E0}) para manejo interno que utiliza Microsoft Dynamics CRM 2011, éstos atributos son los que vamos a remplazar con los valores del campo lookup 'Zona', quedando algo como ésto.

Casi hemos terminado, solo falta definir la forma en que nuestros resultados del Fetch se mostraran a nuestros usuarios.

Para finalizar necesitamos 3 características que contienen todas las vistas en Microsoft Dynamics CRM 2011:
var viewId = "{25986987-4065-A267-4889-637E6438B4E0}";
var entityName = "new_tienda";
var viewDisplayName = "Tiendas de la "+zona.name;

El viewId es un identificador único para cada uno de los elementos que conforman el CRM, el formato es siempre el mismo:
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

en nuestro caso es solo un Id de referencia, necesario para que nuestra "Vista" dinámica funcione correctamente, ya que ésta vista nunca se guarda como parte del sistema porque al ser dinámica se crea cada que se llama a la función en el evento OnChange de nuestro campo 'Zona'; el entityType define la entidad (con nombre de sistema) a la que aplicaremos la vista dinámica; viewDisplayName es el nombre que tendrá nuestra "Vista" dinámica.

Para finalizar sólo debemos escribir la siguiente línea para aplicar nuestra "Vista Dinámica" al lookup 'Tienda':
Xrm.Page.getControl("new_tienda").addCustomView(viewId,entityName, viewDisplayName, FetchCML, layoutXML, true);

Si seguimos todos los pasos correctamente obtendremos el siguiente código funcional:

Una vez desarrollado éste código, basta con ejecutarlo cada vez que nuestro lookup 'Zona' cambie de valor (evento OnChange, Al Cambiar) para poder filtrar nuestro lookup 'Tienda', así lograremos que se muestren únicamente los registros que pertenezcan a la Zona seleccionada.

viernes, 21 de febrero de 2014

Informes SSRS CRM 2011 basados en FetchXML

Introducción

Microsoft Dynamics CRM soporta 2 tipos de reportes basados en SSRS (SQL Server Reporting Services)

FilteredViews:

Hasta la versión 4.0 de Dynamics CRM la única forma soportada se basaba en peticiones (Querys) a las vistas filtradas del sistema. (FilteredViews) Cabe mencionar que después de la versión 4.0 de Dynamics CRM se agregó una nueva funcionalidad de seguridad a nivel de base de datos.
Esto significa que para acceder a las vistas filtradas se requiere autenticación basada en credenciales de windows, que este dentro del dominio de la organización, y que tenga permisos de acceso al CRM.
Esta forma de obtención de datos, dependiendo los permisos que el usuario dentro de CRM serán los datos que la vista filtrada retorne.

FetchXML:

Desde la versión 2011 de Dynamics CRM, los CRMs Online y OnPremise comparten una característica de acceso a datos para la realización de reportes:
FetchXML
Recordemos que en Dynamics CRM Online esto sucede debido a que nuestra información se encuentra alojada en la nube de Microsoft. Debido a esto solo tenemos acceso a datos a través de un FetchXML. Caso contrario a un CRM OnPremise donde los datos son alojados en nuestros propios servidores, y podemos acceder a los datos directamente de SQL Server y también usando FetchXML.

¿Por qué usar FetchXML?

Microsoft ha incluido en Dynamics CRM 2011 una variedad de utilidades de extending para que nuestro CRM trabaje exactamente como lo necesitamos, fácilmente.
Una de estas utilidades es el FetchXML.


¿Qué es FetchXML y cómo usarlo para hacer reportes?

FetchXML es propiamente un query basado en el esquema de base de datos de Dynamics CRM, se usa fácilmente modelando el 'Query' de forma gráfica (Si usamos búsquedas avanzadas). Incluso usuarios más avanzados pueden modelar sus propios Querys basados en FetchXML desde código.



Aquí un ejemplo del FetchXML:



Usando FetchXML para generar Reportes en Visual Studio 2008

Pre requisitos:


En este blog, crearemos un ejemplo rápido y básico para demostrar como poder usar FetchXML como origen de datos de nuestro reporte.
Para esto usaré un CRM online (rollout 2013) donde obtendré las cuentas registradas en Dynamics CRM y sus contactos relacionados.


Pasos para generar el reporte:

1.- Obtener FetchXML mediante búsqueda avanzada:

Obtendremos el FetchXML a partir de una vista, para este ejemplo vamos a obtener los Contactos de una cuenta especifica. Simplemente modelamos nuestra búsqueda avanzada, corroboramos que los datos que arroja son los esperados y descargamos el archivo FetchXML.

2.- Nuevo proyecto en Visual Studio

Creamos un nuevo proyecto de Visual Studio de tipo 'Report Server'


Agregamos un reporte:


Agregamos una nueva fuente de datos con estos datos muy IMPORTANTES:
  • URL de conexión a nuestro CRM 
  • Tipo de conexión ( Microsoft Dynamics CRM Fetch)
  • Credenciales de conexión a Dynamics CRM 
Tal como se muestra en el ejemplo:




En este ejemplo usamos un CRM ONLINE, en el caso de OnPremise bastará con introducir los datos con los que acedemos al CRM
Ejemplo: 
  • *dominio*\*usuario*
  • Contraseña
Ahora, ya teniendo nuestra conexión vamos a agregar un nuevo conjunto de datos  (dataSet)


En este paso es importante seleccionar la opción 'Use a dataset embedded in my report' pues aqui es donde usaremos el FetchXML como se muestra en la imagen.


Si nuestra todo en nuestro proceso ha salido bien, ahora podremos ver los datos en nuestro panel, y podemos comenzar a modelar nuestro reporte.
Vale la pena mencionar que podemos agregar tantos dataSets como nos sea necesario. Siguiendo los pasos anteriores.


Ahora solo generamos nuestro reporte:



Y lo ejecutamos:



Ahora los reportes que generemos dependerán de la dificultad o complejidad requerida. Sin embargo esta es una buena herramienta que Microsoft Proporciona para facilitar la generación de reportes de CRM