Mostrando entradas con la etiqueta Diseño. Mostrar todas las entradas
Mostrando entradas con la etiqueta Diseño. Mostrar todas las entradas

lunes, 6 de abril de 2015

Nuevas opciones con los campos de Fecha en CRM 2015 Update 1

Una de las nuevas funcionalidades que nos ofrece la nueva versión de CRM es la posibilidad de trabajar con campos de tipo fecha que sean independientes a la zona horaria del usuario que la introduce o consulta y la posibilidad de trabajar con campos de tipo fecha de solo fecha (sin horas).

Para entender mejor esto, lo ideal sería explicar como funciona hasta ahora Dynamics CRM en relación con los campos de tipo Fecha/Hora. Hasta ahora, los campos siempre tenían en cuenta la zona horaria del usuario que la introduce. Al introducirse un valor en un campo de fecha hora, este se almacena en la base de datos interna de CRM como en formato UTC, aplicando el desplazamiento horario de la zona horaria del usuario. Al volver a consultar este valor nuevamente ya sea por FilteredViews, SDK, vistas, formularios… Dynamics CRM aplica el desplazamiento horario del usuario nuevamente. Es decir, para los usuarios es transparente el tema de los desplazamientos horarios, simplemente rellenan valores y se los enseña transformados para su zona horaria local.

La zona horaria de los usuarios de define en las opciones personales del usuario:

image

Con esta funcionalidad estándar se disponía por ejemplo de la posibilidad de que si se crea una Cita internacional, cada usuario lo vea en su horario local, lo cual es perfecto.

A pesar de esto, se “perdían” ciertas situaciones de negocio que debían ser tratadas de otras maneras por ejemplo:

  • Si hay un usuario de Argentina introduce una fecha/hora de una reserva de hotel en España por ejemplo a las 10:00, un usuario ubicado España que en entre a consultar esta fecha, vería que la reserva es a las 14:00 porque Dynamics CRM aplica el desplazamiento horario que se le aplica.
  • Si se introducen datos legales de Contactos por ejemplo de sus fecha de Nacimiento, estas fechas en realidad no deberían almacenarse con un horario determinado, ya que solamente tienen una fecha. Si se mantenía esto, podía darse la situación que una persona tenga distintas fechas de nacimiento, al aplicarse los desplazamientos horarios de los diferentes usuarios.

Estos dos son solo dos ejemplos de situaciones que podían darse antes, y que la solución no era sencilla. Muchas veces se ignoran estos problemas en la actualidad simplemente porque todos los usuarios del CRM están en el mismo país o en la misma zona horaria, pero en caso de cambiar las opciones personales, podrían tener problemas. Seguramente si miráis en vuestras implementaciones, si cambiáis la zona horaria del usuario, verías que muchos de los datos de fechas que se introducen, cambian sin tener que hacerlo.

Ok, en la nueva versión de CRM, podemos crear estos tres tipos de campos fecha:

image

  • Local del usuario: es el funcionamiento que se tiene en la acualidad
  • Solo fecha: solo almacena la fecha, sin conversión horaria. En la parte de la hora será siempre 12:00AM
  • Independiente de la zona horaria: se almacena fecha y hora, y todos los usuarios lo verán exactamente igual, sin conversión horaria.

Ahora vamos a ver como funcionan estos 3 campos. Primero me he creado un campo con cada tipo de comportamiento en el formulario de contactos:

image

Introducimos unos valores iguales en los tres campos:

image

Cambiamos la zona horaria del usuario en las opciones personales:

image

y lo que obtengo es lo siguiente:

image

Como se puede ver, el que aplica la hora del usuario, no solo ha cambiado de horario por el desplazamiento, sino que incluso ha cambiado de día!

Mientras tanto, los otros dos, han quedado igual. Este simple ejemplo muestra el potencial de este tipo de comportamientos nuevos en los campos de fecha.

