locked
Programmatically add Resource to Resource Group RRS feed

  • Question

  • CRM 2011:  I am attempting to add a Facility/Equipment Resource to a Resource Group programmatically.  AssociateRequest results in error:  the Update method does not support entities of type 'resource'/'resourcegroup'  Does anyone have an example of how to do this?

    Friday, June 22, 2012 9:24 PM

Answers

  • Hi, you need to define resource constraints, resource spec etc., please refer to this code. hope this helps. 

                // Create the van resource.
                Equipment van = new Equipment
                {
                    Name = "Van 1",
                    TimeZoneCode = 1,
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId)
                };
    
                _vanId = _serviceProxy.Create(van);
    
                Console.WriteLine("Created a sample equipment: {0}.", van.Name);
    
                // Create the contraints for creating the plumber resource group
                System.Text.StringBuilder builder = new System.Text.StringBuilder("<Constraints>");
                builder.Append("<Constraint>");
                builder.Append("<Expression>");
                builder.Append("<Body>resource[\"Id\"] == ");
                builder.Append(userResponse.UserId.ToString("B"));
                builder.Append(" || resource[\"Id\"] == ");
                builder.Append(_vanId.ToString("B"));
                builder.Append("</Body>");
                builder.Append("<Parameters>");
                builder.Append("<Parameter name=\"resource\" />");
                builder.Append("</Parameters>");
                builder.Append("</Expression>");
                builder.Append("</Constraint>");
                builder.Append("</Constraints>");
    
                // Define an anonymous type to define the possible constraint based group type code values.
                var ConstraintBasedGroupTypeCode = new
                {
                    Static = 0,
                    Dynamic = 1,
                    Implicit = 2
                };
                // Create the plumber resource group.
                ConstraintBasedGroup group = new ConstraintBasedGroup
                {
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId),
                    Name = "Plumber with Van 1",
                    Constraints = builder.ToString(),
                    GroupTypeCode = new OptionSetValue(ConstraintBasedGroupTypeCode.Static),
                };
    
                _groupId = _serviceProxy.Create(group);
    
                Console.WriteLine("Created a sample resource group: {0}.", group.Name);
    
                // Create the resource specification.
                ResourceSpec spec = new ResourceSpec
                {
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId),
                    ObjectiveExpression = @"
    					<Expression>
    						<Body>udf ""Random""(factory,resource,appointment,request,leftoffset,rightoffset)</Body>
    						<Parameters>
    							<Parameter name=""factory"" />
    							<Parameter name=""resource"" />
    							<Parameter name=""appointment"" />
    							<Parameter name=""request"" />
    							<Parameter name=""leftoffset"" />
    							<Parameter name=""rightoffset"" />
    						</Parameters>
    						<Properties EvaluationInterval=""P0D"" evaluationcost=""0"" />
    					</Expression>",
                    RequiredCount = 1,
                    Name = "Test Spec",
                    GroupObjectId = _groupId
                };
                _specId = _serviceProxy.Create(spec);
    
                // Create the plumber required resource object.
                RequiredResource plumberReq = new RequiredResource
                {
                    ResourceId = userResponse.UserId,   // assume current user is the plumber
                    ResourceSpecId = _specId
                };
    
    
                // Create the service for the equipment.
                Service plumberService = new Service
                {
                    Name = "Plumber 1",
                    Duration = 60,
                    InitialStatusCode = new OptionSetValue(1),
                    Granularity = "FREQ=MINUTELY;INTERVAL=15;",
                    ResourceSpecId = new EntityReference(ResourceSpec.EntityLogicalName, _specId)
                };
    
                _plumberServiceId = _serviceProxy.Create(plumberService);

    • Proposed as answer by Seepath Sunday, June 24, 2012 2:00 PM
    • Marked as answer by JBlaeske Monday, June 25, 2012 1:40 PM
    Sunday, June 24, 2012 2:00 PM

