2012-06-07 16 views
6

मैं गतिविधि इतिहास से पूछताछ कर रहा हूं, और ऐसा लगता है कि आप इसे किसी अन्य ऑब्जेक्ट के विरुद्ध किसी सबक्वायरी के ऑब्जेक्ट के रूप में ही पूछ सकते हैं। यह ठीक है - मैंने अपनी क्वेरी को खाता ऑब्जेक्ट के विरुद्ध क्वेरी करने के लिए बदल दिया है, जिसमें सबक्वायरी में ActivityHistory है। ठीक काम करने के लिए समझा। लेकिन परीक्षण में, मुझे एक ऐसा मामला मिला जहां ActivityHistory subquery ने 200 से अधिक परिणामों को वापस कर दिया। मैं इस त्रुटि हो रही शुरू कर दिया: एसक्यूएल समस्या जब गतिविधि subiery के रूप में गतिविधि है ..

 FATAL_ERROR|System.QueryException: entity type ActivityHistory does not support query

... डीबग लॉग में। यह केवल एक मुद्दा प्रतीत होता है जहां ActivityHistory ऑब्जेक्ट में किसी खाते में 199 से अधिक संबंधित प्रविष्टियां होती हैं। यह देखने के लिए कि क्या यह कारण था, मैंने उपखंड में एक LIMIT 199 और एक LIMIT 200 खंड डालने का प्रयास किया। निश्चित रूप से, जब मैं 199 (या कुछ भी कम) का उपयोग करता हूं तो यह ठीक काम करता है। उपरोक्त त्रुटि में 200 (या कुछ भी उच्च) का उपयोग करना।

मेरा कोड नीचे है। ध्यान देने योग्य एक बात यह है कि क्वेरी फॉर लूप में है। एक सिद्धांत यह है कि यह क्यों है कि यह LIMIT क्लॉज के उच्च मानों के लिए त्रुटि का उत्पादन क्यों कर रहा है, शायद 200 वह बिंदु है जहां फोर लूप क्वेरी को अलग-अलग हिस्सों में बैच कर रहा है - शायद दूसरा खंड 'सबक्वायरी' के रूप में योग्य नहीं है (चूंकि यह अलग से चल रहा है?) - और सेल्सफोर्स इसे पसंद नहीं कर रहा है।

ओह, और एक और बात: एक ही कोड बेनामी एपेक्स संपादक में ठीक चल रहा है (हालांकि मुझे कुछ संशोधन करना था - स्पष्ट मानों के साथ इनलाइन चर को बदलना)। अजीब है कि एनन संपादक इसके साथ पूरी तरह से खुश है, लेकिन एसएफडीसी सर्वर इसे पसंद नहीं करते हैं।

वैसे भी, मैं कुछ और समस्या निवारण करने के लिए बंद हूं। किसी के पास कोई अंतर्दृष्टि है?

धन्यवाद!

कोड:

 
    // ActivityHistory's on Account 
    for (Account a : [ // you can't query ActivityHistory directly; only in a subquery against another object type 
     SELECT 
      Id 
      ,Name 
      ,(SELECT 
        ActivityDate 
        ,ActivityType 
        ,CRM_Meeting_Type__c 
        ,Description 
        ,CreatedBy.Name 
        ,Status 
        ,WhatId 
       FROM ActivityHistories 
       WHERE ActivityType IN :included_activity_history_types 
       //LIMIT 200 
      ) 
     FROM Account WHERE Id = :accountId 
    ]) { 
    for (ActivityHistory ah : a.ActivityHistories) { 
     if (ah.WhatId==null) { continue; } // skip adding activities without a WhatId 

     if (((string)ah.WhatId).startsWith('001')) { // only add ActivityHistory's tied directly to an Account (the query above pulls back all ActivityHistory's on related Oppty's as well) 
      activities.add(new ActivityWrapper(ah)); 
     } 
    } 
    } 

उत्तर

7

महान प्रश्न; मुझे पूरी तरह से यकीन नहीं है कि यह निष्पादन बेनामी में क्यों काम करेगा, लेकिन आपके शीर्ष वर्ग में नहीं।

हालांकि, मेरे पास कुछ सिफारिशें हैं। मैंने पाया है कि for लूप से SOQL क्वेरीज़ को विभाजित करना सहायक है, फिर वापस लौटाए गए सबक्वायरी डेटा को प्राप्त करने के लिए getSObjects विधि का उपयोग करें। इस विधि का उपयोग करके, मैंने शीर्ष श्रेणी में 200 से अधिक गतिविधि इतिहास रिकॉर्ड सफलतापूर्वक पुनर्प्राप्त कर लिए हैं।

नोट: एक अंतर (आपके कोड और पिछले तरीके से मुझे यह काम करने के बीच) यह है कि मैंने गतिविधि इतिहास में गतिविधि प्रकार में फ़िल्टर नहीं किया था, जहां खंड। इसलिए, यदि नीचे दिया गया कोड एक ही त्रुटि फेंकता है, तो मैं उसे अगली जांचूंगा।

List<Account> AccountsWithActivityHistories = [ 
    // you can't query ActivityHistory directly; only in a subquery against another object type 
    SELECT 
     Id 
     ,Name 
     ,(SELECT 
       ActivityDate 
       ,ActivityType 
       ,CRM_Meeting_Type__c 
       ,Description 
       ,CreatedBy.Name 
       ,Status 
       ,WhatId 
      FROM ActivityHistories 
      WHERE ActivityType IN :included_activity_history_types 
      //LIMIT 200 
     ) 
    FROM Account WHERE Id = :accountId 
]; 

// ActivityHistories on Account 
for (Account a : AccountsWithActivityHistories) { 
    for (ActivityHistory ah : a.getSObjects('ActivityHistories')) { 
    // skip adding activities without a WhatId 
    if (ah.WhatId==null) { continue; } 

    if (((string)ah.WhatId).startsWith('001')) { 
     // only add ActivityHistory's tied directly to an Account 
     // (the query above pulls back all ActivityHistory's on related Oppty's as well) 
     activities.add(new ActivityWrapper(ah)); 
    } 
    } 
} 
1

यह पुराना हो सकता है लेकिन मैंने इस मुद्दे को मारा और वहां मेरा समाधान फेंकना चाहता था जो मुझे एक और मंच पर मिला।

गतिविधि इतिहास वस्तु केवल एक कार्य या एक ईवेंट है जो "बंद" पर सेट है। इसलिए आप "गतिविधि इतिहास" के पीछे बैठे ऑब्जेक्ट के लिए क्वेरी कर सकते हैं और इसे एक नए संपर्क या लीड के नीचे संलग्न कर सकते हैं और यह एक ही ऑब्जेक्ट को एक नए "गतिविधि इतिहास" ऑब्जेक्ट के रूप में संग्रहीत करेगा।

list<Task> activityHistory = [SELECT Id,WhoId FROM Task t WHERE t.WhoId = 'randomID' and t.Status != 'Open']; 

for(Task currentAH : activityHistory){ 
    system.debug(currentAH.Id); 
} 

कोड ऊपर वापस लाया सभी "टास्क" गतिविधि इतिहास वस्तुओं और मुझे एक और संपर्क/लीड करने के लिए WhoId का उपयोग कर उन्हें reparent की अनुमति देता है।

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