Beispiel #1
0
        /// <summary>
        /// Called when user clicks on the add-in menu
        /// </summary>
        /// <param name="e">The context of the VS tools and metadata</param>
        public override void OnClick(AddinEventArgs e)
        {
            FormMain formMain  = new FormMain(this.MetaModelService.GetModelNames().ToList <string>());
            string   modelName = string.Empty;

            if (formMain.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return;
            }

            modelName = formMain.getModelName();

            if (modelName == string.Empty)
            {
                throw new Exception("Model name cannot be empty.");
            }

            try
            {
                Metadata.MetaModel.AxDataEntityViewExtension dataEntityExtension;

                List <string> entities = this.MetadataProvider.DataEntityViewExtensions.ListObjectsForModel(modelName).ToList <string>().Where <string>(x => x.Contains("DimensionCombinationEntity") || x.Contains("DimensionSetEntity")).ToList <string>();

                string updatedDataEntities = string.Empty;
                string names = string.Empty;

                foreach (var extensionName in entities)
                {
                    bool updated = false;

                    dataEntityExtension = this.MetadataProvider.DataEntityViewExtensions.Read(extensionName);

                    foreach (var field in dataEntityExtension.Fields)
                    {
                        string relatedDataEntity;
                        string nameL = field.Name.ToLower().Replace(" ", "");

                        // List based on https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/financial/add-dimensions-excel-templates
                        #region Related entity names
                        switch (nameL)
                        {
                        case "agreement":
                        case "agreements":
                            relatedDataEntity = "DimAttributeAgreementHeaderExt_RUEntity";
                            break;

                        case "bankaccount":
                        case "bankaccounts":
                            relatedDataEntity = "DimAttributeBankAccountTableEntity";
                            break;

                        case "businessunit":
                        case "businessunits":
                            relatedDataEntity = "DimAttributeOMBusinessUnitEntity";
                            break;

                        case "campaign":
                        case "campaigns":
                            relatedDataEntity = "DimAttributeSmmCampaignTableEntity";
                            break;

                        case "cashaccount":
                        case "cashaccounts":
                            relatedDataEntity = "DimAttributeRCashTable_RUEntity";
                            break;

                        case "costcenter":
                        case "costcenters":
                            relatedDataEntity = "DimAttributeOMCostCenterEntity";
                            break;

                        case "customergroup":
                        case "customergroups":
                            relatedDataEntity = "DimAttributeCustGroupEntity";
                            break;

                        case "customer":
                        case "customers":
                            relatedDataEntity = "DimAttributeCustTableEntity";
                            break;

                        case "deferral":
                        case "deferrals":
                            relatedDataEntity = "DimAttributeRDeferralsTable_RUEntity";
                            break;

                        case "department":
                        case "departments":
                            relatedDataEntity = "DimAttributeOMDepartmentEntity";
                            break;

                        case "expenseandincomecode":
                        case "expenseandincomecodes":
                            relatedDataEntity = "DimAttributeRTax25ProfitTable_RUEntity";
                            break;

                        case "expensepurpose":
                        case "expensepurposes":
                            relatedDataEntity = "DimAttributeTrvTravelTxtEntity";
                            break;

                        case "fiscalestablishment":
                        case "fiscalestablishments":
                            relatedDataEntity = "DimAttributeFiscalEstablishment_BREntity";
                            break;

                        case "fixedassetgroup":
                        case "fixedassetgroups":
                            relatedDataEntity = "DimAttributeAssetGroupEntity";
                            break;

                        case "fixedasset":
                        case "fixedassets":
                            relatedDataEntity = "DimAttributeAssetTableEntity";
                            break;

                        case "fund":
                        case "funds":
                            relatedDataEntity = "DimAttributeLedgerFund_PSN";
                            break;

                        case "itemgroup":
                        case "itemgroups":
                            relatedDataEntity = "DimAttributeInventItemGroupEntity";
                            break;

                        case "item":
                        case "items":
                            relatedDataEntity = "DimAttributeInventTableEntity";
                            break;

                        case "job":
                        case "jobs":
                            relatedDataEntity = "DimAttributeHcmJobEntity";
                            break;

                        case "legalentity":
                        case "legalentities":
                            relatedDataEntity = "DimAttributeCompanyInfoEntity";
                            break;

                        case "posregister":
                        case "posregisters":
                            relatedDataEntity = "DimAttributeRetailTerminalEntity";
                            break;

                        case "position":
                        case "positions":
                            relatedDataEntity = "DimAttributeHcmPositionEntity";
                            break;

                        case "projectcontract":
                        case "projectcontracts":
                            relatedDataEntity = "DimAttributeProjInvoiceTableEntity";
                            break;

                        case "projectgroup":
                        case "projectgroups":
                            relatedDataEntity = "DimAttributeProjGroupEntity";
                            break;

                        case "project":
                        case "projects":
                            relatedDataEntity = "DimAttributeProjTableEntity";
                            break;

                        case "prospect":
                        case "prospects":
                            relatedDataEntity = "DimAttributeSmmBusRelTableEntity";
                            break;

                        case "resourcegroup":
                        case "resourcegroups":
                            relatedDataEntity = "DimAttributeWrkCtrResourceGroupEntity";
                            break;

                        case "resource":
                        case "resources":
                            relatedDataEntity = "DimAttributeWrkCtrTableEntity";
                            break;

                        case "store":
                        case "stores":
                            relatedDataEntity = "DimAttributeRetailStoreEntity";
                            break;

                        case "valuestream":
                        case "valuestreams":
                            relatedDataEntity = "DimAttributeOMValueStreamEntity";
                            break;

                        case "vendorgroup":
                        case "vendorgroups":
                            relatedDataEntity = "DimAttributeVendGroupEntity";
                            break;

                        case "vendor":
                        case "vendors":
                            relatedDataEntity = "DimAttributeVendTableEntity";
                            break;

                        case "worker":
                        case "workers":
                            relatedDataEntity = "DimAttributeHcmWorkerEntity";
                            break;

                        default:
                            relatedDataEntity = "DimAttributeFinancialTagEntity";
                            break;
                        }
                        #endregion

                        var relations = dataEntityExtension.Relations;

                        if (relations.Where <Metadata.MetaModel.AxDataEntityViewRelation>(x => x.RelatedDataEntity == relatedDataEntity).Count <Metadata.MetaModel.AxDataEntityViewRelation>() == 0)
                        {
                            Metadata.MetaModel.AxDataEntityViewRelation dataEntityViewRelation = new Metadata.MetaModel.AxDataEntityViewRelation();
                            Metadata.MetaModel.AxDataEntityViewRelationConstraintField dataEntityViewRelationConstraintField = new Metadata.MetaModel.AxDataEntityViewRelationConstraintField();

                            dataEntityViewRelation.RelatedDataEntity = relatedDataEntity;
                            dataEntityViewRelation.Validate          = Metadata.Core.MetaModel.NoYes.No;
                            dataEntityViewRelation.Cardinality       = Metadata.Core.MetaModel.Cardinality.ZeroMore;
                            dataEntityViewRelation.Name = field.Name;
                            dataEntityViewRelation.RelatedDataEntityCardinality = Metadata.Core.MetaModel.RelatedTableCardinality.ZeroOne;
                            dataEntityViewRelation.RelatedDataEntityRole        = $"{Guid.NewGuid().ToString("N")}";
                            dataEntityViewRelation.Role = $"{Guid.NewGuid().ToString("N")}";

                            dataEntityViewRelationConstraintField.Name         = $"{field.Name}Constraint";
                            dataEntityViewRelationConstraintField.Field        = field.Name;
                            dataEntityViewRelationConstraintField.RelatedField = "Value";

                            dataEntityViewRelation.Constraints.Add(dataEntityViewRelationConstraintField);
                            dataEntityExtension.Relations.Add(dataEntityViewRelation);

                            updated = true;
                        }
                    }

                    if (updated)
                    {
                        Metadata.MetaModel.ModelSaveInfo modelSaveInfo = new Metadata.MetaModel.ModelSaveInfo(this.MetadataProvider.DataEntityViewExtensions.GetModelInfo(extensionName).FirstOrDefault());
                        this.MetadataProvider.DataEntityViewExtensions.Update(dataEntityExtension, modelSaveInfo);

                        updatedDataEntities += $"* {extensionName}\n";
                    }
                }

                if (entities.Count == 0)
                {
                    throw new Exception($"No entity extension has been found in {modelName} model for DimensionCombinationEntity and/or DimensionSetEntity. Did you execute \"Add financial dimensions for OData in advance?\" ");
                }

                if (updatedDataEntities != string.Empty)
                {
                    CoreUtility.DisplayInfo($"Following data entities extensions have been updated:\n{updatedDataEntities}");
                }
            }
            catch (Exception ex)
            {
                CoreUtility.HandleExceptionWithErrorMessage(ex);
            }
        }