Desde hoy, empezar a pensar que tipo de comportamiento vais a introducir en vuestros campos de tipo fecha, ya que es una decisión que no se puede cambiar después y que tiene muchas consecuencias.

un saludo!

@demian_rasko

martes, 17 de marzo de 2015

Error con Plugin Registration Tool (como solucionarlo)

Una de las cosas mas interesantes de ser un MVP, es la posibilidad de contactar con gente muy diversa y sobre todo tener contacto con el equipo de producto dentro de Microsoft de la tecnología que nos apasiona, en mi caso, Dynamics CRM.

Bien, hoy ha sido uno de esos días en los cuales puede decir que he conseguido una (muy pequeña) contribución para todos los que trabajamos con Dynamics CRM de habla hispana.

Como muchos de ustedes ya sabrán, en la SDK hay una herramienta que se llama Plugin Registration Tool, que sirve para el registro y depuración de Plugins en Dynamics CRM (en online y en onpremise).

Desde la versión 6.1.1, estamos notando los que tenemos equipos en español, que al intentar conectar con un CRM, la herramienta se intenta conectar y luego se queda así totalmente en blanco:

image

Mucho mas no podemos hacer…así que lo único que nos quedaba era utilizar versiones anteriores que si funcionan (la primera para atrás es la 6.1.0. El problema es que si tenemos diferencia de versiones, no podemos instalar el “Profiler” para depurar los Plugins en remoto.

Hasta ahora esto no ha sido un problema para mí y creí que era algo temporal o de mi PC, pero poco a poco me di cuenta que esto le ocurría a mas gente.

Bien, ahora les voy a decir como se soluciona este problema, y parece ser que es algo solamente relacionado con aquellos como yo que tenemos el PC en idioma Español.

Simplemente se debe renombrar la carpeta dentro del PluginRegistrationTool con el nombre “es-es” como muestro a continuación:

image

Con esto, ya lo tendremos resuelto y a correr!

Espero les haya servido para tanto como para mí… un abrazo!

@demian_rasko

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!

lunes, 13 de agosto de 2012

DynamicForm: Resumen de funcionalidades

Hola, creo que ha llegado el momento de hacer un pequeño (y rápido) resumen, de todas las funcionalidades incluidas hasta hoy en nuestra librería.
El objetivo de esta librería no es solamente ofrecer funcionalidades adicionales que CRM 2011 no tiene, sino también ir explicando como lo voy haciendo, para dejar ideas de como añadir funcionalidades en CRM 2011 diferentes.
Como todos saben, la idea principal de la misma, es que mediante un XML ubicado en un WebResource de Dynamics CRM 2011, se puedan definir comportamientos dinámicos dentro del formulario de CRM.
De esta manera, se puede “jugar” con estas funcionalidades sin necesidad de programar nada en javascript, sino que los comportamientos pueden ser administrados mediante la modificación del XML y alguna personalización.
La idea en resumen es como lo siguiente:
image
Las soluciones completas, códigos fuentes y documentaciones las tenemos incluidas en un sitio común y abierto en CodePlex: http://elblogdedynamicscrm.codeplex.com/documentation
A continuación haré un resumen de cada una de las funcionalidades. Para ver mas en profundidad acerca del funcionamiento de cada una, recomiendo revisar los correspondientes artículos publicados anteriormente.
1) Ocultamiento de campos, secciones, pestañas y nivel de requerimiento de campos dinámico dependiendo de una condición del valor de un campo.
En el siguiente XML, se puede definir un campo de condición, y dependiendo del valor seleccionado de mismo, se pueden ocultar o mostrar campos, secciones y pestañas. Además se puede definir el nivel de requerimiento de los campos (obligatorio, recomendado u opcional).
   1: <attributes>
   2:     <attribute name="accountcategorycode" value="1" 
   3:         showattributes="primarycontactid,accountnumber"hideattributes="" 
   4:         showsections="general/address,general/shipping information" 
   5:         hidesections="" showtabs="notes and activities,administration" hidetabs="" 
   6:         setrequiredlevel="required:fax-address1_city,recommended:address1_name"/>
   7:     <attribute name="accountcategorycode" value="2" showattributes="" 
   8:         hideattributes="primarycontactid,accountnumber" showsections="" 
   9:         hidesections="general/address,general/shipping information" 
  10:         showtabs="" hidetabs="notes and activities,administration"
  11:         setrequiredlevel="none:fax-address1_city-address1_name-websiteurl"/>
  12: </attributes>
image

2) Concatenaciones de campos

Con el siguiente XML, se puede definir una “action” en donde se define un campo destino, y varios campos que serán concatenados. Además se puede definir que valor tendrá el string de concatenación.


   1: <action type="concat" destattribute="description" 
   2:     attributestoconcat="address1_name,address1_line1,address1_line2,address1_line3,
   3:     address1_city,address1_postalcode,address1_stateorprovince,address1_country,
   4:     address1_telephone1"
stringseparator=";"/>

image

3) Validaciones de campos según tipos
La idea de esta funcionalidad es que se puedan definir validaciones de campos dependiendo del contenido de negocio que se le quiere dar a determinados campos. Por ejemplo, validar que solo se introduzcan númericos, campos de tipo dirección de correo electrónico, de tipo dirección ip, de tipo URL, etc.
Esto se define con el siguiente XML, que además contempla que los mensajes de error en las validaciones aparezca en la parte superior de formulario:

   1: <validations>
   2:     <validation attributename="accountnumber" type="number" RegEx=""/>
   3:     <validation attributename="address1_name" type="email" RegEx=""/>
   4:     <validation attributename="address2_line1" type="ipaddress" RegEx=""/>
   5:     <validation attributename="address2_line2" type="url" RegEx=""/>
   6: </validations>


 
image



4) Diseño de los campos del formulario

Mediante los siguientes XML lo que se puede hacer es cambiar los colores de fondo de los campos y de los textos.

   1: <action type="backgroundcolor" attributename="description" color="#FFF00F"/>
   2: <action type="backgroundcolor" attributename="address1_line1" color="#FF660F"/>
   3: <action type="backgroundcolor" attributename="address1_line2" color="#33300F"/>
   4: <action type="backgroundcolor" attributename="address1_line3" color="#55500F"/>
   5: <action type="fontcolor" attributename="address1_line2" color="#FFFFFF"/>
   6: <action type="fontcolor" attributename="address1_line3" color="#FFFFFF"/>

 
image


5) Convertir un Lookup en un despegable

La idea de este XML, es que la introducción de un campo de tipo Lookup, pueda ser realizada mediante un desplegable.


   1: <action type="lookuptocombo" attributename="new_paisid" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_pais"/>

image



6) Convertir un Lookup en un selector de tipo Radio

El siguiente XML, convierte un campo de tipo Lookup en un selector de tipo radio.


   1: <action type="lookuptoradio" attributename="new_paisid" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_paisradio"/>
image


7) Introducción de un campo de tipo selector múltiple (checkbox) de una entidad

La idea de esta funcionalidad, es que mediante un selector múltiple (checkboxes), se puedan seleccionar diversos valores provenientes una entidad de CRM.

El XML que define esta funcionalidad es el siguiente:


   1: <action type="multipleselect" attributename="new_paises" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_paismultiple"/>

image


Bueno, esperamos seguir avanzando con mas ideas y mas funcionalidades. Se aceptan sugerencias Guiño


un saludo,

viernes, 3 de diciembre de 2010

Alineaciones de campos numéricos

