lunedì 24 settembre 2012

AX 2009 - Aggiunta e gestione di immagini come campo di tabella


L'argomento che andiamo a trattare è il caricamento e la visualizzazione di un immagine.
Un caso frequente di utilizzo sono, ad esempio, dei listini articoli con l'immagine dell'articolo dentro AX.

Per prima cosa dovremo creare sulla nostra tabella un nuovo campo di tipo Container,

e impostare le proprietà del campo come segue:


le modifiche a livello di tabella finisco qui, vediamo ora come fare per visualizzare e modificare l'immagine da un form.
Sul form avremo bisogno di due controlli, un campo di tipo Windows e Button.

 impostiamo le proprietà dei controlli come segue:


Adesso  ci mancano solo i metodi per gestire il tutto.
Iniziamo con l'override del metodo clicked del bottone appena creato.

 void clicked()
 {
   FilenameFilter filter = ['Image Files','*.bmp;*.jpg;*.gif;*.jpeg'];
   BinData binData = new BinData();
   str extention, path, nameOfFile;
  
   super();
  
   imageFilePathName = WinAPI::getOpenFileName(element.hWnd(),filter,'', "@SYS53008", '','');
   if (imageFilePathname && WinAPI::fileExists(imageFilePathName))
   {
  
     [path, nameOfFile, extention] = fileNameSplit(imageFilePathName);
     if (extention == '.bmp' ||
       extention == '.jpg' ||
       extention == '.gif' ||
       extention == '.jpeg')
     {
       binData.loadFile(imageFilePathName);
       imageContainer = binData.getData();
       element.showImage();
       element.insert();
     }
     else
     {
       throw error("@SYS89176");
     }
   }
 }  

In seguito dobbimo realizzare i due metodi 'showImage' e 'insert' che abbiamo appena utilizzato. Questi andranno creati a livello dei metodi globali del form. Il metodo 'showImage' serve a visualizzare l'immagine appena caricata mentre il metodo 'insert' ad inserirla e salvarla sul database.

 void showImage()  
 {  
   Image  logoImage;  
   ;
  
   try  
   {  
     element.lock();
  
     if (imageContainer)  
     {  
       logoImage = new Image();  
       logoImage.setData(imageContainer);  
       Image.image(logoImage);  
     }  
     else  
     {  
       Image.imageResource(0);  
       Image.widthValue(32);  
       Image.heightValue(32);  
     }
  
     element.resetSize();  
     element.unLock();  
   }  
   catch (Exception::Warning)  
   {  
     throw error(strfmt("@SYS19312", imageFilePathName));  
   }  
 }  

 void insert()  
 {  
   ;
  
   ttsbegin;
  
   line = MyTable::find(MyTable_ds.KeyField, true);  
   if(line)  
   {  
     line.Image = imageContainer;  
     line.update();  
   }
  
   ttscommit;  
 }  

E' buona norma non mettere l'immagine nella griglia della panoramica principale ma inserirla in uno degli altri tab del nostro form in modo da non appesantire lo scorrimento del dataSource, dovremo allora aver cura anche di effettuare l'override del metodo 'pageActivated', del tab dove inseriremo l'immagine, come segue:

 public void pageActivated()  
 {  
   ;
  
   super();  
   element.loadImage();
 }  

 void loadImage()  
 {  
   Image    img;  
   MyTable  table;  
   ;
  
   table= MyTable::find(MyTable_ds.KeyField);  
   if (table.Image)  
   {  
     img = new Image();  
     img.setData(table.Image);  
     Image.image(img);  
   }  
   else  
   {  
     Image.image(null);  
   }  
 }  

Il risultato che otterremo sarà qualcosa di simile al seguente... :)


Nessun commento:

Posta un commento