All replies

  • Hi, you need to define resource constraints, resource spec etc., please refer to this code. hope this helps. 

                // Create the van resource.
                Equipment van = new Equipment
                {
                    Name = "Van 1",
                    TimeZoneCode = 1,
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId)
                };
    
                _vanId = _serviceProxy.Create(van);
    
                Console.WriteLine("Created a sample equipment: {0}.", van.Name);
    
                // Create the contraints for creating the plumber resource group
                System.Text.StringBuilder builder = new System.Text.StringBuilder("<Constraints>");
                builder.Append("<Constraint>");
                builder.Append("<Expression>");
                builder.Append("<Body>resource[\"Id\"] == ");
                builder.Append(userResponse.UserId.ToString("B"));
                builder.Append(" || resource[\"Id\"] == ");
                builder.Append(_vanId.ToString("B"));
                builder.Append("</Body>");
                builder.Append("<Parameters>");
                builder.Append("<Parameter name=\"resource\" />");
                builder.Append("</Parameters>");
                builder.Append("</Expression>");
                builder.Append("</Constraint>");
                builder.Append("</Constraints>");
    
                // Define an anonymous type to define the possible constraint based group type code values.
                var ConstraintBasedGroupTypeCode = new
                {
                    Static = 0,
                    Dynamic = 1,
                    Implicit = 2
                };
                // Create the plumber resource group.
                ConstraintBasedGroup group = new ConstraintBasedGroup
                {
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId),
                    Name = "Plumber with Van 1",
                    Constraints = builder.ToString(),
                    GroupTypeCode = new OptionSetValue(ConstraintBasedGroupTypeCode.Static),
                };
    
                _groupId = _serviceProxy.Create(group);
    
                Console.WriteLine("Created a sample resource group: {0}.", group.Name);
    
                // Create the resource specification.
                ResourceSpec spec = new ResourceSpec
                {
                    BusinessUnitId = new EntityReference(BusinessUnit.EntityLogicalName, userResponse.BusinessUnitId),
                    ObjectiveExpression = @"
    					<Expression>
    						<Body>udf ""Random""(factory,resource,appointment,request,leftoffset,rightoffset)</Body>
    						<Parameters>
    							<Parameter name=""factory"" />
    							<Parameter name=""resource"" />
    							<Parameter name=""appointment"" />
    							<Parameter name=""request"" />
    							<Parameter name=""leftoffset"" />
    							<Parameter name=""rightoffset"" />
    						</Parameters>
    						<Properties EvaluationInterval=""P0D"" evaluationcost=""0"" />
    					</Expression>",
                    RequiredCount = 1,
                    Name = "Test Spec",
                    GroupObjectId = _groupId
                };
                _specId = _serviceProxy.Create(spec);
    
                // Create the plumber required resource object.
                RequiredResource plumberReq = new RequiredResource
                {
                    ResourceId = userResponse.UserId,   // assume current user is the plumber
                    ResourceSpecId = _specId
                };
    
    
                // Create the service for the equipment.
                Service plumberService = new Service
                {
                    Name = "Plumber 1",
                    Duration = 60,
                    InitialStatusCode = new OptionSetValue(1),
                    Granularity = "FREQ=MINUTELY;INTERVAL=15;",
                    ResourceSpecId = new EntityReference(ResourceSpec.EntityLogicalName, _specId)
                };
    
                _plumberServiceId = _serviceProxy.Create(plumberService);

    • Proposed as answer by Seepath Sunday, June 24, 2012 2:00 PM
    • Marked as answer by JBlaeske Monday, June 25, 2012 1:40 PM
    Sunday, June 24, 2012 2:00 PM
  • Hi, did you find the code sample helpful? 
    • Proposed as answer by Seepath Monday, June 25, 2012 12:51 PM
    Monday, June 25, 2012 12:51 PM
  • Thanks, I should have been looking for 'Constraints'.  For some reason I must have overlooked that property of the ResourceGroup.  This does indeed work.
    Monday, June 25, 2012 1:40 PM