lunes, 10 de junio de 2013

CRM 2011 - ImageGallery

Como novedad, aquí teneis un visualizador de imágenes para CRM 2011, es una solución administrada

link

Cualquier duda, comentario ;)

Bonobo - Days to come

miércoles, 14 de abril de 2010

Deshabilitar refresco de pantalla en Formulario (F5)

Hola a todos.

Si alguna vez habeis necesitado deshabilitar el refresco de pantalla en algún formulario de CRM, este es el código que teneis que poner en el OnLoad:

var UrlWindow = window.location.href;
var vista=false;
document.onkeydown = function(){ 
if(window.event && (window.event.keyCode == 116)){
window.event.keyCode = 505; 
}
if(window.event.keyCode == 505){ 
return false; 
} 
}


Portishead - Over
http://www.youtube.com/watch?v=pzananVefh0

Detección de Eventos

Buenas.

Si alguna vez se ha dado el caso que necesitais detectar el botón pulsado en un formulario CRM esto son los códigos mas usuales

event.Mode==1    //Funcion: crmForm.Save();
event.Mode==2    //Funcion: crmForm.SaveAndClose()
event.Mode==7    //Funcion: send()
event.Mode==58    //Funcion: SaveAsCompleted()
event.Mode==59    //Funcion: // Funcion: crmForm.SubmitCrmForm(59, true, true, false) EQUIVALE A Guardar y Nuevo;

Hot 8 brass band - Rastafunk

Llamada a WebServices por Javascript

Buenas a todos.


en mi día a día de desarrollo me he encontrado con que tengo que llamar a WebServices mediante Javascript para realizar diferentes operaciones (Consultas, Modificaciones, Integraciones con otros sistemas, etc), estos WebServices los suelo meter en la carpeta de ISV de CrmWeb, de manera que conserva las credenciales utilizadas al entrar a CRM.

Si habeis trabajo con esto os habreis dado cuenta de el churro de llamadas a WebServices que teneis en vuestros javascripts de formularios.

Pues bien, para no repetir tanto el código he creado una función de Javascript que realiza la llamada, es muy sencilla, pero he pensado que a alguien quizás le venga bien.

pues bien, esta sería la funcion:


(Siento ponerlo como imágen, pero algunas etiquetas son incompatibles con blogger, si alguien me dice como poner código de una manera mas curiosa se lo agradecería)


La llamada a esta función sería la siguiente:

var paramsName = new Array(); 
paramsName.push("accountid");
var paramsValue = new Array();
paramsValue.push(crmForm.ObjectId);

var resultXml = montaClienteWs("dameTelefonoAccount", //Nombre del método
paramsName, // Array con los nombres de los parámetros de los WebService
paramsValue, // Array con los valores de los parámetros
"http://tempuri.org/", //Namespace del WebService
"/ISV/WsCRM/Service1.asmx" ); // URL del WebService

Espero que os sirva de ayuda.



Trentemoller - Moan
http://www.youtube.com/watch?v=uTGquMexR8Y

Vistas de Entidades en Formularios

Hoy voy a explicar como cargar vistas de entidades dentro de formularios mediante IFRAMES.

Hay dos tipos de vistas en Dynamics CRM 4:

- Vistas Propiamente dichas: son las que se nos muestran en la página principal de CRM y que nos permiten realizar búsquedas, interactuar con los registros, clasificar por vistas personalizadas entre otras cosas.




- Areas: son las vistas que se nos muestran dentro de los registros para las entidades relacionadas, se encuentran en el menú de la izquierda.



* Para el caso de las vistas, su utilización es muy sencilla, y podemos mostralas de una manera soportada, únicamente tenemos que copiar el link que nos facilita CRM al ir a Mas Acciones/Copiar acceso directo/Vista Actual


(Si no se os queda en el portapapeles la dirección url de la vista probad con Acciones/Enviar acceso directo/Vista Actual, se os abrirá un nuevo correo electrónico con la url de la vista como contenido)



