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

viernes, 7 de enero de 2011

Microsoft Dynamics NAV: Utilización de AutoSplitKey y MultipleNewLines en formularios

Nota: Aquellos que no tengan ni pajolera idea de lo que es Microsoft Dynamics NAV abstenganse de leer este post y si lo leen no me hago responsable de los desperfectos cerebrales que pueda causar.

Bueno, algunos sabrán como funcionan estas propiedades, otros también lo sabrán pero no tanto y otros como yo que las conocían a medias y se han tenido que pegar con ellas, las habrán sufrido.

Y por que este post, pues hace poco tuve que hacer un formulario muy majo en el que podía introducir líneas entre otras líneas al estilo líneas de venta y para ello decidí utilizar la propiedad AutoSplitKey (el que quiera saber exactamente como funciona esta propiedad que se vaya a la ayuda, si quieres saber como actua ves a las líneas de venta y verás que si introduces una línea entre dos existentes, el nº de línea se calcula solo y será un número entre el nº de línea de la línea de arriba y el nº de línea de la línea de abajo, o sea, la mitad).

Siguiendo con el tema del formulario majo, decidí hacer lo mismo que hace las líneas de venta, y ví que en este formulario se utilizaba la propiedad AutoSplitKey y MultipleNewLines, con lo que decidí poner las dos.
En un principio parecía todo correcto hasta que decidí aplicar un filtro a mi "fabuloso" formulario. Lo hice al estilo "yo", F7 sobre el campo y Aceptar, me sale filtrado como yo quiero pero cuando cambio de línea y quito el filtro, "wala", - mierda: me han desaparecido las líneasssss -. Realmente no me habían desaparecido las líneas pero me había situado el cursor en el último registro (lógico) pero el scroll me había llegado abajo del todo con lo que tenía que subir para ver las demás líneas, cosa rara donde las hayas. Pues bueno, después de investigar un poco y pedir ayuda a algún compañero vimos donde estaba el problema, era la propiedad MultipleNewLines la que hacía que esto se comportara así. Esta propiedad te permite dejar líneas en blanco entre medias de otras líneas, pues para poner descripciones, líneas en blanco para relleno, o las utilidades que se quiera y parece la culpable de este comportamiento y exactamente, quité de mi "fabuloso" formulario esta propiedad (que tampoco me interesaba porque no quería líneas en blanco) y a funcionar como yo quería, o sea, quitando el filtro y no dejando el scroll abajo.

Si queréis comprobar como va probar en las líneas de venta, creaís un pedido con bastantes líneas. Filtraís por un producto en el que se vean pocas líneas, cambiáis de registro y quitáis el filtro, ahora deberíais ver la última línea del pedido y el scroll abajo del todo con lo que deberéis subir el scroll para ver todas las líneas. Si esto mismo lo probáis sin esta propiedad el scroll no se quedará abajo.

Bueno, se que será un chorrada pero sí alguíen tiene este problema que no se asuste, no es un problema, es un comportamiento de Navision.

No pongo referencia de donde lo he sacado por que me ha pasado a mi.

Hasta pronto.