miércoles, 8 de septiembre de 2010

Ejecutar OnChange sin perder el foco

El evento OnChange de los campos de un formulario de Dync CRM tienen una peculariedad ... el evento se ejecuta cuando se pierde el foco. Este detalle podría crearnos ciertas dificultades para lo cual tendríamos que forzar a que dicho evento se ejecute inmediatamente después de cambiar su valor y no después que se haya perdido el foco del campo. Veamos el siguiente ejemplo:
ESCENARIO
Se tiene el campo checkbox "valor" y un campo de caja de texto "descripcion". El campo "descripcion" deberá estar deshabilitado a menos que se haya seleccionado el campo "valor".

SOLUCION FALLIDA
En el evento OnChange de "valor" colocar:
if(crmForm.all.valor.DataValue==true)
   crmForm.all.descripcion.Disabled=false;
La opción arriba mencionda funciona sí y sólo sí luego de haber colocado un check en el campo "valor" se da un clic en cualquier otra parte del formulario o si se presiona la tecla TAB.

Para lograr nuestro cometido emplearemos "attachEvent" y que se ejecute en el momento que se haga check en "valor"
SOLUCION CORRECTA
En el evento OnLoad del formulario colocaremos lo siguiente 
function MiFuncion(){
   if(crmForm.all.valor.DataValue==true)
      crmForm.all.descripcion.Disabled=false;
}
crmForm.all.valor.attachEvent('onclick',MiFuncion);

viernes, 13 de agosto de 2010

crmForm.que?

Este post está orientado a personas que recién están empezando a realizar códigos de javascripts para los formularios y campos de CRM. Al menos cuando yo empecé en este mundo lo primero que me mandaron hacer fue justamente esto y en muchas ocasiones ignoraba de las propiedades y métodos que permitirían realizar rápidamente mi trabajo... en fin. Para que no les pase como a mí, les voy a dejar un listado de propiedades y métodos:
Variables Globales
SERVER_URL Nos proporciona una cadenta de texto con el nombre del servidor
USER_LANGUAGE_CODE Proporciona el codigo del lenguaje seleccionado por el usuario
ORG_LANGUAGE_CODE Proporciona el codigo del paquete de lenguaje dela organización
ORG_UNIQUE_NAME Proporciona el nombre de la organización

Propiedades crmForm
crmForm.all Nos permite acceder a todos los campos del formulario
crmForm.IsDirty Retorna un booleando. True si el campo ha sido modificado
crmForm.FormType Obtiene un entero según el modo en el que se encuentre el formulario. Como valores
válidos tenemos:

-Undefined Form Type = 0

-Create Form = 1

-Update Form = 2

-Read Only Form = 3

-Disabled Form = 4

-Quick Create Form = 5

-Bulk Edit Form = 6
crmForm.ObjectId Retorna un string que muestra el GUID del registro abierto. En caso que el
formulario sea de tipo"Create Form" el vaslor será null.
crmForm.ObjectTypeCode Obtiene el código de la entidad del formulario abierto.
crmForm.ObjectTypeName Obtiene el nombre de la entidad del formulario abierto.

Lookup Multientity - (como el de cliente)

En ocasiones hemos necesitado de un lookup el cual nos permita manejar tanto Cuentas como Contactos (similar al que hay en el formulario de Casos) o lookups como los "Referente a". Si bien es cierto que es una funcionalidad propia de CRM, en este ejempplo (que tiene como base este post) vamos a emular un lookup multi-entidad el cual nos permita hacer el registro de un contacto o cuenta.
Supongamos que tienen una entidad personalizada llamaba: jl_entidad. Deberán crear relaciones con la entidad account y contact donde éstas son las entidades principales. Agregar los campos de tipo lookup jl_accountid y jl_contactid en el formulario de jl_entidad.
Ahora en el evento OnLoad, copiar el siguiente código:
var accountLookup = crmForm.all.jl_accountid;
var contactLookup = crmForm.all.jl_contactid;
accountLookup.lookuptypes = "1,2";
accountLookup.lookuptypenames = "account:1,contact:2";
accountLookup.lookuptypeIcons = "/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif";
if (contactLookup.DataValue != null) {
   accountLookup.DefaultValue = contactLookup.DataValue;
   accountLookup.DataValue = contactLookup.DataValue;
   if (typeof (accountLookup.DataValue[0].data) != "undefined") {
      accountLookup.DefaultValue[0].data = accountLookup.DataValue[0].data;
   }
}
En el evento OnSave copiar lo siguiente:
var accountLookup = crmForm.all.jl_accountid;
var contactLookup = crmForm.all.jl_contactid;
if (accountLookup.DataValue == null) {
   contactLookup.DataValue = null;
}
else {
   var customer = accountLookup.DataValue[0];
   if (customer.type == "1") {
      contactLookup.DataValue = null;
   }
   else {
      contactLookup.DataValue = accountLookup.DataValue;
      accountLookup.DataValue = null;
   }
}

miércoles, 11 de agosto de 2010

Personalizando FULLNAME

Como ya sabemos podemos personalizar el FULLNAME mediante la Configuración del sistema, pero este medio es un poco limitante ya solo nos da la oportunidad de elegir uno de los siguientes formatos:
  • Apellidos, Nombre
  • Nombre Apellidos
  • Apellidos, Nombres Iniciales
  • Nombres Iniciales Apellidos
  • Apellidos, Nombre Segundo nombre
  • Nombre Segundo nombre Apellidos
  • Apellidos Nombre
  • ApellidosNombre
