Mostrando entradas con la etiqueta AX2012. Mostrar todas las entradas
Mostrando entradas con la etiqueta AX2012. Mostrar todas las entradas

martes, 8 de enero de 2013

Usar DataSets .NET desde AX2012

En las devoluciones de los servicios web, lo normal es devolver datos primitivos (string, int32, array de strings) , así hacemos un servicio compatible con diferentes plataformas.


Para devolver “tablas” de datos, y si la lógica la tenemos en .NET, nos puede ser más cómodo devolver datasets, pero tenemos el inconveniente de estar “complicando” a clientes que no sean .NET.

Por ejemplo, para consumir un servicio web que devolvía un DataSet de .NET en versiones anteriores de Axapta, teníamos que crearnos un clase que nos parseara el dataset a un contenedor. (Un servicio web SOAP devuelve XML)

En esta versión se incluyen unas librerías que nos simulan el ADO, con lo que podemos manipular el dataset “casi” igual que desde .NET. (con algo más de “fontanería”)

¿Un ejemplo?

Partiendo del artículo anterior, prepararemos un proyecto que haga referencia a un servicio web que devuelva un dataset.

Luego, nos crearemos un job que use ese proyecto.


Podemos recuperar los datos según el nombre de la columna, o por índice de columna.

Un saludo.

Consumir servicios web desde AX2012



Tenemos unos servicios webs ya creados y queremos consumirlos dentro de AX2012.

Para ello, crearemos un proyecto “dll” con las referencias web que queramos usar, y ese proyecto lo añadiremos al AOT y podremos usar sus servicios web desde X++.

Añadiendo un proyecto VS a AX2012

En VS2010, creamos un proyecto de tipo “Biblioteca de clases”,y añadiremos las referencias web que queramos usar.



En mi caso, quiero consumir servicios web SOAP creados en .NET 2.0 (no servicios WCF).  Debemos de agregar la referencia web de esta forma:







Con esto, tendremos un proyecto de biblioteca de clases que hace referencia a un servicio web.




Si quisiérais hacerlo con un servicio WCF, el procedimiento debería ser el mismo, salvo que en la ventana “agregar referencia de servicio” deberíamos escribir la url del servicio WCF, y el servicio se crearía en el nodo Service Reference en vez de Web Reference

Una vez añadidos los servicios que queremos usar, debemos añadir este proyecto al AOT.

Para ello, botón derecho en el proyecto y “Añadir proyecto al AOT”.


Si nos vamos al AOT en AX2012, podemos ver en Visual Studio Projects / C Sharp Projects, el proyecto que hemos creado anteriormente.


Añadiendo un nuevo servicio web
Si queremos añadir un nuevo servicio al proyecto creado anteriormente, no hace falta que lo tengamos creado ya que está integrado en el AOT. 

Nos vamos al proyecto que contiene los web services, botón derecho > Editar.
Se nos abre el VS2010 con el proyecto cargado, añadimos las referencias que queramos añadir, y compilamos el proyecto.
Hecho este paso, en el AOT, si restauramos el proyecto, ya nos debe de aparecer el nuevo servicio.

Modificación de un servicio web
Añadir un proyecto al AOT, lo que hace es crear un código “proxy” dentro de AX2012 para que se pueda usar desde X++. Esa clase proxy va mapeada a llamadas a la DLL, que dentro tienen otra clase proxy con llamadas al web service SOAP.
Si cambia el Web Service, se rompen esos mapeos y da error. Para ello, hay que actualizar el proxy de dentro del proyecto DLL.
Para ello, editamos el proyecto  (Visual Studio Projects > C Sharp Projects > Proyecto de WS > botón derecho > Editar )
Nos situamos sobre el proxy que queremos actualizar, y botón derecho > actualizar referencia web. Este paso vuelve a generar el proxy.



Compilamos y cerramos proyecto.

Consumiendo el servicio web

Para consumir el proyecto, relizaremos el ejemplo con un job.





Mediante el método set_Url, podemos cambiar la URL del servicio, por lo que nos permite tener webservices de producción y de prueba.


En el siguiente artículo, pondré un ejemplo de cómo recuperar información de DataSets de .NET dentro de X++.
Espero que os sirva este ejemplo. Un saludo.






lunes, 1 de octubre de 2012

Diagrama de tablas en Ax2012

Hola.

Estamos "lidiando" con la estructura de tablas y las relaciones que tiene el nuevo AX2012.

La teoría y la recomendación es que no se acceda a las tablas directamente, ya que hay unas opciones muy válidas para integrar aplicaciones en Ax2012 como Interop, AIF y Business Connector

Pero si necesitáis atacar a las tablas directamente, no queda otra que comprender su estructura.
Para ello, comparto (con permiso de mis compañeros), los diagramas de relaciones de los módulos que hemos ido necesitando.

