domingo, 28 de marzo de 2010

Error al añadir una nueva Entidad (0x80040203)

Al crear entidades, es posible que aparezcan una serie de errores. Como saben, al crear una entidad se producen una serie de acciones, de las cuales algunas pueden dar algun error.
En caso del Error "0x80040203", es causado por la falta del rol de "Personalizador del sistema".
Cuando se crea una nueva entidad, se añaden automáticamente los permisos en este rol, por lo tanto, si el Rol no lo encuentra o hay algun problema con el mismo, aparece este error.
La solución de este error simplemente pasa por importar el rol de personalizador de sistema nuevamente, y listo.
La descripción del error es la siguiente:

Error: roleId

Error Number: 0x80040203

Error Message: roleId

Error Details: roleId

Source File: Not available

Line Number: Not available

Request URL: http://crm.mscrm.com/

Stack Trace Info: [ArgumentException: roleId]


[CrmArgumentException: roleId]
at Microsoft.Crm.Exceptions.ThrowIfGuidEmpty(Guid parameter, String name)
at Microsoft.Crm.ObjectModel.RoleServiceInternal`1.AddPrivileges(Guid roleId, RolePrivilege[] privileges, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.AddPrivilegesToUserRole(RolePrivilege[] privileges, Guid[] roleTemplates, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.CreateEntityHelper(IEntityDescription entityDescription, OwnershipTypes ownershipTypeMask, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.CreateInternal(EntityCreateInfo entityInfo, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo)
at Microsoft.Crm.Application.WebServices.SystemCustomization.EntityCreate.Execute(IUser user, ParameterBag paramBag)
at Microsoft.Crm.Application.WebServices.SystemCustomization.SystemCustomization.CreateEntity(XmlNode data)

Un saludo!

sábado, 20 de marzo de 2010

Desarrollo de informes con Visual Studio para Dynamics CRM 4.0

He realizado un video que explica paso a paso como realizar un informe con el Visual Studio. Es un video bastante sencillo relacionado con las oportunidades, sus estados y los ingresos estimados.
Adicionalmente explico como se integran los filtros del CRM con los del Informe desarrollado.
Tengo el orgullo de que este video me lo han publicado en Channel 9 Spain (canal de MSDN).
La Url del video es el siguiente:
http://channel9.msdn.com/posts/channel9spain/Desarrollo-de-informes-con-Visual-Studio-para-Dynamics-CRM-40/


Espero les sirva, un saludo

miércoles, 17 de marzo de 2010

Como extender la búsqueda rápida del CRM

Como todos saben, cuando se realiza una búsqueda rápida en CRM, automáticamente la plataforma añade el "comodín" del asterisco (*) por detrás de la búsqueda.
Seguramente muchos usuarios les hayan preguntado, ¿y por qué no añade dicho asterisco por delante tambien?
Seguramente sea por un tema de rendimiento, o funcionalidad específica, pero hoy les voy a mostrar una forma en la que podemos extender las búsquedas rápidas a esta funcionalidad.
Tengo mis dudas de si esto es soportado o no, y como siempre que tengo dudas acerca de este tema, considero que es no soportado.
La idea es crear un plugin que nos permita buscar con asteriscos por delante y por detrás sin necesidad de añadir el primero de los mismos.
Voy a explicar lo que vamos a hacer.
En el funcionamiento estándar de CRM, una búsqueda sería como la siguiente:


Lo ideal sería que me lo devuelva de la siguiente forma (sin meter el asterisco por delante):


Bien, para hacer esto se me ocurrió utilizar un "plugin" en el "Pre" de la ejecución de dichas consultas, para añadir la condición deseada por delante.
El código del plugin es el siguiente:

public class QueryHandler : IPlugin
{
public void Execute(IPluginExecutionContext context)
{


if (context.MessageName == "Execute" && context.InputParameters.Properties.Contains("FetchXML") &&
context.InputParameters.Properties["FetchXML"].ToString().Contains("operator=\"like\""))
{
string fetchxml = context.InputParameters.Properties["FetchXML"].ToString();
context.InputParameters.Properties["FetchXML"] = fetchxml.Replace("operator=\"like\" value=\"", "operator=\"like\" value=\"%");
}
}
}

El registro del Plugin sería en el "pre" del mensaje "Execute" de la siguiente forma:


Espero les sirva, por ahora lo he probado con varias entidades y no visto ningún problema, pero recuerden que está no soportado.

un saludo!

lunes, 15 de marzo de 2010

Trucos y consejos (Tricks and tips) de CRM

Existe una web de Microsoft donde se puede publicar trucos, consejos e ideas para para hacer cosas en CRM.
Son pequeñas cosas (muchas o casi todas no soportadas) que puede ayudar mucho a "acercar" el CRM a los requerimientos del usuario.
La web es la siguiente:
http://rc.crm.dynamics.com/rc/regcont/en_us/OP/articles/usertips.aspx
Unos ejemplos de cosas que pueden encontrarse:

  • Añadir "tooltips" a los campos en un formulario.

  • Permitir mas de 8 pestañas en un formulario.

  • Ordenar por mas de una columna en una vista.

  • Ordenar por mas de una columna en una vista.

  • Utilizar campos de solo lectura en Flujos de trabajo.

  • etc.


  • Recomiendo darse una vuelta y mirar a ver si hay algo interesante, o proponer cosas nuevas que no hayan sido propuestas aún.

    Un saludo,

    jueves, 11 de marzo de 2010

    Videos acerca de CRM en "Channel 9"



    En cuanto a la documentación de determinadas cosas o procedimientos, creo que es mas útil hacer un video demostrativo que leerse un documento muy extenso explicando paso a paso.
    A pesar de que pueda parecernos mucho mas tedioso, la verdad que utilizando el Expression Encoder que viene en el paquete de Microsoft Expression puede resultar de lo mas sencillo, incluso mas rápido que hacer un largo y tedioso documento de ayuda.

    En cuanto a contenidos en videos relacionados con CRM, se dispone de una gran cantidad de videos en Channel 9.
    En cuanto a contenidos, hay comentarios, charlas y videos técnicos que pueden ser de mucha utilidad y que recomiendo los visiten que seguro encontrarán cosas útiles.

    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, 3 de marzo de 2010

    Compartir registros desde Flujos de trabajo

    Buceando por Codeplex encontré una utilidad que creo que puede ser bastante útil.
    Se trata de una actividad de workflow que permite compratir el registro en cuestión, tanto con equipos como con usuarios, y actualizando cada uno de los permisos relacionados.
    Tanto los fuentes como las DLLs pueden ser descargados de aquí: http://crm40sharestep.codeplex.com/releases/view/25317
    Los pasos a seguir para su utilización son:
    1) Registrar la Dll en el CRM:

    2) En los flujos de trabajo aparecerá una nueva acción con el nombre "Share record". con las siguientes opciones:


    Esta funcionalidad me pareció muy buena para hacer este tipo de cosas de forma asíncrona. Además, como se dispone de los fuentes, siempre tenemos la posibilidad de mejorar su funcionalidad (por ejemplo añadir mas de 2 equipos para compartir o mas de2 usuarios).

    Espero les sea útil,

    un saludo

    lunes, 1 de marzo de 2010

    Alineando importes a la derecha en vistas

    Como sabéis, el CRM no nos permite alinear columnas a la derecha en las vistas.
    Pero muchas veces, en especial en relación con los importes, sería interesante que se pueda alinear a la derecha.
    En este artículo mostraré como utilizar la clase "jQuery" dentro de las vistas del CRM.
    La idea es que se vea como la siguiente imagen donde se ven los "Ingresos estimados" alineados a la derecha:

    La idea para hacer esto es TOTALMENTE no soportada. Lo que hay que hacer es lo siguiente:
    1) Añadir lo siguiente al fichero "../_root/HomePage.aspx":

    <script language="JavaScript" src="/ISV/jquery/jquery.js"></script>
    2) Debajo de eso añadir:

    <script language="JavaScript">
    $(document).ready(function() {
    $("NOBR.num").css("text-align","right");
    });
    </script>

    3) Descargar el "jQuery.js" y copiarlo en la carpeta "ISV/jQuery". La librería "jQuery" puede ser descargada de aquí: http://docs.jquery.com/Downloading_jQuery

    De esta forma utilizaremos el "jQuery" para alinear las columnas de tipo numérico a la derecha de la columna.

    Un saludo