miércoles, 26 de enero de 2011

Microsoft Dynamics CRM: Carácteres extraños al abrir un lookup filtrado

Ante todo comentar que no soy ningún entendido de CRM pero al tener que echarle una mano a un compañero algo se me ha quedado.

Muchas veces, por no decir casi todas, me he tenido que pegar con las malditas codificaciones de carácteres, por que? Por que una plataforma esta en ANSII, otra en UTF8, etc... Esto suele ser un infierno y si un proyecto lo tengo que parir yo pues todo en la misma codificación, página web, base de datos, conexión a base de datos, etc... todo en lo mismo.

Bueno a lo que vamos, resulta que necesitamos pasar un filtro para que al abrir un lookup nos aparezcan los datos filtrados. Esto se esta haciendo desde el evento onload de un formulario con lo que el código es javascript, pues al abrir la pantalla filtrada, arggggg, los acentos salen mal. Distintas codificaciones, para variar, pues bueno, navegando un poco por ahí veo unas funciones que codifican y decodifican utf8 y las modifico según mis necesidades. Pues después de cruzar los dedos, buala, el filtro funciona.

Después del rollo os dejo el código utilizado en el evento onload:

//--------------------------------
// añadiendo el filtro al lookup
document.FilterLookup = function(source, target)
{
    if (IsNull(source) || IsNull(target)) { return; }
    var name = IsNull(source.DataValue) ? "" : source.DataValue[0].name;
    target.additionalparams = 'search=' + document.UTF8_encode(name);
}
// función que codifica a utf8
document.UTF8_encode = function(s)
{
    for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
            s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
    );
    return s.join("");
}
// función que decodifica utf8
document.UTF8_decode = function(s)
{
    for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
        ((a = s[i][c](0)) & 0x80) &&
        (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
        o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
    );
    return s.join("");
}
// llamada a la función para el lookup
document.FilterLookup(cust, custnav);

//--------------------------------

Espero que sea de utilidad.

Una referencia a las funciones y su utilización.
http://jsfromhell.com/geral/utf-8

No hay comentarios:

Publicar un comentario