dimension etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
dimension etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

13 Ekim 2017 Cuma

AX 2012 - Bir Finansal Boyuta Göre Sıralama

AX 2012'de mali boyutlar bir RecId alanında saklı olduğu ve çeşitli tabloları refere ettiği için sıralama olayı biraz karışık. Bunun için işimizi kolaylaştırıcı bir sınıf var:

DimensionProvider           dimProvider = new DimensionProvider();
    dimProvider.addOrderByAttribute(BorAXJournalTrans_DS.query(),BorAXJournalTrans_DS.query().dataSourceNo(1).name(),
       FieldStr(BorAXJournalTrans,DefaultDimension),
        DimensionComponent::DimensionAttribute,SortOrder::Ascending,
"Departmanı");
BorAXJournalTrans_DS.executeQuery();
  
Bu sınıfı kullanmak istemiyorum derseniz bir de şöyle bir seçenek var:

RecId  depRecId = 5637152827; //departman boyutunun DimensionAttribute tablosundaki recId değeri
    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);
    }

19 Ocak 2016 Salı

Axapta - Query'ye boyut (dimension) bazında filtre eklemek

StrFmt ile boyut bazında filtre eklemek istediğimizde dimension alanın köşeli parantezleri dimension[2] = "0001" tarzı filtre eklemek istediğimizde hata veriyor. Doğru yöntemi bir forum sayfasında buldum:


QueryBuildDataSource    qbds = query.addDataSource(tablenum(EmplTable));
...
 qbds.addRange(fieldid2Ext(fieldnum(EmplTable, Dimension),1)).value("600742");

15 Eylül 2014 Pazartesi

AX 2012 - Tabloya bağlı yeni bir finansal boyut tanımlama

Microsoft'un ilgili white paper  sayfasından faydalanan bir blogdan öğrendiğim bu işlem çok kolay:
1-AOT'dan DimAttribute adıyla başlayan viewlerden birini kopyala ve adı yine aynen DimAttribute ile başlasın.
2. Ana data sourcenin orijinal tablo adı ne olursa olsun adı data source adı BackingEntity olsun.
3.Viewdeki tanımlı alanların adı (orijinal isimleri farklı olabilir) şöyle olmak zorunda:
Key - Data source tablosunun Surrogate key field'ı. RecId gibi...
Value - Data source tablosunun primary key field'ı. AccountNum gibi...
Name - Açıklama alanı. Description gibi...


Bu boyutun geçerli olması için iki yol var:

AOS restart

veya

DimensionCache::clearAllScopes(); 

komutu.

11 Eylül 2014 Perşembe

AX 2012 - Bir LedgerDimension değerinden tek bir boyutun değerini almak

Bu konuyu oluştururken bir blogda bulduğum dimension hakkında çizilmiş data modelini kullandım. Malesef blogdaki kodu anlayamadım ve bu kodu yazdım:


 DimensionDefault                        d =  5637183219;
    DimensionAttributeValueCombination      dimensionAttributeValueCombination;
    DimensionAttributeValueGroupCombination dimensionAttributeValueGroupCombination;
    DimensionAttributeValueGroup            dimensionAttributeValueGroup;
    DimensionAttributeLevelValue            dimensionAttributeLevelValue;
    DimensionAttributeValue                 dimensionAttributeValue;
    DimensionAttribute                      dimensionAttribute;
   
    select dimensionAttributeValueCombination
            where dimensionAttributeValueCombination.RecId == d
        join dimensionAttributeValueGroupCombination
            where dimensionAttributeValueGroupCombination.DimensionAttributeValueCombination ==
                  dimensionAttributeValueCombination.RecId
        join dimensionAttributeValueGroup
            where dimensionAttributeValueGroup.RecId == dimensionAttributeValueGroupCombination.DimensionAttributeValueGroup
        join dimensionAttributeLevelValue
            where dimensionAttributeLevelValue.DimensionAttributeValueGroup == dimensionAttributeValueGroup.RecId
        join dimensionAttributeValue
            where dimensionAttributeValue.RecId == dimensionAttributeLevelValue.DimensionAttributeValue
        join dimensionAttribute
            where dimensionAttribute.RecId == dimensionAttributeValue.DimensionAttribute &&
                  DimensionAttribute.Name == "Proje";
    info(DimensionAttributeLevelValue.DisplayValue);



