jueves, 6 de octubre de 2011

Microsoft Dynamics NAV: Sustitución de acentos, ñ's y demás

Ya hacía tiempo que no comentaba nada, a parte de falta de tiempo, tampoco había descubierto nada interesante pero hace poco he tenido que hacer una función para algo que pensaba que debía existir en NAV y yo no he encontrado.

Cuando me pidieron de sustituir en una cadena las letras con acentos por la misma letra sin acento, ñ's por n´s, estuve buscando y no ví una función que lo hiciese como yo quería pues navegando por ahí (creo que en mibuso) encontre una función que en conjunto con otra creada por mi hacía lo que necesitaba exactamente que era, sustituir cualquier ocurrencia de letras con acento o ñ's por sus respectivas letras.

Después del rollo, aquí va la función:

SustitucionCaracteres(Texto : Text[250]) TextoCambiado : Text[250] 
  Cadena1 := 'ÀÄÁÂÈËÉÊÌÏÍÎÒÖÓÔÙÜÚÛÑÇàäáâèëéêìïíîòöóôùüúûñç';
  Cadena2 := 'AAAAEEEEIIIIOOOOUUUUNCaaaaeeeeiiiioooouuuunc';
  TextoCambiado := Texto;
  FOR i := 1 TO STRLEN(Cadena1) DO BEGIN
    IF STRPOS(Texto,FORMAT(Cadena1[i])) <> 0 THEN
      TextoCambiado := ReplaceString(TextoCambiado,FORMAT(Cadena1[i]),FORMAT(Cadena2[i])); 

  END;

donde:

ReplaceString(String : Text[250];FindWhat : Text[250];ReplaceWith : Text[250]) NewString : Text[250]
  WHILE STRPOS(String,FindWhat) > 0 DO
    String := DELSTR(String,STRPOS(String,FindWhat)) + ReplaceWith + COPYSTR(String,STRPOS(String,FindWhat) + STRLEN(FindWhat));

  NewString := String;


Esta última función es la que ví en mibuso (creo recordar).

Bueno, espero que haya sido útil y seguramente habrá algo parecido pero las prisas xdd.

Hasta otra.

miércoles, 2 de marzo de 2011

Microsoft Dynamics NAV: Maximizar formulario desde código

Quien no ha tenido el problema de tener una formulario maximizado y al realizar alguna acción sobre este se quede minimizado o en un tamaño menor, como ejemplo cuando se envían correos.
Esto a veces puede resultar molesto, bueno solo debes maximizarlo, pero después de investigar un poco he visto una solución. Se trata de pasar una combinación de teclas que nos permita maximizarla desde código. Realmente si lo tuviesemos que hacer desde teclado sería <ATL>+<-> para sacarnos el menú contextual de formulario y luego <X> para maximizar, <N> para minimizar, etc... (ver imagen)


Pues la cuestión es hacer esto mismo enviando la combinación de teclas adecuada.
Para ello deberemos declarar una variable automation 'Windows Script Host Object Model'.WshShell.
Esta nos sirve para utilizar la función SendKeys y para el ejemplo de maximizar ventana el código sería el siguiente:

Desde teclado normal: <ALT>+<->+<X>
Desde código: WShell.SendKeys('%'+'{-}'+'{X}');

De esta forma le estamos diciendo que saque el menú contextual y maximice.
A partir de aquí imaginación xd.

Espero que os sea de utilidad. Hasta la próxima.

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.