miércoles, 8 de agosto de 2012

Accediendo a Microsoft Dynamics NAV desde ruby on rails

Después de un largo tiempo de pruebas y más pruebas, he conseguido hacer lo que quería, que no es más que poder acceder a Navision desde una aplicación hecha en ruby on rails.

Para aquellos no familiarizados, ruby on rails en un lenguaje de programación para entornos web del que tengo cierto conocimiento y experiencia.

Como antecedentes, para poder conectar con Navision se necesita la versión 2009 que dispone de una publicación muy sencilla de web services. Mi idea inicial era consumir dichos web services desde el mismo ruby on rails a través de una gema llamada Savon. Según lo que ví por ahí era sencillo de hacer pero todo lo que probé no me funcionó y opte por el camino simple.
Ya sabía conectar a Navision a través de .NET y probé a conectar desde ruby on rails con web services hechos en .NET y buala!!!, funcionó.

Entran en juego 3 partes, Navision que publica unos web services que se consumen desde .NET y a su vez .NET son web services que se consumen desde ruby on rails a través de la gema Savon. Pensandolo bien es hasta bueno hacerlo así puesto que el servicio de .NET puede estar separado de Navision y no se accede directamente al servidor.

Y como va esto? Pues suponiendo que se conoce como hacer web services en .NET y como se conecta con Navision, lo importante es como se conecta desde ruby on rails a .NET.

Aquí va,

Hay que estudiarse un poco como funciona Savon pero es algo sencillo:

require 'savon'
client = Savon::Client.new("miwebservice.asmx?wsdl")
Con esta instrucción se carga en client los datos de acceso al web service de .NET
client.wsdl.soap_actions 
Devuelve los métodos del web service de .NET en un array [:action1, :action2, etc...]

response = client.request(:get_people) do |soap|
  soap.body = {:code => code}
end
response.body.first.last[:get_people_result]
Hace la llamada al método get_people del web service .NET pasándole el parametro code. Este método devuelve un string con los resultados accesible con [:get_peope_result]

response = client.request(:show_people)
response.body.first.last[:show_people_result][:string]
Hace la llamada al método show_people del web service .NET. Este método devuelve un array de strings con los resultados accesible con [:show_people_result][:string]

response = client.request(:insert_people) do |soap|
soap.body = {:name.to_s.camelcase => "name", :address.to_s.camelcase => "address",
  :city.to_s.camelcase => "city", :county.to_s.camelcase => "county"}
end
response.body.first.last[:insert_people_result]
Hace la llamada al método insert_people del web service .NET. Este método inserta los parametros en Navision y devuelve un resultado para saber si la ejecución a sido correcta o no.

Estas líneas pueden ir en cualquier modelo de ruby on rails, son un ejemplo de lectura e inserción que te permiten obtener datos de Navision y actualizarlo.

Ahora eres tú quien debe formatear dichos datos para ponerlos como más te gusten.

Referecias:
Savon => https://github.com/rubiii/savon/
Conexión Navison  y .NET => En cualquier sitio

Espero que sea de utilidad para alguien.

Hasta pronto amigos.

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.

martes, 21 de diciembre de 2010

Resinstalar Windows XP en Acer Aspire One

Pues eso, yo tengo un Acer Aspire One, si de esos que no tienen CD, y siempre me he preguntado como podría formatearlo o reinstalarlo si no tenía CD. Pues lo más lógico es que el sistema te permita arrancar desde USB y tener en él el sistema operativo. Pues leyendo un poco por ahí he visto como se puede hacer de una forma rápida y sin necesidad de USB.
No lo he probado pero tiene su lógica y de seguro que lo probaré cuando me haga falta.

Hay va:
Se reinicia el PC y cuando aparece la pantalla de la BIOS, esa rara que dice cosas raras xd, se pulsa ALT+F10. Aquí sólo hay que seguir los pasos que indica y en breve tendremos nuestro notebook como cuando lo compramos. Esto supongo que realiza un formateo.
Eso es para el Acer Aspire One, supongo que para otros notebooks será algo parecido.

Bueno, lo probaré cuando lo necesite pero ahí queda eso.

Aquí os dejo una referencia:
http://www.boscolopez.com/?p=121

Hasta la próxima.

sábado, 18 de diciembre de 2010

No veo mi red inalambrica y las demás sí, y solo me pasa en un portatil, que hago?

Cosas como estas nos hacen perder mucho tiempo y si buscamos un poco por ahí encontramos soluciones muy buenas.
Y cual es el problema, pues este: Tengo mi router wifi en el cual conecto por cable mi pc de sobremesa, ahora tengo un portatil que detecta sin problemas la red wifi pero mi notebook puede ver las demás pero la mia no. Coño, que pasa aquí, por que no la veo?
Pues lo dicho, navegando por ahí encuento una solución que dice: Hay tarjetas ethernet que no captan los canales 12 y 13 del router y que lo cambie por el 11. Pues hecho y a funcionar.
No voy a entrar en detalle como se cambia porque cada router debe ser un mundo pero lo lógico es que este en la sección de wireless, configuración avanzada, supuestamente habrá una entrada donde se pueda indicar el canal que por defecto suele ser el 13 (por lo menos en el mio).

Pues ala, aquí os dejo el link de donde saque la información que a mi sí me sirvio.
http://www.forospyware.com/t168357.html

Hasta pronto amigos.