製品ファミリ、製品、バンドル、および製品のプロパティを作成および管理する

製品ファミリで製品およびバンドルを作成、関連製品の一覧を定義、親製品ファミリにプロパティ(属性)を追加することで、階層構造に製品を組織して、製品カタログを定義します。それにより、製品ファミリの子製品とバンドルはプロパティを自動的に継承するようになります。

既定では、製品ファミリ、製品またはバンドルのレコードを作成する場合は、その状態が下書きになります。 親製品ファミリ レコードに製品を作成、関連製品を定義、属性を構成した後に、その製品ファミリ、製品、またはバンドル レコードを公開して、販売代理店が営業用にシステム内で利用できるようにする必要があります。 詳細: 製品ファミリ、製品、バンドルの公開

Note

製品ファミリに関連付けられていない製品、つまり製品ファミリに割り当てられた親製品ファミリ レコードを持たない製品の場合は、Organization.CreateProductsWithoutParentInActiveState 列を1 (true) に設定することで、直接アクティブ状態の製品を作成できます。 既定では、この列は、Dynamics 365 for Customer Engagement の新しいインストールでは 0 (false) に設定されており、以前のバージョンの Customer Engagement からアップグレードの場合 1 (True) に設定されています。これにより、以前のバージョンの Customer Engagement (製品レコードがアクティブの状態で作成されている) で動作するアプリケーションとの互換性が保たれます。

Dynamics 365 for Customer Engagement または Microsoft Dynamics 365 for Outlook システム設定領域の営業タブを使用して、製品をアクティブ状態で作成するかどうかを指定できます。 詳細: 製品カタログの構成の管理

製品、製品ファミリ、およびバンドルを定義する

Product.ProductStructure 列を使用して、アイテムを製品ファミリ、製品またはバンドルにするかを定義します。 この列の値を次のように設定します。

  • 1: 製品の作成

  • 2: 製品ファミリの作成

  • 3: バンドルの作成

    製品ファミリ、製品、およびバンドルを定義する際に考慮する必要がある重要な点がいくつかあります。

  • 製品ファミリは、階層構造に複数の子製品ファミリ、製品、バンドルのインスタンスを含めることができます。 子製品ファミリ、子製品、または子製品バンドル インスタンスには、Product.ParentProductId 列を使用して、親製品ファミリ インスタンスを定義します。 設定したら、親レコードを変更することはできません。

  • 製品またはバンドルは、親として設定することはできません。つまり、製品またはバンドル レコードは子レコード持てないことを意味しています。

  • 製品ファミリ、製品、またはバンドル インスタンスは、1 件のみの製品ファミリ インスタンスの一部です。

  • 製品ファミリの入れ子レベルに制限はありません。

  • Product.ValidFromDateProduct.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 のシステム設定領域の営業タブを使用して、最大製品プロパティ数を構成します。 詳細: 製品カタログの構成の管理

製品のプロパティを作成している時、その名前、非表示、必須、または読み取り専用であるかというプロパティの属性が関連付けられている Draft 状態のプロパティの名前、およびプロパティのデータの種類を指定します。 製品のプロパティは次のデータ種類の 1 つである可能性があります:

[データの種類]
0 [オプション セット]
1 [小数]
2 浮動小数点数
3 1 行テキスト
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);  

完全なサンプルについては、サンプル: 製品を作成して公開する を参照してください。

Note

Option Set データの種類の製品プロパティを作成するときは、DynamicPropertyOptionSetItem テーブル レコードを作成することによって、製品のプロパティの個々のオプションを定義する必要があります。 各テーブル レコードは、DynamicPropertyOptionSetItem.DynamicPropertyOptionName および DynamicPropertyOptionSetItem.DynamicPropertyOptionValue 属性により名前と値がそれぞれ定義される個々のオプションの情報を格納し、DynamicPropertyOptionSetItem.DynamicPropertyId 列を使用して、個々のオプション レコードを親製品のプロパティ インスタンスと関連付けることができます。

Web クライアントを使用した製品プロパティの作成および管理に関する詳細については、プロパティを使用して製品を説明する を参照してください。

Note

