创建和管理产品系列、产品、捆绑销售以及产品属性
发布日期: 2017年1月
适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online
通过在某一产品系列下创建产品和销售捆绑将您的产品组织在一个分层结构中,由此来定义您的产品目录,定义相关产品并将属性添加到父产品系列中,以便让在此产品系列下的所有子产品和销售捆绑可以自动继承这些属性。
默认情况下,在创建产品系列、产品或销售记录时,它们都处在草稿状态中。 在创建产品、定义相关产品、对父产品系列记录配置属性之后,必须为其发布产品系列、产品或捆绑记录,以便让您的销售代理能够在系统中看到您的销售产品。详细信息:发布产品系列、产品或捆绑销售
备注
对于与产品系列无关联的产品,也就是没有为其分派父产品系列记录的产品,通过设置 Organization.CreateProductsWithoutParentInActiveState 属性为 1 (true),您可以在可用状态下直接创建它们。 默认情况下,如果全新安装 Microsoft Dynamics 365,则该属性设置为 0 (false);如果您正在升级 Dynamics 365 先前版本以确保使用 Dynamics 365 先前版本(在此版本中,可用状态下创建产品记录)的应用程序兼容性,则该属性设置为 1 (true)。
您还可以使用 Microsoft Dynamics 365 或 Microsoft Dynamics 365 for Outlook 的系统设置区域中的“销售”选项卡,以指定是否在可用状态下创建产品。详细信息:TechNet:管理产品目录配置
本主题内容
定义产品、产品系列和销售捆绑
定义产品属性
捆绑销售和配套件
在产品销售过程中,定义产品关系以起到加强推荐的功能
克隆产品系列、产品或捆绑销售
定义产品、产品系列和销售捆绑
使用 Product.ProductStructure 属性定义某一项是否是产品系列、产品或捆绑销售。 将此属性的值设置为:
1 用来创建产品
2 用来创建产品系列
3 用来创建捆绑销售
在定义产品系列、产品和捆绑销售时,需要考虑以下重要事项:
产品系列记录可将多个子产品系列、产品、捆绑销售实例包含在分层结构中。 对于子产品系列,子产品或子捆绑销售实例,使用 Product.ParentProductId 属性定义父产品系列实例。 一旦设置它之后,就无法更改父记录。
不能将产品或捆绑销售设置为父级,这暗示产品或捆绑销售记录不能具有子记录。
产品系列、产品或捆绑销售实例只能作为产品系列实例的一部分。
对产品系列的嵌套级没有限制。
Product.ValidFromDate 和 Product.ValidToDate 属性没有与它们关联的任何现成业务逻辑,除了一个确保 Product.ValidToDate 中的日期应晚于或等于 Product.ValidFromDate 中的日期的检查以外。 如果需要,可以依据这些属性实施您自己的业务逻辑。 例如,可以使用 Product.ValidToDate 属性中的日期值,执行计划的作业,以自动弃用上一季度的产品。
以下代码示例演示如何创建单个产品系列和子产品记录。
// 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 record 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);
定义产品属性
产品属性帮助您定义产品的特征,如其大小、颜色或组件。 产品属性使用 DynamicProperty 实体定义。 定义产品属性时,只能将其关联到 Draft 状态的产品系列记录,不能关联到产品或捆绑销售记录。 可以关联到草稿产品系列记录的产品属性的最大数量由以下组织设置决定:Organization.MaximumDynamicPropertiesAllowed。 当您在附加了属性的产品系列下发布子产品记录或捆绑销售(而不是在将属性附加到草稿产品系列记录)时,该数量才会生效。
提示
也可以在 Dynamics 365 或 Dynamics 365 for Outlook 的系统设置区域中使用“销售”选项卡配置产品属性的最大数目。详细信息:TechNet:管理产品目录配置。
创建产品属性时,您将指定其名称、其关联的 Draft 状态(如隐藏、必需还是只读)的产品系列记录,以及属性的数据类型。 产品属性可以是下面的一种数据类型:
值 |
数据类型 |
---|---|
0 |
选项集 |
1 |
十进制 |
2 |
浮点数 |
3 |
单行文本 |
4 |
整数 |
产品属性一经创建,即不可更改其数据类型。 创建产品属性时,创建的状态为 Draft。
以下示例代码演示如何创建产品属性:
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);
有关完整示例,请参阅 示例:创建和发布产品
备注
创建 Option Set 数据类型的产品属性时,必须通过创建 DynamicPropertyOptionSetItem 实体记录定义产品属性的单个选项。 每个实体记录存储有关单个选项的信息,其中 DynamicPropertyOptionSetItem.DynamicPropertyOptionName 和 DynamicPropertyOptionSetItem.DynamicPropertyOptionValue 属性分别定义选项名称和值,并且您可以使用 DynamicPropertyOptionSetItem.DynamicPropertyId 属性将单个选项记录关联到父产品属性实例。
有关使用 Web 客户端创建和管理产品属性的信息,请参阅帮助和培训:使用属性描述产品
备注
您定义产品属性的方式将决定在运行时(也就是说,将关联产品添加到商机、报价单、订单或发票时)销售代理能够使用它的方式。 在运行时,可对可更新产品的属性值进行更改,但不能对只读产品的属性值进行更改。 对于设置为必需的产品属性,必须在运行时指定属性值。 否则,属性将显示为未解析。 在运行时隐藏属性不会对销售代理显示。
此外,产品属性不影响产品的定价。 这暗示 Dynamics 365 定价引擎不支持基于更改产品属性值的产品价格更改。
更改产品属性
请务必获知产品属性的各种状态,以便了解如何和何时可以更改这些状态。 产品属性的状态可以是“草稿”、“有效”或“已停用”。 产品在创建时,其状态为“草稿”,发布其关联的产品系列记录后,则更改为“有效”。 停用关联的产品系列记录时,产品属性的状态也变为“Retired“。
可以在两个级别更改产品属性:首先在产品属性关联的产品系列级别,其次在子产品系列、产品或捆绑销售级别(产品属性在此处继承)。
更改产品属性关联的产品系列的产品属性
对于 Draft 产品系列记录,可以更改与其关联的产品属性。 发布产品系列记录(更改为“Active“状态)之后,修订产品系列记录之前,不能更改产品属性。 修订产品系列记录(更改为“Under Revision“状态),请覆盖属性的已发布(有效)版本以进行更改。 有关产品生命周期的信息,请参阅 发布、修订、还原、停用和激活产品(产品生命周期)
更改子产品系列、产品或捆绑销售继承的产品属性
对于“Draft“状态的产品属性,子产品系列、产品和捆绑销售记录可以替代继承的属性以定义自己的属性版本。 例如,替代继承的属性以更改其名称,或将属性从隐藏更改为可视,从必需更改为可选,或从只读更改为可更新。 不能替代或更改继承的属性的数据类型。
若要替代产品属性,请创建产品属性的实例,然后将 BaseDynamicPropertyId 属性设置为您要替代的属性的 GUID。 此外,还将新属性实例关联到正在其中执行替代的子产品系列、产品或捆绑销售记录。
以下示例代码演示如何替代现有产品属性记录(如使用 GUID _productPropertyId),然后将替代的属性关联到产品记录(如使用 GUID _product1Id) 之后,可以更新新属性的属性,以便指定您自己的值以完成替代。
// Override a product property
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);
有关完整示例,请参阅 示例:创建和发布产品
对于“Active“状态的产品属性,如果以下条件均成立,您可以覆盖子产品系列、产品或捆绑销售记录继承的属性:
子产品系列、产品或捆绑销售记录的状态为”正在修订“。
已替代继承的有效产品属性。
若要覆盖产品属性,请创建产品属性的实例,然后将 BaseDynamicPropertyId 属性设置为您已替代的属性的 GUID。 此外,还将新属性实例与 Under Revision 阶段的产品系列、产品或捆绑销售记录关联。
以下示例代码演示如何覆盖已替换且状态为有效的产品属性记录(如使用 GUID _productOverridenPropertyId),然后将新属性关联到“Under Revision”状态的产品记录(如使用 GUID _product1Id)。 之后,可以更新新属性的属性,以便指定您自己的值并完成覆盖。
// Overwrite a product property
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);
有关完整示例,请参阅 示例:创建和发布产品
捆绑销售和配套件
捆绑销售是在 Dynamics 365 中引入的功能,用来替换旧有配套件的功能。 类似于配套件,捆绑销售是多个产品的集合,作为一套产品进行销售。 产品捆绑销售是一个有用的功能,它可以按照在整个产品线中客户受益最多或享受捆绑销售产品折扣的方式对产品进行分组,使您能够分组这些产品,并以单个产品的方式售出。
只能将产品添加到捆绑销售中;您无法将产品系列、捆绑销售或配套件记录添加到捆绑销售中去。 通过使用 ProductAssociation 实体创建产品相关记录,您可以将产品添加到捆绑销售或配套件中。ProductAssociation.ProductId 记录指定您可以向其添加产品的捆绑销售或配套件,ProductAssociation.AssociatedProduct 并指定要添加的产品。 可向捆绑销售中添加产品的最大数量由以下组织设定决定: Organization.MaxProductsinBundle。
也可以在 Dynamics 365 或 Dynamics 365 for Outlook 的系统设置区域中使用“销售”选项卡指定能够添加到捆绑销售的产品的最大数目。详细信息:TechNet:管理产品目录配置
以下代码示例演示如何将产品添加到捆绑销售中。
// Add a product to a bundle
ProductAssociation newAssociation1 = new ProductAssociation
{
AssociatedProduct = new EntityReference(Product.EntityLogicalName, _product1Id),
ProductId = new EntityReference(Product.EntityLogicalName, _bundleId),
Quantity = new decimal(15),
ProductIsRequired = new OptionSetValue(0),
UoMId = new EntityReference(UoM.EntityLogicalName, unit.Id)
};
_product1AssociationId = _serviceProxy.Create(newAssociation1);
// Add another product to the bundle
ProductAssociation newAssociation2 = new ProductAssociation
{
AssociatedProduct = new EntityReference(Product.EntityLogicalName, _product2Id),
ProductId = new EntityReference(Product.EntityLogicalName, _bundleId),
Quantity = new decimal(20),
ProductIsRequired = new OptionSetValue(1),
UoMId = new EntityReference(UoM.EntityLogicalName, unit.Id),
};
_product2AssociationId = _serviceProxy.Create(newAssociation2);
if ((_product1AssociationId != null) && (_product1AssociationId != null))
Console.WriteLine("\nAdded both the products to the bundle");
有关完整示例,请参阅示例:将产品添加到捆绑销售。
配套件和捆绑销售之间的区别
配套件和捆绑销售都可以让您将产品组合为单个计价单位,但二者之间也存在一些区别。
配套件 |
捆绑销售 |
---|---|
配套件中的所有产品都是必需的。 |
捆绑销售中某些产品是可选的。 |
配套件支持嵌套;您可以将一个配套件添加到另一个配套件中。 |
无法将一个捆绑销售添加到另一个捆绑销售。 您只能将产品添加到捆绑销售。 |
当将配套件添加到商机、报价单、订单或发票中时,您只能查看该配套件级别的详细信息;您无法在配套件中看到各个产品。 |
当将捆绑销售添加到商机、报价单、订单或发票中时,您能查看该捆绑销售级别的详细信息,还能在捆绑销售中看到各个产品。 |
备注
Dynamics 365 中已弃用配套件;您应该改用捆绑销售。
在产品销售过程中,定义产品关系以起到加强推荐的功能
在进行商机或订单管理时,您可以定义向您的销售代理显示相关产品作为针对某个产品的推荐产品。 针对某个产品的产品推荐使您的销售代理能够向客户推荐相关的产品和捆绑销售/配套件,从而促进产品的销售。 您可以定义以下产品的关系:附件、交叉销售、替代产品和 追加销售。 例如,可以将 Surface Pro 作为 Surface RT 的追加销售产品来进行添加,这样一来,当您的销售代理在将 Surface RT 添加到任一商机、报价单、订单或发票中时,系统将建议将 Surface Pro 作为追加销售选项。
使用 ProductSubstitute.SalesRelationshipType 属性定义产品关系。 将此属性的值设置为:
0 用于追加销售
1 用于交叉销售
2 用于配件
3 用于替代产品
在定义产品关系时,定义关系的方向以防止数据重复是非常重要的。 产品关系的支持方向有:
产品关系 |
方向 |
---|---|
配件 |
单向 |
交叉销售 |
单向或双向 |
替代品 |
单向或双向 |
追加销售 |
单向 |
使用 ProductSubstitute.Direction 属性指定产品关系的方向。 将此属性的值设置为:
0 用于单向
1 用于双向
以下代码示例演示如何定义产品关系。
// Set product relationship
// Set product1 and product2 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);
克隆产品系列、产品或捆绑销售
使用 CloneProductRequest 消息克隆产品系列、产品或捆绑销售记录,并以相同的父节点创建记录副本。 必须提供用于克隆的记录 ID。 克隆产品记录的同时也会复制产品属性。 创建了克隆记录之后,日期和时间戳将追加到 Product.Name 和 Product.ProductNumber 属性的初始值;日期时间戳表示克隆记录时的时间。 以下代码示例演示如何克隆产品。
CloneProductRequest cloneReq = new CloneProductRequest
{
Source = new EntityReference(Product.EntityLogicalName, _productId)
};
CloneProductResponse cloned = (CloneProductResponse)_serviceProxy.Execute(cloneReq);
_productCloneId = cloned.ClonedProduct.Id;
// Retrieve the cloned product record
Product retrievedProduct = (Product)_serviceProxy.Retrieve(Product.EntityLogicalName, _productCloneId, new ColumnSet(true));
Console.WriteLine("\nCreated clone product: {0}", retrievedProduct.Name);
下一步
发布您的产品记录,以便让您的销售代理可以销售这些产品。详细信息:发布产品系列、产品或捆绑销售
另请参阅
发布、修订、还原、停用和激活产品(产品生命周期)
示例:创建和发布产品
示例:克隆产品记录
示例:将产品添加到捆绑销售
产品目录实体
Microsoft Dynamics 365
© 2017 Microsoft。 保留所有权利。 版权