Финансовое измерение после сохранения пусто

У меня есть финансовое измерение, которое связывается со значениями, такими как BuildingID и ContractID. Когда создается новое здание, измерение правильно заполняется данными. Но после этого возникает необходимость в заключении контракта. При создании контракта в поле финансовой аналитики указывается значение contractID. Но при сохранении контракта финансовое измерение идентификатора контракта исчезает. Когда я проверяю значение таблицы DIMENSIONATTRIBUTEVALUESET для этого измерения ContractID, оно равно null, есть только значение для BuildingID. У меня есть этот метод для начальных размеров:

void initDimensions()
    {        
        DimensionDefault dimension;
        PMGOrgDimension orgDimension;
        CompanyId       companyId;        
        PMEGround ground;
        PMEBuilding building;

        switch(pmcContract.EstateType)
        {            
            case PMCEstateType::Ground :
                ground = PMEGround::find(pmcContract.EstateId);
                dimension    = PMEObjectLegalEntity::find(ground.TableId, ground.RecId).DefaultDimension;
                orgDimension = ground.OrgDimension;
                companyId    = ground.CompanyId;
                break;
            case PMCEstateType::Building :
                building = PMEBuilding::find(pmcContract.EstateId);
                dimension    = PMEObjectLegalEntity::find(building.TableId, building.RecId).DefaultDimension;
                orgDimension = building.OrgDimension;
                companyId    = building.CompanyId;
                break;
            default :
                dimension = pmcContract.DefaultDimension;
                orgDimension = pmcContract.OrgDimension;
                companyId = pmcContract.CompanyId;
                break;
        }

        pmcContract.DefaultDimension    = dimension;
        pmcContract.OrgDimension = orgDimension;
        pmcContract.CompanyId    = companyId;

    } 

Есть ли что-то, чего мне не хватает?


person DarthCSharper    schedule 20.06.2019    source источник


Ответы (2)


Попробуйте изменить эту строку:

pmcContract.DefaultDimension = dimension;

К этому:

pmcContract.DefaultDimension = DimensionDefaultingService::serviceMergeDefaultDimensions(pmcContract.DefaultDimension, dimension);

person Alex Kwitny    schedule 20.06.2019
comment
Я попытался. Не работает, в D365 нет DimensionDefaultingService, я использовал LedgerDimensionDefaultFacade. Но большое спасибо. Похоже, дело не в методе initDimension, а в том, где он вызывается. - person DarthCSharper; 21.06.2019
comment
Что касается измерений в целом, если измерение уже установлено, оно получает RecId, хранящееся в DefaultDimension, и если вы хотите установить другое измерение, вам нужно будет их объединить. Подобно набору InventDimId, где у вас есть только Site... если вы хотите указать склад, вам нужно будет findOrCreate или эффективно объединить сайт/склад, чтобы получить новый InventDimId. Надеюсь, это имеет смысл. Я думал, вам нужно проверить, хранилось ли уже значение pmcContract.DefaultDimension. - person Alex Kwitny; 21.06.2019
comment
Проблема, вероятно, не в объявлении метода. Это в том месте, где называется. За всей формой стоит код. github.com/DarkhVader/AXDev/blob/master/PMCContractDetails.xpp - person DarthCSharper; 24.06.2019
comment
Кроме того, вспомогательный класс, который может обрабатывать только одно значение за вызов... github.com/ ДархВейдер/AXDev/blob/master/PMGDimensionCl - person DarthCSharper; 24.06.2019

Проблема в этом методе:

static server public DimensionDefault tableDimension(Common _c, DimensionDefault _d)
    {
        DimensionAttribute dimensionAttribute;
        DimensionAttributeValue dimensionAttributeValue;
        DimensionAttributeSetItem dimensionAttributeSetItem;
        DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
        DimensionDefault cDimensionDefault;
        DimensionDefault ret;
        ;

        ret = _d;

        select firstonly RecId from dimensionAttribute
            where dimensionAttribute.BackingEntityTableId == _c.TableId
            join firstonly RecId from dimensionAttributeSetItem
                where dimensionAttributeSetItem.DimensionAttributeSet == DimensionCache::getDimensionAttributeSetForLedger()
                   && dimensionAttributeSetItem.DimensionAttribute == dimensionAttribute.RecId;
        if (dimensionAttributeSetItem.RecId != 0)
        {
            dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndEntityInst(dimensionAttribute.RecId, _c.RecId, false, true);
            if (dimensionAttributeValue.RecId != 0)
            {
                dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage();
                dimensionAttributeValueSetStorage.addItemValues(dimensionAttributeValue.DimensionAttribute, dimensionAttributeValue.RecId, dimensionAttributeValue.HashKey);
                cDimensionDefault = dimensionAttributeValueSetStorage.save();
                if (cDimensionDefault != 0)
                {
                    ret = LedgerDimensionDefaultFacade::serviceMergeDefaultDimensions(cDimensionDefault, _d);
                }
            }
        }

        return ret;
    }

Объединение не работает. Он принимает значения только для _d. Не сливая их.

person DarthCSharper    schedule 24.06.2019