jueves, mayo 29, 2014

Libro Software Development

El Desarrollo de Software es una actividad compleja, el Desarrollador debe tener ciertas destrezas que deben ser pulidos y mejorados, de esta manera lograremos un avance significativo en nuestra profesión, este libro nos permite conocer aquellos aspectos del Desarrollo de Software que son desconocidos por muchos de nosotros, recomiendo leerlo, una vez adquirido el conocimiento aplicarlo.

Preview


lunes, mayo 12, 2014

AX2009: Importar Proyectos AX 2012 a AX 2009

En ciertos momentos se requiere reutilizar componentes desarrollados en Axapta 2012 a versiones inferiores de AX, como por ejemplo AX 2009. La tarea no termina en importar el archivo XPO a la versión AX 2009 directamente; debido a ciertos requerimientos del nuevo formato xpo de AX 2012 tendremos el siguiente mensaje de error:


Para solucionar este inconveniente se requiere realizar la siguiente modificación en cada uno de los componentes de software que se encuentran en el Proyecto (Archivo XPO).

Abrir el archivo XPO con un editor de texto (NotePad esta bien) y realizar la modificación siguiente:

- Borramos la línea Origin.
- Añadimos la línea Versión: 3



Posterior a esto, volvemos a importar y podemos verificar que ya no tenemos el error presentado al inicio.

martes, marzo 18, 2014

AX 2012: Utilizando clase estándar UserConnection

Algunas veces es necesario establecer un nuevo contexto en la transacción de la base de datos independiente al que se está utilizando dentro de Axapta. 

Dependiendo de las necesidades o problemas a resolver, en mi caso, necesito establecer un Log de errores de la información procesada, como buenas prácticas es recomendable establecer un ámbito de transacción cuando trabajos con datos de la base de datos.  ¿Que quiere decir esto? simplemente asegurar la consistencia de la información cuando manipulamos los datos para ingreso, eliminación y actualización de la información, para que cuando existe algún error dentro de nuestro ámbito de la transacción el motor de base de datos pueda realizar el rollback y de esta forma la consistencia de la información es manejada adecuadamente.

¿Que sucede cuando dentro de nuestro ámbito de la transacción tenemos el proceso para registrar el log de errores de nuestras transacciones?

Obviamente, cuando exista un rollback, toda la información ingresada, actualizada o eliminada también es desecha. 

Aquí es donde la clase UserConnection ayuda. Esta clase va permitir establecer un nuevo ámbito de transacción de base de datos, independiente al que maneja el Axapta, permitiendo mantener la información de la tabla con la información que se desea, sin importar si existe un rollback

La forma de utilizar la clase UserConnection para ingresar y actualizar información difiere.

- Para ingresar información:

  UserConnection   userConnection;
  TestTable testTable; //buffer Tabla

  ;
  ttsbegin;

  //instancia de la clase
  userConnection = new UserConnection();

  testTable.NoYesError = NoYesError::Error;
  testTable.LogText = strFmt("Error de parametrización");
  testTable.setConnection(userConnection); //establecer el nuevo ámbito de conexión base datos
  testTable.insert();

  ttscommit;

- Para actualizar información:

 UserConnection   userConnection;
  TestTable testTable; //buffer Tabla

  ;

  //instancia de la clase
  userConnection = new UserConnection();

  userConnection.ttsbegin(); //comienzo transacción

  testTable.setConnection(userConnection); //establecer el nuevo ámbito de conexión base datos

  select forUpdate testTable; //consulta del registro a actualizar
                       
  testTable.NoYesError = NoYesError::Error;
  testTable.LogText = strFmt("Error de parametrización");

  testTable.update();

  userConnection.ttscommit(); //transacción finaliza ok





miércoles, octubre 09, 2013

Axapta: Macros en sentencias SQL

Macros en sentencias SQL
Uno de los beneficios de utilizar macros es que permiten especificar sentencias parciales de consultas en código X++, las cuales pueden ser reutilizadas en varias partes a lo largo de cualquier aplicación.

Beneficios:

·         Reutilización de código,

·         Mejora la lectura del código fuente,

·         Mayor flexibilidad a modificaciones,

·         Reducir el tiempo de desarrollo.

 Ejemplo de uso:

Clase con dos métodos que realizan consultas a la base de datos.

Método: custPaymentProcess
 
 
Método: advancesProcess
 
Luego del análisis realizado a estos dos métodos se puede observar que las consultas pueden ser utilizadas dentro de macros, de esta forma, se puede mejorar la visibilidad del código fuente y hacer uso de la reutilización del código.
Para lo cual creamos dos macros:
Todo se simplifica utilizando macros
·         Macro FieldsCustPaymentHeader
 
A continuación la explicación al código.
o   El %1, %2, %n permite pasar argumentos a nuestra macro, esto permite definir desde donde se llama la macro las variables que queremos utilizar dentro de esta.
o   #ifNot.Empty(%n) permite definir un rango condicionante de acuerdo al argumento que se esté enviando a la macro. En este ejemplo comprobamos si el parámetro enviado en la tercera posición no está vacío ejecuta todo el bloque #ifNot.Empty(%3) …#EndIf
o   #EndIf identifica que es el final de la macro condicionante.
o   #if.Empty(%n) permite comprobar si el parámetro enviado en la posición %n es vacía, entonces se ejecuta todo lo que se encuentra en el bloque #If .Empty…#EndIf


