2012-05-31 8 views
10

सीआरएम 2011 एसडीके (v5.0.10) का उपयोग करके मैं एक मुट्ठी भर लुकअप फ़ील्ड के साथ एक समस्या में भाग रहा हूं जहां लक्ष्य आबादी नहीं है और उम्मीद है कि कोई मुझे इन मामलों में संदर्भित इकाई निर्धारित करने का सबसे अच्छा तरीका निर्धारित करने में मदद कर सकता है ।डायनेमिक्स 2011 एसडीके में, LookupAttributeMetadata.Targets खाली होने पर लक्ष्य इकाई को कैसे निर्धारित करें?

विशेष रूप से, मैं इस कॉल के साथ इकाई, विशेषता और रिश्ता मेटाडाटा को पुन: प्राप्त कर रहा हूँ:

var entityRequest = new RetrieveAllEntitiesRequest 
         { 
          RetrieveAsIfPublished = true, 
          EntityFilters = EntityFilters.Entity | EntityFilters.Attributes | EntityFilters.Relationships 
          }; 

var entityResponse = (RetrieveAllEntitiesResponse)_organizationService.Execute(entityRequest); 
return entityResponse.EntityMetadata.ToList(); 

बाद में, जब एक EntityMetadata वस्तु के साथ काम है कि कॉल से लौटे, मैं गुण संग्रह और LookupAttributeMetadata वस्तुओं के लिए निरीक्षण किया , मैं LookupAttributeMetadata ऑब्जेक्ट की लक्ष्य संपत्ति का उपयोग करके लुकअप द्वारा संदर्भित इकाई को निर्धारित करने का प्रयास करता हूं।

हालांकि, कुछ ऐसे मामले हैं जहां एक LookupAttributeMetadata ऑब्जेक्ट में एक खाली लक्ष्य संग्रह है। उदाहरण के लिए, अभियान गतिविधि (तार्किक नाम: अभियान सक्रियता) इकाई में सेवा क्षेत्र (लॉजिकल नाम: सर्विस्ड) एक लुकअप फ़ील्ड के रूप में परिभाषित किया गया है, लेकिन LookupAttributeMetadata ऑब्जेक्ट पर लक्ष्य गुण खाली है।

VS QuickWatch

जब मैं प्रकार धारा के तहत इकाई के लिए वेब UI अनुकूलन स्क्रीन को देखो और सेवा क्षेत्र खोलते हैं, तो पता चलता है प्रकार है: लुक, लक्ष्य रिकॉर्ड प्रकार: खाता, रिश्ता नाम: campaignactivity_account।

Web UI field view

यह जानकारी कहां से आता है?

यह भी ध्यान दें: अभियान गतिविधि या खाता इकाइयों पर "campaignactivity_account" नामक कोई रिश्ते नहीं हैं।