En su día, publiqué un artículo acerca de como alinear importes en la derecha de las columnas de las vistas utilizando JQuery (http://crmtoall.blogspot.com/2010/03/alineando-importes-la-derecha-en-vistas.html).
Ahora voy a explicar una forma de alineación que se basa en la modificación de las clases propias del CRM, lo cual por supuesto no esta soportado, pero nos permite modificar la forma en que el CRM nos muestra los números.

La forma sería:

Para los grids: modificar el fichero "/_grid/AppGrid.css.aspx" en la clase ‘nobr.num’ y a añadir el texto "text-align: right".

Para los formularios: modificar el fichero “/_forms/controls/controls.css.aspx” la clase 'INPUT.ms-crm-Number' y añadir el valor "text-align: right".

De esta forma, podemos alinear importes hacia la derecha.

un saludo!

miércoles, 21 de abril de 2010

Añadiendo botones en las secciones del formulario

He encontrado en el blog de Adi Katz una funcionalidad muy buena para añadir botones en las secciones del formulario.
La verdad que es muy útil, ya que si bien podemos añadir botones en las vistas y en la parte superior de los formularios a través del ISV.config, no tenemos opcion de añadir botones en el mismo formulario.
Este ejemplo muestra como añadir los mismos, a través de Javascript.
Lo que hay que hacer simplemente es crear un atributo nuevo de tipo texto y añadirlo en el formulario quitándole la etiqueta en el mismo. En mi ejemplo el atributo se llama "new_texto".
Luego hay que añadir este código en el Onload:

function InlineToolbar(containerId)
{
var toolbar = this;
var container = document.all[containerId];

if (!container)
{
return alert("Toolbar Field: " + containerId + " is missing");
}

container.style.display = "none";
container = container.parentElement;

toolbar.AddButton = function(id,text,width,callback,imgSrc)
{
var btn = document.createElement("button");
var btStyle = new StyleBuilder();
btStyle.Add( "font-family" , "Arial" );
btStyle.Add( "font-size" , "12px" );
btStyle.Add( "line-height" , "16px" );
btStyle.Add( "text-align" , "center" );
btStyle.Add( "cursor" , "hand" );
btStyle.Add( "border" , "1px solid #3366CC" );
btStyle.Add( "background-color" , "#CEE7FF" );
btStyle.Add( "background-image" , "url( '/_imgs/btn_rest.gif' )" );
btStyle.Add( "background-repeat" , "repeat-x" );
btStyle.Add( "padding-left" , "5px" );
btStyle.Add( "padding-right" , "5px" );
btStyle.Add( "overflow" , "visible" );
btStyle.Add( "width" , width );

btn.style.cssText = btStyle.ToString();
btn.attachEvent("onclick",callback);
btn.id = id;

if (imgSrc)
{
var img = document.createElement("img");
img.src = imgSrc;
img.style.verticalAlign = "middle";
btn.appendChild(img);
btn.appendChild(document.createTextNode(" "));
var spn = document.createElement("span");
spn.innerText = text;
btn.appendChild(spn);
}
else
{
btn.innerText = text;
}

container.appendChild(btn);
container.appendChild(document.createTextNode(" "));

return btn;
}

toolbar.RemoveButton = function(id)
{
var btn = toolbar.GetButton(id)
if (btn)
{
btn.parentNode.removeChild(btn);
}
}

toolbar.GetButton = function(id)
{
return document.getElementById(id);
}

function StyleBuilder()
{
var cssText = new StringBuilder();
this.Add = function( key , value ){cssText.Append( key ).Append( ":" ).Append( value ).Append( ";" );}
this.ToString = function(){return cssText.ToString();}
}

function StringBuilder()
{
var parts = [];
this.Append = function( text ){parts[ parts.length ] = text;return this;}
this.Reset = function(){parts = [];}
this.ToString = function(){return parts.join( "" );}
}
}

/* Start Script Execution */
function OnCrmPageLoad()
{
window.GeneralToolbar = new InlineToolbar("new_texto");
GeneralToolbar.AddButton("btnActivity","Nueva Actividad","10%",Lookup_Click);
GeneralToolbar.AddButton("btnAddNote","Adjuntar fichero","16px",AddNote_Click,"/_imgs/ico_16_5_d.gif");
}


function Lookup_Click()
{
openStdDlg('/InfoavanCRM/Activities/dlg_create.aspx', window, 350, 350);
}

function AddNote_Click()
{
locAddFileTo(5);
}
OnCrmPageLoad() ;

Y el formulario quedaría finalmente así:

En este caso, le he modificado la funcionalidad para que puedan adjuntar ficheros y añadir directamente actividades.

El post original del que saqué la idea es: http://mscrm4ever.blogspot.com/2009/10/crm-40-creating-inline-toolbar-and.html

Un saludo,

viernes, 5 de marzo de 2010

Ocultando zonas del CRM

En este artículo vamos a "jugar" un poco con el diseño del CRM, con el Javascript.
He utilizado la herramienta de depuración que nos provee el Internet Explorer 8 (apretando F12), que me parece una maravilla ;) y recomiendo su utilización.
Lo que quise hacer es ver como se vería el CRM si le vamos ocultando las diversas zonas.
Obviamente todo esto esta NO SOPORTADO.
La idea es meter una serie de botones en la barra de herramientas del CRM (ToolBar), de esta forma:


