vendredi 21 décembre 2012

Envoyer un report directement sur une imprimante

Ajouter ou modifier la méthode init() à la racine du report: 

public void init()
{
      str printer;
      ;
      printer = '\\\\serveur\\imprimante';
      this.deviceName(printer);
      this.setTarget(printMedium::printer);
      super();
}

mardi 18 décembre 2012

Bonjour à tous

Je me lance aujourd'hui dans un blog sur Dynamics AX, j'ai trouvé que ce serait bien de partager mes connaissances d'utilisateur et développeur sur cet ERP.

Générer un fichier Excel en X++

Voici le code pour générer un fichier Excel avec du code X++:

public void ExportXLS()
{
      SysExcelApplication     xlsApplication;
      SysExcelWorkBooks    xlsWorkBookCollection;
      SysExcelWorkBook      xlsWorkBook;
      SysExcelWorkSheets   xlsWorkSheetCollection;
      SysExcelWorkSheet     xlsWorkSheet;
      SysExcelRange             xlsRange;
      CustTable                       CustTable;
      int                                    row = 1;
      str                                    fileName;
      FileIOPermission          perm;
      ;
      fileName = "\\\\nomServeur\\dossier\\nomFichierExcel.xls";

      xlsApplication = SysExcelApplication::construct();

      xlsWorkBookCollection    = xlsApplication.workbooks();
      xlsWorkBook                     = xlsWorkBookCollection.add();
      xlsWorkSheetCollection   = xlsWorkBook.worksheets();
      xlsWorkSheet                    = xlsWorkSheetCollection.itemFromNum(1);

      //Ajoute des entêtes de colonne
      xlsWorkSheet.cells().item(row,1).value("Numéro de client");
      xlsWorkSheet.cells().item(row,2).value("Nom");
      row++;

      //Ajoute les lignes avec le no et le nom du client
      while select custTable
          {
                xlsWorkSheet.cells().item(row,1).value(custTable.custAccount);
                xlsWorkSheet.cells().item(row,2).value(custTable.name);

           }

    //Si le fichier existe on le supprime
    if(WinApi::fileExists(fileName))
       WinApi::deleteFile(fileName);

    //On enregistre le fichier sous le nom contenu dans la variable filename
    xlsWorkbook.saveAs(fileName);
    
    //Fermeture de l'application (plus d'excel.exe dans le gestionnaire de tâches windows
    xlsApplication.quit();
    xlsApplication.finalize();
    xlsApplication = null;
}

NB: ce code ne semble pas fonctionner dans le cadre d'un traitement par lot, la classe WinAPI pose problème car elle n'est pas supportée dans le cadre d'un traitement de type serveur, j'ai vu dans des forums qu'il fallait plutôt utiliser la classe winAPIServer et gérer des permissions avec le code suivant:

perm = new FileIOPermission(filename,'rw');
perm.assert();

à insérer après la boucle while et

CodeAccessPermission::revertAssert();

avant xlsApplication.quit();
mais ça n'a pas l'air de marcher mieux (en tout cas dans mon environnement AX 2009 sans SP1)

Si on veut ouvrir le fichier: remplacer les dernières lignes par le code suivant:

xlsApplication.visible(true);