Blog

DimensionAttributeLevelValue Kaydı Bulup Silme

DimensionAttributeLevelValue Kaydı Bulup Silme

Problem

Son kullanıcı yeni bir ana hesap / tedarikçi / müşteri / banka gibi bir ana veri yarattı. Sonrasında bu ana veriyi kullanarak finansal günlük(ler) yarattı ama deftere nakletmedi. Sonunda da başta yarattığı ana veriyi silmeye karar verdi ve silerken şöyle bir hata aldı:

An error occur: “A financial dimension value is based on the 1100 record and has been used on a transaction. You cannot delete the 1100 record”

Kullanıcının oluşturuduğu deftere nakledilmeyen tüm günlükleri sildiniz ama hata devam etmekte.

Çözüm

Günlüklerde ya da sistemin farklı yerlerinde ana hesap(Main Account), tedarikçi(vendor), müşteri(customer) gibi ana verileri kullandığınız zaman Dynamics AX Boyut Özelliklerini “Dimension attributes” tutmak için birçok tabloya kayıt atar. Örneğin herhangi bir ana hesabı silmek istediğinizde DimensionAttributeLevelValue tablosunda ilgili kayıt var mı diye kontrol edilecektir.

Tüm anaverileri için ortak kontrol DimensionValidation sınıfının canDeleteEntityValue metodunda yapılmaktadır. Eğer gerçekten ilgili ana verinin hareketleri bulunamaz ise DimensionAttribute ile başlayan tablolarda karşılık gelen kayıtlar silinir.

Aşağıdaki kod, master data silmeye çalışırken “DimensionAttributeLevelValue“ hatası verdiğinde kullanılabilir.

Job

Aşağıdaki job içeri alınır.

static void PRG_0000_CheckNotDeletedDimRecord_AYX(Args _args)
{
    DimensionAttribute dimAttribute;
    DimensionAttributeValue dimAttributeValue;
    DimensionAttributeLevelValue dimAttributeLevelValue;
    DimensionAttributeValueGroup dimAttributeValueGroup;
    DimensionHierarchy dimHierarchy;
    int         i;
    container   concreteCompanies;
    int         concreteCompanyCount;
    CompanyId   currentConcreteCompany;
    boolean     canDelete;
 
    SysDictTable tableToCheck;
 
    TableId         entityId;
    RecId           entityInstance;
    DataAreaId      dataAreaId;
    RecId           financialTagCategoryId;
 
    // Convert the supplied table into the fields needed to check delete ability
    [entityId, entityInstance, dataAreaId, financialTagCategoryId] = DimensionEnabledType::getFieldsForDeleteOrRename(CustTable::find("M000001", 0));
 
    // Validate input parameters
    if (!entityId || !entityInstance || !dataAreaId)
    {
        throw error(Error::wrongUseOfFunction(funcName()));
    }
 
    // Prevent deletion if the entity instance existsas a non-deleted DAV on any combination except for focuses
    // This query is not cached as deleting backing entities will not be a common operation
    select firstonly RecId from dimAttributeLevelValue
        exists join dimAttributeValue where
            dimAttributeValue.RecId == dimAttributeLevelValue.DimensionAttributeValue &&
            dimAttributeValue.EntityInstance == entityInstance &&
            dimAttributeValue.IsDeleted == false
        exists join dimAttribute where
            dimAttribute.RecId == dimAttributeValue.DimensionAttribute &&
            dimAttribute.BackingEntityType == entityId
        exists join dimAttributeValueGroup where
            dimAttributeValueGroup.RecId == dimAttributeLevelValue.DimensionAttributeValueGroup
        notExists join dimHierarchy where
            dimHierarchy.RecId == dimAttributeValueGroup.DimensionHierarchy &&
            dimHierarchy.StructureType == DimensionHierarchyType::Focus;
 
        info(strFmt("DimensionAttributeLevelValue.RecId : %1", dimAttributeLevelValue.RecId));
}

İlgili Master Data(Ana Veri)

DimensionEnabledType::getFieldsForDeleteOrRename(CustTable::find(“M000001”)); satırındaki CustTable, ilgili masterdata ile değiştirilir. Örnek:AssetTable::find, VendTable::find gibi
CustTable::find(“M000001”)); yerine ilgili tablonun primary key değeri. Örn: CustTable için accountnum

Job’u Çalıştırma

Job’u çalıştırdıktan sonra ekrana gelen RecId kopyalanır.

1

DimensionAttributeLevelValue Kaydını Silme

Kopyalanan RecId yapıştırılıp kayıt bulunur. Alt+F9 ile silinir

2

Posted on
Posted in Blog