·         Macro FieldsCustPaymentLine

 
La explicación expuesta en la primera macro aplica en esta.


Utilización de la macro en consultas SQL en X++

Modificamos nuestro código original para remplazar con las macros creadas anteriormente.


En el segundo método tenemos:



De esta forma la utilización de macros en las sentencias SQL nos permite una gran flexibilidad a la hora de desarrollar aplicaciones en Axapta.

 

jueves, mayo 23, 2013

Dynamics AX Performance Optimization Guide

Hola, he obtenido mi copia impresa del Libro Dynamics AX Performance. Revisaré y compartiré mis comentarios sobre este nuevo libro que no debería faltar en la biblioteca de cualquier desarrollador Dynamics AX.

martes, enero 08, 2013

AX 2012: MAPAS DESDE AOT

 
Mapas

Los mapas son objetos que asocian un campo del mapa con un campo en una o más tablas. Esto permite utilizar el mismo nombre del campo para acceder a campos con diferente nombre en diferentes tablas. Los métodos del mapa le permiten crear o modificar métodos que actúan en los campos del mapa.

Una tabla puede ser accedida a través de más de un mapa. Típicamente, si más de un mapa accede a la misma tabla, cada mapa accede a diferentes subconjuntos de campos en el mapa. Los mapas no definen objetos de base de datos y así los mapas no se sincronizan con la base de datos.   

Beneficios

Simplicidad. Los mapas proporcionan una interfaz simple a los campos en múltiples tablas. Esto quiere decir que cualquier objeto que hace referencia al campo del mapa puede ser utilizado contra múltiples tablas sin cambiar ningún nombre del campo.
Consistencia.- los campos de las tablas con nombres variados pueden ser accedidos en código de una manera consistente. Por ejemplo utilizando un mapa, los campos nombrados Zip en una tabla, ZipCode en otra, y PostalCode en otra tabla pueden todos ser accedidos por el nombre ZipCode.  

Reutilización de código. Un método del mapa permite añadir código que se ejecute contra los campos del mapa. Un método sencillo del mapa previene la duplicidad de métodos y código en cada tabla.

Elementos del Mapa

Fields. El nodo Fields contiene los elementos del campo del mapa. Cada campo debe ser del mismo tipo de dato a la cual es asociado.
Field Group. Contiene grupo de campos asociados lógicamente. Trabajan de la misma forma que en las tablas.

Mappings. Es el lugar donde los campos del mapa son asociados con los campos de las tablas. Aquí están las tablas que el mapa combina. Sobre cada tabla puede ver cual campo de la tabla está asociado con un campo del mapa. Si un campo existente en el mapa no está asociado a un campo particular de la tabla, solo dejar la propiedad MapFieldTo en blanco.

Methods. Despliega todos los métodos disponibles para el mapa. En este nodo puede añadir nuevos métodos o sobrescribir métodos de la clase kernel xRecord y añadir su propio código.
 
EJERCICIO
·         Crear un Mapa utilizando el AOT
 
1.      Crear dos tablas con la siguiente estructura de datos:
 

 
2.      En el AOT expandir el Data Dictionary, click derecho en Maps y luego en Nuevo Mapa. Establecer el nombre del mapa CustVendMyMap
 

3.      Expandir el nuevo mapa, click derecho en Fields, click en Nuevo, luego seleccionar el tipo de dato para añadir un campo al mapa.
 También puede utilizar la funcionalidad de “Arrastrar y Soltar” para añadir los campos del mapa.
 

 
4.      Repetir el paso 2 para añadir más campos al mapa.
5.      Si el campo del mapa está asociado con un campo de la tabla que es un tipo de dato extendido, establecer la propiedad ExtendedDataType.
6.      Organizar los campos relacionados en grupos.
7.      Asociar los campos del mapa con campos específicos de la tabla.
 
a. Click derecho sobre Mappings, luego click en Nuevo Mapping. Un nuevo mapeo es añadido con todos los campos del mapa definidos en el paso 2.

b.Click derecho en el nuevo mapeo, click en Propiedades, luego establecer la tabla en la propiedad MappingTable. Seleccionar como valor de esta propiedad la tabla CustBirthDay

c. Expandir el nuevo mapeo y luego click derecho en nodo campo.
d.                      Click en Propiedades, y luego seleccionar un campo desde la lista de la propiedad MapFieldTo.
 

 
La lista de campos disponibles varía dependiendo del tipo de dato que seleccionado en el paso 2.
e. Repetir el paso 6d para cada nodo de campo que está desplegado abajo del nuevo mapeo.

8.       Grabar los cambios del mapa.
9.      En el nuevo Mapa creado nos ubicamos en el nodo Methods, click derecho y seleccionamos cancelar método y luego validateWrite
 

 
10.  Reemplazamos el código por lo siguiente:

11.  Grabar los cambios del mapa.
12.  En el AOT buscamos la tabla VendBirthDay.
13.  Ubicamos el nodo Methods, click derecho y seleccionamos cancelar método y luego validateWrite

14.  Añadimos desde el editor de código la siguiente línea:

15.  Creamos un nuevo Job para la ejecución de nuestra pruebas