2013-03-17 6 views
9

In Dynamics CRM 2011, über den Vorfall Einheit, die "Status Reason" Optionsgruppe (auch bekannt als Statuscode) mit dem "Status" Optionsgruppe verwandt ist (auch bekannt als state)Dynamics CRM: Erhalten Sie Metadaten für Statuscode/state Mapping

z.B. siehe diesen Screenshot

screenshot of CRM field options

Wenn ich die API, um den Status Reason Optionsgruppe abzurufen, etwa so:

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

Es funktioniert, dass ich die ganze Liste der "Status Reason" erhalten (Statuscode) Optionen. Ich bekomme jedoch keine Informationen darüber, welche "Status Reason" (Statuscode) Optionen sich auf welche "Status" (Statecode) Optionen beziehen.

Wie bekomme ich diese Informationen?

Antwort

11

Sie haben bereits alles versuchen, diesen Code einfügen innerhalb von foreach:

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

Siehe StatusAttributeMetaData.OptionSet.Options Hierarchie kann eine Art Rückkehr StatusOptionMetadata genannt, wenn Sie die State-Eigenschaft des StatusOptionMetadata verwenden, wird es die state zurückkehren diese Statuscode gehört zu.

+0

Ah, ok, also sollte ich StatusOptionMetadata in der foreach anstelle von OptionMetadata verwenden - werde es ausprobieren ... – codeulike

+0

Hi codeulike, das funktioniert? –

+0

+1 für die Kürze. –

3

Hier ist, wie Sie es durch Abfragen der Datenbank bekommen

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

Hier Code arbeitet, der Ausgang Zustand/Statuszuordnung für eine bestimmte Einheit wird (Sie nur die orgServiceProxy zur Verfügung stellen müssen):

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