Buscar en este blog

jueves, 31 de julio de 2014

Crear servicio personalizado AIF – Custom Services, Microsoft Dynamics AX 2012


Aquí voy a presentar cómo se crea un servicio AIF en 4 pasos para consultar el grupo de clientes y exponerlo en un servicio WCF para que sea consumido por cualquier herramienta, por ejemplo .NET. Este ejemplo por supuesto funciona para cualquier escenario donde se necesiten consultar datos de Ax.

Los conceptos básico de AIF no los explico aquí porque supongo que de algo tienen idea si es que están leyendo este post. Y sino tienen toda la teoría referente a este tema, les recomiendo el libro que recientemente (Marzo, 2014) saco Packt Publishing, se llama “Microsoft Dynamics AX 2012 R2 Services” es un libro bastante completo y bien explicado.

Portada de libro

1. Crear los métodos que va a exponer el servicio. Para esto lo primero es crearnos una clase, esta va a servir para exponer las operaciones (métodos), en este caso, consultar el grupo de clientes, le vamos a llamar GRW_InterfazAxCDI_GrupoClientes. Ponemos su propiedad de RunOn en Server para que siempre corra del lado del servidor y consulte ahí siempre los grupos de clientes.

image

Al método que nos consulte los grupos de clientes, le ponemos el atributo SysEntryPointAttribute en true, esto le indica a Ax que es un método del tipo Service Operation.
[SysEntryPointAttribute( true ), AifCollectionTypeAttribute('return' , Types::String)]
//regresa una lista de strings
public List getCustomerGroupList()
{
    CustGroup       custGroup;
    List list = new List(Types::String);  
  
    //seleccionamos todos los grupos de clientes
    while select from custGroup      
    {
        //agregamos los grupos a la lista
        list.addEnd(custGroup.CustGroup);
    }
  
    return list;
}
2. Crear el servicio. Vamos a crear un servicio y agregarle el Service Operation que creamos. Esto lo hacemos en AOT, Servicios –> Nuevo servicio, le ponemos el nombre que queramos que en este caso yo elegí GRW_interfazAxCDI_GrupoClientesServicio y en la propiedad Class seleccionamos nuestra clase anterior llamada GRW_InterfazAxCDI_GrupoClientes.

imageimage

Expandemos nuestro servicio y click derecho sobre “Operations”, seleccionamos “Agregar Operation”, con esto, nos va a mostrar todos los métodos que estén expuestos en nuestra clase, en este caso solo tenemos un método llamado getCustomerGroupList, lo seleccionamos para que se agregue a nuestro servicio.
image    image

3. Crear un Service Group, para exponer nuestro servicio. Vamos a Service Group –> Nuevo Service Group, le ponemos el nombre que queramos y en la propiedad “AutoDeploy” lo marcamos en “Yes”, esto le indica a Ax que este servicio se debe iniciar cuando el AOS se inicie y en la propiedad “Descripción” el nombre con el que se va a exponer nuestro servicio.

image     image

Ahora, sobre el mismo grupo creado vamos a crear un Node Reference y en la propiedad “Service” seleccionamos nuestro servicio que creamos en el paso 2.

image   image

4. Implementar servicio. Sobre el grupo creado, click derecho e Implementar servicio. Esto se tarda un poco.
image

Listo! con esto ya tenemos nuestro servicio creado. Ahora vamos a verlo en Ax.

Consultar nuestro servicio implementado.

Para esto vamos a Administración de sistema –> Configuración –> Servicios y aplicaciones –> Puertos de entrada, ahí buscamos el nombre de nuestro grupo de servicios y podremos ver la URL donde se expone el WSDL.

En esta pantalla debemos verificar que el servicio se encuentra activo, sino esta activo, presionar el botón de “Activar”.
image image
image

Consumir servicio desde .Net

Para probar que el servicio este devolviendo los datos que requerimos, vamos usar el WCF Test Client de Visual Studio, para abrirlo vamos a All Programs -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt y escribimos: wcftestclient
Ya que se abre el WCF test client de .Net, agregamos nuestro servicio copiando la URL del WSDL de nuestro servicio expuesto.

En el WCF Test Client vamos a ver nuestro método expuesto que nos consulta los grupos de clientes, en este caso, solo tenemos que indicar la compañia de la cuál vamos a consultar los datos, ya que siempre que vamos a invocar un servicio, el parámetro por defaul, es el context, le damos doble click y después click en el botón de “Invocar”, con esto veremos el resultado.

Y la otra forma, es crearnos un proyecto de visual studio, agregar la referencia de nuestro servicio y consumirlo, sencillo, no?

Con la referencia me refiero a la URL donde se publico el WSDL del servicio. Y cuando se haya agregado, y esto es solo como tip y al gusto de cualquiera, le dan click derecho al servicio –> Configurar y en la opción “Collection type” elegir System.Collections.Generic.List esto nos facilita la vida en .Net ya que podemos trabajar nuestro resultados con un simple List<string> por ejemplo, es decir, usando listas genéricas fuertemente tipadas. En caso de no hacer eso, tendremos que usar arrays, que a mi en lo personal no me gustan nada nada.

image

Aquí un pedazo de código de ejemplo de cómo leer los datos que estoy recibiendo de ax.

private void button1_Click( object sender, EventArgs e)
{
     //Instanciamos el servicio
     using( ServiceReference1.QueryCustGroupAXClient servicio = new ServiceReference1.QueryCustGroupAXClient())
     {
          List< string> gruposDeClientes = new List< string>();
          StringBuilder cadenaGrupos = new StringBuilder ();

          //Instanciamos el CallContext para enviar la compañia de la que se quiere consultar
          //los grupos de clientes
          ServiceReference1.CallContext paramsCompania = new ServiceReference1.CallContext();
          paramsCompania.Company = "companiaEjemplo" ;

          //Invocamos el servicio enviandole el CallContext como parámetro
          //y lo asignamos a una lista de strings
          gruposDeClientes = servicio.getCustomerGroupList(paramsCompania);

          foreach(String grupoCliente in gruposDeClientes)
          {
               cadenaGrupos.Append(grupoCliente);
               cadenaGrupos.Append( ", " );
          }

          textBox1.Text = cadenaGrupos.ToString();
     }
}

Resultado:
image

Todo lo anterior se hizo desde el mismo segmento de red donde se encuentra el servidor de ax y con usuario de dominio en la misma red.

Qué pasa si por ejemplo nos conectamos por vpn a donde se encuentra el servicio expuesto de ax?
Qué pasa si nuestra máquina no esta dentro del dominio?

Para ambos escenarios debemos enviar las credenciales, eso lo veo en el siguiente post.



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo.


No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 


Consumir servicio personalizado AIF con credenciales   ----->>>>>





4 comentarios:

  1. Genial, muchas gracias. Muy bien explicado.

    ResponderBorrar
  2. Qque tal me gustaria contar con mas informacion acerca de este tema , ¿realizas consultorias?

    ResponderBorrar
  3. Hola, compañeros , estoy realizando este ejemplo , sin embargo recibo una "Exception" al momento de enviarle el contexto, el mensaje es :
    "El tipo esperado era str pero el tipo que se encontró fue record."
    Alguna sugerencia ?

    ResponderBorrar
  4. no se ven las imágenes, puedes volver a subirlas

    ResponderBorrar