lunedì 3 settembre 2012

AX 2009 - Lookup custom su dialog

In questo articolo vedremo come effettuare l'override del metodo lookup su un campo di una dialog. Attenzione: non è possibile effettuare l'override del metodo lookup se si stà lanciando un report

Supponiamo di voler effettuare la lookup custum sul campo itemId di una dialog e di vol filtrare solo gli articoli di tipo formula.

La nostra classe, oltre i metodi ( dialog(), getFromDialog(), pack() e unpack()) dovà contenere l'override del metodo dialogPostRun():

 public void dialogPostRun(DialogRunbase _dialog)  
 {  
   ;  
   _dialog.dialogForm().formRun().controlMethodOverload(true);  
   _dialog.dialogForm().formRun().controlMethodOverloadObject(this);  
   _dialog.formRun().controlMethodOverload(true);  
   _dialog.formRun().controlMethodOverloadObject(this);  
   super(_dialog);  
 }  


a questo punto facciamo tasto destro sul controllo per vedere il nome che AX gli ha assegnato:


Come vediamo AX ha assegnato al controllo il nome "Fld1_1". Di conseguenza per effettuare l'override della lookup bisogna aggiungere il metodo Fld1_1_lookup(), se avessimo voluto fare l'override del modified avremmo dovuto aggiungere un metodo chiamato Fld1_1_modifie, in generale quindi la sintassi è <nome controllo>_nome_metodo():

 boolean Fld1_1_lookup()  
 {  
   FormStringControl control = dialog.formRun().controlCallingMethod();  
   SysTableLookup     sysTableLookup =  SysTableLookup::newParameters(tablenum(InventTable), control);  
   Query          query = new Query();  
   QueryBuildDataSource  queryBuildDataSource;  
   QueryBuildRange     queryBuildRange;  
    ;  
   //lista dei campi da mostrare nella lookup  
   sysTableLookup.addLookupfield(fieldnum(InventTable, ItemId));  
   sysTableLookup.addLookupfield(fieldnum(InventTable, ItemName));  
   sysTableLookup.addLookupfield(fieldnum(InventTable, ItemType));  
   //filtri  
   query.addDataSource (tableNum( InventTable) ).addRange( fieldNum( InventTable,ItemType)).   value(queryValue(ItemType::Formula));
  
   sysTableLookup.parmQuery(query);  
   sysTableLookup.performFormLookup();
  
   return true;  
 }   


 A questo punto la nostra lookup sugli articoli mostrerà solo quelli di tipo "Formula":



La stessa cosa potrebbe essere fatta in teoria anche su un campo del "Seleziona",anche se è sconsigliabile farlo, qualora la lookup standard non fosse disponibile:


La nostra classe dovrà così essere modificata:

 class LIL_TestQueryLookup extends RunBaseBatch  
 {  
   Range      range;  
   SysQueryRun   queryrun;  
   DialogRunbase  dialog;  
   #define.CurrentVersion(1)  
   #define.Version1(1)  
   #localmacro.CurrentList  
     range  
   #endmacro  
 }  

 public Object dialog()  
 {  
   FormBuildStringControl queryField;  
   ;  
   dialog = super(dialog);  
   //settiamo le proprietà del controllo   
   //per renderlo attivo, editabile e far apparire il pulsante di lookup  
   queryField = Dialog.dialogForm().control("Fld1_1");  
   queryField.enabled(true);  
   queryField.allowEdit(true);  
   queryField.lookupButton(FormLookupButton::Always);  
   queryField.text("");  
   return dialog;  
 }  

 public boolean getFromDialog()  
 {  
   FormBuildStringControl queryField;  
   boolean ret;  
   ret = super();  
   queryField = Dialog.dialogForm().control("Fld1_1");  
   range = queryField.text();  
   return ret;  
 }  

conviene infine disattivare il pulsante "Select"  ovverridando il metodo showQuerySelectButton() per evitare che l'utente, cambiando range sulla query, possa sovrascrivere il nostro controllo "Fld1_1"

 boolean showQuerySelectButton()  
 {  
   return false;  
 }  

2 commenti:

  1. Ciao, ottima guida! E per ottenere la stessa cosa su un report come posso fare? purtroppo non si puo sovrascrivere il dialogPostRun :(

    RispondiElimina
  2. Ciao,
    Io purtoppo non sono mai riuscito ad ottenere lookup custom sul lancio di un report, anche cercando in rete non ho trovato mai nulla in merito. Anche colleghi più esperti di me dicono che non si può fare..
    La cosa che puoi fare è inserire della validazioni sui valori inseriti

    RispondiElimina