2013-03-17 44 views
9

在动态CRM 2011,关于事件的实体, “状态的原因” optionset(又名的StatusCode)是关系到 “状态” optionset(又名statecode)元数据动态CRM:获取的StatusCode/statecode映射

例如看到这张截图

screenshot of CRM field options

当我使用API​​来检索状态原因optionset,就像这样:

 RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest 
     { 
      EntityLogicalName = "incident", 
      LogicalName = "statuscode", 
      RetrieveAsIfPublished = true 
     }; 
     RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)serv.Execute(attributeRequest); 
     AttributeMetadata attrMetadata = (AttributeMetadata)attributeResponse.AttributeMetadata; 
     StatusAttributeMetadata statusMetadata = (StatusAttributeMetadata)attrMetadata; 
     var dict = new Dictionary<int?, string>(); 
     foreach (OptionMetadata optionMeta in statusMetadata.OptionSet.Options) 
     { 
      dict.Add(optionMeta.Value, optionMeta.Label.UserLocalizedLabel.Label); 
     } 

它的工作原理,我得到的“状态原因”整个列表(的StatusCode )选项。但是,我没有得到关于哪个“状态原因”(状态码)选项与哪个“状态”(状态码)选项有关的任何信息。

如何获取该信息?

回答

11

你已经拥有了一切尝试插入这个代码的foreach内:

int stateOptionValue = (int)((StatusOptionMetadata)optionMeta).State; 

StatusAttributeMetaData.OptionSet.Options层次可以返回一个名为StatusOptionMetadata如果使用StatusOptionMetadata的国家属性类型,它将返回此的StatusCode所属的statecode至。

+0

啊,好的,所以我应该在foreach中使用StatusOptionMetadata,而不是OptionMetadata - 将尝试出来... – codeulike 2013-03-18 10:49:45

+0

喜欢codeulike,这有效吗? – 2013-03-19 06:44:10

+0

为简洁起见。 – 2013-03-20 20:55:48

3

这里是你如何可以通过查询数据库

SELECT distinct e.LogicalName as entity, 
     smState.Value AS stateCode, 
     smstate.AttributeValue, 
     smStatus.Value AS [statuscode/statusreason], 
     smStatus.AttributeValue 
FROM StatusMap sm 
    JOIN Entity e ON sm.ObjectTypeCode = e.ObjectTypeCode 
    JOIN StringMap smState ON smState.AttributeValue = sm.State 
          AND smState.ObjectTypeCode = e.ObjectTypeCode 
          AND smState.AttributeName = 'StateCode' 
    JOIN StringMap smStatus ON smStatus.AttributeValue = sm.Status 
          AND smStatus.ObjectTypeCode = e.ObjectTypeCode 
          AND smStatus.AttributeName = 'StatusCode' 
WHERE e.LogicalName in ('lead') 
ORDER BY e.LogicalName, 
     smState.AttributeValue, 
     smStatus.AttributeValue; 
0

这里是工作的代码,将针对给定的实体输出状态/状态映射(你只需要提供orgServiceProxy)得到它:

var dictState = new Dictionary<int, OptionMetadata>(); 
    var dictStatus = new Dictionary<int, List<OptionMetadata>>(); 

    string entityName = "lead"; 
    int count=0; 
    using (var orgServiceProxy = GetOrgServiceProxy(orgServiceUriOnLine)) 
    { 
     RetrieveAttributeResponse attributeResponse = GetAttributeData(orgServiceProxy, entityName, "statecode"); 
     AttributeMetadata attrMetadata = (AttributeMetadata)attributeResponse.AttributeMetadata; 
     StateAttributeMetadata stateMetadata = (StateAttributeMetadata)attrMetadata; 
     foreach (OptionMetadata optionMeta in stateMetadata.OptionSet.Options) 
     { 
      dictState.Add(optionMeta.Value.Value,optionMeta); 
      dictStatus.Add(optionMeta.Value.Value,new List<OptionMetadata>()); 
     } 

     attributeResponse = GetAttributeData(orgServiceProxy, entityName, "statuscode"); 
     attrMetadata = (AttributeMetadata)attributeResponse.AttributeMetadata; 
     StatusAttributeMetadata statusMetadata = (StatusAttributeMetadata)attrMetadata; 

     foreach (OptionMetadata optionMeta in statusMetadata.OptionSet.Options) 
     { 
      int stateOptionValue = ((StatusOptionMetadata)optionMeta).State.Value; 
      var statusList = dictStatus[stateOptionValue]; 
      statusList.Add(optionMeta); 
      count++; 
     } 
    } 
    Console.WriteLine($"Number of mappings: {count}"); 
    foreach (var stateKvp in dictState.OrderBy(x=> x.Key)) 
    { 
     Console.WriteLine($"State: {stateKvp.Value.Value}: {stateKvp.Value.Label.UserLocalizedLabel.Label}"); 
     var statusList = dictStatus[stateKvp.Key]; 
     Console.WriteLine($"\tStatuses"); 
     foreach (var status in statusList.OrderBy(s => s.Value)) 
     { 
      Console.WriteLine($"\t\t{stateKvp.Value.Value}: {status.Label.UserLocalizedLabel.Label}"); 
     } 
    }