製品のプロパティを定義する方法によって、実行時(営業案件、見積もり、受注、または請求書に関連製品を追加する時)に販売代理店によって使用される方法が決まります。 更新できる製品プロパティ値は、実行時に変更できますが、読み取り専用製品プロパティの値を変更することはできません。 必須として設定された製品のプロパティは、実行時にプロパティの値を指定する必要があります。 そうしないと、プロパティは未解決として表示されます。 非表示プロパティは、実行時に販売代理店に表示されません。

また、製品プロパティは、製品の価格に影響を与えません。 つまり、Dynamics 365 の価格設定エンジンでは、製品プロパティ属性値の変更に基づく製品価格の変更はサポートされていないことを意味します。

製品のプロパティを変更する

製品のプロパティの変更方法と変更するタイミングを理解するには、製品のプロパティの異なる状態を知ることが重要です。 製品のプロパティは、下書きアクティブ、または廃止状態である場合があります。 製品が作成されると、製品はドラフト状態となり、関連付けられている製品ファミリ レコードが公開されると、アクティブ状態に変更されます。 関連付けられている製品ファミリ レコードが廃止されると、製品のプロパティの状態も Retired に変更されます。

製品のプロパティは次の 2 つのレベルに変更可能です。製品のプロパティが関連付けられている製品ファミリ レベルにおける第 1 レベルと製品のプロパティを継承した子製品ファミリ、製品、またはバンドル レベルにおける第 2 レベルです。

関連付けられている製品ファミリの製品プロパティの変更

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 を使用して既に上書きされたアクティブな状態にある製品プロパティのレコードを上書きする方法、また、GUID _product1Id を使用して、新しいプロパティを Under Revision 状態にある製品レコードに関連付ける方法を示しています。 これが完了した後に、新しいプロパティの属性を更新し、値を指定した後に、上書きを完了させることができます。

// 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);  

完全なサンプルについては、サンプル: 製品を作成して公開する を参照してください。

バンドルおよびキット

バンドルは、Customer Engagement に導入されて、以前のキット機能と置き換えられました。 キットに似て、バンドルは、単一ユニットとして販売される製品のコレクションです。 製品をバンドルにすると、製品をグループ化して単一の出荷単位として販売することで、製品のフルラインを提供したりバンドル化された製品で割引できるので、顧客はメリットを得ることができます。

製品のみバンドルに追加できます。バンドルに製品ファミリ、バンドルまたはキット レコードを追加することはできません。 バンドルまたはキットに製品を追加するには、ProductAssociation テーブルを使用して製品関連付けレコードを作成します。 ProductAssociation.ProductId レコードは、製品を追加するバンドルまたはキットを指定し、ProductAssociation.AssociatedProduct は追加される製品を指定します。 バンドルに追加可能な最大製品数は、次の組織設定によって決まります: Organization.MaxProductsinBundle

Dynamics 365 または Dynamics 365 for Outlook のシステム設定領域の営業タブを使用して、バンドルに追加できるの最大製品数を指定します。 詳細: 製品カタログの構成の管理

次のコード サンプルは、製品をバンドルに追加する方法を示しています。

// 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) && (_product2AssociationId != null))  
Console.WriteLine("\nAdded both the products to the bundle");  

完全なサンプルについては、サンプル: バンドルへの製品の追加 を参照してください。

キットとバンドルの違い

キットおよびバンドルの両方は、単体ユニットに製品をグループ化できますが、これら 2 つには違いがあります。

キット バンドル
キットの全製品は必須です。 バンドルの一部の製品は任意です。
キットは入れ子構造をサポートしています。キットを別のキットに追加できます。 バンドルに別のバンドルを追加することはできません。 バンドルには、製品のみを追加できます。
キットを営業案件、見積もり、受注、または請求書に追加する際、キットレベル詳細のみ表示できます。キットの個々の製品は表示できません。 バンドルを営業案件、見積もり、受注、または請求書に追加する際、バンドルレベル詳細とバンドルの個々の製品を表示できます。

注意

キットは 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);  

次の手順

製品レコードを公開して、販売代理店が製品を販売できるようにします。 詳細: 製品ファミリ、製品、バンドルの公開

製品の公開、改訂、戻し、廃止、アクティブ化(製品のライフサイクル)
サンプル: 製品を作成して公開する
サンプル: 製品レコードを複製する
サンプル: バンドルへの製品の追加
製品カタログ テーブル