0

In SharePoint Community site , Category Tile view is showing wrong count of reply. In general Category total replies are 5 but in Category tile view it is showing 3. This behaviour we are able to replicate both in our test and Production environment. We also waited for one day , if this issue related to Crawl but issue still persists.

Please give some suggestions on this.

Thanks, Sheetal

1 Answers1

0

I had the exact same problem and there was no fix available. In my opinion these counters are updated through event receivers, so this has nothing to do with search crawls.

I solved this by setting the correct fields by code:

First count the topics and replies with this SSOM code

        /// <summary>
    /// Dictionary: categId, nr disc
    /// </summary>
    public Dictionary<int, int> CategoryTopicCount
    {
        get
        {
            var categoriesDiscussionsCount = new Dictionary<int, int>();
            foreach (int categId in Categories)
            {
                var spquery = new SPQuery();
                spquery.Query = ""
                  + " <Where>"
                  + " <And> "
                  + "     <IsNull>"
                  + "       <FieldRef Name='ParentFolderId' />"
                  + "     </IsNull>"
                  + "     <Eq>"
                  + "       <FieldRef Name='CategoriesLookup' LookupId='TRUE' />"
                  + "       <Value Type='Lookup'>" + categId + "</Value>"
                  + "     </Eq>"
                  + " </And> "
                  + " </Where>";
                spquery.ViewAttributes = "Scope='RecursiveAll'";

                categoriesDiscussionsCount.Add(categId, _discussionList.GetItems(spquery).Count);
            }
            return categoriesDiscussionsCount;
        }
    }

    /// <summary>
    /// Dictionary: categId, nr replies
    /// </summary>
    public Dictionary<int, int> CategoryReplyCount
    {
        get
        {
            var categoriesDiscussionsCount = new Dictionary<int, int>();
            foreach (int categId in Categories)
            {
                //get topics of this category
                var spquery = new SPQuery();
                spquery.Query = ""
                  + " <Where>"
                  + " <And> "
                  + "     <IsNull>"
                  + "       <FieldRef Name='ParentFolderId' />"
                  + "     </IsNull>"
                  + "     <Eq>"
                  + "       <FieldRef Name='CategoriesLookup' LookupId='TRUE' />"
                  + "       <Value Type='Lookup'>" + categId + "</Value>"
                  + "     </Eq>"
                  + " </And> "
                  + " </Where>";
                spquery.ViewAttributes = "Scope='RecursiveAll'";
                SPListItemCollection topicsOfThisCategory = _discussionList.GetItems(spquery);

                //get nr of replies for each topic of this category
                var totalRepliesCategory = 0;
                foreach (SPListItem topic in topicsOfThisCategory)
                {
                    var spqueryreplies = new SPQuery();
                    spqueryreplies.Query = ""
                      + " <Where>"
                      + " <And> "
                      + "     <IsNotNull>"
                      + "       <FieldRef Name='ParentFolderId' />"
                      + "     </IsNotNull>"
                      + "     <Eq>"
                      + "       <FieldRef Name='ParentFolderId' />"
                      + "       <Value Type='Number'>" + topic.ID + "</Value>"
                      + "     </Eq>"
                      + " </And> "
                      + " </Where>";
                    spqueryreplies.ViewAttributes = "Scope='RecursiveAll'";
                    totalRepliesCategory += _discussionList.GetItems(spqueryreplies).Count;
                }

                categoriesDiscussionsCount.Add(categId, totalRepliesCategory);
            }

            return categoriesDiscussionsCount;
        }
    }

Then update the counters with this SSOM code:

/// <summary>
    /// Update number of topics and replies for each category
    /// </summary>
    public void UpdateCategoriesCounts()
    {
        Dictionary<int, int> categoryTopicCount = this.CategoryTopicCount;
        Dictionary<int, int> categoryReplyCount = this.CategoryReplyCount;
        SPListItemCollection categories = _categoryList.Items;

        foreach (SPListItem category in categories)
        {
            Console.WriteLine("Handling " + category.DisplayName);
            int topicCount = category["TopicCount"] == null ? 0 : Convert.ToInt32(category["TopicCount"]);
            int replyCount = category["ReplyCount"] == null ? 0 : Convert.ToInt32(category["ReplyCount"]);
            Console.WriteLine("Topics: " + categoryTopicCount[category.ID] + " || Replies: " + categoryReplyCount[category.ID]);
            _web.AllowUnsafeUpdates = true;

            if (categoryTopicCount[category.ID] != topicCount)
                category["TopicCount"] = categoryTopicCount[category.ID];

            if (categoryReplyCount[category.ID] != replyCount)
                category["ReplyCount"] = categoryReplyCount[category.ID];
            category.SystemUpdate(false);

            _web.AllowUnsafeUpdates = false;
            Console.WriteLine("Saved...");
        }
        Console.WriteLine("Finished");
    }

Hope this helps you!

PS: the same problem might occure with the 'my membership'-counters. Here we can also adjust the values through code. Check this: SharePoint 'my membership' webpart counters in community site

Community
  • 1
  • 1
Verthosa
  • 1,671
  • 1
  • 15
  • 37