martedì 26 settembre 2023

D365FFO - Creare campi calcolati su una vista

In questo post vediamo come creare campi calcolati su una vista.Come esempio creiamo una vista basata su VendTable che mostra come colonne l'account num e le dimensioni finzanziarie di default "Cost center" e "Business unit". Questa possibilità è stata introdotta con AX 2012 e potenziata con la 365. In Ax 2009 invece non è possibile aggiungere metodi alle viste.

1) Creare una nuova view che chiameremo LILVendTableDefaultDimension

2) Aggiungere come datasource VendTable

3) Aggiungere AccounNum come field

4) Aggiungere due nuovi campi di tipo string così:


        che chiameremo CostCenter e BU

5) Aggiungere due nuovi metodi alla vista, che chiameremo  getCostCenterDisplayValue e getBUDisplayValue,per recuperare il display value della dimensione CostCenter e Business unit

 public static str getCostCenterDisplayValue()  
   {  
     str VendTableDefaultDimension = SysComputedColumn::returnField(tableStr(LILVendTableDefaultDimension)  
                                     ,dataEntityDataSourceStr(LILVendTableDefaultDimension,VendTable)  
                                     ,fieldStr(VendTable, DefaultDimension));  
   
     str backingEntityType = int2Str(tableNum(DimAttributeOMCostCenter));  
   
   
     return strFmt(@"select  
                 top 1 DimensionAttributeValueSetItemView.DISPLAYVALUE  
             from  
                 DimensionAttributeValueSetItemView  
             join  
                 DIMENSIONATTRIBUTEVALUE  
             on  
                 DIMENSIONATTRIBUTEVALUE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTEVALUE  
             join  
                 DIMENSIONATTRIBUTE  
             on  
                 DIMENSIONATTRIBUTE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTE  
             where  
                 DIMENSIONATTRIBUTEVALUESET = %1  
             and   BACKINGENTITYTYPE     = %2",VendTableDefaultDimension  
                                 ,backingEntityType);  
   }  
 public static str getBUDisplayValue()  
   {  
     str VendTableDefaultDimension = SysComputedColumn::returnField(tableStr(LILVendTableDefaultDimension)  
                                     ,dataEntityDataSourceStr(LILVendTableDefaultDimension,VendTable)  
                                     ,fieldStr(VendTable, DefaultDimension));  
   
     str dimensionName = 'BusinessUnit';  
   
   
     return strFmt(@"select  
                 top 1 DimensionAttributeValueSetItemView.DISPLAYVALUE  
             from  
                 DimensionAttributeValueSetItemView  
             join  
                 DIMENSIONATTRIBUTEVALUE  
             on  
                 DIMENSIONATTRIBUTEVALUE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTEVALUE  
             join  
                 DIMENSIONATTRIBUTE  
             on  
                 DIMENSIONATTRIBUTE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTE  
             where  
                 DIMENSIONATTRIBUTEVALUESET = %1  
             and   DIMENSIONATTRIBUTE.NAME  = '%2'",VendTableDefaultDimension  
                                  ,dimensionName);  
   }  
N.B: se si usano le stringhe nei parametri della where ( per esempio dimensionattribute.name =...) vanno messi tra doppi apici ''

6) Compilare le proprietà ViewMethod dei due campi coi nomi dei metodi appena creati

7) Buildare e sincronizzare



In AX 2012 la firma del metodo deve contenere la parola "server":

 public static server str getBUDisplayValue()  
Inoltre la funzione 

dataEntityDataSourceStr

Non è disponibile è và sostituita con la stringa del nome del datasource nella view

Nessun commento:

Posta un commento