Güncelleme:
Yukarıdaki bağlantı PurchTable defaultDimension alanı için çalışmadı.
Aşağıdaki kodu Andesoft'un web sitesinden aldım:

 DimensionDefault                        d =  5637169331;
    DimensionAttributeValueSet  dimAttrValueSet;
    DimensionAttributeValueSetItem  dimAttrValueSetItem;
    DimensionAttributeValue         dimAttrValue;
    DimensionAttribute          dimAttr;
    Common      dimensionValueEntity;
    DimensionValue  dimensionValue;
    DimensionAliasName  dimensionName;
   
    dimAttrValueSet = DimensionAttributeValueSet::find(D);
    while select dimAttrValueSetItem
        where dimAttrValueSetItem.DimensionAttributeValueSet == dimAttrValueSet.RecId
    {
        dimAttrValue = DimensionAttributeValue::find(dimAttrValueSetItem.DimensionAttributeValue);
       
        dimAttr = DimensionAttribute::find(DimAttrValue.DimensionAttribute);
        dimensionvalueentity = DimensionDefaultingControllerBase::findBackingEntityInstance(
        curext(),DimAttr,dimAttrvalue.EntityInstance);
        dimensionvalue = dimattrvalue.getValue();
        info(strFmt("%1 %2",Dimensionvalue, DimAttr.Name));
    }
       
        




10 Eylül 2014 Çarşamba

AX 2012 - Bir DefaultDimension değerinden tek bir boyutu almak

Bu kodu yazarken bir blogdan faydalandım:


   DimensionAttributeValueSetStorage  dimStorage; 
   Counter               i; 
   DimensionAttribute         dimAttributeCostCenter; 
   DimensionAttributeValue       dimAttributeValue; 
   DimensionDefault         d =  5637168596;
   
   
   dimStorage = DimensionAttributeValueSetStorage::find(d); 
   info(dimStorage.getDisplayValueByDimensionAttribute(DimensionAttribute::findByName("Project").RecId));   
   

AX 2012 - Default dimension verisine yeni bir dimension değeri eklemek

Bu kodu Eyüp Tezar'ın bir kodundan faydalanarak yazdım:

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();

5 Ağustos 2014 Salı

AX 2012 - Forma default dimension eklemek

Nasıl yapıldığını anlamak için LedgerJournalTable formuna bakılabilir.
DimensionDefault EDTsi ile tabloya eklediğimiz alana DimensionAttributeValueSet tablosunun RecId alanıyla bir relation ekliyoruz.

Forma bir tab sayfası ekleyip adını tabFinancialDimensions yapıyoruz ve aşağıdaki property ayarlarını yapıyoruz:

AutoDeclaration = true
caption = @SYS101181
HideIfEmpty = No
NeedPermission = Manual

Formun classDeclaration metoduna aşağıdaki tanımlamayı yapıyoruz:

DimensionDefaultingController       dimensionDefaultingController;

Formun init metoduna aşağıdaki kodları yazıyoruz:

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);
}


Tab sayfası kontrolüne bu metodu ekliyoruz:

public void pageActivated()
{
    dimensionDefaultingController.pageActivated();
    super();
}


Tablo data source metodlarını aşağıdaki gibi güncelliyoruz:

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;
}


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;
}


Kullanımı:

LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")

Eğer Unable to return DimensionAttributeValue record for ... gibi bir hata alırsanız sistemde kayıtlı olmayan bir dimension value değerine kombinasyon oluşturmaya çalışıyorsunuz demektir.