/// <summary> /// Create and configure the organization service proxy. /// Create few types of attributes. /// Insert status in the existing status list. /// Retrieve attribute. /// Update attribute. /// Update existing state value. /// Optionally delete/revert any attributes /// that were created/changed for this sample. /// </summary> /// <param name="serverConfig">Contains server connection information.</param> /// <param name="promptForDelete">When True, the user will be prompted to delete all /// created entities.</param> public void Run(ServerConnection.Configuration serverConfig, bool promptForDelete) { try { // Connect to the Organization service. // The using statement assures that the service proxy will be properly disposed. using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri,serverConfig.Credentials, serverConfig.DeviceCredentials)) { // This statement is required to enable early-bound type support. _serviceProxy.EnableProxyTypes(); //<snippetWorkWithAttributes1> #region How to create attributes //<snippetWorkWithAttributes2> // Create storage for new attributes being created addedAttributes = new List<AttributeMetadata>(); // Create a boolean attribute BooleanAttributeMetadata boolAttribute = new BooleanAttributeMetadata { // Set base properties SchemaName = "new_boolean", DisplayName = new Label("Sample Boolean", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Boolean Attribute", _languageCode), // Set extended properties OptionSet = new BooleanOptionSetMetadata( new OptionMetadata(new Label("True", _languageCode), 1), new OptionMetadata(new Label("False", _languageCode), 0) ) }; // Add to list addedAttributes.Add(boolAttribute); // Create a date time attribute DateTimeAttributeMetadata dtAttribute = new DateTimeAttributeMetadata { // Set base properties SchemaName = "new_datetime", DisplayName = new Label("Sample DateTime", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("DateTime Attribute", _languageCode), // Set extended properties Format = DateTimeFormat.DateOnly, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(dtAttribute); // Create a decimal attribute DecimalAttributeMetadata decimalAttribute = new DecimalAttributeMetadata { // Set base properties SchemaName = "new_decimal", DisplayName = new Label("Sample Decimal", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Decimal Attribute", _languageCode), // Set extended properties MaxValue = 100, MinValue = 0, Precision = 1 }; // Add to list addedAttributes.Add(decimalAttribute); // Create a integer attribute IntegerAttributeMetadata integerAttribute = new IntegerAttributeMetadata { // Set base properties SchemaName = "new_integer", DisplayName = new Label("Sample Integer", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Integer Attribute", _languageCode), // Set extended properties Format = IntegerFormat.None, MaxValue = 100, MinValue = 0 }; // Add to list addedAttributes.Add(integerAttribute); // Create a memo attribute MemoAttributeMetadata memoAttribute = new MemoAttributeMetadata { // Set base properties SchemaName = "new_memo", DisplayName = new Label("Sample Memo", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Memo Attribute", _languageCode), // Set extended properties Format = StringFormat.TextArea, ImeMode = ImeMode.Disabled, MaxLength = 500 }; // Add to list addedAttributes.Add(memoAttribute); // Create a money attribute MoneyAttributeMetadata moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = "new_money", DisplayName = new Label("Money Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Money Attribue", _languageCode), // Set extended properties MaxValue = 1000.00, MinValue = 0.00, Precision = 1, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(moneyAttribute); // Create a picklist attribute PicklistAttributeMetadata pickListAttribute = new PicklistAttributeMetadata { // Set base properties SchemaName = "new_picklist", DisplayName = new Label("Sample Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Picklist Attribute", _languageCode), // Set extended properties // Build local picklist options OptionSet = new OptionSetMetadata { IsGlobal = false, OptionSetType = OptionSetType.Picklist, Options = { new OptionMetadata( new Label("Created", _languageCode), null), new OptionMetadata( new Label("Updated", _languageCode), null), new OptionMetadata( new Label("Deleted", _languageCode), null) } } }; // Add to list addedAttributes.Add(pickListAttribute); // Create a string attribute StringAttributeMetadata stringAttribute = new StringAttributeMetadata { // Set base properties SchemaName = "new_string", DisplayName = new Label("Sample String", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("String Attribute", _languageCode), // Set extended properties MaxLength = 100 }; // Add to list addedAttributes.Add(stringAttribute); // NOTE: LookupAttributeMetadata cannot be created outside the context of a relationship. // Refer to the WorkWithRelationships.cs reference SDK sample for an example of this attribute type. // NOTE: StateAttributeMetadata and StatusAttributeMetadata cannot be created via the SDK. foreach (AttributeMetadata anAttribute in addedAttributes) { // Create the request. CreateAttributeRequest createAttributeRequest = new CreateAttributeRequest { EntityName = Contact.EntityLogicalName, Attribute = anAttribute }; // Execute the request. _serviceProxy.Execute(createAttributeRequest); Console.WriteLine("Created the attribute {0}.", anAttribute.SchemaName); } //</snippetWorkWithAttributes2> #endregion How to create attributes #region How to insert status //<snippetWorkWithAttributes3> // Use InsertStatusValueRequest message to insert a new status // in an existing status attribute. // Create the request. InsertStatusValueRequest insertStatusValueRequest = new InsertStatusValueRequest { AttributeLogicalName = "statuscode", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("Dormant", _languageCode), StateCode = 0 }; // Execute the request and store newly inserted value // for cleanup, used later part of this sample. _insertedStatusValue = ((InsertStatusValueResponse)_serviceProxy.Execute( insertStatusValueRequest)).NewOptionValue; Console.WriteLine("Created {0} with the value of {1}.", insertStatusValueRequest.Label.LocalizedLabels[0].Label, _insertedStatusValue); //</snippetWorkWithAttributes3> #endregion How to insert status #region How to retrieve attribute //<snippetWorkWithAttributes4> // Create the request RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_string", RetrieveAsIfPublished = true }; // Execute the request RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute(attributeRequest); Console.WriteLine("Retrieved the attribute {0}.", attributeResponse.AttributeMetadata.SchemaName); //</snippetWorkWithAttributes4> #endregion How to retrieve attribute #region How to update attribute //<snippetWorkWithAttributes5> // Modify the retrieved attribute AttributeMetadata retrievedAttributeMetadata = attributeResponse.AttributeMetadata; retrievedAttributeMetadata.DisplayName = new Label("Update String Attribute", _languageCode); // Update an attribute retrieved via RetrieveAttributeRequest UpdateAttributeRequest updateRequest = new UpdateAttributeRequest { Attribute = retrievedAttributeMetadata, EntityName = Contact.EntityLogicalName, MergeLabels = false }; // Execute the request _serviceProxy.Execute(updateRequest); Console.WriteLine("Updated the attribute {0}.", retrievedAttributeMetadata.SchemaName); //</snippetWorkWithAttributes5> #endregion How to update attribute #region How to update state value //<snippetWorkWithAttributes6> // Modify the state value label from Active to Open. // Create the request. UpdateStateValueRequest updateStateValue = new UpdateStateValueRequest { AttributeLogicalName = "statecode", EntityLogicalName = Contact.EntityLogicalName, Value = 1, Label = new Label("Open", _languageCode) }; // Execute the request. _serviceProxy.Execute(updateStateValue); Console.WriteLine( "Updated {0} state attribute of {1} entity from 'Active' to '{2}'.", updateStateValue.AttributeLogicalName, updateStateValue.EntityLogicalName, updateStateValue.Label.LocalizedLabels[0].Label ); //</snippetWorkWithAttributes6> #endregion How to update state value #region How to insert a new option item in a local option set //<snippetWorkWithAttributes7> // Create a request. InsertOptionValueRequest insertOptionValueRequest = new InsertOptionValueRequest { AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("New Picklist Label", _languageCode) }; // Execute the request. int insertOptionValue = ((InsertOptionValueResponse)_serviceProxy.Execute( insertOptionValueRequest)).NewOptionValue; Console.WriteLine("Created {0} with the value of {1}.", insertOptionValueRequest.Label.LocalizedLabels[0].Label, insertOptionValue); //</snippetWorkWithAttributes7> #endregion How to insert a new option item in a local option set #region How to change the order of options of a local option set //<snippetWorkWithAttributes8> // Use the RetrieveAttributeRequest message to retrieve // a attribute by it's logical name. RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_picklist", RetrieveAsIfPublished = true }; // Execute the request. RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute( retrieveAttributeRequest); // Access the retrieved attribute. PicklistAttributeMetadata retrievedPicklistAttributeMetadata = (PicklistAttributeMetadata) retrieveAttributeResponse.AttributeMetadata; // Get the current options list for the retrieved attribute. OptionMetadata[] optionList = retrievedPicklistAttributeMetadata.OptionSet.Options.ToArray(); // Change the order of the original option's list. // Use the OrderBy (OrderByDescending) linq function to sort options in // ascending (descending) order according to label text. // For ascending order use this: var updateOptionList = optionList.OrderBy(x => x.Label.LocalizedLabels[0].Label).ToList(); // For descending order use this: // var updateOptionList = // optionList.OrderByDescending( // x => x.Label.LocalizedLabels[0].Label).ToList(); // Create the request. OrderOptionRequest orderOptionRequest = new OrderOptionRequest { // Set the properties for the request. AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, // Set the changed order using Select linq function // to get only values in an array from the changed option list. Values = updateOptionList.Select(x => x.Value.Value).ToArray() }; // Execute the request _serviceProxy.Execute(orderOptionRequest); Console.WriteLine("Option Set option order changed"); //</snippetWorkWithAttributes8> #endregion How to change the order of options of a global option set // NOTE: All customizations must be published before they can be used. _serviceProxy.Execute(new PublishAllXmlRequest()); Console.WriteLine("Published all customizations."); //</snippetWorkWithAttributes1> DeleteRequiredRecords(promptForDelete); } } // Catch any service fault exceptions that Microsoft Dynamics CRM throws. catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>) { // You can handle an exception here or pass it back to the calling method. throw; } }
private IEnumerable <string> checkDifferenceMoneyAttribute(MoneyAttributeMetadata originalAttributeMetadata, MoneyAttributeMetadata readAttributeMetadata) { List <string> attributeToChange = new List <string>(); if (originalAttributeMetadata.Precision != readAttributeMetadata.Precision) { originalAttributeMetadata.Precision = readAttributeMetadata.Precision; attributeToChange.Add("Precision"); } if (originalAttributeMetadata.MinValue != readAttributeMetadata.MinValue) { originalAttributeMetadata.MinValue = readAttributeMetadata.MinValue; attributeToChange.Add("Min Value"); } if (originalAttributeMetadata.MaxValue != readAttributeMetadata.MaxValue) { originalAttributeMetadata.MaxValue = readAttributeMetadata.MaxValue; attributeToChange.Add("Max Value"); } if (originalAttributeMetadata.ImeMode != readAttributeMetadata.ImeMode) { originalAttributeMetadata.ImeMode = readAttributeMetadata.ImeMode; attributeToChange.Add("ImeMode"); } return(attributeToChange); }
/// <summary> /// Sets the money max size and max and min values, according to the specified sql precision and scale arguments. /// </summary> /// <param name="metadata"></param> /// <returns></returns> public static bool SetFromSqlPrecisionAndScale(this MoneyAttributeMetadata metadata, int precision, int scale) { if (precision < scale) { throw new ArgumentOutOfRangeException("precision must be equal to or greater than scale."); } if (scale < MoneyAttributeMetadata.MinSupportedPrecision || scale > MoneyAttributeMetadata.MaxSupportedPrecision) { throw new ArgumentOutOfRangeException("scale is not within min and max crm values."); } var crmMaxValueLengthWithoutPrecision = Math.Max(Math.Truncate(Math.Abs(MoneyAttributeMetadata.MaxSupportedValue)).ToString().Length, Math.Truncate(Math.Abs(MoneyAttributeMetadata.MinSupportedValue)).ToString().Length); if (precision - scale > crmMaxValueLengthWithoutPrecision) { throw new ArgumentOutOfRangeException("The precision is greater than the maximum value crm will allow."); } metadata.Precision = scale; // need to set appropriate min and max values. // If the precision is equal to the max precision allowed, then set min and max values allowed. if (precision == crmMaxValueLengthWithoutPrecision) { metadata.MinValue = (double)MoneyAttributeMetadata.MinSupportedValue; metadata.MaxValue = (double)MoneyAttributeMetadata.MaxSupportedValue; } else { // the min value should be a series of 9's to the specified precision and scale. var maxNumberBuilder = new StringBuilder(); for (int i = 0; i < precision - scale; i++) { maxNumberBuilder.Append("9"); } if (scale > 0) { maxNumberBuilder.Append("."); for (int i = 0; i < scale; i++) { maxNumberBuilder.Append("9"); } } var maxNumber = double.Parse(maxNumberBuilder.ToString()); metadata.MaxValue = maxNumber; metadata.MinValue = -maxNumber; } // finallty, as we are setting precision and scale explicitly, the precision source should be set to honour our precision. //When the PrecisionSource is set to zero (0), the MoneyAttributeMetadata.Precision value is used. //When the PrecisionSource is set to one (1), the Organization.PricingDecimalPrecision value is used. //When the PrecisionSource is set to two (2), the TransactionCurrency.CurrencyPrecision value is used. metadata.PrecisionSource = 0; return(true); }
/// <summary> /// /// </summary> /// <param name="SchemaName">Schema Name</param> /// <param name="DisplayName">Display Name</param> /// <param name="StringFormat">StringFormat.Url, StringFormat.Phone, StringFormat.Email</param> /// <param name="addedAttributes">Pass by reference.</param> /// <param name="lines">Pick among theses: 'singleLine', 'money', 'multi'. The option 'multi' is for memo.</param> static void createFieldString(string SchemaName, string DisplayName, StringFormat StringFormat, ref List <AttributeMetadata> addedAttributes, string lines = "singleLine") { if ("singleLine" == lines) { var EntityAttribute = new StringAttributeMetadata("new_" + SchemaName) { SchemaName = "new_" + SchemaName, LogicalName = "new_" + SchemaName, DisplayName = new Label(DisplayName + " *", 1033), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("MSVProperties CRM - " + DisplayName, 1033), MaxLength = 255, IsValidForForm = true, IsValidForGrid = true, Format = StringFormat, }; addedAttributes.Add(EntityAttribute); } else if ("money" == lines) { var EntityAttribute = new MoneyAttributeMetadata("new_" + SchemaName) { SchemaName = "new_" + SchemaName, LogicalName = "new_" + SchemaName, DisplayName = new Label(DisplayName + " *", 1033), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("MSVProperties CRM - " + DisplayName, 1033), // Set extended properties MinValue = 0.00, Precision = 2, PrecisionSource = 1, ImeMode = ImeMode.Disabled, IsValidForForm = true, IsValidForGrid = true, }; addedAttributes.Add(EntityAttribute); } else { var EntityAttribute = new MemoAttributeMetadata("new_" + SchemaName) { SchemaName = "new_" + SchemaName, LogicalName = "new_" + SchemaName, DisplayName = new Label(DisplayName + " *", 1033), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("MSVProperties CRM - " + DisplayName, 1033), // Set extended properties Format = StringFormat.TextArea, ImeMode = ImeMode.Disabled, MaxLength = 1000, IsValidForForm = true, IsValidForGrid = true, }; addedAttributes.Add(EntityAttribute); } }
private AttributeMetadata CreateMoneyAttribute(ExcelWorksheet sheet, int rowIndex, int startCell) { var mamd = new MoneyAttributeMetadata { Precision = sheet.GetValue <int>(rowIndex, startCell), MinValue = sheet.GetValue <double>(rowIndex, startCell + 1), MaxValue = sheet.GetValue <double>(rowIndex, startCell + 2) }; return(mamd); }
private AttributeMetadata CloneAttributes(MoneyAttributeMetadata att) { return(new MoneyAttributeMetadata { ImeMode = att.ImeMode, MaxValue = att.MaxValue, MinValue = att.MinValue, Precision = att.Precision, PrecisionSource = att.PrecisionSource, CalculationOf = att.CalculationOf, FormulaDefinition = att.FormulaDefinition }); }
protected override void ExecuteCmdlet() { base.ExecuteCmdlet(); MoneyAttributeMetadata attribute = new MoneyAttributeMetadata(); if (ImeType.HasValue) { attribute.ImeMode = ImeMode.Auto; if (ImeType == CrmImeType.Active) { attribute.ImeMode = ImeMode.Active; } if (ImeType == CrmImeType.Disabled) { attribute.ImeMode = ImeMode.Disabled; } if (ImeType == CrmImeType.Inactive) { attribute.ImeMode = ImeMode.Inactive; } } if (MaxValue.HasValue) { attribute.MaxValue = MaxValue.Value; } if (MinValue.HasValue) { attribute.MinValue = MinValue.Value; } if (Precision.HasValue) { attribute.Precision = Precision.Value; } if (PrecisionType.HasValue) { attribute.PrecisionSource = 0; if (PrecisionType == CrmMoneyPrecisionType.OrganizationPricing) { attribute.PrecisionSource = 1; } if (PrecisionType == CrmMoneyPrecisionType.Currency) { attribute.PrecisionSource = 2; } } WriteAttribute(attribute); }
private AttributeMetadata moneyFieldCreation(string[] row) { MoneyAttributeMetadata attrMetadata = new MoneyAttributeMetadata(Utils.addOrgPrefix(row[ExcelColumsDefinition.SCHEMANAMEEXCELCOL], organizationPrefix, currentOperationCreate)); generalFieldCreation(row, attrMetadata); int parseResult; double doubleResult; attrMetadata.Precision = int.TryParse(row[ExcelColumsDefinition.MONEYPRECISION], out parseResult) ? parseResult : (int?)null; attrMetadata.MaxValue = double.TryParse(row[ExcelColumsDefinition.MONEYMAXVALUE], out doubleResult) ? doubleResult : (double?)null; attrMetadata.MinValue = double.TryParse(row[ExcelColumsDefinition.MONEYMINVALUE], out doubleResult) ? doubleResult : (double?)null; string imeModeFormatString = row[ExcelColumsDefinition.MONEYIMEMODE]; attrMetadata.ImeMode = Enum.IsDefined(typeof(ImeMode), imeModeFormatString) ? (ImeMode)Enum.Parse(typeof(ImeMode), imeModeFormatString, true) : (ImeMode?)null; return(attrMetadata); }
private AttributeMetadata CreateMoneyAttribute(object[] dataRowValues) { var metadata = new MoneyAttributeMetadata { MinValue = MoneyAttributeMetadata.MinSupportedValue, MaxValue = MoneyAttributeMetadata.MaxSupportedValue, ImeMode = ImeMode.Auto }; foreach (var column in Columns) { var value = dataRowValues[column.Position - 1]; var field = (ConfigurationFile.AttributeFields)column.TargetField; if (value != null && !string.IsNullOrEmpty(value as string)) { switch (field) { case ConfigurationFile.AttributeFields.Precision: var precision = (int)value; if (precision >= MoneyAttributeMetadata.MinSupportedPrecision && precision <= MoneyAttributeMetadata.MaxSupportedPrecision) { metadata.Precision = precision; } break; case ConfigurationFile.AttributeFields.MinimumValue: metadata.MinValue = (double)value; break; case ConfigurationFile.AttributeFields.MaximumValue: metadata.MaxValue = (double)value; break; case ConfigurationFile.AttributeFields.ImeMode: metadata.ImeMode = (ImeMode)EnumUtils.GetSelectedOption(field, value); break; } } else if (!EnumUtils.IsOptional(field)) { throw new ArgumentException($"Mandatory data field {EnumUtils.Label(field)} does not contain a value."); } } return(metadata); }
private MoneyAttributeMetadata BuildCreateMoneyAttribute() { //DateTimeFormat dtFormat = DateTimeFormat.DateOnly; var moneyAttribute = new MoneyAttributeMetadata(); int moneyPrecision = moneyAttribute.DefaultSqlPrecision(); int moneyScale = moneyAttribute.DefaultSqlScale(); var dataType = this.CurrentColumnDefinition.DataType; if (dataType.Arguments != null && dataType.Arguments.Any()) { // first is scale, second is precision. var argsCount = dataType.Arguments.Count(); if (argsCount > 2) { throw new InvalidOperationException("Datatype can have a maximum of 2 size arguments."); } if (argsCount >= 1) { var sqlPrecisionArg = dataType.Arguments.First(); ((IVisitableBuilder)sqlPrecisionArg).Accept(this); if (CurrentNumericLiteralValue != null) { moneyPrecision = Convert.ToInt32(CurrentNumericLiteralValue); CurrentNumericLiteralValue = null; } } if (argsCount >= 2) { int?sqlScale = null; var sqlScaleArg = dataType.Arguments.Skip(1).Take(1).Single(); ((IVisitableBuilder)sqlScaleArg).Accept(this); if (CurrentNumericLiteralValue != null) { sqlScale = Convert.ToInt32(CurrentNumericLiteralValue); CurrentNumericLiteralValue = null; } moneyScale = sqlScale.Value; } } moneyAttribute.SetFromSqlPrecisionAndScale(moneyPrecision, moneyScale); return(moneyAttribute); }
public MoneyAttributeMetadata Create(AttributeMetadata baseMetadata, double?maxValue, double?minValue, int?precision, int?precisionSource, ImeMode imeMode) { var moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = baseMetadata.SchemaName, DisplayName = baseMetadata.DisplayName, RequiredLevel = baseMetadata.RequiredLevel, Description = baseMetadata.Description, // Set extended properties MaxValue = 1000.00, MinValue = 0.00, Precision = 1, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; return(moneyAttribute); }
public MoneyAttributeMetadata CreateMoney(string schema, string label, int lang, AttributeRequiredLevel requiredLevel, double maxValue, double minValue, int precisionSize) { MoneyAttributeMetadata moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = schema, DisplayName = new Label(label, lang), RequiredLevel = new AttributeRequiredLevelManagedProperty(requiredLevel), Description = new Label(label, lang), // Set extended properties MaxValue = maxValue, MinValue = minValue, Precision = precisionSize, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; return(moneyAttribute); }
/// <summary> /// Gets the sql precision for the crm money attribute. /// </summary> /// <param name="metadata"></param> /// <returns></returns> public static bool IsSqlPrecisionSupported(this MoneyAttributeMetadata metadata, int precision, int scale) { if (precision < scale) { throw new ArgumentOutOfRangeException("precision must be equal to or greater than scale."); } if (scale < MoneyAttributeMetadata.MinSupportedPrecision || scale > MoneyAttributeMetadata.MaxSupportedPrecision) { return(false); } int crmMaxValueLengthWithoutPrecision = Math.Max(MoneyAttributeMetadata.MinSupportedValue.ToString().Length, MoneyAttributeMetadata.MaxSupportedValue.ToString().Length); if (precision - scale > crmMaxValueLengthWithoutPrecision) { return(false); } return(true); }
private static MoneyAttributeMetadata CreateMoneyAttribute(string name, string displayName, AttributeRequiredLevel attributeRequiredLevel, string desription, double minValue, double maxValue, int precision, int precisionSource) { // Create a date time attribute MoneyAttributeMetadata moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = publisherPrefix + name, LogicalName = publisherPrefix + name, DisplayName = new Label(displayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(attributeRequiredLevel), Description = new Label(desription, _languageCode), // Set extended properties MaxValue = maxValue, MinValue = minValue, Precision = precision, PrecisionSource = precisionSource, ImeMode = ImeMode.Disabled }; return(moneyAttribute); }
public EntityAttributeMetadataBuilder MoneyAttribute(string schemaName, string displayName, string description, AttributeRequiredLevel requiredLevel, double?min, double?max, int?precision, int?precisionSource, ImeMode imeMode = ImeMode.Disabled) { // Define the primary attribute for the entity // Create a integer attribute int languageCode = 1033; var att = new MoneyAttributeMetadata() { // Set base properties SchemaName = schemaName, DisplayName = new Label(schemaName, languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requiredLevel), Description = new Label(description, languageCode), // Set extended properties Precision = precision, PrecisionSource = precisionSource, MaxValue = max, MinValue = min, ImeMode = imeMode }; this.Attributes.Add(att); return(this); }
[STAThread] // Required to support the interactive login experience static void Main(string[] args) { CrmServiceClient service = null; try { service = SampleHelpers.Connect("Connect"); if (service.IsReady) { // Create any entity records that the demonstration code requires SetUpSample(service); #region Demonstrate _productVersion = Version.Parse(((RetrieveVersionResponse)service.Execute(new RetrieveVersionRequest())).Version); #region How to create attributes // Create storage for new attributes being created addedAttributes = new List <AttributeMetadata>(); // Create a boolean attribute var boolAttribute = new BooleanAttributeMetadata { // Set base properties SchemaName = "new_Boolean", LogicalName = "new_boolean", DisplayName = new Label("Sample Boolean", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Boolean Attribute", _languageCode), // Set extended properties OptionSet = new BooleanOptionSetMetadata( new OptionMetadata(new Label("True", _languageCode), 1), new OptionMetadata(new Label("False", _languageCode), 0) ) }; // Add to list addedAttributes.Add(boolAttribute); // Create a date time attribute var dtAttribute = new DateTimeAttributeMetadata { // Set base properties SchemaName = "new_Datetime", LogicalName = "new_datetime", DisplayName = new Label("Sample DateTime", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("DateTime Attribute", _languageCode), // Set extended properties Format = DateTimeFormat.DateOnly, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(dtAttribute); // Create a decimal attribute var decimalAttribute = new DecimalAttributeMetadata { // Set base properties SchemaName = "new_Decimal", LogicalName = "new_decimal", DisplayName = new Label("Sample Decimal", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Decimal Attribute", _languageCode), // Set extended properties MaxValue = 100, MinValue = 0, Precision = 1 }; // Add to list addedAttributes.Add(decimalAttribute); // Create a integer attribute var integerAttribute = new IntegerAttributeMetadata { // Set base properties SchemaName = "new_Integer", LogicalName = "new_integer", DisplayName = new Label("Sample Integer", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Integer Attribute", _languageCode), // Set extended properties Format = IntegerFormat.None, MaxValue = 100, MinValue = 0 }; // Add to list addedAttributes.Add(integerAttribute); // Create a memo attribute var memoAttribute = new MemoAttributeMetadata { // Set base properties SchemaName = "new_Memo", LogicalName = "new_memo", DisplayName = new Label("Sample Memo", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Memo Attribute", _languageCode), // Set extended properties Format = StringFormat.TextArea, ImeMode = ImeMode.Disabled, MaxLength = 500 }; // Add to list addedAttributes.Add(memoAttribute); // Create a money attribute var moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = "new_Money", LogicalName = "new_money", DisplayName = new Label("Money Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Money Attribue", _languageCode), // Set extended properties MaxValue = 1000.00, MinValue = 0.00, Precision = 1, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(moneyAttribute); // Create a picklist attribute var pickListAttribute = new PicklistAttributeMetadata { // Set base properties SchemaName = "new_Picklist", LogicalName = "new_picklist", DisplayName = new Label("Sample Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Picklist Attribute", _languageCode), // Set extended properties // Build local picklist options OptionSet = new OptionSetMetadata { IsGlobal = false, OptionSetType = OptionSetType.Picklist, Options = { new OptionMetadata( new Label("Created", _languageCode), null), new OptionMetadata( new Label("Updated", _languageCode), null), new OptionMetadata( new Label("Deleted", _languageCode), null) } } }; // Add to list addedAttributes.Add(pickListAttribute); // Create a string attribute var stringAttribute = new StringAttributeMetadata { // Set base properties SchemaName = "new_String", LogicalName = "new_string", DisplayName = new Label("Sample String", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("String Attribute", _languageCode), // Set extended properties MaxLength = 100 }; // Add to list addedAttributes.Add(stringAttribute); //Multi-select attribute requires version 9.0 or higher. if (_productVersion > new Version("9.0")) { // Create a multi-select optionset var multiSelectOptionSetAttribute = new MultiSelectPicklistAttributeMetadata() { SchemaName = "new_MultiSelectOptionSet", LogicalName = "new_multiselectoptionset", DisplayName = new Label("Multi-Select OptionSet", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Multi-Select OptionSet description", _languageCode), OptionSet = new OptionSetMetadata() { IsGlobal = false, OptionSetType = OptionSetType.Picklist, Options = { new OptionMetadata(new Label("First Option", _languageCode), null), new OptionMetadata(new Label("Second Option", _languageCode), null), new OptionMetadata(new Label("Third Option", _languageCode), null) } } }; // Add to list addedAttributes.Add(multiSelectOptionSetAttribute); } // NOTE: LookupAttributeMetadata cannot be created outside the context of a relationship. // Refer to the WorkWithRelationships.cs reference SDK sample for an example of this attribute type. // NOTE: StateAttributeMetadata and StatusAttributeMetadata cannot be created via the SDK. foreach (AttributeMetadata anAttribute in addedAttributes) { // Create the request. var createAttributeRequest = new CreateAttributeRequest { EntityName = Contact.EntityLogicalName, Attribute = anAttribute }; // Execute the request. service.Execute(createAttributeRequest); Console.WriteLine("Created the attribute {0}.", anAttribute.SchemaName); } #endregion How to create attributes #region How to insert status // Use InsertStatusValueRequest message to insert a new status // in an existing status attribute. // Create the request. var insertStatusValueRequest = new InsertStatusValueRequest { AttributeLogicalName = "statuscode", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("Dormant", _languageCode), StateCode = 0 }; // Execute the request and store newly inserted value // for cleanup, used later part of this sample. _insertedStatusValue = ((InsertStatusValueResponse)service.Execute( insertStatusValueRequest)).NewOptionValue; Console.WriteLine("Created status named '{0}' with the value of {1}.", insertStatusValueRequest.Label.LocalizedLabels[0].Label, _insertedStatusValue); #endregion How to insert status #region How to retrieve attribute // Create the request var attributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_string", RetrieveAsIfPublished = true }; // Execute the request RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)service.Execute(attributeRequest); Console.WriteLine("Retrieved the attribute {0}.", attributeResponse.AttributeMetadata.SchemaName); #endregion How to retrieve attribute #region How to update attribute // Modify the retrieved attribute var retrievedAttributeMetadata = attributeResponse.AttributeMetadata; retrievedAttributeMetadata.DisplayName = new Label("Update String Attribute", _languageCode); // Update an attribute retrieved via RetrieveAttributeRequest var updateRequest = new UpdateAttributeRequest { Attribute = retrievedAttributeMetadata, EntityName = Contact.EntityLogicalName, MergeLabels = false }; // Execute the request service.Execute(updateRequest); Console.WriteLine("Updated the attribute {0}.", retrievedAttributeMetadata.SchemaName); #endregion How to update attribute #region How to update state value // Modify the state value label from Active to Open. // Create the request. var updateStateValue = new UpdateStateValueRequest { AttributeLogicalName = "statecode", EntityLogicalName = Contact.EntityLogicalName, Value = 1, Label = new Label("Open", _languageCode) }; // Execute the request. service.Execute(updateStateValue); Console.WriteLine( "Updated {0} state attribute of {1} entity from 'Active' to '{2}'.", updateStateValue.AttributeLogicalName, updateStateValue.EntityLogicalName, updateStateValue.Label.LocalizedLabels[0].Label ); #endregion How to update state value #region How to insert a new option item in a local option set // Create a request. var insertOptionValueRequest = new InsertOptionValueRequest { AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("New Picklist Label", _languageCode) }; // Execute the request. int insertOptionValue = ((InsertOptionValueResponse)service.Execute( insertOptionValueRequest)).NewOptionValue; Console.WriteLine("Created {0} with the value of {1}.", insertOptionValueRequest.Label.LocalizedLabels[0].Label, insertOptionValue); #endregion How to insert a new option item in a local option set #region How to change the order of options of a local option set // Use the RetrieveAttributeRequest message to retrieve // a attribute by it's logical name. var retrieveAttributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_picklist", RetrieveAsIfPublished = true }; // Execute the request. RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute( retrieveAttributeRequest); // Access the retrieved attribute. var retrievedPicklistAttributeMetadata = (PicklistAttributeMetadata) retrieveAttributeResponse.AttributeMetadata; // Get the current options list for the retrieved attribute. OptionMetadata[] optionList = retrievedPicklistAttributeMetadata.OptionSet.Options.ToArray(); // Change the order of the original option's list. // Use the OrderBy (OrderByDescending) linq function to sort options in // ascending (descending) order according to label text. // For ascending order use this: var updateOptionList = optionList.OrderBy(x => x.Label.LocalizedLabels[0].Label).ToList(); // For descending order use this: // var updateOptionList = // optionList.OrderByDescending( // x => x.Label.LocalizedLabels[0].Label).ToList(); // Create the request. var orderOptionRequest = new OrderOptionRequest { // Set the properties for the request. AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, // Set the changed order using Select linq function // to get only values in an array from the changed option list. Values = updateOptionList.Select(x => x.Value.Value).ToArray() }; // Execute the request service.Execute(orderOptionRequest); Console.WriteLine("Option Set option order changed"); #endregion How to change the order of options of a global option set // NOTE: All customizations must be published before they can be used. service.Execute(new PublishAllXmlRequest()); Console.WriteLine("Published all customizations."); #endregion Demonstrate #region Clean up CleanUpSample(service); #endregion Clean up } else { const string UNABLE_TO_LOGIN_ERROR = "Unable to Login to Microsoft Dataverse"; if (service.LastCrmError.Equals(UNABLE_TO_LOGIN_ERROR)) { Console.WriteLine("Check the connection string values in cds/App.config."); throw new Exception(service.LastCrmError); } else { throw service.LastCrmException; } } } catch (Exception ex) { SampleHelpers.HandleException(ex); } finally { if (service != null) { service.Dispose(); } Console.WriteLine("Press <Enter> to exit."); Console.ReadLine(); } }
private AttributeMetadata GetAttributeMetadata(string type, string logicalname, string displayname, AttributeRequiredLevel requiredlevel) { AttributeMetadata attribute = null; if (type != null) { switch (type.ToLower()) { case "boolean": attribute = new BooleanAttributeMetadata { // Set extended properties OptionSet = new BooleanOptionSetMetadata( new OptionMetadata(new Label("True", languageCode), 1), new OptionMetadata(new Label("False", languageCode), 0) ) }; break; case "datetime": // Create a date time attribute attribute = new DateTimeAttributeMetadata { // Set extended properties Format = DateTimeFormat.DateOnly, ImeMode = ImeMode.Disabled }; break; case "double": // Create a decimal attribute attribute = new DecimalAttributeMetadata { // Set extended properties MaxValue = 100, MinValue = 0, Precision = 1 }; break; case "integer": // Create a integer attribute attribute = new IntegerAttributeMetadata { // Set extended properties Format = IntegerFormat.None, MaxValue = 100, MinValue = 0 }; break; case "memo": // Create a memo attribute attribute = new MemoAttributeMetadata { // Set extended properties Format = StringFormat.TextArea, ImeMode = ImeMode.Disabled, MaxLength = 500 }; break; case "money": // Create a money attribute MoneyAttributeMetadata moneyAttribute = new MoneyAttributeMetadata { // Set extended properties MaxValue = 1000.00, MinValue = 0.00, Precision = 1, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; break; case "picklist": // Create a picklist attribute attribute = new PicklistAttributeMetadata { // Set extended properties // Build local picklist options OptionSet = new OptionSetMetadata { IsGlobal = false, OptionSetType = OptionSetType.Picklist } }; break; case "string": // Create a string attribute attribute = new StringAttributeMetadata { // Set extended properties MaxLength = 100 }; break; default: throw new ArgumentException(string.Format("Unexpected attribute type: {0}", type)); } // Set base properties attribute.SchemaName = logicalname; attribute.DisplayName = new Label(displayname, languageCode); attribute.RequiredLevel = new AttributeRequiredLevelManagedProperty(requiredlevel); } return(attribute); }
private object CopyValueInternal(AttributeMetadata oldAttribute, MoneyAttributeMetadata newAttribute, object value) { return CopyValueInternal(oldAttribute, new DecimalAttributeMetadata(), value); }
public void CreateCRMAttribute(DataRow record) { string result = string.Empty; try { #region # Read From Datatable # AttributeMetadata createMetadata = new AttributeMetadata(); bool isGlobal = false; AttributeRequiredLevel requirementLevel = AttributeRequiredLevel.None; string reqLevelText = ""; int precisionSource = 0; int currencyPrecision = 2; if (record["RequiredLevel"] != null && !string.IsNullOrEmpty(Convert.ToString(record["RequiredLevel"]))) { reqLevelText = Convert.ToString(record["RequiredLevel"]).ToLower(); requirementLevel = reqLevelText == "required" ? AttributeRequiredLevel.ApplicationRequired : AttributeRequiredLevel.Recommended; } reqLevelText = record["Attribute Type"].ToString().ToLower(); string attributeSchemaName = record["Attribute Schema Name"].ToString().ToLower(); string optionSetValues = record["Option Set Values"].ToString().ToLower(); string attributeDisplayName = record["Attribute Display Name"].ToString().ToLower(); string attributeDiscription = record["Description"].ToString().ToLower(); bool boolDefaultValue = record["Default Value"].ToString().ToLower() == "yes"?true:false; Microsoft.Xrm.Sdk.Metadata.StringFormat stringFormat = GetStringFormat(record["String Format"].ToString().ToLower()); int stringLength = record["String Length"] != null && !string.IsNullOrEmpty(Convert.ToString(record["String Length"])) && Convert.ToInt32(record["String Length"].ToString()) <= 4000? Convert.ToInt32(record["String Length"].ToString()) : 4000; Microsoft.Xrm.Sdk.Metadata.DateTimeFormat dateFormat = record["Date Type Format"] != null && !string.IsNullOrEmpty(record["Date Type Format"].ToString()) ? GetDateFormat(record["Date Type Format"].ToString().ToLower()):DateTimeFormat.DateAndTime; Microsoft.Xrm.Sdk.Metadata.IntegerFormat integerFormt = record["Integer Format"] != null && !string.IsNullOrEmpty(record["Integer Format"].ToString()) ? GetIntegerFormat(record["Integer Format"].ToString().ToLower()) : IntegerFormat.None; Double intMinValue = record["Integer Minimum Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Integer Minimum Value"])) && Convert.ToDouble(record["Integer Minimum Value"].ToString()) <= 2147483647 && Convert.ToDouble(record["Integer Minimum Value"].ToString()) >= -2147483647 ? Convert.ToDouble(record["Integer Minimum Value"].ToString()) : -2147483648; Double intMaxValue = record["Integer Maximum Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Integer Maximum Value"])) && Convert.ToDouble(record["Integer Maximum Value"].ToString()) <= 2147483647 && Convert.ToDouble(record["Integer Maximum Value"].ToString()) >= -2147483647 ? Convert.ToDouble(record["Integer Maximum Value"].ToString()) : 2147483647; int floatingPrecision = record["Floating Number Precision"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Floating Number Precision"])) ? Convert.ToInt32(record["Floating Number Precision"].ToString()) : 2; Double floatMinValue = record["Float Min Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Float Min Value"])) && Convert.ToDouble(record["Float Min Value"].ToString()) >= 0 && Convert.ToDouble(record["Float Min Value"].ToString()) <= 1000000000 ? Convert.ToDouble(record["Float Min Value"].ToString()) : 0; Double floatMaxValue = record["Float Max Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Float Max Value"])) && Convert.ToDouble(record["Float Max Value"].ToString()) >= 0 && Convert.ToDouble(record["Float Max Value"].ToString()) <= 1000000000 ? Convert.ToDouble(record["Float Max Value"].ToString()) : 1000000000; int decimalPrecision = record["Decimal Precision"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Decimal Precision"])) ? Convert.ToInt32(record["Decimal Precision"].ToString()) : 2; Decimal decimalMinValue = record["Decimal Min Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Decimal Min Value"])) && Convert.ToDecimal(record["Decimal Min Value"].ToString()) >= -100000000000 && Convert.ToDecimal(record["Decimal Min Value"].ToString()) <= 100000000000 ? Convert.ToDecimal(record["Decimal Min Value"].ToString()) : -100000000000; Decimal decimalMaxValue = record["Decimsl Max Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Decimsl Max Value"])) && Convert.ToDecimal(record["Decimsl Max Value"].ToString()) >= -100000000000 && Convert.ToDecimal(record["Decimsl Max Value"].ToString()) <= 100000000000 ? Convert.ToDecimal(record["Decimsl Max Value"].ToString()) : 100000000000; Double currencyMinValue = record["Currency Min Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Currency Min Value"])) && Convert.ToDouble(record["Currency Min Value"].ToString()) >= -922337203685477 && Convert.ToDouble(record["Currency Min Value"].ToString()) <= 922337203685477 ? Convert.ToDouble(record["Currency Min Value"].ToString()) : -922337203685477; Double currencyMaxValue = record["Currency Max Value"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Currency Max Value"])) && Convert.ToDouble(record["Currency Max Value"].ToString()) >= -922337203685477 && Convert.ToDouble(record["Currency Max Value"].ToString()) <= 922337203685477 ? Convert.ToDouble(record["Currency Max Value"].ToString()) : 922337203685477; Microsoft.Xrm.Sdk.Metadata.ImeMode imeMode = GetIMEMode(record["IME Mode"].ToString().ToLower()); if (record["Currency precision"] != null && !string.IsNullOrEmpty(Convert.ToString(record["Currency precision"]).ToLower())) { switch (Convert.ToString(record["Currency precision"]).ToLower().Trim()) { case "pricing decimal precision": precisionSource = 1; break; case "currency precision": precisionSource = 2; break; default: currencyPrecision = Convert.ToInt32(Convert.ToString(record["Currency precision"])); break; } } bool isAuditEnabled = record["AuditEnable"] != null && record["AuditEnable"].ToString().ToLower() == "yes" ? true : false; bool isValidForAdvancFind = record["IsValidForAdvancedFind"] != null && record["IsValidForAdvancedFind"].ToString().ToLower() == "yes" ? true : false; #endregion # Read From Datatable # switch (reqLevelText.ToLower().Trim()) { case "boolean": // Create a boolean attribute createMetadata = new BooleanAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), // Set extended properties OptionSet = new BooleanOptionSetMetadata( new OptionMetadata(new Microsoft.Xrm.Sdk.Label("Yes", _languageCode), 1), new OptionMetadata(new Microsoft.Xrm.Sdk.Label("No", _languageCode), 0) ), DefaultValue = boolDefaultValue, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), }; break; case "date and time": createMetadata = new DateTimeAttributeMetadata { // Set base properties SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), // Set extended properties Format = dateFormat, ImeMode = imeMode, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), }; break; case "multiple line of text": createMetadata = new MemoAttributeMetadata { // Set base properties SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), // Set extended properties ImeMode = imeMode, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), MaxLength = stringLength }; break; case "whole number": createMetadata = new IntegerAttributeMetadata { // Set base properties SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), // Set extended properties // ImeMode = imeMode,// in crm 2016 ths feature is there // Set extended properties Format = IntegerFormat.None, MaxValue = Convert.ToInt32(intMaxValue), MinValue = Convert.ToInt32(intMinValue), IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind) }; break; case "floating point number": createMetadata = new DoubleAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), MaxValue = floatMaxValue, MinValue = floatMinValue, Precision = floatingPrecision, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), ImeMode = imeMode }; break; case "decimal number": createMetadata = new DecimalAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), MaxValue = decimalMaxValue, MinValue = decimalMinValue, Precision = decimalPrecision, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), ImeMode = imeMode }; break; case "currency": createMetadata = new MoneyAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), MaxValue = currencyMaxValue, MinValue = currencyMinValue, Precision = currencyPrecision, PrecisionSource = precisionSource, ImeMode = imeMode }; break; case "option set": OptionMetadataCollection optionMetadataCollection = GetOptionMetadata(optionSetValues); OptionSetMetadata Optionmedata = new OptionSetMetadata(); if (optionMetadataCollection != null && optionMetadataCollection.Count() > 0) { Optionmedata.Options.AddRange(optionMetadataCollection); } Optionmedata.IsGlobal = isGlobal; Optionmedata.OptionSetType = OptionSetType.Picklist; createMetadata = new PicklistAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), OptionSet = Optionmedata }; break; case "single line of text": createMetadata = new StringAttributeMetadata { SchemaName = attributeSchemaName, DisplayName = new Microsoft.Xrm.Sdk.Label(attributeDisplayName, _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(requirementLevel), Description = new Microsoft.Xrm.Sdk.Label(attributeDiscription, _languageCode), // Set extended properties ImeMode = imeMode, IsAuditEnabled = new BooleanManagedProperty(isAuditEnabled), IsValidForAdvancedFind = new BooleanManagedProperty(isValidForAdvancFind), MaxLength = stringLength }; break; } CreateAttributeRequest request = new CreateAttributeRequest { Attribute = createMetadata, EntityName = ApplicationSetting.SelectedEntity.LogicalName }; try { Service.Execute(request); result = "Success"; } catch (FaultException <Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) { result = ex.Message; } catch (Exception ex) { result = ex.Message; } } catch (Exception ex) { result = ex.Message; } }
public static AttributeMetadata SetMetadataType(string type, string prefix, string name) { AttributeMetadata value = new AttributeMetadata(); switch (type) { case "Single Line of Text": value = new StringAttributeMetadata(); ((StringAttributeMetadata)value).Format = Microsoft.Xrm.Sdk.Metadata.StringFormat.Text; ((StringAttributeMetadata)value).MaxLength = 100; break; case "Two Options": value = new BooleanAttributeMetadata(); ((BooleanAttributeMetadata)value).OptionSet = new BooleanOptionSetMetadata(new OptionMetadata( new Microsoft.Xrm.Sdk.Label("Yes", 1033), 10000), new OptionMetadata(new Microsoft.Xrm.Sdk.Label("No", 1033), 10001)); ((BooleanAttributeMetadata)value).DefaultValue = false; break; case "Whole Number": value = new IntegerAttributeMetadata(); ((IntegerAttributeMetadata)value).Format = Microsoft.Xrm.Sdk.Metadata.IntegerFormat.None; ((IntegerAttributeMetadata)value).MinValue = -2147483648; ((IntegerAttributeMetadata)value).MaxValue = 2147483647; break; case "Floating Point Number": value = new DoubleAttributeMetadata(); ((DoubleAttributeMetadata)value).Precision = 2; ((DoubleAttributeMetadata)value).MinValue = 0.00; ((DoubleAttributeMetadata)value).MaxValue = 1000000000.00; break; case "Decimal Number": value = new DecimalAttributeMetadata(); ((DecimalAttributeMetadata)value).Precision = 2; ((DecimalAttributeMetadata)value).MinValue = (decimal)0.00; ((DecimalAttributeMetadata)value).MaxValue = (decimal)1000000000.00; break; case "Currency": value = new MoneyAttributeMetadata(); ((MoneyAttributeMetadata)value).Precision = 4; ((MoneyAttributeMetadata)value).PrecisionSource = 2; ((MoneyAttributeMetadata)value).MinValue = 0.0000; ((MoneyAttributeMetadata)value).MaxValue = 1000000000.0000; break; case "Multiple Lines of Text": value = new MemoAttributeMetadata(); ((MemoAttributeMetadata)value).MaxLength = 2000; break; case "Date and Time": value = new DateTimeAttributeMetadata(); ((DateTimeAttributeMetadata)value).Format = Microsoft.Xrm.Sdk.Metadata.DateTimeFormat.DateOnly; break; } value.SchemaName = prefix + "_" + name.ToLower(); value.DisplayName = new Microsoft.Xrm.Sdk.Label(name, 1033); value.IsAuditEnabled = new BooleanManagedProperty(true); return(value); }
private RetrieveAttributeResponse ExecuteInternal(RetrieveAttributeRequest request) { var response = new RetrieveAttributeResponse(); var entityType = CrmServiceUtility.GetEarlyBoundProxyAssembly().GetTypes().FirstOrDefault(t => t.GetCustomAttribute <EntityLogicalNameAttribute>(true)?.LogicalName == request.EntityLogicalName); var propertyTypes = entityType?.GetProperties() .Where(p => p.GetCustomAttribute <AttributeLogicalNameAttribute>()?.LogicalName == request.LogicalName ).Select(p => p.PropertyType.IsGenericType ? p.PropertyType.GenericTypeArguments.First() : p.PropertyType).ToList(); var propertyType = propertyTypes?.Count == 1 ? propertyTypes[0] : propertyTypes?.FirstOrDefault(p => p != typeof(OptionSetValue) && p != typeof(EntityReference)); // Handle OptionSets/EntityReferences that may have multiple properties if (propertyType == null) { throw new Exception($"Unable to find a property for Entity {request.EntityLogicalName} and property {request.LogicalName} in {CrmServiceUtility.GetEarlyBoundProxyAssembly().FullName}"); } AttributeMetadata metadata; if (propertyType.IsEnum || propertyTypes.Any(p => p == typeof(OptionSetValue))) { metadata = CreateOptionSetAttributeMetadata(request, propertyType); } else if (propertyType == typeof(string)) { metadata = new StringAttributeMetadata(request.LogicalName); } else if (propertyTypes.Any(p => p == typeof(EntityReference))) { metadata = new LookupAttributeMetadata { LogicalName = request.LogicalName }; } #if !XRM_2013 else if (propertyType == typeof(Guid)) { metadata = new UniqueIdentifierAttributeMetadata { LogicalName = request.LogicalName }; } #endif else if (propertyType == typeof(bool)) { metadata = new BooleanAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(Money)) { metadata = new MoneyAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(int)) { metadata = new IntegerAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(long)) { metadata = new BigIntAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(DateTime)) { metadata = new DateTimeAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(double)) { metadata = new DoubleAttributeMetadata { LogicalName = request.LogicalName }; } else if (propertyType == typeof(decimal)) { metadata = new DecimalAttributeMetadata { LogicalName = request.LogicalName }; } else { throw new NotImplementedException($"Attribute Type of {propertyType.FullName} is not implemented."); } response.Results["AttributeMetadata"] = metadata; return(response); }
/// <summary> /// The main method /// </summary> /// <param name="args">The arguments</param> public static void Main(string[] args) { var options = new Options(); if (CommandLine.Parser.Default.ParseArguments(args, options)) { Console.WriteLine("Connection String: {0}", options.ConnectionString); Console.WriteLine("Entities: {0}", options.Entities ?? "None"); Console.WriteLine(string.Empty); foreach (string sourceFileName in Directory.GetFiles(@"..\..\OneXrm\", "*.ts")) { string destFileName = string.Format(@"..\..\..\..\..\FinalDynamicsChallenge.Singular\OneXrm\{0}", Path.GetFileName(sourceFileName)); Console.Write("Copying: {0} to {1}... ", sourceFileName, destFileName); File.Copy(sourceFileName, destFileName, true); Console.WriteLine("Done"); } TemplateList templates = new TemplateList(); Console.Write("Connecting to Dynamics 365... "); CrmServiceClient connection = new CrmServiceClient(options.ConnectionString); if (connection.IsReady) { Console.WriteLine("Done"); IOrganizationService service = (IOrganizationService)connection.OrganizationServiceProxy; foreach (string entity in options.Entities.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { Console.Write("Retrieving {0}... ", entity.Trim()); RetrieveEntityResponse retrieveEntityResponse = (RetrieveEntityResponse)service.Execute(new RetrieveEntityRequest { LogicalName = entity.Trim(), EntityFilters = EntityFilters.Attributes }); EntityMetadata entityMetadata = retrieveEntityResponse.EntityMetadata; Console.Write("Generating OneXrm.Sdk.Entities.{0}... ", retrieveEntityResponse.EntityMetadata.SchemaName); string content = templates.Entity; StringBuilder attributes = new StringBuilder(); StringBuilder optionSets = new StringBuilder(); StringBuilder metadataAttributes = new StringBuilder(); foreach (AttributeMetadata attributeMetadata in entityMetadata.Attributes.Where(ma => ma.AttributeOf == null).OrderBy(ma => ma.LogicalName)) { string attributeContent = string.Empty; switch (attributeMetadata.AttributeType) { case AttributeTypeCode.BigInt: attributeContent = templates.BigIntAttribute; break; case AttributeTypeCode.Boolean: attributeContent = templates.BooleanAttribute; break; case AttributeTypeCode.Customer: attributeContent = templates.CustomerAttribute; break; case AttributeTypeCode.DateTime: attributeContent = templates.DateTimeAttribute; break; case AttributeTypeCode.Decimal: attributeContent = templates.DecimalAttribute; break; case AttributeTypeCode.Double: attributeContent = templates.DoubleAttribute; break; case AttributeTypeCode.Integer: attributeContent = templates.IntegerAttribute; break; case AttributeTypeCode.Memo: attributeContent = templates.MemoAttribute; break; case AttributeTypeCode.Money: MoneyAttributeMetadata moneyAttributeMetadata = (MoneyAttributeMetadata)attributeMetadata; if (moneyAttributeMetadata.CalculationOf == null) { attributeContent = templates.MoneyAttribute; } break; case AttributeTypeCode.Owner: attributeContent = templates.OwnerAttribute; break; case AttributeTypeCode.PartyList: attributeContent = templates.PartyListAttribute; break; case AttributeTypeCode.Picklist: attributeContent = templates.PicklistAttribute; break; case AttributeTypeCode.State: attributeContent = templates.StateAttribute; break; case AttributeTypeCode.Status: attributeContent = templates.StatusAttribute; break; case AttributeTypeCode.String: attributeContent = templates.StringAttribute; break; case AttributeTypeCode.Lookup: attributeContent = templates.LookupAttribute; break; case AttributeTypeCode.Virtual: if (attributeMetadata is MultiSelectPicklistAttributeMetadata) { attributeContent = templates.MultiSelectPicklistAttribute; } break; } if (!string.IsNullOrEmpty(attributeContent)) { attributeContent = attributeContent.Replace("{Attribute:LogicalNameProperty}", attributeMetadata.LogicalName == "name" ? "nameAttribute" : attributeMetadata.LogicalName); attributeContent = attributeContent.Replace("{Attribute:LogicalNameValue}", attributeMetadata.LogicalName); attributes.AppendLine(attributeContent); } bool isOptionSet = false; switch (attributeMetadata.AttributeType) { case AttributeTypeCode.Boolean: case AttributeTypeCode.Picklist: case AttributeTypeCode.State: case AttributeTypeCode.Status: isOptionSet = true; break; case AttributeTypeCode.Virtual: isOptionSet = attributeMetadata is MultiSelectPicklistAttributeMetadata; break; } if (isOptionSet) { string optionSetContent = templates.OptionSetEnum; optionSetContent = optionSetContent.Replace("{Attribute:LogicalNameProperty}", attributeMetadata.LogicalName == "name" ? "nameAttribute" : attributeMetadata.LogicalName); optionSetContent = optionSetContent.Replace("{Attribute:LogicalNameValue}", attributeMetadata.LogicalName); optionSetContent = optionSetContent.Replace("{Attribute:Options}", Utils.GetOptions(attributeMetadata)); optionSets.AppendLine(optionSetContent); } string metadataAttributeContent = string.Empty; string attributeTargets = string.Empty; switch (attributeMetadata.AttributeType) { case AttributeTypeCode.BigInt: case AttributeTypeCode.Boolean: case AttributeTypeCode.Customer: case AttributeTypeCode.DateTime: case AttributeTypeCode.Decimal: case AttributeTypeCode.Double: case AttributeTypeCode.Integer: case AttributeTypeCode.Memo: case AttributeTypeCode.Owner: case AttributeTypeCode.PartyList: case AttributeTypeCode.Picklist: case AttributeTypeCode.State: case AttributeTypeCode.Status: case AttributeTypeCode.String: case AttributeTypeCode.Uniqueidentifier: metadataAttributeContent = templates.MetadataAttribute; break; case AttributeTypeCode.Lookup: LookupAttributeMetadata lookupAttributeMetadata = (LookupAttributeMetadata)attributeMetadata; attributeTargets = string.Format(",\n targets: [{0}]", string.Join(",", lookupAttributeMetadata.Targets.Select(t => string.Format("\"{0}\"", t)))); metadataAttributeContent = templates.MetadataAttribute; break; case AttributeTypeCode.Money: MoneyAttributeMetadata moneyAttributeMetadata = (MoneyAttributeMetadata)attributeMetadata; if (moneyAttributeMetadata.CalculationOf == null) { metadataAttributeContent = templates.MetadataAttribute; } break; case AttributeTypeCode.Virtual: if (attributeMetadata is MultiSelectPicklistAttributeMetadata) { metadataAttributeContent = templates.MetadataAttribute; } break; } if (!string.IsNullOrEmpty(metadataAttributeContent)) { metadataAttributeContent = metadataAttributeContent.Replace("{Attribute:LogicalNameProperty}", attributeMetadata.LogicalName == "name" ? "nameAttribute" : attributeMetadata.LogicalName); metadataAttributeContent = metadataAttributeContent.Replace("{Attribute:LogicalNameValue}", attributeMetadata.LogicalName); metadataAttributeContent = metadataAttributeContent.Replace("{Attribute:SchemaName}", attributeMetadata.SchemaName); metadataAttributeContent = metadataAttributeContent.Replace("{Attribute:AttributeType}", attributeMetadata.AttributeType.ToString()); metadataAttributeContent = metadataAttributeContent.Replace("{Attribute:Targets}", attributeTargets); metadataAttributes.AppendLine(metadataAttributeContent); } } content = content.Replace("{Entity:Attributes}", attributes.ToString()); content = content.Replace("{Entity:OptionSets}", optionSets.ToString()); content = content.Replace("{Entity:MetadataAttributes}", metadataAttributes.ToString()); content = content.Replace("{Entity:LogicalName}", entityMetadata.LogicalName); content = content.Replace("{Entity:SchemaName}", entityMetadata.SchemaName); content = content.Replace("{Entity:PrimaryIdAttribute}", entityMetadata.PrimaryIdAttribute); content = content.Replace("{Entity:LogicalCollectionName}", entityMetadata.LogicalCollectionName); content = content.Replace("{Entity:ObjectTypeCode}", (entityMetadata.IsCustomEntity ?? false) ? "null" : (entityMetadata.ObjectTypeCode ?? 0).ToString()); content = content.Replace("{Entity:IsCustomEntity}", (entityMetadata.IsCustomEntity ?? false) ? "true" : "false"); File.WriteAllText(string.Format(@"..\..\..\..\..\FinalDynamicsChallenge.Singular\OneXrm\OneXrm.Entities.{0}.ts", entityMetadata.LogicalName), content, Encoding.UTF8); Console.WriteLine("Done"); } } else { Console.Write("Unable to connect to Dynamics 365: "); Console.WriteLine(connection.LastCrmError); } } Console.WriteLine("Press enter to close..."); Console.ReadLine(); }
public void CreateAttribute(CrmServiceClient service, string entityname, List <DxEntityAttribute> entityAttributes) { #region Attribute Metadata StringAttributeMetadata dxStringAttributeMetadata = null; DecimalAttributeMetadata dxDecimalAttributeMetadata = null; IntegerAttributeMetadata dxIntegerAttributeMetadata = null; MoneyAttributeMetadata dxMoneyAttributeMetadata = null; DateTimeAttributeMetadata dxDateTimeAttributeMetadata = null; #endregion AttributeMetadata attributeMetadata = null; foreach (DxEntityAttribute dxEntityAttribute in entityAttributes) { switch (dxEntityAttribute.PType) { case 1: dxStringAttributeMetadata = new StringAttributeMetadata { SchemaName = String.Format("{0}_{1}", entityname.Substring(0, entityname.IndexOf("_")), dxEntityAttribute.PSchemaName.ToLower().Trim()), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), MaxLength = dxEntityAttribute.StringAttribute.PMaxLength, FormatName = dxEntityAttribute.StringAttribute.PStringFormatName, DisplayName = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDisplayName, 3082), Description = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDescription, 3082), }; attributeMetadata = dxStringAttributeMetadata; break; case 2: dxDecimalAttributeMetadata = new DecimalAttributeMetadata { SchemaName = String.Format("{0}_{1}", entityname.Substring(0, entityname.IndexOf("_")), dxEntityAttribute.PSchemaName.ToLower().Trim()), DisplayName = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDisplayName, 3082), Description = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDescription, 3082), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), MaxValue = dxEntityAttribute.DecimalAttribute.PMaxValue, MinValue = dxEntityAttribute.DecimalAttribute.PMinValue, Precision = dxEntityAttribute.DecimalAttribute.PPrecision }; attributeMetadata = dxDecimalAttributeMetadata; break; case 3: dxIntegerAttributeMetadata = new IntegerAttributeMetadata { SchemaName = String.Format("{0}_{1}", entityname.Substring(0, entityname.IndexOf("_")), dxEntityAttribute.PSchemaName.ToLower().Trim()), DisplayName = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDisplayName, 3082), Description = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDescription, 3082), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), MaxValue = dxEntityAttribute.IntegerAttribute.PMaxValue, MinValue = dxEntityAttribute.IntegerAttribute.PMinValue, Format = dxEntityAttribute.IntegerAttribute.PFormat }; attributeMetadata = dxIntegerAttributeMetadata; break; case 4: dxMoneyAttributeMetadata = new MoneyAttributeMetadata { SchemaName = String.Format("{0}_{1}", entityname.Substring(0, entityname.IndexOf("_")), dxEntityAttribute.PSchemaName.ToLower().Trim()), DisplayName = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDisplayName, 3082), Description = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDescription, 3082), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), MaxValue = dxEntityAttribute.MoneyAttribute.PMaxValue, MinValue = dxEntityAttribute.MoneyAttribute.PMinValue, Precision = dxEntityAttribute.MoneyAttribute.PPrecision, PrecisionSource = dxEntityAttribute.MoneyAttribute.PPrecisionSource, ImeMode = dxEntityAttribute.MoneyAttribute.PImeMode }; attributeMetadata = dxMoneyAttributeMetadata; break; case 5: dxDateTimeAttributeMetadata = new DateTimeAttributeMetadata { SchemaName = String.Format("{0}_{1}", entityname.Substring(0, entityname.IndexOf("_")), dxEntityAttribute.PSchemaName.ToLower().Trim()), DisplayName = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDisplayName, 3082), Description = new Microsoft.Xrm.Sdk.Label(dxEntityAttribute.PDescription, 3082), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Format = dxEntityAttribute.DateTimeAttribute.PFormat, ImeMode = dxEntityAttribute.DateTimeAttribute.PImeMode }; attributeMetadata = dxDateTimeAttributeMetadata; break; } CreateAttributeRequest createBankNameAttributeRequest = new CreateAttributeRequest { EntityName = entityname, Attribute = attributeMetadata, }; service.OrganizationServiceProxy.Execute(createBankNameAttributeRequest); } }
private IEnumerable <string> checkDifferenceAttributeMetadata(AttributeMetadata originalAttributeMetadata, AttributeMetadata readAttributeMetadata) { List <string> attributesToUpdate = checkGlobalDifferenceAttributeMetadata(originalAttributeMetadata, readAttributeMetadata); switch (originalAttributeMetadata.AttributeType) { case AttributeTypeCode.Integer: IntegerAttributeMetadata intattrMetadata = originalAttributeMetadata as IntegerAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceIntegerAttribute(intattrMetadata, readAttributeMetadata as IntegerAttributeMetadata)); originalAttributeMetadata = intattrMetadata; break; case AttributeTypeCode.DateTime: DateTimeAttributeMetadata dateattrMetadata = originalAttributeMetadata as DateTimeAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceDateTimeAttribute(dateattrMetadata, readAttributeMetadata as DateTimeAttributeMetadata)); originalAttributeMetadata = dateattrMetadata; break; case AttributeTypeCode.String: StringAttributeMetadata strattrMetadata = originalAttributeMetadata as StringAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceStringAttribute(strattrMetadata, readAttributeMetadata as StringAttributeMetadata)); originalAttributeMetadata = strattrMetadata; break; case AttributeTypeCode.Picklist: PicklistAttributeMetadata pklattrMetadata = originalAttributeMetadata as PicklistAttributeMetadata; attributesToUpdate.AddRange(checkDifferencePicklistAttribute(pklattrMetadata, readAttributeMetadata as PicklistAttributeMetadata)); originalAttributeMetadata = pklattrMetadata; break; case AttributeTypeCode.Memo: MemoAttributeMetadata memattrMetadata = originalAttributeMetadata as MemoAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceMemoAttribute(memattrMetadata, readAttributeMetadata as MemoAttributeMetadata)); originalAttributeMetadata = memattrMetadata; break; case AttributeTypeCode.Double: DoubleAttributeMetadata dblattrMetadata = originalAttributeMetadata as DoubleAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceDoubleAttribute(dblattrMetadata, readAttributeMetadata as DoubleAttributeMetadata)); originalAttributeMetadata = dblattrMetadata; break; case AttributeTypeCode.Decimal: DecimalAttributeMetadata dcmattrMetadata = originalAttributeMetadata as DecimalAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceDecimalAttribute(dcmattrMetadata, readAttributeMetadata as DecimalAttributeMetadata)); originalAttributeMetadata = dcmattrMetadata; break; case AttributeTypeCode.Boolean: BooleanAttributeMetadata blnattrMetadata = originalAttributeMetadata as BooleanAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceBooleanAttribute(blnattrMetadata, readAttributeMetadata as BooleanAttributeMetadata)); originalAttributeMetadata = blnattrMetadata; break; case AttributeTypeCode.Money: MoneyAttributeMetadata mnyattrMetadata = originalAttributeMetadata as MoneyAttributeMetadata; attributesToUpdate.AddRange(checkDifferenceMoneyAttribute(mnyattrMetadata, readAttributeMetadata as MoneyAttributeMetadata)); originalAttributeMetadata = mnyattrMetadata; break; } return(attributesToUpdate); }
/// <summary> /// Gets the default sql scale for the crm money attribute. /// </summary> /// <param name="metadata"></param> /// <returns></returns> public static int DefaultSqlScale(this MoneyAttributeMetadata metadata) { int scale = MoneyAttributeMetadata.MinSupportedPrecision; return(scale); }
private AttributeMetadata CloneAttributes(MoneyAttributeMetadata att) { return new MoneyAttributeMetadata { ImeMode = att.ImeMode, MaxValue = att.MaxValue, MinValue = att.MinValue, Precision = att.Precision, PrecisionSource = att.PrecisionSource, CalculationOf = att.CalculationOf, FormulaDefinition = att.FormulaDefinition }; }
/// <summary> /// Gets the default sql precision for the crm money attribute. /// </summary> /// <param name="metadata"></param> /// <returns></returns> public static int DefaultSqlPrecision(this MoneyAttributeMetadata metadata) { var precision = Math.Max(Math.Truncate(Math.Abs(MoneyAttributeMetadata.MaxSupportedValue)).ToString().Length, Math.Truncate(Math.Abs(MoneyAttributeMetadata.MinSupportedValue)).ToString().Length); return(precision + DefaultSqlScale(metadata)); }
public void CreateOrUpdateMoneyAttribute(string schemaName, string displayName, string description, bool isRequired, bool audit, bool searchable, string recordType, double minimum, double maximum) { MoneyAttributeMetadata metadata; if (FieldExists(schemaName, recordType)) metadata = (MoneyAttributeMetadata) GetFieldMetadata(schemaName, recordType); else metadata = new MoneyAttributeMetadata(); SetCommon(metadata, schemaName, displayName, description, isRequired, audit, searchable); metadata.MinValue = minimum; metadata.MaxValue = maximum; CreateOrUpdateAttribute(schemaName, recordType, metadata); }
private static UpdateFormulaResponse UpdateInternal(MoneyAttributeMetadata att, AttributeMetadata from, AttributeMetadata to) { return UpdateForumlaDefinition(att, from, to); }
/// <summary> /// Create and configure the organization service proxy. /// Create few types of attributes. /// Insert status in the existing status list. /// Retrieve attribute. /// Update attribute. /// Update existing state value. /// Optionally delete/revert any attributes /// that were created/changed for this sample. /// </summary> /// <param name="serverConfig">Contains server connection information.</param> /// <param name="promptForDelete">When True, the user will be prompted to delete all /// created entities.</param> public void Run(ServerConnection.Configuration serverConfig, bool promptForDelete) { try { // Connect to the Organization service. // The using statement assures that the service proxy will be properly disposed. using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig)) { // This statement is required to enable early-bound type support. _serviceProxy.EnableProxyTypes(); //<snippetWorkWithAttributes1> #region How to create attributes //<snippetWorkWithAttributes2> // Create storage for new attributes being created addedAttributes = new List <AttributeMetadata>(); // Create a boolean attribute BooleanAttributeMetadata boolAttribute = new BooleanAttributeMetadata { // Set base properties SchemaName = "new_boolean", DisplayName = new Label("Sample Boolean", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Boolean Attribute", _languageCode), // Set extended properties OptionSet = new BooleanOptionSetMetadata( new OptionMetadata(new Label("True", _languageCode), 1), new OptionMetadata(new Label("False", _languageCode), 0) ) }; // Add to list addedAttributes.Add(boolAttribute); // Create a date time attribute DateTimeAttributeMetadata dtAttribute = new DateTimeAttributeMetadata { // Set base properties SchemaName = "new_datetime", DisplayName = new Label("Sample DateTime", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("DateTime Attribute", _languageCode), // Set extended properties Format = DateTimeFormat.DateOnly, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(dtAttribute); // Create a decimal attribute DecimalAttributeMetadata decimalAttribute = new DecimalAttributeMetadata { // Set base properties SchemaName = "new_decimal", DisplayName = new Label("Sample Decimal", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Decimal Attribute", _languageCode), // Set extended properties MaxValue = 100, MinValue = 0, Precision = 1 }; // Add to list addedAttributes.Add(decimalAttribute); // Create a integer attribute IntegerAttributeMetadata integerAttribute = new IntegerAttributeMetadata { // Set base properties SchemaName = "new_integer", DisplayName = new Label("Sample Integer", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Integer Attribute", _languageCode), // Set extended properties Format = IntegerFormat.None, MaxValue = 100, MinValue = 0 }; // Add to list addedAttributes.Add(integerAttribute); // Create a memo attribute MemoAttributeMetadata memoAttribute = new MemoAttributeMetadata { // Set base properties SchemaName = "new_memo", DisplayName = new Label("Sample Memo", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Memo Attribute", _languageCode), // Set extended properties Format = StringFormat.TextArea, ImeMode = ImeMode.Disabled, MaxLength = 500 }; // Add to list addedAttributes.Add(memoAttribute); // Create a money attribute MoneyAttributeMetadata moneyAttribute = new MoneyAttributeMetadata { // Set base properties SchemaName = "new_money", DisplayName = new Label("Money Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Money Attribue", _languageCode), // Set extended properties MaxValue = 1000.00, MinValue = 0.00, Precision = 1, PrecisionSource = 1, ImeMode = ImeMode.Disabled }; // Add to list addedAttributes.Add(moneyAttribute); // Create a picklist attribute PicklistAttributeMetadata pickListAttribute = new PicklistAttributeMetadata { // Set base properties SchemaName = "new_picklist", DisplayName = new Label("Sample Picklist", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("Picklist Attribute", _languageCode), // Set extended properties // Build local picklist options OptionSet = new OptionSetMetadata { IsGlobal = false, OptionSetType = OptionSetType.Picklist, Options = { new OptionMetadata( new Label("Created", _languageCode), null), new OptionMetadata( new Label("Updated", _languageCode), null), new OptionMetadata( new Label("Deleted", _languageCode), null) } } }; // Add to list addedAttributes.Add(pickListAttribute); // Create a string attribute StringAttributeMetadata stringAttribute = new StringAttributeMetadata { // Set base properties SchemaName = "new_string", DisplayName = new Label("Sample String", _languageCode), RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), Description = new Label("String Attribute", _languageCode), // Set extended properties MaxLength = 100 }; // Add to list addedAttributes.Add(stringAttribute); // NOTE: LookupAttributeMetadata cannot be created outside the context of a relationship. // Refer to the WorkWithRelationships.cs reference SDK sample for an example of this attribute type. // NOTE: StateAttributeMetadata and StatusAttributeMetadata cannot be created via the SDK. foreach (AttributeMetadata anAttribute in addedAttributes) { // Create the request. CreateAttributeRequest createAttributeRequest = new CreateAttributeRequest { EntityName = Contact.EntityLogicalName, Attribute = anAttribute }; // Execute the request. _serviceProxy.Execute(createAttributeRequest); Console.WriteLine("Created the attribute {0}.", anAttribute.SchemaName); } //</snippetWorkWithAttributes2> #endregion How to create attributes #region How to insert status //<snippetWorkWithAttributes3> // Use InsertStatusValueRequest message to insert a new status // in an existing status attribute. // Create the request. InsertStatusValueRequest insertStatusValueRequest = new InsertStatusValueRequest { AttributeLogicalName = "statuscode", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("Dormant", _languageCode), StateCode = 0 }; // Execute the request and store newly inserted value // for cleanup, used later part of this sample. _insertedStatusValue = ((InsertStatusValueResponse)_serviceProxy.Execute( insertStatusValueRequest)).NewOptionValue; Console.WriteLine("Created {0} with the value of {1}.", insertStatusValueRequest.Label.LocalizedLabels[0].Label, _insertedStatusValue); //</snippetWorkWithAttributes3> #endregion How to insert status #region How to retrieve attribute //<snippetWorkWithAttributes4> // Create the request RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_string", // When RetrieveAsIfPublished property is set to false, retrieves only the currently published changes. Default setting of the property is false. // When RetrieveAsIfPublished property is set to true, retrieves the changes that are published and those changes that have not been published. RetrieveAsIfPublished = false }; // Execute the request RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute(attributeRequest); Console.WriteLine("Retrieved the attribute {0}.", attributeResponse.AttributeMetadata.SchemaName); //</snippetWorkWithAttributes4> #endregion How to retrieve attribute #region How to update attribute //<snippetWorkWithAttributes5> // Modify the retrieved attribute AttributeMetadata retrievedAttributeMetadata = attributeResponse.AttributeMetadata; retrievedAttributeMetadata.DisplayName = new Label("Update String Attribute", _languageCode); // Update an attribute retrieved via RetrieveAttributeRequest UpdateAttributeRequest updateRequest = new UpdateAttributeRequest { Attribute = retrievedAttributeMetadata, EntityName = Contact.EntityLogicalName, MergeLabels = false }; // Execute the request _serviceProxy.Execute(updateRequest); Console.WriteLine("Updated the attribute {0}.", retrievedAttributeMetadata.SchemaName); //</snippetWorkWithAttributes5> #endregion How to update attribute #region How to update state value //<snippetWorkWithAttributes6> // Modify the state value label from Active to Open. // Create the request. UpdateStateValueRequest updateStateValue = new UpdateStateValueRequest { AttributeLogicalName = "statecode", EntityLogicalName = Contact.EntityLogicalName, Value = 1, Label = new Label("Open", _languageCode) }; // Execute the request. _serviceProxy.Execute(updateStateValue); Console.WriteLine( "Updated {0} state attribute of {1} entity from 'Active' to '{2}'.", updateStateValue.AttributeLogicalName, updateStateValue.EntityLogicalName, updateStateValue.Label.LocalizedLabels[0].Label ); //</snippetWorkWithAttributes6> #endregion How to update state value #region How to insert a new option item in a local option set //<snippetWorkWithAttributes7> // Create a request. InsertOptionValueRequest insertOptionValueRequest = new InsertOptionValueRequest { AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, Label = new Label("New Picklist Label", _languageCode) }; // Execute the request. int insertOptionValue = ((InsertOptionValueResponse)_serviceProxy.Execute( insertOptionValueRequest)).NewOptionValue; Console.WriteLine("Created {0} with the value of {1}.", insertOptionValueRequest.Label.LocalizedLabels[0].Label, insertOptionValue); //</snippetWorkWithAttributes7> #endregion How to insert a new option item in a local option set #region How to change the order of options of a local option set //<snippetWorkWithAttributes8> // Use the RetrieveAttributeRequest message to retrieve // a attribute by it's logical name. RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest { EntityLogicalName = Contact.EntityLogicalName, LogicalName = "new_picklist", // When RetrieveAsIfPublished property is set to false, retrieves only the currently published changes. Default setting of the property is false. // When RetrieveAsIfPublished property is set to true, retrieves the changes that are published and those changes that have not been published. RetrieveAsIfPublished = false }; // Execute the request. RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute( retrieveAttributeRequest); // Access the retrieved attribute. PicklistAttributeMetadata retrievedPicklistAttributeMetadata = (PicklistAttributeMetadata) retrieveAttributeResponse.AttributeMetadata; // Get the current options list for the retrieved attribute. OptionMetadata[] optionList = retrievedPicklistAttributeMetadata.OptionSet.Options.ToArray(); // Change the order of the original option's list. // Use the OrderBy (OrderByDescending) linq function to sort options in // ascending (descending) order according to label text. // For ascending order use this: var updateOptionList = optionList.OrderBy(x => x.Label.LocalizedLabels[0].Label).ToList(); // For descending order use this: // var updateOptionList = // optionList.OrderByDescending( // x => x.Label.LocalizedLabels[0].Label).ToList(); // Create the request. OrderOptionRequest orderOptionRequest = new OrderOptionRequest { // Set the properties for the request. AttributeLogicalName = "new_picklist", EntityLogicalName = Contact.EntityLogicalName, // Set the changed order using Select linq function // to get only values in an array from the changed option list. Values = updateOptionList.Select(x => x.Value.Value).ToArray() }; // Execute the request _serviceProxy.Execute(orderOptionRequest); Console.WriteLine("Option Set option order changed"); //</snippetWorkWithAttributes8> #endregion How to change the order of options of a global option set // NOTE: All customizations must be published before they can be used. _serviceProxy.Execute(new PublishAllXmlRequest()); Console.WriteLine("Published all customizations."); //</snippetWorkWithAttributes1> DeleteRequiredRecords(promptForDelete); } } // Catch any service fault exceptions that Microsoft Dynamics CRM throws. catch (FaultException <Microsoft.Xrm.Sdk.OrganizationServiceFault> ) { // You can handle an exception here or pass it back to the calling method. throw; } }
/// <summary> /// Add output columns /// </summary> /// <param name="propertyValue"></param> public void AddOutputColumns(String propertyValue) { if (!String.IsNullOrEmpty(propertyValue)) { if (service == null) { AcquireConnections(null); } if (service != null) { DataTable dt = GetData(propertyValue, true); IDTSOutput100 output = ComponentMetaData.OutputCollection[0]; output.OutputColumnCollection.RemoveAll(); output.ExternalMetadataColumnCollection.RemoveAll(); if (dt != null) { //Check if there are any rows in the datatable if (dt.Rows != null && dt.Rows.Count > 0) { DataTable schemaDT = dt.CreateDataReader().GetSchemaTable(); foreach (DataRow row in schemaDT.Rows) { IDTSOutputColumn100 outputCol = output.OutputColumnCollection.New(); AttributeMetadata mdta = entMetadata.Attributes.FirstOrDefault(m => m.LogicalName == row["ColumnName"].ToString()); bool isLong = false; DataType dType = DataRecordTypeToBufferType((Type)row["DataType"]); dType = ConvertBufferDataTypeToFitManaged(dType, ref isLong); int length = ((int)row["ColumnSize"]) == -1 ? 4000 : (int)row["ColumnSize"]; int precision = row["NumericPrecision"] is System.DBNull ? 0 : (short)row["NumericPrecision"]; int scale = row["NumericScale"] is System.DBNull ? 0 : (short)row["NumericScale"]; int codePage = schemaDT.Locale.TextInfo.ANSICodePage; switch (dType) { //case DataType.DT_DATE: // precision = 0; // scale = 0; // break; case DataType.DT_STR: case DataType.DT_TEXT: MemoAttributeMetadata att = (MemoAttributeMetadata)mdta; if (att.MaxLength.HasValue) { length = (int)att.MaxLength; } else { length = 1048576; } precision = 0; scale = 0; break; case DataType.DT_CY: MoneyAttributeMetadata attMoney = (MoneyAttributeMetadata)mdta; if (attMoney.PrecisionSource == 0) //TODO get the other types of precision sources { if (attMoney.Precision.HasValue) { scale = (int)attMoney.Precision; } else { scale = 2; } } else { scale = 4; } int precision1 = 0, precision2 = 0; if (attMoney.MaxValue.HasValue) { precision1 = attMoney.MaxValue.Value.ToString().Length; } if (attMoney.MinValue.HasValue) { precision2 = attMoney.MinValue.Value.ToString().Length; } if (precision1 > precision2) { precision = precision1; } else { precision = precision2; } length = 0; codePage = 0; if (precision == 0) { precision = 23; } if (precision > 38) { precision = 38; } if (scale > precision) { scale = precision; } break; case DataType.DT_NUMERIC: case DataType.DT_DECIMAL: DecimalAttributeMetadata attDecimal = (DecimalAttributeMetadata)mdta; if (attDecimal.Precision.HasValue) { scale = (int)attDecimal.Precision; } else { scale = 2; } int precisiondec1 = 0, precisiondec2 = 0; if (attDecimal.MaxValue.HasValue) { precisiondec1 = attDecimal.MaxValue.Value.ToString().Length; } if (attDecimal.MinValue.HasValue) { precisiondec2 = attDecimal.MinValue.Value.ToString().Length; } if (precisiondec1 > precisiondec2) { precision = precisiondec1; } else { precision = precisiondec2; } length = 0; codePage = 0; if (precision == 0) { precision = 23; } if (precision > 38) { precision = 38; } if (scale > precision) { scale = precision; } break; case DataType.DT_WSTR: if (mdta.GetType() == typeof(StringAttributeMetadata)) { StringAttributeMetadata attstring = (StringAttributeMetadata)mdta; if (attstring.MaxLength.HasValue) { length = (int)attstring.MaxLength; } else { length = 4000; } } else { MemoAttributeMetadata attmemo = (MemoAttributeMetadata)mdta; length = (int)attmemo.MaxLength; } precision = 0; scale = 0; codePage = 0; break; default: length = 0; precision = 0; scale = 0; codePage = 0; break; } outputCol.Name = row["ColumnName"].ToString(); outputCol.SetDataTypeProperties(dType, length, precision, scale, codePage); CreateExternalMetaDataColumn(output, outputCol); } } } } } }
public MoneyAttributeMetadataInfo(MoneyAttributeMetadata amd) : base(amd) { this.amd = amd; }
private MoneyAttributeMetadata CreateMoneyAttributeMetadata(AttributeTemplate attributeTemplate) { var moneyAttributeMetadata = new MoneyAttributeMetadata { PrecisionSource = attributeTemplate.Precision == default(int) ? DefaultConfiguration.DefaultMoneyPrecisionSource : attributeTemplate.Precision }; return moneyAttributeMetadata; }
private object CopyValueInternal(AttributeMetadata oldAttribute, MoneyAttributeMetadata newAttribute, object value, Dictionary <string, string> migrationMapping) { return(new Money((decimal)CopyValueInternal(oldAttribute, new DecimalAttributeMetadata(), value, migrationMapping))); }
/// <summary> /// Gets the sql precision for the crm money attribute. /// </summary> /// <param name="metadata"></param> /// <returns></returns> public static int MaxSupportedSqlPrecision(this MoneyAttributeMetadata metadata) { var crmPrecision = Math.Max(Math.Truncate(Math.Abs(MoneyAttributeMetadata.MaxSupportedValue)).ToString().Length, Math.Truncate(Math.Abs(MoneyAttributeMetadata.MinSupportedValue)).ToString().Length); return(crmPrecision + MoneyAttributeMetadata.MaxSupportedPrecision); }
public MoneyAttributeMetadataInfo(MoneyAttributeMetadata amd) : base(amd) { this.amd = amd; }
private object CopyValueInternal(AttributeMetadata oldAttribute, MoneyAttributeMetadata newAttribute, object value) { return(CopyValueInternal(oldAttribute, new DecimalAttributeMetadata(), value)); }