Financial dimensions with AX 2012 collected in RecId fields and that RecId referes a couple of tables so it's a bit complicated. Fortunately there is a class for make it easy:
DimensionProvider dimProvider = new DimensionProvider();
dimProvider.addOrderByAttribute(BorAXJournalTrans_DS.query(),BorAXJournalTrans_DS.query().dataSourceNo(1).name(),
FieldStr(BorAXJournalTrans,DefaultDimension),
DimensionComponent::DimensionAttribute,SortOrder::Ascending,
"Department");
BorAXJournalTrans_DS.executeQuery();
If you don't want to use that class alternate is:
RecId depRecId = 5637152827; //RecId value of department dimension at DimensionAttribute table
BorAXJournalTrans boraxJournalTrans;
DimensionAttributeValueSet dimensionAttributeValueSet;
DimensionAttributeValueSetItem dimensionAttributeValueSetItem;
DimensionAttributeValue dimensionAttributeValue;
DimensionAttribute dimensionAttribute;
while SELECT firstOnly10 borAXJournalTrans
ORDER BY DimensionAttributeValueSetItem.DisplayValue
JOIN dimensionAttributeValueSet
where borAXJournalTrans.DefaultDimension == dimensionAttributeValueSet.RecId
JOIN dimensionAttributeValueSetItem
where dimensionAttributeValueSet.RecId == dimensionAttributeValueSetItem.DimensionAttributeValueSet
JOIN dimensionAttributeValue
where dimensionAttributeValueSetItem.DimensionAttributeValue == dimensionAttributeValue.RecId
JOIN dimensionAttribute
where dimensionAttributeValue.DimensionAttribute == dimensionAttribute.RecId &&
dimensionAttribute.RecId == depRecId
{
info(dimensionAttributeValueSetItem.DisplayValue);
}
defaultdimension etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
defaultdimension etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
13 Ekim 2017 Cuma
9 Ağustos 2017 Çarşamba
AX 2012 - Add filter for one dimension for a query's financial dimension
If you try to this with add tables you'll see you have to add lots of table to query. There is a class which do this for you DimensionProvider with AX 2012:
DimensionProvider dimProvider = new DimensionProvider();
dimProvider.addAttributeRangeToQuery(element.query(),element.query().dataSourceNo(1).name(),
FieldStr(MyTable,DefaultDimension),
DimensionComponent::DimensionAttribute,
OMOperatingUnit::find(depRecId,OMOperatingUnitType::OMDepartment).OMOperatingUnitNumber,
"Department",true);
BTW if you get an error like Unknown type: RefRecId it would be about EDT of your table. In my case they used RefRecId EDT instead of DimensionDefault EDT with DefaultDimension field. In your case it would be other than RefRecId. There is a bug like this with original AX table HcmEmployment.
DimensionProvider dimProvider = new DimensionProvider();
dimProvider.addAttributeRangeToQuery(element.query(),element.query().dataSourceNo(1).name(),
FieldStr(MyTable,DefaultDimension),
DimensionComponent::DimensionAttribute,
OMOperatingUnit::find(depRecId,OMOperatingUnitType::OMDepartment).OMOperatingUnitNumber,
"Department",true);
BTW if you get an error like Unknown type: RefRecId it would be about EDT of your table. In my case they used RefRecId EDT instead of DimensionDefault EDT with DefaultDimension field. In your case it would be other than RefRecId. There is a bug like this with original AX table HcmEmployment.
10 Eylül 2014 Çarşamba
AX 2012 - Add a new dimension value to Default dimension
I wrote this code from one of Eyüp Tezar's code:
DimensionDefault DefDim;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue newValue;
DimensionAttributeValueSetStorage dimensionStorage;
DefDim = mytable.Defaultdimension;
dimensionAttribute = DimensionAttribute::find(myDimRecid);
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
//------------------- another dimension ------------------------
dimensionAttribute = DimensionAttribute::findbyName("Project");
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue2,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
DimensionDefault DefDim;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue newValue;
DimensionAttributeValueSetStorage dimensionStorage;
DefDim = mytable.Defaultdimension;
dimensionAttribute = DimensionAttribute::find(myDimRecid);
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
//------------------- another dimension ------------------------
dimensionAttribute = DimensionAttribute::findbyName("Project");
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue2,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
Etiketler:
add,
AX,
ax 2012,
AXAPTA,
default dimension,
defaultdimension
5 Ağustos 2014 Salı
AX 2012 - Add defaultdimension control to form
You can look for LedgerJournalTable form for how to do.
Add a relation with DimensionAttributeValueSet table's RecId field for which field added from DimensionDefault EDT.
Add a tab page named tabFinancialDimensions and change properties like below:
AutoDeclaration = true
caption = @SYS101181
HideIfEmpty = No
NeedPermission = Manual
Add this line to forms classDeclaration method:
DimensionDefaultingController dimensionDefaultingController;
Add this code part to forms init method:
public void init()
{
boolean allowEdit = true;
super();
dimensionDefaultingController = DimensionDefaultingController::constructInTabWithValues(false, true, allowEdit, 0, this, tabFinancialDimensions, "@SYS101181");
dimensionDefaultingController.parmAttributeValueSetDataSource(MyTable_ds, fieldStr(MyTable, DefaultDimension));
dimensionDefaultingController.parmValidateBlockedForManualEntry(true);
}
Add this method to tab page:
public void pageActivated()
{
dimensionDefaultingController.pageActivated();
super();
}
Update table data source methods like below:
public void delete()
{
super();
DimensionDefaultingController.deleted();
}
public void write()
{
ttsBegin;
DimensionDefaultingController.writing();
super();
ttsCommit;
}
public int active()
{
int ret;
ret = super();
DimensionDefaultingController.activated();
return ret;
}
Add a relation with DimensionAttributeValueSet table's RecId field for which field added from DimensionDefault EDT.
Add a tab page named tabFinancialDimensions and change properties like below:
AutoDeclaration = true
caption = @SYS101181
HideIfEmpty = No
NeedPermission = Manual
Add this line to forms classDeclaration method:
DimensionDefaultingController dimensionDefaultingController;
Add this code part to forms init method:
public void init()
{
boolean allowEdit = true;
super();
dimensionDefaultingController = DimensionDefaultingController::constructInTabWithValues(false, true, allowEdit, 0, this, tabFinancialDimensions, "@SYS101181");
dimensionDefaultingController.parmAttributeValueSetDataSource(MyTable_ds, fieldStr(MyTable, DefaultDimension));
dimensionDefaultingController.parmValidateBlockedForManualEntry(true);
}
Add this method to tab page:
public void pageActivated()
{
dimensionDefaultingController.pageActivated();
super();
}
Update table data source methods like below:
public void delete()
{
super();
DimensionDefaultingController.deleted();
}
public void write()
{
ttsBegin;
DimensionDefaultingController.writing();
super();
ttsCommit;
}
public int active()
{
int ret;
ret = super();
DimensionDefaultingController.activated();
return ret;
}
Etiketler:
AX,
ax 2012,
AXAPTA,
defaultdimension,
form
24 Haziran 2014 Salı
AX 2012 - Default dimension
//http://axvuongbao.blogspot.com.tr/2013/08/how-to-create-default-dimension-from-x.html
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Sample usage:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
If you get Unable to return DimensionAttributeValue record for ... error than you try create a dimension combination values unavailable in system.
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Sample usage:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
If you get Unable to return DimensionAttributeValue record for ... error than you try create a dimension combination values unavailable in system.
Etiketler:
AX,
ax 2012,
AXAPTA,
default dimension,
defaultdimension
Kaydol:
Kayıtlar (Atom)