Con la url obtenida podemos ponerla tanto en un IFRAME de un formulario CRM como en cualquier aplicación o web que deseeis, pensad que si la quereis poner fuera de CRM os pedirá login/password.



Nota: si la url que os da es por ejemplo:

http://1.1.1.1:5555/demo/_root/homepage.aspx?etc=1&viewid=%7b00000000-0000-0000-00AA-000010001002%7d

debeis quitar el dominio de la url, esto es:

http://1.1.1.1:5555/

de manera que solo deberiais pegar la url del iframe:

/demo/_root/homepage.aspx?etc=1&viewid=%7b00000000-0000-0000-00AA-000010001002%7d



esto es necesario para que una vez desplegada nuestra implementación de CRM no tengamos problemas con la ip del servidor, ya que seguramente será distinta.



* Para el caso de la áreas tiene un poco mas de intringulis, aparte de que hace falta sacar la ruta de la Url, esto se puede hacer de dos formas (que yo conozca).
este desarrollo es no soportado aunque al ser mediante Javascript no es destructivo:



a.- Si teneis Internet Explorer 8, pulsais F12 y se os mostrara una pantalla en la cual podeis obtener Javascripts, css, url y demas entresijos de la web



b.- Si teneis una version previa a Internet Explorer 8, podeis bajaros Internet Explorer Developer Toolbar, que es lo mismo, solo que no viene integrada de serie ( http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en )
para sacar la url de el área, pulsais sobre la flecha que se muestra en la parte superior izquierda y despues marcais la zona de la que quereis obtener la url (en caso de que tenga)



Nota: como podreis observar, en uno de los parametros de la URL (TabSet) tenemos la entidad a la que pertenece el área con el literal "area" contatenado delante.


esta url la podemos pegar en cualquier formulario, con una salvedad, podeis observar que el primer parametro de la url es "oId", este valor es el id del registro del cual queremos obtener los registros de la entidad relacionada, por lo que si queremos que el area que mostremos tenga coherencia debemos pegar el id de nuestro registro actual en ese parámetro.

Esto lo realizaremos mediante javascript en el onload del formulario, por lo que en la url del iframe que hemos puesto es nuestro formulario pondremos "about:blank", esto no nos cargará nada en el iframe.


Cabe mencionar que para que el IFRAME quede bien colocado y no haya margenes laterales ni bordes es necesario ajustar una serie de opciones del IFRAME, que son:


- Expandir automáticamente para usar el espacio disponible
- Desplazamiento: Nunca
- Mostrar borde: No (Preferencia personal, aquí cada uno que haga lo que quiera)

Ahora en el onload pasamos a cargar el IFRAME:

crmForm.all.IFRAME_AreaContactos.src = "areas.aspx?oId="+crmForm.ObjectId+"&oType=1&security=852023&tabSet=areaContacts";



* Como podeis ver añadimos la url en el Ifame mediante la propiedad "src".

* Tambien podeis observar que he concatenado el id del registro actual en el parámetro "oId", este id se obtiene usando "crmForm.ObjectId"

* IMPORTANTE: uno de los parámetros de la url es oType, este parametro es en TypeCode de la entidad (valor numérico), en las entidades de sistema so hay problema puesto que sus valores numéricos siempre son los mismos, sin embargo, en las entidades personalizadas los números pueden variar desde una implementacion a otra, por lo que si queremos mostrar el área de una entidad personalizada lo óptimo sería obtener el TypeCode de la entidad mediante una llamada a WebService en javascript a los servicios de CRM para obtener el mencionado TypeCode, podeis ver como hacerlo aqui:

http://blog.customereffective.com/blog/2009/02/client-side-web-service-calls-for-microsoft-dynamics-crm-40-calling-the-metadata-service-with-javascript.html


(es importante hacer mención a que esto afectará al rendimiento puesto que estamos realizando una consulta mediante webservice)


Nota: si cuando agregeis el iframe en el formulario dejais la opción "Restringir scripting entre marcos", no os permitira interactuar con el IFRAME


