vendredi 22 juin 2012

Lenteur des méthodes display

Il est courant de vouloir afficher des informations calculées dans une grid. Pour cela il est possible (entre autres) d'utiliser des méthodes "display".

Il est ainsi possible de définir une méthode "display" sur une table, avec la syntaxe suivante :
display str MyDisplayMethod()
{
     return "Ma méthode display";
Cette méthode peut alors être utilisée dans une grid dont le datasource est la table contenant notre méthode "display".

Rapidement se pose alors un problème de performance. En effet, les grid sous AX étant ce qu'elles sont, on ne peut pas dire que l'optimisation de l'affichage soit leur point fort. L'utilisation des méthodes "display" (pour peu qu'elles contiennent des accès à la base) devient vite problématique du fait de lenteur insoutenables de la grid.

Pour remédier à cela, il est possible de mettre en cache une méthode display. Sur votre form, placez vous sur le datasource mappé sur votre datatable. Il vous suffit d'overrider la méthode "init" du datasource, ainsi :


public void init()
{
    super();
    this.cacheAddMethod(tablemethodstr(MyDataTable,  MyDisplayMethod ));
}

Vous  noterez alors une très nette accélération de l'affichage de la grid.

vous trouvez ici un peu plus de détails sur la méthode de mise en cache.

mercredi 21 mars 2012

Crash d'un client AX

Ce matin au lancement de mon environnement de développement sous AX (et donc du client AX) j'ai eu la mauvaise surprise de tomber sur une erreur Windows qui provoque le crash de l’exécutable AX32.exe.

Bien entendu j'avais à ma disposition un minium d'information, juste un code exception 0xc0000005. J'avais sur mon poste deux autres lanceurs :

  • un pour l'environnement de pré-production
  • un pour l'environnement de production
Le premier plantait comme mon lanceur de dev alors que le second fonctionnement correctement. Le problème ne pouvait donc pas venir de l'installation de mon client AX. Mais pourquoi deux lanceurs différents plantaient-ils de la même façon ?


J'avais sur un autre poste, un lanceur de dev. En me connectant à ce poste sous mon nom, le lanceur fonctionnait correctement. Le problème ne venait donc pas de mon compte AX qui aurait pu être "vérolé".

J'ai ai donc conclu que le problème ne pouvait venir que d'un cache qui se trouverait en local sur mon poste et qui concernerait uniquement l'environnement de développement et de préprod. Pourquoi ces deux lanceurs ?

Il se trouve que ces deux environnements se trouvaient sur le même serveur....

Il m'était arrivé plusieurs fois de partir en quête d'un cache AX mais en abandonnant car ne trouvant pas l'information (par manque de temps aussi). Mais là je n'avais pas le choix.

Et bien le voilà ce fameux cache, vous le trouverez dans le répertoire AppData\Local de votre profil (donc dans "C:\Utilisateurs\<Votre profil>", le cache porte le nom de votre serveur + votre compte AX + extension .auc.

Ce qui explique mon problème de 2 lanceurs puisque mes deux environnements posant problème pointant sur un serveur identique où nous avons deux instances d'AX.

En supprimant le fichier .auc j'ai réglé mon problème.