1. アセットと製品のリンク

アセットと製品のリンク

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

このアクション スクリプトの例では、アセットのファイル名を {product number}_{name} の形式に変更すると、そこで指定した製品にアセットがリンクされます。このアクションはコミット前の段階 (処理中) で実行されます。

注意

コミット前は、このスクリプトがトリガー イベントの前に実行されることを意味します。この例では、エンティティが変更される前にスクリプトが実行されます。

ユース ケース

  1. ユーザーがアセットのファイル名を編集します。
  2. 製品番号を使用した特定の形式によるファイル名を使用すると、アセットがその製品にリンクされます。

スクリプト

using System.Linq;
using System.Threading.Tasks;

var asset = Context.Target as IEntity;
if(asset == null) return;

var filename = asset.GetPropertyValue<string>("FileName");
if(string.IsNullOrEmpty(filename)) return;

var splitFilename = filename.Split('_');
if(splitFilename.Count() < 2) return;

var productNumber = splitFilename[0];
var productId = await GetProductId(productNumber);

if(productId.HasValue){
var productRelation = asset.GetRelation("PCMProductToAsset");
productRelation.SetIds(new long[]{ productId.Value });
MClient.Logger.Info($"Asset {asset.Id} is linked to product {productId.Value}.");
}
else{
MClient.Logger.Warn($"No product found with product number {productNumber}!");
}

async Task<long?> GetProductId(string productNumber)
{
var query = Query.CreateQuery(entities =>
from e in entities
where e.Property("ProductNumber") == productNumber
&& e.DefinitionName =="M.PCM.Product"
select e);
var productId = await MClient.Querying.SingleIdAsync(query);
MClient.Logger.Info(productId.ToString());

return productId;
}

スクリプトの説明

この例のアクション スクリプトは次のように動作します。

  1. インクルードされるライブラリは次のとおりです。

    using System.Linq;
    using System.Threading.Tasks;
  2. このアクションはコミットの前に実行されるので、Context から Target オブジェクトを取得して IEntity にキャストしておきます。Target は、作成イベントまたは変更イベントに関与するアセットです。このアセットが存在しないと、このスクリプトは終了します。

    var asset = Context.Target as IEntity;
    if(asset == null) return;
  3. GetPropertyValue("FileName") メソッドでは、このアセットから FileName を取得します。filename が null または空の場合、このスクリプトは戻ります。

    var filename = asset.GetPropertyValue<string>("FileName");
    if(string.IsNullOrEmpty(filename)) return;
  4. 指定の形式によるファイル名を使用していると、そのファイル名は {productNumber}{name} の 2 つの部分に分割されます。それ以外の場合、このスクリプトは戻ります。

    var splittedFilename = filename.Split('_');
    if(splittedFilename.Count() < 2) return;
  5. GetProductId(productnumber) メソッドによって productNumber が遅延読み込みされます。productNumberは、次のように filename で指定した番号です。

    var productNumber = splittedFilename[0];
    var productId = await GetProductId(productNumber);
  6. productId が有効な値であれば、次のように SetIds メソッドによってアセットが PCMProductToAsset リレーションにリンクされます。

    if(productId.HasValue){
    var productRelation = asset.GetRelation("PCMProductToAsset");
    productRelation.SetIds(new long[]{ productId.Value });
    MClient.Logger.Info($"Asset {asset.Id} is linked to product {productId.Value}.");
    }
    else{
    MClient.Logger.Warn($"No product found for product number {productNumber}!");
    }
  7. GetProductId メソッドからは、次のように productNumber パラメーターを使用して productId が返されます。

    async Task<long?> GetProductId(string productNumber)
    {
    var query = Query.CreateQuery(entities =>
    from e in entities
    where e.Property("ProductNumber") == productNumber
    && e.DefinitionName =="M.PCM.Product"
    select e);
    var productId = await MClient.Querying.SingleIdAsync(query);
    MClient.Logger.Info(productId.ToString());
    
    return productId;
    }

設定

スクリプト、アクション、およびトリガーを設定するには、次の手順に従います。

  1. {productnumber}_{name} の形式によるファイル名で アセットを作成するか既存のアセット名を編集します。

  2. アクション タイプのスクリプトを作成して公開し、有効にします。

  3. アクション スクリプト タイプのアクションを作成して、上記で作成したスクリプトにリンクします。

  4. 次の手順でトリガーを作成します。

    • [全般] タブで、[目標][エンティティ作成][エンティティ変更] に設定します。

    • [全般] タブで、[実行タイプ][処理中] に設定します。

    • [条件] タブで、Asset(M.Asset) エンティティ定義の条件を追加します。

    • この条件に Filename(FileName) エンティティ定義の条件を新たに追加し、それを [変更済み] に設定します。

    • [アクション] タブの [コミット前アクション] で、関連するアクションを追加します。

    • 保存して、トリガーをアクティブにします。

この記事を改善するための提案がある場合は、 お知らせください!