Posted: Tue Aug 15, 2006 12:48 pm Post subject: Caché de métodos
//**********************************************************
// Tipo : Desarrollo
// Titulo : Caché de métodos
// Codigo : TD0011
// Keywords : Programacion, Axapta 3.0
// Sub-keywords : cacheAddMethod, bwsim, latencia, cache, display
//
//**********************************************************
En el truco de hoy vamos a tratar el tema de los métodos display y como pueden llegar a penalizar el rendimiento de una pantalla en entornos de 3 capas. Así mismo mostraremos como el uso de la caché de métodos de Axapta puede mejorar ostensiblemente dicho rendimiento.
Bien, para empezar, y como siempre … vamos a crear una situación desesperada
Vamos al formulario de artículos (InventTable) y añadimos un display method en el datasource InventTable como el que sigue :
Ahora vamos a arrastrar el display method al grid de la primera solapa como una columna más, de esta forma cuando veamos la lista de artículos … podremos ver el stock físico disponible de cada uno en una columna.
Bueno, la verdad es que … parece que no penaliza mucho el sistema, ¿no es cierto?
Quizá sea porque (al menos en mi caso) lo estamos ejecutando en local o en una red local …
Vamos a simular un entorno un poco más hostil
Vamos al “Axapta Configuration Utility” y añadiremos un parámetro para simular un entorno remoto … por ejemplo … una línea de 32 Kilobytes por segundo y ping (latencia) de 150 milisegundos (cualquier adsl).
Nota : en la documentación indica que el primer parámetro son bytes por segundo, no estoy seguro de si es un error y son bits por segundo. De todas formas he puesto un valor bajo, 32000, si son bytes por segundo … son 256 Kbps (una adsl de las que ya casi no quedan).
Esto tambien podemos configurarlo sin necesidad de tocar la configuración, simplemente hacemos doble clic sobre el ícono de comunicaciones de la barra de estado en la parte inferior derecha de la pantalla de Axapta.
Nos aparecerá una pantalla, en la solapa “Conexión remota” también podemos establecer los parámetros de simulación.
IMPORTANTE : Esto solo funciona si tenemos una instalación en 3 capas (con AOS), si no es así …
Se me ocurre que quizá podamos simular un poco la latencia de la línea introduciendo un delay en nuestro método.
Es decir, podemos suponer que la latencia de la línea es de 150 milisegundos, por tanto … calculamos que cada vez los datos van y vienen una vez son 150 x 2 = 300. A esto le añadimos un ligero retardo de 100 milisegundos en concepto de ancho de banda, tiempo de respuesta del servidor o lo que queramos. Nos da un total de 400 milisegundos que podemos incluir en nuestro método mediante la instrucción sleep().
Podemos dejar el código así :
x++:
display qty Disponible( inventtable itable ) {
inventonHand IonHand;
;
sleep(400); // Con esto simulamos la latencia
IOnHand = InventOnHand::newItemId(itable.ItemId);
return IOnHand.availPhysical();
}
Sigamos con el truco
Si ahora volvemos a entrar a Axapta y vamos a abrir el formulario de artículos (InventTable) … comprobaremos de que manera penaliza nuestro método al pintado del grid y por tanto al rendimiento general del formulario.
Moveos un poco por la pantalla, o incluso mover alguna ventana por encima del formulario abierto de artículos de forma que ocultéis y mostréis nuestro nuevo campo calculado y comprobaréis a lo que me refiero cuando digo ... “penalizar el rendimiento”.
¿Es grave doctor?
Grave … lo que se dice grave … depende de la paciencia del usuario que esté al otro lado de la línea “lenta” y la influencia que tenga el mismo sobre la línea jerárquica de mando en nuestra empresa
Vamos a ver si podemos mejorar un poco el rendimiento.
Para empezar debemos trasladar el método display a la tabla del diccionario en lugar de donde está ahora (el datasource del formulario).
Para eso debemos cambiar un poco el aspecto del mismo (nada complicado) :
NOTA : Si no disponéis de una instalación en 3 capas acordaos de poner la instrucción sleep(400) para simular la lentitud de línea.
Lo dicho, lo creamos en la tabla (del nodo “Data Dictionary/Tables” del AOT) y lo borramos del datasource InventTable del formulario InventTable.
A nivel de grid no es necesario tocar nada.
Ahora debemos modificar el método INIT del datasource InventTable dentro del formulario.
x++:
void init() {
super();
this.query().forceNestedLoop(true);
// Trucos Ax - Añadimos el método a la caché
InventTable_ds.cacheAddMethod(tablemethodstr(InventTable,Disponible));
}
Si ahora probamos de nuevo el formulario … supongo que notaréis la diferencia.
Más cosas sobre esta caché
Si el valor que devuelve el método display depende directamente de el valor de algún campo de la tabla que estamos usando … (imaginemos que estamos mostrando la descripción del grupo de artículos) puede suceder que el usuario modifique el valor de dicho campo y nuestro método siga mostrando el valor antiguo (para eso es la caché, para que no pierda tiempo buscando siempre los valores ).
Para solucionar este tema, es preciso que en el método modified del campo que produce este cambio forcemos el recálculo de nuestro método. Es decir, hay que decirle a Axapta que no lo traiga de la caché sino que vuelva a calcularlo.
Para ello, disponemos de la función cacheCalculateMethod(), mediante la cual obligaremos a recalcular nuestro método.
Hasta aquí hemos llegado, hay más cosas a tener en cuenta cuando nos enfrentamos a aplicaciones que deben usarse de forma remota … ya las iremos viendo
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
Axapta y Dynamics Ax son marcas registradas de Microsoft corporation. Todos los logos y marcas son propiedad de sus respectivos propietarios. Excepto trucosAx.com que este si que es mio :-). (c) 2005 by Manel Querol (Mkz) TrucosAx.com no pertenece ni está asociada a Microsoft corporation. Los fragmentos de código y proyectos importables que aquí se muestren están realizados sobre bancos de pruebas. No nos hacemos responsables de cualquier daño o pérdida de datos que se pudiera originar del hecho de instalar alguno de estos ejemplos en un sistema productivo. Es responsabilidad del usuario ser consciente del impacto que puede ocasionar en sus aplicaciones el uso del código que de aquí extraiga.