Los botones afectan a las siguientes "zonas":


Un ejemplo del CRM sin el menú de navegación:


Pinchando en los botones se van ocultado las zonas, y pinchando de nuevo se vuelven a ver.
Para esto simplemente hay que añadir en el ISV.Config en el "Toolbar" el siguiente código:

<Button Icon="/_imgs/ico_18_debug.gif" JavaScript="if
(parent.document.frames['menuBar'].document.getElementById('tdLogoMastHeadBar').style.display=='none')
parent.document.frames['menuBar'].document.getElementById('tdLogoMastHeadBar').style.display='inline';
else
parent.document.frames['menuBar'].document.getElementById('tdLogoMastHeadBar').style.display='none';">
<Titles>
<Title LCID="3082" Text="Superior"/>
</Titles>
<ToolTips>
<ToolTip LCID="3082" Text="Superior"/>
</ToolTips>
</Button>


<Button Icon="/_imgs/ico_18_debug.gif" JavaScript="if (parent.document.frames['menuBar'].document.getElementById('leftContextTD').style.display=='none')
parent.document.frames['menuBar'].document.getElementById('leftContextTD').style.display='inline';
else
parent.document.frames['menuBar'].document.getElementById('leftContextTD').style.display='none';">
<Titles>
<Title LCID="3082" Text="Título Área"/>
</Titles>
<ToolTips>
<ToolTip LCID="3082" Text="Título Área"/>
</ToolTips>
</Button>

<Button Icon="/_imgs/ico_18_debug.gif" JavaScript="if (parent.document.frames['menuBar'].document.getElementById('tdStageContextBar').style.display=='none')
parent.document.frames['menuBar'].document.getElementById('tdStageContextBar').style.display='inline';
else
parent.document.frames['menuBar'].document.getElementById('tdStageContextBar').style.display='none';">
<Titles>
<Title LCID="3082" Text="Título Sección"/>
</Titles>
<ToolTips>
<ToolTip LCID="3082" Text="Título Sección"/>
</ToolTips>
</Button>


<Button Icon="/_imgs/ico_18_debug.gif" JavaScript="if (parent.document.frames['stageFrameSet'].cols=='190,*')
parent.document.frames['stageFrameSet'].cols='1,*';
else
parent.document.frames['stageFrameSet'].cols='190,*';">
<Titles>
<Title LCID="3082" Text="Menú navegación"/>
</Titles>
<ToolTips>
<ToolTip LCID="3082" Text="Menú navegación"/>
</ToolTips>
</Button>

Un saludo!

miércoles, 9 de diciembre de 2009

Como ocultar la barra de navegación de y botonera del formulario de CRM