Nombres y direcciones

Como sabéis, en AX2012 se ha creado un AddressBook que ha normalizado todos los nombres y direcciones en tablas relacionadas. Este es el diagrama que relaciona estas tablas:

Tablas que intervienen:

Vistas que intervienen:

  • DirPartyContactInfoView (Enlace )
  • DirPartyPostalAddressView (Enlace )
  • DirPartyNameView (Enlace )

Dimensiones

Tablas que intervienen:

  • DimensionAttributeValue (Enlace )
  • DimensionAttributeValueSetItem (Enlace )
  • DimensionAttribute (Enlace )

Vistas que intervienen:

  • DefaultDimensionView (Enlace )

Personal, trabajadores y roles de proyecto

Tablas que intervienen:



Cuentas Contables (antigua LedgerTable)


Tablas que intervienen:

  • MainAccount (Enlace )
  • MainAccountLegalEntity (Enlace )
  • DimensionAttribute (Enlace)
  • DimensionAttributeValue (Enlace)
  • DimensionAttributeValueCombination (Enlace)
  • DimensionAttributeValueFinancialStmt (Enlace)


Diarios (antigua LedgerTrans)


 Tablas que intervienen:


  • LedgerEntryJournal (Enlace )
  • GeneralJournalEntry (Enlace )
  • SubledgerVoucherGeneralJournalEntry (Enlace )
  • FiscalCalendarPeriod (Enlace )
  • LedgerEntryJournalizing (Enlace)
  • GeneralJournalAccountEntry (Enlace)
  • LedgerEntry (Enlace )
  • TaxTransGeneralJournalAccountEntry (Enlace)
  • TaxTrans (Enlace )
  • DimensionAttributeValueCombination (Enlace )






De momento esto es todo. Si van surgiendo nuevos diagramas los iré subiendo.
Y si la entrada te ha sido de utilidad, pincha en la publicidad para que Google me financie algún café al año. ¡Gracias por adelantado!
Saludos!!!







martes, 18 de septiembre de 2012

Tipos de integración VS2010 - AX 2012


Con motivo de la integración de nuestras aplicaciones .NET con Microsoft Dynamics AX 2012, he ido resumiendo la información que he ido leyendo y probando.

AX2012 proporciona las siguientes formas de integrarse con aplicaciones:


Managed Interop o Proxy Classes.


http://msdn.microsoft.com/en-us/library/gg879799


http://msdn.microsoft.com/EN-US/library/gg889166


 Te permite acceder a las Clases, Tablas y Enums del AOT (Application Object Tree) de Ax2012 desde Visual Studio a través de Proxys, así como ver datos de display, métodos, etc... directamente, por lo que tienes un acceso a ALTO NIVEL a los objetos de Axapta.

Este método de acceso, comparado con el Business Connector, tiene la ventaja de tener Intellisense de las clases, tablas y enums que vas manejando, así como la detección de errores por parte del compilador, al ser objetos tipados.

Aquí recomiendo la consulta de “Tips de integración AX2012” si surge algún error.

Pasos para usar Interop:

  • Nos creamos un nuevo proyecto en Visual Studio 2010 (en un equipo que tengamos instalado AX2012 con las Developer Tools)
  • En el proyecto que vayamos a acceder a Ax, creamos una referencia a Microsoft.Dynamics.AX.ManagedInterop que se ubica en “C:\Program Files (x86)\Microsoft Dynamics AX\60\Client\Bin”
  • Botón derecho en el proyecto en el “explorador de soluciones” -> Add Project1 to AOT. 
  • Se nos habrá creado una ventana “Application explorer” (que la podemos sacar de Ver > Application Explorer) en la que tenemos el AOT de AX2012.








  • Elegimos los objetos con los que queremos interactuar del AOT (recuerda: Tablas, clases y enumerados) y los arrastramos al árbol de proyecto en el Explorador de Soluciones de VS2010. Esto nos creará unos proxys con los que podremos trabajar
  •  Usaremos los proxys
Un ejemplo de uso:









Fijaos en el consumo de VendTable. VendTable es el proxy que se ha generado al arrastrar la tabla al árbol de proyecto.  Estamos usando el método FindByCompany, y luego estamos recuperando la información de forma tipada, con Intellisense, e incluso, pudiendo llamar a Displays y métoodos. 


Business Connector for .NET


NOTA: Se recomiendan los otros tipos de integración, ya que este método se mantiene por compatibilidad con anteriores desarrollos, y no se garantiza su continuidad en futuras versiones. 

Es otro componente que permite accede a los elementos del AOT, pero sin tener proxys ni tipos, y llamando directamente a sus métodos y propiedades.

Ataca un nivel más bajo que los proxyes de Interop, ya que los campos display y los métodos hay que llamarlos mediante Call() y no aparecen integrados dentro de la llamada principal.

