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.