2013-03-17 11 views
9

W Dynamics CRM 2011 w sprawie podmiotu incydencie, "Stan Reason" optionset (aka StatusCode) jest związane z "Stan" optionset (aka statecode)Dynamics CRM Uzyskaj metadane mapowanie StatusCode/statecode

np zobaczyć ten screenshot

screenshot of CRM field options

Kiedy używać interfejsu API do pobierania optionset Stan powodu tak:

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

Działa on na tym, że mam całą listę "status rozumu" (StatusCode) Opcje. Jednak nie dostaję żadnych informacji o tym, które opcje "Przyczyna stanu" (kod statusu) odnoszą się do opcji "Status" (kod statusu).

Jak uzyskać te informacje?

Odpowiedz

11

Masz już wszystko spróbować wstawić ten kod wewnątrz z foreach:

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

Zobacz StatusAttributeMetaData.OptionSet.Options hierarchii może zwracać typ zwany StatusOptionMetadata jeśli używasz własności państwowej z StatusOptionMetadata, zwróci statecode to StatusCode należącą do.

+0

Ah, ok, więc powinienem używać StatusOptionMetadata w foreach zamiast OptionMetadata - wypróbuję to ... – codeulike

+0

Witam, czy to działa? –

+0

+1 dla zwięzłości. –

3

Oto jak można je dostać, przeglądając bazę danych

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

Oto kod roboczych, które będą wyjściowe odwzorowanie State/statusu dla danego podmiotu (wystarczy podać 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}"); 
     } 
    } 
Powiązane problemy