Vuelvo a hacer referencia a  “Tips de integración AX2012” por si surge algún error.

Pasos para usar Business Connector.

Son unos pasos parecidos al Managed Interop.
  •  Nos creamos una solución en Visual Studio 2010 (en un equipo que tengamos instalado AX2012 con las Developer Tools)
  • En el proyecto que vayamos a acceder a Ax, creamos una referencia a Microsoft.Dynamics.BusinessConnectorNet.dll que se ubica en “C:\Program Files (x86)\Microsoft Dynamics AX\60\Client\Bin”
  • Botón derecho en el proyecto en el “explorador de soluciones” -> Add Project1 to AOT.
  • Creamos el código.

Si habéis trabajado con el AxaptaComConnector de la versión 3, esto os recordará su manejo.

También fijaos que los Displays Name y Email hay que llamarlos. En el proxy generado de Managed Interop, estas llamadas estan incluidas en el proxy, por lo que el código resultante es más compacto.
Application Integration Framework (AIF)

http://axwonders.blogspot.com.es/2012/01/microsoft-dynamics-ax-2012-services-and.html

El AIF es una plataforma que permite interactuar con cualquier aplicación, ya sea .Net o de otro tipo, ya que la comunicación se basa en WCF.

Algunos de estos servicios se pueden publicar en el AOS (Application Object Server) o en el IIS.
Por buscar símiles, el IIS expone servicios WCF y el AOS expone los servicios AX2012

El AIF se compone de:
  • Document Services
  • Custom Services
  • System Services

Document Services
Su símil con WCF sería el Contract; o sea, el objeto que se expone al servicio. Se trata de una query autogenerada (query con prefijo AXD ) a partir de una entidad determinada. Microsoft ya ha creado unos 70 documents de las entidades más representativas, a falta de exponerlos en el AIF.

Los campos DEL_ de las tablas y los campos con la propiedad "Visible=false" no son incluidos en el documento.

En el caso de que quisiéramos crear nosotros nuestro propio document Service , se puede seguir el siguiente walkthrough


Pasos para crear un Document Service.

  • Creamos la Query (o buscamos la query AXD ya generada que nos cuadre)
  • Creamos el servicio basándonos en la query (Espacio de desarrollo > herramientas > Marco de integración de la aplicación > Crear servicio de documentos), eligiendo los métodos que queremos que nos autogenere (Read, Write, Find...)

  • Este paso generará una clase con prefijo AXD y un servicio ya preconfigurado con los métodos que hemos elegido.
  • Nos quedará publicarlo; para ello vamos a Service Groups, creamos un nuevo Service Group y añadimos un nuevo nodo por cada servicio que queramos añadir en el Service Group. En propiedades de cada nodo vamos eligiendo el Service que queremos publicar.
  • Una vez tengamos todo el Service Group completo, implementaremos.
  • Para ver que el servicio está correctamente publicado, lo podremos ver en el espacio de trabajo > Administracion del sistema > Configurar > Services and Application Integration Framework > Puertos de entrada.


Esto te crea un nuevo servicio de tipo "Base" que es creado con una configuración por defecto. Si queremos configurar el adaptador y poder ajustar más opciones, en esa misma pantalla podríamos eliminar y crear un nuevo puerto de entrada, que sería de modo extendido, y permitiría configurar todos los parámetros posibles (configurar el Binding del WCF)
Más info en
http://msdn.microsoft.com/en-us/library/aa609947

Tipos de puertos 

Ya que hemos tocado los puertos, decir que los InboundPorts reciben peticiones desde fuera de AX y los Outbound ports emiten peticiones a otros sistemas.

Consumo de un Document Service

En Visual Studio 2010, nos creamos una referencia de servicio a la dirección que aparece en la imagen superior, en el campo "uri de WSDL"

aquí os pongo un ejemplo de cómo se haría un "read" de un proveedor.


Custom Services

Son unos servicios más flexibles y personalizados que los Document Services, ya que permiten exponer directamente una clase a un servicio, que es lo que hacemos normalmente con WCF.

Pasos para crear un Custom Service.

  • En el AOT, creamos nueva clase
  • Añadimos métodos decorándolos con atributos correctamente. [SysEntryPointAttribute(true), AifCollectionTypeAttribute('return', Types::String)]
  • Creamos un nuevo service, y lo mapeamos a la clase (propiedad class).
  • Dentro de Servicios, en el árbol Operaciones, añadimos las operaciones(seleccionamos los métodos que hemos creado)
  • Creamos un nuevo grupo de servicio, y añadimos nuevos serviceNodeReference asociados a services.
  • Publicamos
