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
BU5) 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