Wednesday, February 27, 2013
Créer un enum dynamique sous AX 2012
Voici un article intéressant de l'excellent Blog de Sreenath qui permet de manipuler un enum sous AX dynamiquement.
En effet, les enums peuvent parfois posés problème lorsque nous souhaitons les filtrer en fonction du contexte de connexion (user, entité juridique, rôles, groupes AX etc...)
Sous 2012, une nouvelle EnumDialogComboBox a été ajouté à l'AOT et permet cette manipulation plus simplement qu'en 2009.
Voici un autre article qui concerne une implémentation similaire sous DAX 2009 utilisant une classe customisée (SysCustomizedEnumComboBox).
Tuesday, January 29, 2013
Solution pour fusionner des PDF sous AX
Voici une solution intéressante pour fusionner des PDF sous AX Dynamics en utilisant une librairie C# de CodePlex (PDFSharp) : dynamicsaxgyan.wordpress.com/2012/08/15/merge-multiple-pdfs-in-to-single-pdf-report-using-x-in-dynamics-ax-2012/
Attention, il y a une petite coquille dans le code de sreenath qui a été relevé dans un commentaire de son article (cela donne une erreur de dépassement de boucle dans la librarie PDFSharp).
static void SR_MergePDFs(Args _args)
{
PdfSharp.Pdf.PdfDocument outPutPDFDocument = new PdfSharp.Pdf.PdfDocument();
PdfSharp.Pdf.PdfDocument inputPDFDocument = new PdfSharp.Pdf.PdfDocument();
PdfSharp.Pdf.PdfPages pdfPages;
container con = ["c:\\test2.pdf","c:\\test1.pdf"];
// winapi::findfirstfile
int i, j, pageCount;
FileName pdfFile;
InteropPermission permission;
str errorMessage;
;
try
{
permission = new InteropPermission(InteropKind::ClrInterop);
permission.assert();
for (i = 1; i <= conLen(con); i++)
{
pdfFile = conPeek(con,i);
inputPDFDocument = PdfSharp.Pdf.IO.PdfReader::Open(pdfFile, PdfSharp.Pdf.IO.PdfDocumentOpenMode::Import);
outputPDFDocument.set_Version(inputPDFDocument.get_Version());
pageCount = inputPDFDocument.get_PageCount();
pdfPages = inputPDFDocument.get_Pages();
// modification
if (pageCount > 0)
{
for (j = 0 ; j < pageCount; j++)
{
outputPDFDocument.AddPage(pdfPages.get_Item(j));
}
}
}
outputPDFDocument.Save("c\\mergedFile.pdf");
CodeAccessPermission::revertAssert();
}
catch(Exception::CLRError)
{
// Get the CLR error before any other CLR operation
errorMessage = AifUtil::getClrErrorMessage();
CodeAccessPermission::revertAssert();
throw error(errorMessage);
}
}
Thanks to sreenath for this nice solution.
Attention, il y a une petite coquille dans le code de sreenath qui a été relevé dans un commentaire de son article (cela donne une erreur de dépassement de boucle dans la librarie PDFSharp).
static void SR_MergePDFs(Args _args)
{
PdfSharp.Pdf.PdfDocument outPutPDFDocument = new PdfSharp.Pdf.PdfDocument();
PdfSharp.Pdf.PdfDocument inputPDFDocument = new PdfSharp.Pdf.PdfDocument();
PdfSharp.Pdf.PdfPages pdfPages;
container con = ["c:\\test2.pdf","c:\\test1.pdf"];
// winapi::findfirstfile
int i, j, pageCount;
FileName pdfFile;
InteropPermission permission;
str errorMessage;
;
try
{
permission = new InteropPermission(InteropKind::ClrInterop);
permission.assert();
for (i = 1; i <= conLen(con); i++)
{
pdfFile = conPeek(con,i);
inputPDFDocument = PdfSharp.Pdf.IO.PdfReader::Open(pdfFile, PdfSharp.Pdf.IO.PdfDocumentOpenMode::Import);
outputPDFDocument.set_Version(inputPDFDocument.get_Version());
pageCount = inputPDFDocument.get_PageCount();
pdfPages = inputPDFDocument.get_Pages();
// modification
if (pageCount > 0)
{
for (j = 0 ; j < pageCount; j++)
{
outputPDFDocument.AddPage(pdfPages.get_Item(j));
}
}
}
outputPDFDocument.Save("c\\mergedFile.pdf");
CodeAccessPermission::revertAssert();
}
catch(Exception::CLRError)
{
// Get the CLR error before any other CLR operation
errorMessage = AifUtil::getClrErrorMessage();
CodeAccessPermission::revertAssert();
throw error(errorMessage);
}
}
Thanks to sreenath for this nice solution.
Configuration des emails sous DAX 2012
Voici un lien utile pour paramétrer les emails sous AX Dynamics 2012 : lien
Voici les pages également de référence coté Microsoft : Manage email
Ne pas oublier de gérer la partie batch qui s'occupe d'envoyer les notifications par mail (traitement par lot des mails dans System Administration).
Pour tester les emails en environnement de dev, un outil smtp/pop3 comme Argosoft + un thunderbird portable vous permettra de remplacer un système d'email coûteux.
Voici les pages également de référence coté Microsoft : Manage email
Ne pas oublier de gérer la partie batch qui s'occupe d'envoyer les notifications par mail (traitement par lot des mails dans System Administration).
Pour tester les emails en environnement de dev, un outil smtp/pop3 comme Argosoft + un thunderbird portable vous permettra de remplacer un système d'email coûteux.
Friday, January 25, 2013
Cache du client et multi environnement sous AX 2012
Un article très clair et détaillant la gestion du cache client par AX Dynamics.
L'auteur détaille notamment la manière de faire en cas de restauration d'environnement AX sur plusieurs AOS (réinitialisation de la SYSSQMSETTINGS)
http://daxmusings.codecrib.com/2013/01/fixing-code-caching-on-ax-environment.html?showComment=1359104152828#c7999282833205874569
L'auteur détaille notamment la manière de faire en cas de restauration d'environnement AX sur plusieurs AOS (réinitialisation de la SYSSQMSETTINGS)
http://daxmusings.codecrib.com/2013/01/fixing-code-caching-on-ax-environment.html?showComment=1359104152828#c7999282833205874569
Wednesday, January 9, 2013
Problème de taille de table : Fractionner ou augmenter le buffer SQL ?
Recemment, je me suis retrouvé sur un problème lorsque j'ajoutais des champs sur une table temporaire dédié à un report SSRS :
La taille interne d'un enregistrement xxxxxxxxTmp est de 25296 octets, mais les performances de Microsoft Dynamics sont optimisées par défaut pour ne pas dépasser 24576 octets.
Il est vivement conseillé de fractionner la(es) table(s) en unités plus petites.
Vous pouvez également indiquer une valeur « Taille maximale de la marge » de 25 kilo-octets ou plus sous l'onglet « Réglage de la base de données » de l'utilitaire de configuration du serveur Microsoft Dynamics AX. La valeur par défaut est 24 kilo-octets.
Quittez immédiatement Microsoft Dynamics et suivez les instructions ci-dessus. L'utilisation des tables aura des résultats imprévisibles.
Deux solutions :
- Splitter la table
- Augmenter la taille du buffer sur le serveur OAS : Microsoft Dynamics AX Server Configuration Utility > Onglet Database Tuning > Champs Maximum Buffer Size qui est à 24 Kbytes par défaut.
Les conséquences de ce tuning sont minimes. La taille des tables proposés par Microsoft est choisie pour des raisons de performances. Leur augmentation dans la limite du raisonnable na pas d'impact surtout dans le cadre d'une table temporaire.
Théoriquement, voici ce qu'en dit Microsoft : Cliquez ici
La taille interne d'un enregistrement xxxxxxxxTmp est de 25296 octets, mais les performances de Microsoft Dynamics sont optimisées par défaut pour ne pas dépasser 24576 octets.
Il est vivement conseillé de fractionner la(es) table(s) en unités plus petites.
Vous pouvez également indiquer une valeur « Taille maximale de la marge » de 25 kilo-octets ou plus sous l'onglet « Réglage de la base de données » de l'utilitaire de configuration du serveur Microsoft Dynamics AX. La valeur par défaut est 24 kilo-octets.
Quittez immédiatement Microsoft Dynamics et suivez les instructions ci-dessus. L'utilisation des tables aura des résultats imprévisibles.
Deux solutions :
- Splitter la table
- Augmenter la taille du buffer sur le serveur OAS : Microsoft Dynamics AX Server Configuration Utility > Onglet Database Tuning > Champs Maximum Buffer Size qui est à 24 Kbytes par défaut.
Les conséquences de ce tuning sont minimes. La taille des tables proposés par Microsoft est choisie pour des raisons de performances. Leur augmentation dans la limite du raisonnable na pas d'impact surtout dans le cadre d'une table temporaire.
Théoriquement, voici ce qu'en dit Microsoft : Cliquez ici
Thursday, December 20, 2012
Cumulative Update 4 pour DAX 2012 RTM et Feature Pack
Le 02 décembre 2012, Microsoft a publié la mise à jour CU4 pour AX Dynamics 2012.
Cette Cumulative Update 4 reprend les CU3, CU2 et CU1.
La mise à jour contient une partie binaire et une partie fonctionnelle (à tester avec vos customisations).
La partie binaire est applicable sur le client riche AX et sur le serveur.
A priori, la sortie de la R2 en décembre et celle du CU4 ne serait pas liées. La R2 apporte des évolutions plus fonctionnelles, sur l'internationalisation de l'application notamment.
La CU4 est basée sur les retours clients/partenaires des releases RTM et Feautre Pack (fonctionnels et applicatifs).
Lien vers la CU4 : KB2765124
Cette Cumulative Update 4 reprend les CU3, CU2 et CU1.
La mise à jour contient une partie binaire et une partie fonctionnelle (à tester avec vos customisations).
La partie binaire est applicable sur le client riche AX et sur le serveur.
A priori, la sortie de la R2 en décembre et celle du CU4 ne serait pas liées. La R2 apporte des évolutions plus fonctionnelles, sur l'internationalisation de l'application notamment.
La CU4 est basée sur les retours clients/partenaires des releases RTM et Feautre Pack (fonctionnels et applicatifs).
Lien vers la CU4 : KB2765124
Wednesday, December 19, 2012
Conflit d'ID à l'import d'un modelStore
J'ai rencontré recemment un problème d'import de ModelStore sur un environnement cible, sur lequel j'ai trouvé peu d'information claire.
Le message d'erreur à l'import est de la forme :
Import-AXModelStore : The pipeline has been stopped.
At line:1 char:20
+ Import-AXModelStore <<<< -file "C:\monmodel.axmodelstore" -Sch
emaName "MONSCHEMA" -Database MADATABASE -Server MONSERVER -D
etails
+ CategoryInfo : OperationStopped: (:) [Import-AXModelStore], Pip
elineStoppedException
+ FullyQualifiedErrorId : Invalid object name 'MONSCHEMA.ModelSecurityComm
on'.,Microsoft.Dynamics.AX.Framework.Tools.ModelManagement.PowerShell.Impo
rtStoreCommand
Il s'agit d'un conflit d'ID lié à des developpements identiques (projet, objet de l'AOT) sur des couches différentes du model AX (ex en couche CUS, ISV, USR...).
Vérifier que vos dev soit bien tous importés dans la bonne couche sur votre serveur de compilation et que vous n'auriez pas importé un XPO en CUS puis une mise à jour de ce XPO en USR par exemple (c'était mon cas).
J'ai résolu en forçant l'écrasement des ID (j'imagine par la couche la plus elevée) en ajoutant un attribut sur la commande powershell Import-AXModelStore :
Import-AXModelStore -file "C:\monmodel.axmodelstore" -SchemaName "monschemas" -Database madatabase -Server monserver -IdConflict "overwrite" -Details
L'Attribut IDconflict peut prendre la valeur reject ou overwirte (comme l'attribut de la commande AXUtil permettant de faire la même opération).
Corriger ensuite votre environnement de compilation :
1) En important dans la bonne couche les XPO en conflit.
2) En supprimant la customisation dans la couche du dessus
3) compiler l'application
4) Extraire le modelstore
5) Réimporter le modelstore sans l'attribut -IDConflict
Attention, veiller à importer le XPO (étape 1) avant de supprimer la modification en couche supérieure, sinon, une perte de données peut être effectuée par la suppression (en cas de création de table ou de champs)
Quelques liens utiles :
Lien sur les méthodes de déploiements
Une discussion qui m'a permit de comprendre
Un white paper microsoft sur le sujet
Le message d'erreur à l'import est de la forme :
Import-AXModelStore : The pipeline has been stopped.
At line:1 char:20
+ Import-AXModelStore <<<< -file "C:\monmodel.axmodelstore" -Sch
emaName "MONSCHEMA" -Database MADATABASE -Server MONSERVER -D
etails
+ CategoryInfo : OperationStopped: (:) [Import-AXModelStore], Pip
elineStoppedException
+ FullyQualifiedErrorId : Invalid object name 'MONSCHEMA.ModelSecurityComm
on'.,Microsoft.Dynamics.AX.Framework.Tools.ModelManagement.PowerShell.Impo
rtStoreCommand
Vérifier que vos dev soit bien tous importés dans la bonne couche sur votre serveur de compilation et que vous n'auriez pas importé un XPO en CUS puis une mise à jour de ce XPO en USR par exemple (c'était mon cas).
J'ai résolu en forçant l'écrasement des ID (j'imagine par la couche la plus elevée) en ajoutant un attribut sur la commande powershell Import-AXModelStore :
Import-AXModelStore -file "C:\monmodel.axmodelstore" -SchemaName "monschemas" -Database madatabase -Server monserver -IdConflict "overwrite" -Details
L'Attribut IDconflict peut prendre la valeur reject ou overwirte (comme l'attribut de la commande AXUtil permettant de faire la même opération).
Corriger ensuite votre environnement de compilation :
1) En important dans la bonne couche les XPO en conflit.
2) En supprimant la customisation dans la couche du dessus
3) compiler l'application
4) Extraire le modelstore
5) Réimporter le modelstore sans l'attribut -IDConflict
Attention, veiller à importer le XPO (étape 1) avant de supprimer la modification en couche supérieure, sinon, une perte de données peut être effectuée par la suppression (en cas de création de table ou de champs)
Quelques liens utiles :
Lien sur les méthodes de déploiements
Une discussion qui m'a permit de comprendre
Un white paper microsoft sur le sujet
Subscribe to:
Posts (Atom)