Como anteriormente hemos comentado, para ver que el servicio está correctamente publicado, lo podremos ver en el espacio de trabajo > Administracion del sistema > Configurar > Services and Application Integration Framework > Puertos de entrada.

Consumo de un Custom Service

Lo consumiremos como como un servicio normal, creando un Service Reference (que ya hemos visto en los Document Services)





Estos métodos devuelven tipos básicos. Si queremos que devuelva tipos complejos (clases de datos) , usaremos los DataContracts, como en WCF
Para ello, creamos una clase contenedora de datos y la etiquetamos como [DataContractAttribute], s métodos los etiquetando los métodos con [DataMemberAttribute('XXX')]
Más info en:

http://sumitsaxfactor.wordpress.com/2012/06/13/data-contracts-and-custom-services-ax-2012/

System Services


Solo AOS sobre TCP. Usado para recibir metadatos, datos de una query o información de usuario.
Los system services son un conjunto de los siguientes servicios:
  • Query Services
  • Dynamic Query
  • User-session Services
http://msdn.microsoft.com/en-us/library/gg879657.aspx

Query Services

Expone el AOT para realizarle queries. Devuelve datasets. La url es net.tcp://<hostname:port>/DynamicsAX/Services/QueryService

El llamador necesita tener los permisos apropiados para recoger la información.
Se componen de:
  • Static query
  • User-Defined query
  • Dynamic Query
http://msdn.microsoft.com/EN-US/library/gg847959.aspx

Static Query

Query que ha sido definida previamente en el AOT.

http://msdn.microsoft.com/en-us/library/gg863932.aspx

User-defined query

Query definida usando la clase QueryMetaData del MetadataService

Dynamic Query

(Ejemplo: buscar clase KanbanOverviewJobsQueryBuilder)
Query definida en una clase X++ que hereda de AIFQueryBuilder, implementándose en el método Initialize

    QueryServiceClient client = new QueryServiceClient();
    DataSet dataSet;
    Paging paging = null;
    CustTransQueryBuilderArgs args = new CustTransQueryBuilderArgs() { parmCustAccount = "4008" };
    dataSet = client.ExecuteDynamicQuery("CustTransQueryBuilder", args, ref paging);


http://msdn.microsoft.com/en-us/library/gg847959.aspx 

Metadata service

Permite obtener información de los metadatos del AOS.
net.tcp://<hostname:port>/DynamicsAX/Services/MetadataService

http://msdn.microsoft.com/EN-US/library/gg880762.aspx


User - session service

Permite obtener información del usuario llamante. (User Company, timezone, …)
net.tcp://<hostname:port>/DynamicsAX/Services/UserSessionService

http://msdn.microsoft.com/EN-US/library/gg881307.aspx



Y nada más; espero que con esta ayuda os hagáis una idea de qué herramientas tenemos disponibles para integrar apps.

Happy interop!!!



miércoles, 5 de septiembre de 2012

Tips integración VS2010 - AX 2012

Aquí os dejo un post con los problemas y soluciones que voy encontrando al tratar de integrar un proyecto .NET en Visual Studio 2010 con Microsoft Dynamics AX 2012



Problema:

Se añade la referencia al Business Connector, pero da el siguiente error:
El tipo o el nombre del espacio de nombres 'Dynamics' no existe en el espacio de nombres 'Microsoft' (¿falta una referencia de ensamblado?)

Solucion:
El proyecto se compila con el Framework Client profile. Hay que poner el Framework 4.0 completo.

Problema:

Al ejecutar el BusinessConnector  (Microsoft.Dynamics.BusinessConnectorNet) da un System.IO.FileLoadException

“El ensamblado de modo mixto se ha compilado con la versión 'v2.0.50727' del runtime y no se puede cargar en el runtime 4.0 sin información de configuración adicional.”
Solucion:

Debemos de añadir en el App.Config (o en el Web.Config, según se trate de WinForms o Webforms) la siguiente entrada:

<configuration>
   <startup useLegacyV2RuntimeActivationPolicy="true">
   </startup>
</configuration>

- Actualización -
Si estás intentando ejecutar una prueba unitaria, hay que modificar el config del siguiente directorio:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine86.exe.config
Sacado de el blog Diary of a Ninja

Problema:
Da el siguiente error al ejecutar

{"No se puede cargar el archivo o ensamblado 'Microsoft.Dynamics.Ax.Xpp.Support, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.":"Microsoft.Dynamics.Ax.Xpp.Support, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"}

Solución: 
Nos falta hacer login en el sesión de ManagedInterop.

     Microsoft.Dynamics.AX.ManagedInterop.Session session = new Microsoft.Dynamics.AX.ManagedInterop.Session();
     session.Logon(null, null, null, null);
     ....
     session.Logoff();



Hasta aquí es todo. Iré actualizando la lista a medida que me encuentre con más cosas.

Saludos.