Mostrando entradas con la etiqueta IFD. Mostrar todas las entradas
Mostrando entradas con la etiqueta IFD. Mostrar todas las entradas

lunes, 25 de junio de 2012

DynamicForm 1.3: Concatenaciones de campos

Siguiendo con el progreso de nuestro componente, iremos añadiendo funcionalidades que creo que todos nosotros hemos utilizado alguna vez, o que sino, seguro que necesitarán en el futuro alguna vez.

La idea de hoy es añadir la posibilidad de concatenar varios campos en uno solo. Esto suele ser muy utilizado especialmente en algunos casos como en entidades de relación que simulan relaciones N-N y así rellenar en el campo “new_name” la relación.

El resumen de la funcionalidad propuesta hoy es el siguiente:

Formulario: Cuenta
Evento: OnLoad(), OnChange()

Atributos: para este ejemplo, el campo description, y todos los relacionados con la dirección (address1_*).
Funcionalidad: Además de la funcionalidad que ya se disponía, he añadido en el XML la posibilidad de definir “actions”, en un primer momento de tipo “concat” para concatenar campos en uno de destino.

Todo este ejemplo estará como siempre disponible en Codeplex:

http://elblogdedynamicscrm.codeplex.com/documentation

En el XML he añadido una nueva sección:







La idea es que por cada “action” se defina:




  • type: define si la acción a realizar es de tipo “concat” (concatenación)


  • destattribute: define el nombre del atributo donde queremos que se escriba el resultado de la concatenación


  • attributestoconcat: listado de atributos separados por comas y en orden que se quieren concatenar.


  • stringseparator: cadena utilizada para separa los valores regogidos



En cuando a nuestro Javascript en esta versión he añadido un par de funciones nuevas:




function Actions()
{
var nodePath = "//Root/actions/action";
var nodelist = doc.selectNodes(nodePath);
//Actions
LoadXmlWebResource("new_new_test_xml");
for (var i = 0; i < nodelist.length; i++)
{
var attributes=nodelist(i).attributes;
var type= attributes.getNamedItem("type").nodeValue;
var destattribute= attributes.getNamedItem("destattribute").nodeValue;
var attributestoconcat= attributes.getNamedItem("attributestoconcat").nodeValue;
var stringseparator= attributes.getNamedItem("stringseparator").nodeValue;
switch (type)
{
case "concat":
Concat(destattribute,attributestoconcat,stringseparator);
break;
}
}
}

function Concat(destattribute,attributestoconcat,stringseparator)
{
var strConcat="";
var arrattributestoconcat=attributestoconcat.split(",");
for (j=0;j {
if (strConcat!="")
{
strConcat+=stringseparator;
}
var value=getValue(arrattributestoconcat[j]);
if (value!=null)
strConcat+=getValue(arrattributestoconcat[j]);
}
setValue(destattribute,strConcat);

}

Los métodos nuevos son:



  • Actions: que es llamado en Load() y en el OnChange() de los campos definidos para concatenar.


  • Concat: método que recibe los parámetros y concatena los valores en el campo de destino.


Además he añadido una nueva función que no tenía hasta ahora, a pesar de ser bastante básica y creo que no requiere mayor explicación:



function setValue(attributename,value)
{
if (getAttribute(attributename))
getAttribute(attributename).setValue(value);
}


Todo este ejemplo, junto con el resto de versiones completas y funcionando podéis descargarlas de Codeplex, en donde además del código completo, está también la solución completa y funcional.



Les dejo una imagen con este ejemplo funcionando en CRM:



image



Un Saludo!

domingo, 27 de diciembre de 2009

Autenticación en un ASPX con el acceso IFD activado

Al activar el acceso a través de IFD (Internet Facing Deployment) al CRM, lo que se permite es que los usuarios accedan al CRM a través de la autenticación por formulario. De esta forma, al acceder al CRM en vez de pedir la típica ventana de autenticación del directorio activo, aparece un formulario web, en donde hay que introducir usuario y contraseña. Esto suele utilizarse cuando se va habilitar acceso al CRM a través de internet desde diferentes ubicaciones.
Para ver como configurar el acceso a través de IFD recomiendo ir a:
http://support.microsoft.com/kb/948779

Una vez configurado y activos el acceso por IFD, se produce un cambio muy importante en el IIS (Internet Information Services) del servidor web, que habilita el acceso anonómimo al sitio web. De esta forma, el usuario que ejecuta la aplicación, es el usuario anónonimo y no el usuario conectado a traves de las credenciales del directorio activo.

Esto trae como consecuencia, que cualquier desarrollo web nuestro (formularios aspx) en los cuales nos hemos conectado a los web services de CRM mediante las "DefaulCredentials", provocará un error de autenticación ya que el usuario anónimo no es usuario de CRM.
Veamos como sería la autenticación en una implantación "On Premise" (sin IFD):

CrmService crmService = new CrmService();
crmService.Url = orgInfo.CrmServiceUrl;
crmService.CrmAuthenticationTokenValue = token;
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;

account account = new account();
account.name = "Nueva cuenta: " + DateTime.Now.TimeOfDay.ToString();
service.Create(account);

Como puede verse, simplemente se recogen las "DefaultCredentials" que son las del usuario conectado, ya que al no estar activado el acceso por IFD, el sitio web recoge las credenciales del usuario conectado del directorio activo.

En caso de activar el acceso por IFD, esas "DefaultCredentials" devuelven al usuario anónimo, por lo tanto da un error de autenticación.
La forma de hacer lo mismo en una implantación con IFD activado sería:

using (new CrmImpersonator())
{
CrmAuthenticationToken token;
token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname);
token.OrganizationName = orgname;
token.AuthenticationType = 0;

CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
service.CrmAuthenticationTokenValue = token;
service.Url = crmurl;

account account = new account();
account.name = "Nueva cuenta: " + DateTime.Now.TimeOfDay.ToString();
service.Create(account);
}

El "CrmImpersonator" lo que hace es que todo el código dentro del "using" se ejecute con el entorno del usuario conectado (usuario de CRM) y no con el usuario anónimo. De hecho, si quisiésemos recoger el id del usuario del CRM lo tenemos utilizando rl "token.CallerId".
De esta forma funcionaría nuestro código con IFD activado. De hecho este código funciona tando con "IFD" como con "On Premise", con lo cual sugiero que en vuestros desarrollos web, intenten utilizar este tipo de código, y que lo prueben bien, ya que nuestros desarrollos web pueden cambiar sus funcionamientos en caso de acceder a traves de IFD.

Espero les haya servido,

un abrazo