Pero qué pasaría si tenemos el apellido paterno y el apellido materno por separado y queremos que éste forme parte del FULLNAME
Para ello crearemos 2 nuevos campos: jc_apellidopaterno y jc_apellidomaterno.
No utilizamos el atributo lastname ya que lo emplearemos para la concatenación de los atributos que creamos. Por último implementaremos la siguiente porción de JScript:
En el evento OnLoad
//Ocultar el campo lastname que viene por defecto
crmForm.all.lastname.style.visibility='hidden';
crmForm.all.lastname_c.style.visibility='hidden';
En el evento OnSave:
//Concatenación de campos
crmForm.all.lastname.DataValue=crmForm.all.jc_apellidopaterno.DataValue+' '
+ crmForm.all.jc_apellidomaterno.DataValue;
Con esto el campo FULLNAME mostrará el nombre, el apellido paterno y el apellido materno.

No se puede validar la instalación de servidor de informes SQL Server Reporting Services

Tal vez cuando has intentado instalar el CRM Data Connector en un servidor que cuenta con SQL Server 2008 RS te has encontrado con este inconveniente.

Según información oficial este problema se soluciona con las actualizaciones más recientes que se descargan de internet durante la instalación, pero que pasa cuando nuestro servidor de reportes (por motivos de seguridad) no cuenta con salida a la red de redes. Bajo estas circunstancias se vuelve un poco tedioso poder realizar la instalación pero no se vuelve imposible.

Para poder conseguir nuestro objetivo deberemos realiar los siguientes pasos:

1. Copiar la carpeta SRSDataConnector, que viene en el CD de instalación, en una de las particiones del servidor (esto para una mayor facilidad de trabajo). Ejemplo: E:\SrsDataConnector
2. Dentro de la nueva carpeta creada (E:\SrsDataConnector) copiaremos la carpeta VCRedist que también se encuentra en el CD de instalación (Redist\amd64\ VCRedist ó Redist\i386\ VCRedist).
3. Abrir un comand prompt y ejecutar la siguiente instrucción:
Path:>msiexec /i E:\SrsDataConnector\SrsDataConnector.msi PATCH=E:\SrsDataConnector\SrsDataConnector_amd64.msp

4. Aquí se mostrará una ventana de progreso de instalación.
5. Abrir el archivo install-config.xml que se encuentra en E:\SrsDataConnector. La modificación consistirá en agregar la siguiente etiqueta:
<Patch update="true">E:\SrsDataConnector\SrsDataConnector_amd64.msp</Patch>
6. Luego volveremos a abrir un comand promt y ubicarnos en la ruta elegida donde se encuentra el SrsDataConnector(E:\SrsDataConnector). Todo esto se hará vía de comandos
7. Una vez ubicado en E:\SrsDataConnector> ejecutaremos:
SetupSrsDataConnector.exe /config install-config.xml
8. Finalmente se ejecutará el Wizard de instalación y seguiremos hasta culminar la instalación.

Éstos pasos nos permitirán poder instalar satisfactoriamente el Conector de reportes.

Inventario de jscripts crmForm

A quien no le ha pasado que como parte de los entregables de los diferentes proyectos con Dync CRM nos han solicitado realizar un inventario de los scripts desarrollados para los diferentes formularios y atributos de las diferentes entidades :S Bueno esto puede volverse una tarea muy engorrosa (especialmente si uno no ha desarrollado dichos scripts). Felizmente contamos con herramientas que nos pueden facilitar la vida. En esta oportunidad les comento sobre una herramienta que nos va a servir de mucho: FormJavascriptManager que lo puedes descargar haciendo click aquí.
Para utilizar esta herramienta deberemos crear una conexión al servidor de CRM de la siguiente manera:

(Primero hacer click en el botón [...] y luego en [new connection])

En la siguiente ventana le pondremos un nombre a la conexión, escogeremos el tipo de autenticación e ingresaremos información correspondiente al servidor de CRM

Finalmente aparecerá una ventana donde podremos apreciar las entidades personlizables de donde podremos seleccionar aquellas que querramos analizar. Por cada entidad que selecciones nos permitirá visualizar los métodos OnChange, OnSave y OnLoad de los atributos y formularios respectivamente.

domingo, 16 de mayo de 2010

"Reporting Error. The report cannot be displayed"

Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Cannot create a connection to data source 'CRM'. --->

Es posible que te encuentres con este error luego de una actualización de Base de Datos o de una reasignación de usuarios a los servicios del SQL Server.

Este error se debe ya que la cuenta que el CRM Data Connector usa para la autenticación no tiene los privilegios necesarios sobre las BDs de Dync CRM (es muy probable que la cuenta con la que se ejecuta los servicios NO sea NT AUTHORITY\NETWORK SERVICE). Para solucionar este problema debemos hacer las siguientes configuraciones:

1. En el servidor de RS identificar la cuenta que ejecuta el SQL Server Reporting Services Windows service (esto se identificará desde la pantalla de servicios)
2. Verificar que el usuario identificado en el paso 1 sea miembro de SQLAccessGroup creado con la instalación de DynC CRM. En caso contrario se deberá agregarlo.
3. Abrir el SQL SERVER MANAGEMENT STUDIO.
4. Expandir "Security", luego "Logins", y luego hacer clic derecho en "SQLAccessGroup" y luego hacer clic en "Properties"
5. En la siguiente ventana hacer clic en "[organizacion]_MSCRM" y habilitar las casillas de selección "CRMReaderRole", "public" y "db_owner" ([organizacion]_MSCRM representa la BD Organizacional)
7 Hacer check en la casilla de selección "MSCRM_CONFIG" y habilitar las casillas de selección "CRMReaderRole", "public" y "db_owner" Hacer clic en "Ok"
8. Repetir los pasos 5,6,7 para el usuario identificado en el paso 1.