lunedì 24 aprile 2023

D365 FFO - Aggiungere campo multiselect lookup

In questo post vediamo come aggiungere un campo di tipo lookup-multiselect  che punta alle delivery modes ad una form STD (CustParameters nel nostro caso). Ho trovato in giro diverse soluzioni, quella che mi sembra logicamente più corretta è quella di memorizzare i valori selezionati in una tabella dedicata, piuttosto che scrivere i valori sul controllo unbound stesso.

1) Per prima cosa creiamo una tabella che conterrà i recId delle delivery mode selezionate.La tabella che chiameremo LILCustParametersDlvMode conterrà quindi un campo "DlvModeRecId" chiave primaria



2) Aggiungiamo ora un controllo di tipo string alla form CustParameters nel tab general e settiamo le seguenti proprietà:

  • Autodeclaration = Yes
  • Name = CustParameters_DlvModes
  • Filter Expression = %1
  • Label = @SYS210

3) Creare un oggetto query avente come datasource la tabella DlvMode e come campi Code e Txt



4)Creare una classe CoC che chiameremo LILCustParametersForm_Extension per estendere la form cust parameter:

 [ExtensionOf(formStr(CustParameters))]  
 final class LILCustParametersForm_Extension  
 {  
   private SysLookupMultiSelectCtrl        msCtrlDlvMode;   
   
   //effettual il binding dei valori tra il campo e la tabella LILCustParametersDlvMode  
   void bindCustParametersDlvMode()  
   {  
     container            catalogIds, catalogValues;  
     LILCustParametersDlvMode    custParametersDlvMode;  
     DlvMode             dlvMode;  
     container            dlvModeIds,  
                     dlvModeValues;  
   
     while select custParametersDlvMode  
       join dlvMode  
       where dlvMode.RecId == custParametersDlvMode.DlvModeRecId  
     {  
       dlvModeIds   += [dlvMode.RecId];  
       dlvModeValues  += [dlvMode.Code];  
     }  
   
     msCtrlDlvMode.set([dlvModeIds, dlvModeValues]);  
   }  
   
   public void saveDlvMode()  
   {  
     int                 counter;  
     RecId                recId;  
     LILCustParametersDlvMode      custParametersDlvMode;  
   
     container  dlvModes = msCtrlDlvMode.get();  
   
     ttsBegin;  
   
     //elimina i valori preesistenti  
     delete_from custParametersDlvMode;  
         
     //Salva i nuovi valori selezionati  
     for (counter = 1; counter <= conlen(dlvModes); counter++)  
     {  
       recId = any2int64(conpeek(dlvModes, counter));  
   
       if (recId)  
       {  
         custParametersDlvMode.clear();  
   
         custParametersDlvMode.DlvModeRecId = recId;  
   
         custParametersDlvMode.insert();  
       }  
     }  
   
     ttsCommit;   
   }
   
   private void initAndBindCustParametersDlvMode()
   {
       msCtrlDlvMode = SysLookupMultiSelectCtrl::construct(this, CustParameters_DlvModes, queryStr(LILDlvModeQuery));

       this.bindCustParametersDlvMode();
   }
   
   public void init()  
   {  
     next init();  
   
     this.initAndBindCustParametersDlvMode();
   }  
 }    

5)Sottoscrivere l'evento modified del controllo CustParameters_DlvModes per gestire l'inserimento dei valori:
 class LILCustParametersFormEH  
 {    
   [FormControlEventHandler(formControlStr(CustParameters, CustParameters_DlvModes), FormControlEventType::Modified)]  
   public static void CustParameters_DlvModes_OnModified(FormControl sender, FormControlEventArgs e)  
   {  
     FormRun formRun = sender.formRun() as FormRun;  
   
     formRun.saveDlvMode();  
   }  
 }  

lunedì 17 aprile 2023

Keep CR/LF from SQL Grid to copy

 

It's just a kind suggestion.

Could be happen, copying from SQL grid to text editor the carriage return or line feed are missing

 


Go to SQL TOOLS – Options … ENABLE the flag
Retain CR/LF on copy or save



Open a NEW Tab (in order to load the new parameters), now it works.

 


enjoy