अद्यतन: मैं डायनेमिक्स सीआरएम 2011 रोलअप 8 का स्टॉक इंस्टॉल चला रहा हूं (हालांकि मैंने इसे रोलअप 7 पर भी देखा)। जबकि अभियान गतिविधि वह क्षेत्र है जिसका मैंने अपने उदाहरण में उपयोग किया था, नीचे सूचीबद्ध इस मुद्दे के साथ 14 कुल हैं। मैं अपने कोड में if (entityName=="rollupfield" && fieldName=="organizationid")... तर्क का एक गुच्छा रखने के लिए एक सामान्य समाधान (प्रत्येक के लिए एक-एक बंद समाधान बना रहा हूं), क्योंकि जिन संस्थाओं और क्षेत्रों के साथ मैं काम कर रहा हूं उन्हें उपयोगकर्ता द्वारा रनटाइम पर चुना जाता है और मैं नहीं करता जरूरी समय से पहले मुझे पता नहीं चलेगा कि मुझे क्या सौंपा जाएगा।

  • निकाय: रोलअप फील्ड (rollupfield) फील्ड: संगठन आईडी (organizationid)
  • निकाय: रोलअप क्वेरी (goalrollupquery) फील्ड: मालिक उपयोगकर्ता (owninguser)
  • इकाई: प्रक्रिया के लिए लॉग (workflowlog) क्षेत्र: के बारे में (regardingobjectid)
  • निकाय: सहेजी गयी देखें (userquery) फील्ड: अभिभावक क्वेरी (parentqueryid)
  • इकाई: अभियान गतिविधि (campaignactivity) फील्ड: सेवा (serviceid)
  • इकाई: ई-मेल खोज (emailsearch) एफ ield: जनक (parentobjectid)
  • निकाय: समय क्षेत्र परिभाषा (timezonedefinition) फील्ड: संगठन (organizationid)
  • इकाई: अभियान रिस्पांस (campaignresponse) फील्ड: सेवा (serviceid)
  • इकाई: त्वरित अभियान (bulkoperation) फील्ड : सेवा (serviceid)
  • निकाय: फील्ड अनुमति (fieldpermission) फील्ड: संगठन आईडी (organizationid)
  • निकाय: समय क्षेत्र स्थानीयकृत नाम (timezonelocalizedname) फील्ड: संगठन (organizationid)
  • निकाय: समय क्षेत्र नियम (timezonerule) क्षेत्र: संगठन (अंग izationid)
  • निकाय: लेखा परीक्षा (ऑडिट) फील्ड: रिकॉर्ड (ObjectId)
  • निकाय: पोस्ट (पोस्ट) फील्ड: RegardingObjectId (regardingobjectid)

अद्यतन: निम्नलिखित कंसोल अनुप्रयोग इस्तेमाल किया जा सकता पुन: पेश करने समस्या।

//Requires the following Referenses: 
// Microsoft.CSharp 
// Microsoft.IdentityModel 
// Microsoft.xrm.sdk 
// System 
// System.Core 
// System.Data 
// System.Runtime.Serialization 
// System.ServiceModel 

using System; 
using System.Linq; 
using System.Net; 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.Client; 
using Microsoft.Xrm.Sdk.Messages; 
using Microsoft.Xrm.Sdk.Metadata; 

namespace TargetlessLookupsPOC 
{ 
    internal static class Program 
    { 
     private const string OrganizationServiceURL = 
      "http://dynamicscrm1/DynamicsCRM1/XRMServices/2011/Organization.svc"; 

     private static void Main(string[] args) 
     { 
      Console.WriteLine("====== Authenticating "); 

      var organizationServiceMngt = 
       ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(OrganizationServiceURL)); 
      var authCred = new AuthenticationCredentials(); 
      authCred.ClientCredentials.Windows.ClientCredential = new NetworkCredential(); 
      IOrganizationService orgProxy = new OrganizationServiceProxy(organizationServiceMngt, 
                     authCred.ClientCredentials); 

      Console.WriteLine("====== Fetching All Entity Metadata "); 
      var entityRequest = new RetrieveAllEntitiesRequest 
       { 
        RetrieveAsIfPublished = true, 
        EntityFilters = EntityFilters.Entity | EntityFilters.Attributes | EntityFilters.Relationships 
       }; 

      var entityResponse = (RetrieveAllEntitiesResponse) orgProxy.Execute(entityRequest); 

      Console.WriteLine("====== Searching For Targetless Lookups "); 
      foreach (var ent in entityResponse.EntityMetadata) 
      { 
       foreach (var field in ent.Attributes 
        .OfType<LookupAttributeMetadata>() 
        .Where(lookup => !lookup.Targets.Any())) 
       { 
        Console.WriteLine("Entity: {0} ({1}), Field: {2} ({3}) (type: {4}) is targetless", 
             ent.DisplayName.LabelText(), ent.LogicalName, 
             field.DisplayName.LabelText(), field.LogicalName, 
             field.AttributeType); 
       } 
      } 

      Console.WriteLine("=========================== Done"); 
      Console.WriteLine("** Press any key to continue **"); 
      Console.ReadKey(); 
     } 

     public static string LabelText(this Label label) 
     { 
      return (label != null && label.UserLocalizedLabel != null) 
         ? label.UserLocalizedLabel.Label 
         : "<no label>"; 
     } 
    } 
} 
+0

अच्छा सवाल जॉन। आपके लिए कोई जवाब नहीं है (अभी तक?) लेकिन मुझे लगता है कि मेरे एमएससीआरएम 2011 परिनियोजन में, campaignactivity.serviceid 'नियुक्ति' के लिए एक लुकअप है और 'campaignactivity_appointment' का रिश्ते का नाम है (जो ** ** मौजूद नहीं है)।संपादित किया गया: मैंने अपने सिस्टम 'अभियान एक्टिविटी_एपॉइंटमेंट्स' में मौजूद चीज़ों को गलत तरीके से पढ़ा है, लेकिन यह बिल्कुल भी नहीं है) –

+0

यह भी ध्यान दें: मैं एक्सेस मोड = रीड-राइट, लाइसेंस टाइप = पूर्ण और एक सदस्य के साथ खाते का उपयोग कर सर्वर से कनेक्ट कर रहा हूं सिस्टम प्रशासक भूमिका के। –

उत्तर

0

मैं यहाँ इस विषय को समझने में परेशानी हो रही। लुकअप फ़ील्ड वाली इकाइयां लक्ष्य इकाई हो सकती हैं या नहीं। माना जाता है कि मैंने इनमें से कुछ को चेक किया है, लेकिन संदर्भित लुकअप में से कोई भी आवश्यक नहीं था। टाइमज़ोनरूल इकाई के मामले में, संगठनी हमेशा शून्य होता है। हालांकि आपके अपडेट के आधार पर, मुझे लगता है कि आप एक ही निष्कर्ष पर आ सकते हैं।

दी मैं ज्यादातर लायें उपयोग करें, लेकिन मैं सिर्फ विशेषताओं के माध्यम से पुनरावृति और विशेषता प्रकार के आधार पर और एक शब्दकोश वस्तु में प्रत्येक को जोड़ने के लिए करते हैं। शब्दकोश ऑब्जेक्ट को एक सूची में लपेटा जाता है (यानी List<Dictionary<string, object>>)

इस तरह से मैं सिर्फ एक सामान्य लेट स्टेटमेंट पास कर सकता हूं और आबादी वाले विशेषताओं का एक साफ iList वापस प्राप्त कर सकता हूं। लुकअप के लिए, आप प्रदर्शन मान प्राप्त करने के लिए "_name" विशेषता भी जोड़ सकते हैं।

+0

पॉल, मुझे लगता है कि आप उदाहरण संस्थाओं (यानी: लाइव रिकॉर्ड) के बारे में बात कर रहे हैं, जहां मैं प्रत्येक इकाई का वर्णन करने वाले मेटाडेटा के बारे में बात कर रहा हूं। रनटाइम पर एक लुकअप खाली होने के लिए यह निश्चित रूप से समझ में आता है, लेकिन उस लुकअप (डिज़ाइन-टाइम) की परिभाषा को रिश्ते को परिभाषित करना चाहिए, मुझे विश्वास है। –

1

आप के बजाय RetrieveRelationshipRequest संदेश उपयोग करने की कोशिश की है?

वह एक पुनर्प्राप्ति रिलेन्स रिस्पॉन्स क्लास लौटाएगा, जिसमें रिलेशनशिप मेटाडाटा संपत्ति है, जो बदले में, रिश्ते के आधार पर, यह OneToManyRelationshipMetadata या ManyToManyRelationshipMetadata होगा। OneToManyRelationshipMetadata क्लास के गुणों में से, आपको रेफरेंसिंग एट्रिब्यूट और रेफरेंस एट्रिब्यूट गुण मिलेगा, जो आप चाहते हैं।

संबंधित मुद्दे