El resultado sería el siguiente:




En este punto os preguntareis, ¿y para que quiero yo sacar el IFRAME que ya tengo en el menú de la izquierda o en la pantalla principal de CRM?, pues bien, imaginaros que quereis ocultar dicho menú y mostrar únicamente los registros de la entidad relacionada en modo sólo lectura, o por ejemplo quereis mostrar el área pero que no aparezcan los botones de crear registro nuevo, generar informe, etc.

Lo bueno que tiene sacar la vista, es que la podemos poner en el formulario, y de esa manera tenemos acceso a todos los componentes de la vista mediante Javascript, cosa que no se puede hacer con el área "Standard" puesto que esta fuera del formulario.
Pasaremos a mostrar un ejemplo en el que vamos a mostrar el área unicamente con los registros, sin botones.

partiremos de el área de contacto que hemos agregado en el formulario de contacto.



Es necesario dejar constancia que para realizar cambios en el área que hemos cargado tales como ocultar botones, cambiar colores, etc. Se ha de hacer mediante un timer en Javascript, puesto que el control es cargado en el onload, y hasta que no termine de cargar el formulario no se puede "meter mano" a la citada área, de ahí el timer, esto puede afectar al rendimiento.

var iFrame = crmForm.all.IFRAME_AreaContactos;
var resTimer = "";
resTimer = setInterval(cargaFrame,500); // Mediante esta función se hace una llamada cada 500 ms a la función cargaFrame
function cargaFrame()
{
 if (document.readyState == "complete") // Esto nos indica que el formulario ha sido cargado en su totalidad
 { 
   if(document.frames['IFRAME_AreaContactos'].document.all.mnuBar1 != undefined) // Con esto nos aseguramos de que el área tiene barra de menú superior (en la que se encuentran los botones de crear nuevo, generar informe, etc), el id del menú lo obtuve con el Internet Explorer Developer Toolbar
   {
    document.frames['IFRAME_AreaContactos'].document.all.mnuBar1.style.display = "none"; // Ocultamos la barra
     iFrame.allowTransparency=true; // Ponemos fondo transparente al FRAME para que los colores no desentonen 
    clearInterval(resTimer); // Paramos la ejecución del timer
   } 
  }
} 

El resultado sería el siguiente:




Este sería todo el código necesario para realizar el ejemplo:

crmForm.all.IFRAME_AreaContactos.src = "areas.aspx?oId="+crmForm.ObjectId+"&oType=1&security=852023&tabSet=areaContacts";

var resTimer = "";
resTimer = setInterval(cargaFrame,500); // Mediante esta función se hace una llamada cada 500 ms a la función cargaFrame

function cargaFrame()
{
 if (document.readyState == "complete") // Esto nos indica que el formulario ha sido cargado en su totalidad 
 {  
  if(document.frames['IFRAME_AreaContactos'].document.all.mnuBar1 != undefined) // Con esto nos aseguramos de que el área tiene barra de menú superior (en la que se encuentran los botones de crear nuevo, generar informe, etc)  
  {   
   document.frames['IFRAME_AreaContactos'].document.all.mnuBar1.style.display = "none"; // Ocultamos la barra   
   iFrame.allowTransparency=true; // Ponemos fondo transparente al FRAME para que los colores no desentonen   
   clearInterval(resTimer); // Paramos la ejecución del timer   
  }   
 }
}



un ejemplo para mostrar la potencia de todo esto: imaginaros en un escenario en el que en función de un registro seleccionado de un lookup podemos ver la vista relacionada a ese registro dinámicamente

Bueno, espero haber esclarecido algo en este farragoso mundo del CRM.


Smashing Pumpkins - Disarm

http://www.youtube.com/watch?v=QQtLoJlQD6E

Inauguro Blog

Buenas a todos.

Inauguro este blog para compartir trucos, atajos y soluciones de Microsoft Dynamics CRM.

Espero que os sirva de utilidad.