Es posible que por temas de espacio o de funcionalidad deban tener que ocultar ciertas partes del formulario de CRM.
A pesar de que es algo NO SOPORTADO, los usuarios por un lado y las limitaciones del CRM a veces nos obligan a hacer este tipo de cosas.
Para ocultar esto les dejo un ejemplo de código que hay que copiar en el OnLoad del formulario de CRM:

if (crmForm.FormType!=1)//en la creación dejo todo visible
{
//Oculta la barra de menu (botonera superior):
document.all.crmMenuBar.style.display="none";

//Oculta la barra de navegacion (menú de la izquierda)
document.body.firstChild.firstChild.firstChild.width=1;
}

Si lo ponemos por ejemplo en el Contacto, el formulario quedaría de la siguiente forma (a que es mas bonito así??) :


Se ve mas como una "Ficha" de Contacto, sin acciones que hacer, solo acceso a la información.

domingo, 29 de noviembre de 2009

Personalizando el Mapa del sitio (SiteMap)

Microsoft dynamics CRM, nos da la posibilidad de personalizar el Mapa del sitio, de forma que podamos dejarlo de forma que mas nos interese para las necesidades de los clientes, y ademas para "facilitar" la vida a los usuarios para que solo puedan ver lo que necesitan, ocultando según sus roles lo innecesario.
Los enlaces aparecen en "Groups" y "SubAreas" como lo siguiente:






Para poder ocultar una "SubArea", primero voy a explicar como funciona la visibilidad de las mismas. En primer lugar hay que tener en cuenta que solo se mostrarán aquellas SubAreas que tenga permiso el usuario según sus roles de seguridad asignados. Si el usuario puede ver esa entidad, entonces el CRM verifica si hay "Privilegios" adicionales relacionados con la SubArea. Estos privilegios adicionales, nos dan la posibilidad de ocultar o mostrar una SubArea dependendiendo de los permisos que tenga el usuario.
Si quisiésemos ocultar por ejemplo las "Cuentas" para que sólo lo puedan ver los Administradores, un ejemplo sería este (solo les aparecerá a aquellos que puedan crear usuarios):





Por otro lado también hay "Areas", como por ejemplo Area de trabajo, Ventas, Marketing, Configuración, etc.
Estas áreas solo aparecerán si hay SubAreas dentro para mostrar. De esta forma, si quiesiésemos ocultar un Área, simplemente lo que tenemos que hacer es ocultar todas las SubAreas de hay dentro.
Muchas veces necesitamos también crear una nueva Área, con una serie de enlaces dentros (por ejemplo aplicaciones propias para hacer consultas al ERP)
Voy a dejar un ejemplo de como sé haría esto:
















(se deben reemplazar los tags "Titl_e" por "Title" y "Are_a" por "Area")

De esta forma, podríamos ocultar todo lo que nos interese y dejar el mapa del sitio totalmente modificado.

Para personalizar el SiteMap, recomiendo utilizar las "Stunnware Tools 4.0" (http://www.stunnware.com/).

un saludo

jueves, 29 de octubre de 2009

Guía de diseño de MSCRM 4.0

Este artículo trata del tema del diseño y de las hojas de estilo del CRM (tipos de letras, tamaños colores, etc).
En la SDK, en la carpeta raiz hay un fichero con el nombre "crm4 ux design guide.pdf" que muestra todo el diseño del CRM, para que podamos hacer nuestros desarrollos con una apariencia lo mas parecido al CRM.
Lo puedes descargar de aqui:
crm4uxdesignguide.pdf



un saludo

jueves, 30 de julio de 2009

Como cambiar el Logo del CRM

He encontrado en el blog de Cesar de la Torre como modificar la imagen de logo que aparece en la parte superior del CRM.

La imagen por defecto es esta:


La mejor forma de reemplazarlo seria simplemente reemplazando la imagen "\_imgs\masthead.jpg".

Esto seria una modificación no soportada, así que cualquier actualización podría "pisarnos" el cambio.