martedì 24 ottobre 2023

D365 FFO - Creare una form di selezione / deselezione

In questo post vediamo come creare una form selezione / deselezione, come quelle che c'è sui batch group per esempio:



La form inoltre avrà anche un campo per poter filtrare il nome degli elementi

Per creare queste form AX mette disposizione l'oggetto "SysListPanelRelationTableCallback"

Allo scopo occorrono 3 Tabelle:

1) Anagrafica dei gruppi (LILGroupTable)

2) Anagrafica degli elementi che assegneremo di volta in volta ai gruppi (LILElementTable)

3) Tabella che contiene il legame (LILGroupElementTable), che sarà interemente gestita tramite l'oggetto "SysListPanelRelationTableCallback"

Ogni elemento inoltre potrà appartenere contemporaneamente a più di un gruppo alla volta.

Le tre tabelle saranno così fatte:




                                                 


Definiamo a questo punto una nuova form con il seguente design:



E che conterrà il seguente codice:
 [Form]  
 class LILGroupElementInfo extends FormRun  
 {  
   SysListPanelRelationTableCallback sysListPanel;  
   Num                groupId;  
   Description            elementNameFilter;  
   
   public void close()  
   {  
     sysListPanel.finalize();  
     super();  
   }  
   
   void init()  
   {  
     #ResAppl  
   
     sysListPanel = SysListPanelRelationTableCallback::newForm(element,  
                element.controlId(formControlStr(LILGroupElementInfo, ListPanelGroup)),  
                "@SYS113180", "@SYS78228", #ImageUser,  
                tablenum(LILGroupElementTable),  
                fieldnum(LILGroupElementTable, ElementId),  
                fieldnum(LILGroupElementTable, GroupId),  
                tablenum(LILElementTable),  
                fieldnum(LILElementTable, ElementId),  
                [fieldnum(LILElementTable, ElementId), fieldnum(LILGroupTable, Description)],  
                fieldNum(LILElementTable, Description), '',  
                identifierstr(Validate), '', '');  
     sysListPanel.parmDataRangeAsFilter(true);  
   
     super();  
   
     sysListPanel.init();  
   }  
   
   public edit str elementNameFilter(boolean _set, str _elementName)  
   {  
     if (_set && _elementName != elementNameFilter)  
     {  
       elementNameFilter = _elementName;  
     }  
   
     return elementNameFilter;  
   }  
   
   void tabChanged(int fromTab, int toTab)  
   {  
     #define.TabGroups(1)  
     #define.TabGroupElement(2)  
   
     groupId = LILGroupTable.GroupID;  
     switch (toTab)  
     {  
       case #TabGroups:  
         break;  
       case #TabGroupElement:  
         sysListPanel.parmDataRangeValue(elementNameFilter ? elementNameFilter : '*');  
         sysListPanel.parmRelationRangeValue(LILGroupTable.GroupID);  
         sysListPanel.parmRelationRangeRecId(LILGroupTable.RecId);  
         sysListPanel.fill();  
         break;  
     }  
   }  
   
   boolean validate(userId _userId, AddRemove _addRemove, SysListPanelRelationTable _listViewHandler)  
   {  
     return true;  
   }  
   
   [DataSource]  
   class LILGroupTable  
   {  
     public boolean validateWrite()  
     {  
       boolean ret;  
   
       str leftTrimedGroupId;  
       str rightTrimedGroupId;  
    
       leftTrimedGroupId = strltrim(LILGroupTable.GroupID);  
       rightTrimedGroupId = strrtrim(leftTrimedGroupId);  
   
       LILGroupTable.GroupID = rightTrimedGroupId;  
   
       ret = super();  
   
       return ret;  
     }  
   
     int active()  
     {  
       int ret;  
   
       ret = super();  
       element.elementNameFilter(true, '');  
       element.tabChanged(0, tab.tab());  
       return ret;  
     }  
   
   }  
   
   [Control("Tab")]  
   class Tab  
   {  
     void tabChanged(int fromTab, int toTab)  
     {  
       element.tabChanged(fromTab, toTab);  
       super(fromTab, toTab);  
     }  
   
   }  
   
   [Control("TabPage")]  
   class Groups  
   {  
     public boolean allowPageDeactivate()  
     {  
       boolean ret;  
   
       ret = super();  
   
       if (!LILGroupTable.RecId)  
       {  
         if (LILGroupTable_ds.validateWrite())  
           LILGroupTable.write();  
         else  
           return false;  
       }  
   
       return ret;  
     }  
   
   }  
   
   [Control("Button")]  
   class FilterButton  
   {  
     public void clicked()  
     {  
       super();  
   
       sysListPanel.parmDataRangeValue(elementNameFilter ? elementNameFilter : '*');  
       sysListPanel.fill(true);  
     }  
   
   }  
   
 }  

Il risultato sarà il seguente: