2017-10-09 14 views
0

他のエンティティを同様に表示できるようにインターフェイスを一般的に保ちながら、見積りの引用線をリストしたいと思います。Dynamics CRM C#SDK - 見積もり行の名前を取得しようとしましたが、フィールドが存在しません。

これを行うために、私はEntityMetadataにあるPrimaryNameAttributeを利用しようとしています。ほとんどのエンティティでうまく動作しますが、QuoteDetailの場合、PrimaryNameAttributeは実際にはQuoteDetailエンティティの一部として存在しない属性の「productidname」です。

このフィールド "productidname"は、他のエンティティ(OpportunityProduct、SalesOrderDetail)のPrimaryNameAttributeでもあり、その場合もフィールドはありません。

何がありますか?私はGoogleのすべてを検索したような気がしています。誰もこの問題に直面していないようです。

私が話していることを示すMSDNのQuoteDetailエンティティページは次のとおりです。https://msdn.microsoft.com/en-us/library/mt607959.aspx PrimaryNameAttributeはページの他の場所には表示されません。

答えて

1

QuoteDetail(SalesOrderDetailとOpportunityProductのような)は、Catalog ProductアイテムまたはWrite-Inアイテムとの関連エンティティであり、productidname(カタログからの製品)またはproductdescription(write-製品内)。その名前を取得するには、関連する製品に参加する必要があります。

一般的なソリューション/インターフェイスを開発しようとしている場合、これはすべてのLookup属性に対処する必要がある問題です。

あなただけのこれまでのルックアップで接続記録からPrimaryNameAttributeが必要な場合は、あなたがあなたの「メイン」実体のFormattedValuesコレクションから名前を取得することができます。より安全/まだ良く

string productname = quotedetail.FormattedValues["productid"]; 

string productname; 
quotedetail.FormattedValues.TryGetValue("productid", out productname); 
このように見ることができ、任意のエンティティの

取り扱い属性:

foreach (var key in record.Attributes.Keys) 
{ 
    if (record.FormattedValues.ContainsKey(key)) 
    { 
     string formattedvalue; 

     if (record.FormattedValues.TryGetValue(key, out formattedvalue)) 
     { 
      Console.WriteLine(formattedvalue); // use formattedvalue string 
     } 

     continue; // skip to next field when found in formatted values 
    } 

    object attributevalue; 

    record.Attributes.TryGetValue(key, out attributevalue); 

    object actualvalue; 
    string actualtext = string.Empty; 

    // handle AliasedValue fields from JOINed/LinkEntities 
    if (attributevalue.GetType().Name == "AliasedValue") 
    { 
     actualvalue = ((AliasedValue)attributevalue).Value; 
    } 
    else 
    { 
     actualvalue = attributevalue; 
    } 

    switch (actualvalue.GetType().Name) 
    { 
     case "EntityReference": 
      actualtext = ((EntityReference)actualvalue).Name; // this will catch Lookup values not contained in FormattedValues when you just created them 
      break; 

     case "DateTime": 
      actualtext = string.Format("{0:dd.MM.yyyy}", ((DateTime)actualvalue).ToLocalTime()); // ... any other dateTime format you'd like 
      break; 

     case "Guid": 
      actualtext = string.Format("{0:D}", actualvalue); // Entity Primary key 
      break; 

     default: 
      actualtext = (string)actualvalue; // anything else 
      break; 
    } 

    Console.WriteLine(actualtext); 
} 

新しく割り当てられたOptionSetValueMoneyの属性(EntityReferenceのものに似ています)は、通常FormattedValuesから引き出されるので、引き続き注意する必要があります。

この例では既存のcrmデータを扱うので、実際にはすべての属性が含まれていないという落とし穴に気づく必要があるため、.Attributes.Keysを反復するのではなく、定義済みの属性名のコレクションを参照してください。

私の個人的な戦略は、通常、型付きオブジェクトとCRMエンティティの間をマッピングするための軽量なORMを作成することですが、これは汎用インターフェースの要件には合いません。それはどちらかだ、このまたは私は仕事に構文砂糖を入れ、その属性あなたのようなケースについては


string pn = qd.GetAttributeValue<string>("productdesription") ?? (qd.GetAttributeValue<EntityReference>("productid") ?? new EntityReference { Name = string.Empty }).Name; 

が書き込み製品名を取得してください。 nullの場合はLookup名を取得し、nullの場合は偽のEntityReferenceから空の文字列を取得します。

これは摩擦の少ないコーディングを可能にし、「この属性かその属性」をうまく解決します。

+0

ありがとう、ありがとう。関連エンティティ/フィールドを必要に応じて持ち込むようにコードを指示できる何かがメタデータにありますか?それとも、問題のエンティティをカバーするために私のソリューションにハードコードする必要があるのでしょうか? – Yoni

+0

更新を見ただけです。まもなくそれを試みます。再度、感謝します。 – Yoni

+0

アップデートの例はあなたに一般的な考えを与えるべきです。後で任意の属性を抽出する方法の完全なコード例を追加します。 – Filburt

関連する問題