Example #1
0
        internal void PublishProduct()
        {
            //取得產品系列 Id
            QueryExpression productsQuery = new QueryExpression
            {
                EntityName = Product.EntityLogicalName,
                ColumnSet  = new ColumnSet("productid", "name"),
            };

            productsQuery.Criteria.AddCondition("name", ConditionOperator.Equal, "觸控面板烤爐");

            var product = (Product)_orgService.RetrieveMultiple(productsQuery).Entities[0];

            onLog(string.Format("Get Publish Product Family Id => {0}", product.Id));

            //透過產品系列,執行階層發布
            PublishProductHierarchyRequest publishReq = new PublishProductHierarchyRequest
            {
                Target = new EntityReference(Product.EntityLogicalName, product.Id)
            };
            PublishProductHierarchyResponse published = (PublishProductHierarchyResponse)_orgService.Execute(publishReq);

            if (published.Results != null)
            {
                onLog("Published the product records");
            }
        }
Example #2
0
        [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
                    // TODO Add demonstration code here
                    //<snippetCreateandublishProducts1>
                    // Create a product family
                    Product newProductFamily = new Product
                    {
                        Name             = "Example Product Family",
                        ProductNumber    = "PF001",
                        ProductStructure = new OptionSetValue(2)
                    };
                    _productFamilyId = _serviceProxy.Create(newProductFamily);
                    Console.WriteLine("\nCreated '{0}'", newProductFamily.Name);

                    // Create a product property
                    DynamicProperty newProperty = new DynamicProperty
                    {
                        Name = "Example Property",
                        RegardingObjectId = new EntityReference(Product.EntityLogicalName,
                                                                _productFamilyId),
                        IsReadOnly         = true,
                        IsRequired         = true,
                        IsHidden           = false,
                        DataType           = new OptionSetValue(3), //Single line of text
                        DefaultValueString = "Default Value"
                    };
                    _productPropertyId = _serviceProxy.Create(newProperty);
                    Console.WriteLine("\nCreated '{0}' for the product family", newProperty.Name);

                    // Create couple of product records under the product family
                    Product newProduct1 = new Product
                    {
                        Name                 = "Example Product 1",
                        ProductNumber        = "P001",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product1Id = _serviceProxy.Create(newProduct1);

                    Console.WriteLine("\nCreated '{0}' under the product family", newProduct1.Name);

                    Product newProduct2 = new Product
                    {
                        Name                 = "Example Product 2",
                        ProductNumber        = "P002",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product2Id = _serviceProxy.Create(newProduct2);

                    Console.WriteLine("Created '{0}' under the product family", newProduct2.Name);

                    // Create a price list items for the products
                    ProductPriceLevel newPriceListItem1 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product1Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem1Id = _serviceProxy.Create(newPriceListItem1);

                    Console.WriteLine("\nCreated price list for '{0}'", newProduct1.Name);

                    ProductPriceLevel newPriceListItem2 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product2Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem2Id = _serviceProxy.Create(newPriceListItem2);

                    Console.WriteLine("Created price list for '{0}'", newProduct2.Name);

                    // Set the product relationship
                    // Set Example Product 1 and Example Product 2 as substitute of each other (bi-directional)
                    ProductSubstitute newProductRelation = new ProductSubstitute
                    {
                        SalesRelationshipType = new OptionSetValue(3),
                        Direction             = new OptionSetValue(1),
                        ProductId             = new EntityReference(Product.EntityLogicalName, _product1Id),
                        SubstitutedProductId  = new EntityReference(Product.EntityLogicalName, _product2Id)
                    };
                    _productRelationId = _serviceProxy.Create(newProductRelation);

                    Console.WriteLine("\nCreated a substitute relation between the two products.");
                    //</snippetCreateandublishProducts1>

                    // Override a product property at the product level
                    // In this case we will override the property for 'Example Product 1'
                    DynamicProperty newOverrideProperty = new DynamicProperty();
                    newOverrideProperty.BaseDynamicPropertyId = new EntityReference(DynamicProperty.EntityLogicalName,
                                                                                    _productPropertyId);
                    newOverrideProperty.RegardingObjectId = new EntityReference(Product.EntityLogicalName, _product1Id);
                    _productOverridenPropertyId           = _serviceProxy.Create(newOverrideProperty);

                    // Retrieve the attributes of the cloned property you want to update
                    ColumnSet columns = new ColumnSet();
                    columns.AddColumns("name", "isreadonly", "isrequired");
                    DynamicProperty retrievedOverridenProperty = (DynamicProperty)_serviceProxy.Retrieve(
                        DynamicProperty.EntityLogicalName, _productOverridenPropertyId,
                        columns);

                    // Update the attributes
                    retrievedOverridenProperty.Name       = "Overridden Example Property";
                    retrievedOverridenProperty.IsReadOnly = true;
                    retrievedOverridenProperty.IsRequired = false;
                    _serviceProxy.Update(retrievedOverridenProperty);
                    Console.WriteLine("\nOverridden the product property for 'Example Product 1'.");

                    // Prompt the user whether to publish the product family and products
                    bool publishRecords = true;
                    Console.WriteLine("\nDo you want the product records published? (y/n)");
                    String answer = Console.ReadLine();
                    publishRecords = (answer.StartsWith("y") || answer.StartsWith("Y"));

                    if (publishRecords)
                    {
                        PublishProductHierarchyRequest publishReq = new PublishProductHierarchyRequest
                        {
                            Target = new EntityReference(Product.EntityLogicalName, _productFamilyId)
                        };
                        PublishProductHierarchyResponse published = (PublishProductHierarchyResponse)_serviceProxy.Execute(publishReq);
                        if (published.Results != null)
                        {
                            Console.WriteLine("Published the product records");
                        }

                        // Overwrite a product property
                        Console.WriteLine("\nRevising 'Example Product 1' to demonstrate product property overwrite.");

                        // Retrieve the StateCode of Product that you want to revise
                        ColumnSet cols = new ColumnSet();
                        cols.AddColumns("name", "statecode");
                        Product retrievedPublishedProduct = (Product)_serviceProxy.Retrieve(
                            Product.EntityLogicalName, _product1Id,
                            cols);

                        // Update the state of the Product to "Under Revision"
                        retrievedPublishedProduct.StateCode = ProductState.UnderRevision;
                        UpdateRequest updatePropertyState = new UpdateRequest
                        {
                            Target = retrievedPublishedProduct
                        };
                        _serviceProxy.Execute(updatePropertyState);
                        Console.WriteLine("\nChanged '{0}' to 'Under Revision' state.", retrievedPublishedProduct.Name);

                        DynamicProperty newOverwriteProperty = new DynamicProperty();
                        newOverwriteProperty.BaseDynamicPropertyId = new EntityReference(DynamicProperty.EntityLogicalName,
                                                                                         _productOverridenPropertyId);
                        newOverwriteProperty.RegardingObjectId = new EntityReference(Product.EntityLogicalName,
                                                                                     _product1Id);
                        _productOverwrittenPropertyId = _serviceProxy.Create(newOverwriteProperty);

                        // Retrieve the attributes of the cloned property you want to update
                        ColumnSet myCols = new ColumnSet();
                        myCols.AddColumns("name", "isreadonly", "isrequired");
                        DynamicProperty retrievedOverwrittenProperty = (DynamicProperty)_serviceProxy.Retrieve(
                            DynamicProperty.EntityLogicalName, _productOverwrittenPropertyId,
                            myCols);

                        // Update the attributes of the cloned property to complete the overwrite
                        retrievedOverwrittenProperty.Name       = "Overwritten Example Property";
                        retrievedOverwrittenProperty.IsReadOnly = true;
                        retrievedOverridenProperty.IsRequired   = false;
                        _serviceProxy.Update(retrievedOverwrittenProperty);
                        Console.WriteLine("\nOverwritten the product property for 'Example Product 1'.");

                        // Retrieve the StateCode of Product that you want to publish
                        ColumnSet prodCols = new ColumnSet();
                        prodCols.AddColumns("name", "statecode");
                        Product retrievedRevisedProduct = (Product)_serviceProxy.Retrieve(
                            Product.EntityLogicalName, _product1Id,
                            prodCols);

                        // Update the state of the Product to "Active"
                        retrievedRevisedProduct.StateCode = ProductState.Active;
                        UpdateRequest publishProduct1 = new UpdateRequest
                        {
                            Target = retrievedRevisedProduct
                        };
                        _serviceProxy.Execute(publishProduct1);
                        Console.WriteLine("\nPublished '{0}'.", retrievedRevisedProduct.Name);
                    }
                    #endregion Demonstrate
                }
                else
                {
                    const string UNABLE_TO_LOGIN_ERROR = "Unable to Login to Common Data Service";
                    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();
            }
        }
Example #3
0
        /// <summary>
        /// Create and configure the organization service proxy.
        /// Initiate creating all entity records that this sample requires.
        /// Create a product family with a product property and two child product records.
        /// Create a substitute relation between the two products.
        /// Override the product property for one of the child products.
        /// Publish the product family hierarchy, including the child records.
        /// Revise a child product to overwrite the overridden property.
        /// Publish the child product.
        /// Optionally delete any entity records that were created 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();

                    // Call the method to create any data that this sample requires.
                    CreateRequiredRecords();

                    //<snippetCreateandublishProducts1>
                    // Create a product family
                    Product newProductFamily = new Product
                    {
                        Name             = "Example Product Family",
                        ProductNumber    = "PF001",
                        ProductStructure = new OptionSetValue(2)
                    };
                    _productFamilyId = _serviceProxy.Create(newProductFamily);
                    Console.WriteLine("\nCreated '{0}'", newProductFamily.Name);

                    // Create a product property
                    DynamicProperty newProperty = new DynamicProperty
                    {
                        Name = "Example Property",
                        RegardingObjectId = new EntityReference(Product.EntityLogicalName,
                                                                _productFamilyId),
                        IsReadOnly         = true,
                        IsRequired         = true,
                        IsHidden           = false,
                        DataType           = new OptionSetValue(3), //Single line of text
                        DefaultValueString = "Default Value"
                    };
                    _productPropertyId = _serviceProxy.Create(newProperty);
                    Console.WriteLine("\nCreated '{0}' for the product family", newProperty.Name);

                    // Create couple of product records under the product family
                    Product newProduct1 = new Product
                    {
                        Name                 = "Example Product 1",
                        ProductNumber        = "P001",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product1Id = _serviceProxy.Create(newProduct1);

                    Console.WriteLine("\nCreated '{0}' under the product family", newProduct1.Name);

                    Product newProduct2 = new Product
                    {
                        Name                 = "Example Product 2",
                        ProductNumber        = "P002",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product2Id = _serviceProxy.Create(newProduct2);

                    Console.WriteLine("Created '{0}' under the product family", newProduct2.Name);



                    // Create a price list items for the products
                    ProductPriceLevel newPriceListItem1 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product1Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem1Id = _serviceProxy.Create(newPriceListItem1);

                    Console.WriteLine("\nCreated price list for '{0}'", newProduct1.Name);

                    ProductPriceLevel newPriceListItem2 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product2Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem2Id = _serviceProxy.Create(newPriceListItem2);

                    Console.WriteLine("Created price list for '{0}'", newProduct2.Name);

                    // Set the product relationship
                    // Set Example Product 1 and Example Product 2 as substitute of each other (bi-directional)
                    ProductSubstitute newProductRelation = new ProductSubstitute
                    {
                        SalesRelationshipType = new OptionSetValue(3),
                        Direction             = new OptionSetValue(1),
                        ProductId             = new EntityReference(Product.EntityLogicalName, _product1Id),
                        SubstitutedProductId  = new EntityReference(Product.EntityLogicalName, _product2Id)
                    };
                    _productRelationId = _serviceProxy.Create(newProductRelation);

                    Console.WriteLine("\nCreated a substitute relation between the two products.");
                    //</snippetCreateandublishProducts1>

                    // Override a product property at the product level
                    // In this case we will override the property for 'Example Product 1'
                    DynamicProperty newOverrideProperty = new DynamicProperty();
                    newOverrideProperty.BaseDynamicPropertyId = new EntityReference(DynamicProperty.EntityLogicalName,
                                                                                    _productPropertyId);
                    newOverrideProperty.RegardingObjectId = new EntityReference(Product.EntityLogicalName, _product1Id);
                    _productOverridenPropertyId           = _serviceProxy.Create(newOverrideProperty);

                    // Retrieve the attributes of the cloned property you want to update
                    ColumnSet columns = new ColumnSet();
                    columns.AddColumns("name", "isreadonly", "isrequired");
                    DynamicProperty retrievedOverridenProperty = (DynamicProperty)_serviceProxy.Retrieve(
                        DynamicProperty.EntityLogicalName, _productOverridenPropertyId,
                        columns);

                    // Update the attributes
                    retrievedOverridenProperty.Name       = "Overridden Example Property";
                    retrievedOverridenProperty.IsReadOnly = true;
                    retrievedOverridenProperty.IsRequired = false;
                    _serviceProxy.Update(retrievedOverridenProperty);
                    Console.WriteLine("\nOverridden the product property for 'Example Product 1'.");

                    // Prompt the user whether to publish the product family and products
                    bool publishRecords = true;
                    Console.WriteLine("\nDo you want the product records published? (y/n)");
                    String answer = Console.ReadLine();
                    publishRecords = (answer.StartsWith("y") || answer.StartsWith("Y"));

                    if (publishRecords)
                    {
                        PublishProductHierarchyRequest publishReq = new PublishProductHierarchyRequest
                        {
                            Target = new EntityReference(Product.EntityLogicalName, _productFamilyId)
                        };
                        PublishProductHierarchyResponse published = (PublishProductHierarchyResponse)_serviceProxy.Execute(publishReq);
                        if (published.Results != null)
                        {
                            Console.WriteLine("Published the product records");
                        }

                        // Overwrite a product property
                        Console.WriteLine("\nRevising 'Example Product 1' to demonstrate product property overwrite.");

                        // Retrieve the StateCode of Product that you want to revise
                        ColumnSet cols = new ColumnSet();
                        cols.AddColumns("name", "statecode");
                        Product retrievedPublishedProduct = (Product)_serviceProxy.Retrieve(
                            Product.EntityLogicalName, _product1Id,
                            cols);

                        // Update the state of the Product to "Under Revision"
                        retrievedPublishedProduct.StateCode = ProductState.UnderRevision;
                        UpdateRequest updatePropertyState = new UpdateRequest
                        {
                            Target = retrievedPublishedProduct
                        };
                        _serviceProxy.Execute(updatePropertyState);
                        Console.WriteLine("\nChanged '{0}' to 'Under Revision' state.", retrievedPublishedProduct.Name);

                        DynamicProperty newOverwriteProperty = new DynamicProperty();
                        newOverwriteProperty.BaseDynamicPropertyId = new EntityReference(DynamicProperty.EntityLogicalName,
                                                                                         _productOverridenPropertyId);
                        newOverwriteProperty.RegardingObjectId = new EntityReference(Product.EntityLogicalName,
                                                                                     _product1Id);
                        _productOverwrittenPropertyId = _serviceProxy.Create(newOverwriteProperty);

                        // Retrieve the attributes of the cloned property you want to update
                        ColumnSet myCols = new ColumnSet();
                        myCols.AddColumns("name", "isreadonly", "isrequired");
                        DynamicProperty retrievedOverwrittenProperty = (DynamicProperty)_serviceProxy.Retrieve(
                            DynamicProperty.EntityLogicalName, _productOverwrittenPropertyId,
                            myCols);


                        // Update the attributes of the cloned property to complete the overwrite
                        retrievedOverwrittenProperty.Name       = "Overwritten Example Property";
                        retrievedOverwrittenProperty.IsReadOnly = true;
                        retrievedOverridenProperty.IsRequired   = false;
                        _serviceProxy.Update(retrievedOverwrittenProperty);
                        Console.WriteLine("\nOverwritten the product property for 'Example Product 1'.");

                        // Retrieve the StateCode of Product that you want to publish
                        ColumnSet prodCols = new ColumnSet();
                        prodCols.AddColumns("name", "statecode");
                        Product retrievedRevisedProduct = (Product)_serviceProxy.Retrieve(
                            Product.EntityLogicalName, _product1Id,
                            prodCols);

                        // Update the state of the Product to "Active"
                        retrievedRevisedProduct.StateCode = ProductState.Active;
                        UpdateRequest publishProduct1 = new UpdateRequest
                        {
                            Target = retrievedRevisedProduct
                        };
                        _serviceProxy.Execute(publishProduct1);
                        Console.WriteLine("\nPublished '{0}'.", retrievedRevisedProduct.Name);
                    }

                    DeleteRequiredRecords(promptForDelete);
                }
            }
            catch
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }
        /// <summary>
        /// Create and configure the organization service proxy.
        /// Initiate creating all entity records that this sample requires.
        /// Create a product family with two child product records.
        /// Create a substitute relation between the two products.
        /// Publish the product family hierarchy, including the child records.
        /// Optionally delete any entity records that were created 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();

                    // Call the method to create any data that this sample requires.
                    CreateRequiredRecords();

                    // Create a product family
                    Product newProductFamily = new Product
                    {
                        Name             = "Example Product Family",
                        ProductNumber    = "PF001",
                        ProductStructure = new OptionSetValue(2)
                    };
                    _productFamilyId = _serviceProxy.Create(newProductFamily);
                    Console.WriteLine("\nCreated {0}", newProductFamily.Name);

                    // Create couple of product records under the product family
                    Product newProduct1 = new Product
                    {
                        Name                 = "Example Product 1",
                        ProductNumber        = "P001",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product1Id = _serviceProxy.Create(newProduct1);

                    Console.WriteLine("Created {0} under the product family", newProduct1.Name);

                    Product newProduct2 = new Product
                    {
                        Name                 = "Example Product 2",
                        ProductNumber        = "P002",
                        ProductStructure     = new OptionSetValue(1),
                        ParentProductId      = new EntityReference(Product.EntityLogicalName, _productFamilyId),
                        QuantityDecimal      = 2,
                        DefaultUoMScheduleId = new EntityReference(UoMSchedule.EntityLogicalName, _unitGroupId),
                        DefaultUoMId         = new EntityReference(UoM.EntityLogicalName, _unit.Id)
                    };
                    _product2Id = _serviceProxy.Create(newProduct2);

                    Console.WriteLine("Created {0} under the product family", newProduct2.Name);

                    // Create a price list items for the products
                    ProductPriceLevel newPriceListItem1 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product1Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem1Id = _serviceProxy.Create(newPriceListItem1);

                    Console.WriteLine("Created price list for {0}", newProduct1.Name);

                    ProductPriceLevel newPriceListItem2 = new ProductPriceLevel
                    {
                        PriceLevelId = new EntityReference(PriceLevel.EntityLogicalName, _priceListId),
                        ProductId    = new EntityReference(Product.EntityLogicalName, _product2Id),
                        UoMId        = new EntityReference(UoM.EntityLogicalName, _unit.Id),
                        Amount       = new Money(20)
                    };
                    _priceListItem2Id = _serviceProxy.Create(newPriceListItem2);

                    Console.WriteLine("Created price list for {0}", newProduct2.Name);

                    // Set the product relationship
                    // Set Example Product 1 and Example Product 2 as substitute of each other (bi-directional)
                    ProductSubstitute newProductRelation = new ProductSubstitute
                    {
                        SalesRelationshipType = new OptionSetValue(3),
                        Direction             = new OptionSetValue(1),
                        ProductId             = new EntityReference(Product.EntityLogicalName, _product1Id),
                        SubstitutedProductId  = new EntityReference(Product.EntityLogicalName, _product2Id)
                    };
                    _productRelationId = _serviceProxy.Create(newProductRelation);

                    Console.WriteLine("Created a substitute relation between the two products.");

                    // Prompt the user whether to publish the product family and products
                    bool publishRecords = true;
                    Console.WriteLine("\nDo you want the product records published? (y/n)");
                    String answer = Console.ReadLine();
                    publishRecords = (answer.StartsWith("y") || answer.StartsWith("Y"));

                    if (publishRecords)
                    {
                        PublishProductHierarchyRequest publishReq = new PublishProductHierarchyRequest
                        {
                            Target = new EntityReference(Product.EntityLogicalName, _productFamilyId)
                        };
                        PublishProductHierarchyResponse published = (PublishProductHierarchyResponse)_serviceProxy.Execute(publishReq);
                        if (published.Results != null)
                        {
                            Console.WriteLine("Published the product records");
                        }
                    }

                    DeleteRequiredRecords(promptForDelete);
                }
            }
            catch
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }