2013-03-17 21 views
9

In Dynamics CRM 2011, sull'entità incidente, la "ragione di stato" gruppo di opzioni (aka statuscode) è legato alla gruppo di opzioni "Stato" (aka statecode)Dynamics CRM: ottenere i metadati per la mappatura statuscode/statecode

esempio vedere questo screenshot

screenshot of CRM field options

Quando uso l'API per recuperare il gruppo di opzioni Motivo stato, in questo modo:

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

Funziona in che ho l'intero elenco di "ragione di stato" (statuscode) opzioni. Tuttavia, non ho informazioni su quali opzioni di "Status Reason" (statuscode) si riferiscono a quali opzioni "Status" (statecode).

Come ottenere tali informazioni?

risposta

11

hai già tutto provare inserire questo codice all'interno di foreach:

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

Vedi StatusAttributeMetaData.OptionSet.Options gerarchia può restituire un tipo chiamato StatusOptionMetadata se si utilizza la proprietà dello Stato del StatusOptionMetadata, verrà restituito lo statecode questo statuscode appartiene a.

+0

Ah, ok, quindi dovrei usare StatusOptionMetadata nel foreach invece di OptionMetadata - lo proveremo ... – codeulike

+0

Ciao codice, funziona? –

+0

+1 per brevità. –

3

Ecco come si può ottenere interrogando il database

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

Qui è il codice di lavoro che in uscita mappatura Stato/Stato per una determinata entità (solo bisogno di fornire l'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}"); 
     } 
    } 
Problemi correlati