giovedì 4 febbraio 2021

D365FFO - Deploy report da power shell

 Con questo comando possiamo deployare un report da power shell:

https://community.dynamics.com/365/financeandoperations/b/daxology/posts/options-to-deploy-ssrs-report-in-d365fo

es:

 cd K:\AosService\PackagesLocalDirectory\Plugins\AxReportVmRoleStartupTask  
   
 .\DeployAllReportsToSsrs.ps1 -PackageInstallLocation "K:\AosService\PackagesLocalDirectory" -Module ApplicationSuite –ReportName SalesInvoice.Report  

lunedì 1 febbraio 2021

D365FFO - Report Extension

 In questo post vediamo come estendere un report STD aggiungendo un nuovo parametro alla dialog di lancio. Come nota tecnica aggiungo che la modifica illustrata è valida solo dall'UP23 in poi. Con questo update infatti X++ permette di usare l'attributo [DataMemberAttribute] nelle estensioni:

https://docs.microsoft.com/en-us/business-applications-release-notes/October18/dynamics365-finance-operations/platform-extensibility4

Vedremo due casi, il primo con un report "semplice" che prevede solo DataContract + DataProvider ( ho preso come esempio il report Vendor transaction in AP --> Inquiries and report --> Vendor transaction) , e il secondo caso più complesso che prevede anche controller e la UIBuilder (ho preso come riferimento il libro giornale Italia). Nel secondo caso segnalo questo link che è stato molto utile:

https://community.dynamics.com/365/financeandoperations/f/dynamics-365-for-finance-and-operations-forum/377499/extend-contract-class-in-d365-fo-to-add-a-new-parameter

Per entrambe i casi aggiungeremo alla dialog un flag per decidere se stampare o meno la partita iva in anagrafica:

CASO 1: Vendor transaction:

1) Fare la Coc sulla data contract così:

 [ExtensionOf(classstr(VendTransListContract))]  
 final class LIL_VendTransListContract_Extension  
 {  
   private boolean showVatNum;  
   
   [  
     DataMemberAttribute('showVatNum'),  
     SysOperationLabelAttribute(literalstr("@SYS8946"))  
   ]  
   public boolean parmShowVatNum(boolean _showVatNum = showVatNum)  
   {  
     showVatNum = _showVatNum;  
     return showVatNum;  
   }  
 }  
2) Creare l'estensione della tabella VendTransListTmp ed aggiungere il nuovo campo

3) Duplicare il report  VendTransListReport aggiungendo sul layout il nuovo campo

4) Fare la Coc sulla DP aggiungendo le logiche per popolare il nuovo campo:

 [ExtensionOf(classstr(VendTransListDP))]  
 final class LIL_VendTransListDP_Extension  
 {  
   private boolean showVatNum;  
   
   public void processReport()  
   {  
     vendTable        vendTableLocal;  
     VendTransListContract  contract = this.parmDataContract() as VendTransListContract;  
     VendTransListTmp    vendTransListTmp;  
   
     showVatNum = contract.parmShowVatNum();  
   
     next processReport();  
   
     if(showVatNum)  
     {  
       vendTransListTmp = this.getVendTransListTmp();  
   
       update_recordset vendTransListTmp  
         setting LIL_VATNUM = vendTableLocal.VATNum  
         join vendTableLocal  
         where vendTableLocal.AccountNum == vendTransListTmp.AccountNum;  
     }  
   }  
 }  

5) Estendere il menu item VendTransList Modificando la proprietà "Object" con "LIL_VendTransListReport"

Ristampando il report possiamo notare il nuovo parametro e la nuova colonna popolata







CASO 2: Libro giornale italia:

Oltre a quanto fatto per il caso1, dobbiamo anche:

1) Creare la nostra controller che estenderà (estensione classica in questo caso) la controller standard, cambiando il nome del report:

 class LIL_LedgerFiscalJournalController_IT extends LedgerFiscalJournalController_IT  
 {  
   public static void main(Args _args)  
   {  
     #ISOCountryRegionCodes  
     GlobalizationInstrumentationHelper::featureRunByCountryRegionCodes([  
       [#isoIT, GlobalizationConstants::FeatureReferenceIT00011] ],  
       funcName()  
     );  
   
     LIL_LedgerFiscalJournalController_IT  controller = new LIL_LedgerFiscalJournalController_IT();  
       
     controller.parmReportName(ssrsReportStr(LIL_LedgerFiscalJournal_IT, Report));  
     controller.parmArgs(_args);  
     controller.startOperation();  
   }  
   
 }  

2) Coc sulla classe UIBuilder:

 [ExtensionOf(classStr(LedgerFiscalJournalUIBuilder_IT))]  
 final class LIL_LedgerFiscalJournalUIBuilder_IT_Extension  
 {  
   private boolean             showVatNum;  
   private DialogField           showVatNumDlg;  
   private LedgerFiscalJournalContract_IT contract;  
   
   public void build()  
   {  
     contract = this.dataContractObject() as LedgerFiscalJournalContract_IT;  
   
     showVatNumDlg = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(LedgerFiscalJournalContract_IT, parmShowVatNum));  
       
     next build();  
   }  
   
   public void getFromDialog()  
   {  
     contract = this.dataContractObject() as LedgerFiscalJournalContract_IT;  
   
     showVatNumDlg = this.bindInfo().getDialogField(contract,  
             methodStr(LedgerFiscalJournalContract_IT, parmShowVatNum));  
   
     showVatNum = showVatNumDlg.value();  
   
     next getfromdialog();  
   }  
   
 }  
L'estensione del menuitem LedgerFiscalJournal_IT dovrà avere come object la nuova controller.

Nel caso del libro giornale ho avuto dei problemi alla duplica del report. Durante il deploy veniva segnalato un errore sul numero di parametri: "The number of defined parameters is not equal to the number of cell definitions in the parameter panel" . Non ho ben capito da cosa derivi, ho risolto eliminando i dataset e  il design ricreandoli copiando dallo STD. Ricreando i Dataset a mano, ho anche dovuto ricreare la struttura dei parametri divisi in gruppi come nel report STD:



Ristampando il report possiamo vedere le modifiche: