Mostrando entradas con la etiqueta Axapta 2012. Mostrar todas las entradas
Mostrando entradas con la etiqueta Axapta 2012. Mostrar todas las entradas

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.