/// <summary>
        /// Execute re-counting of categories.
        /// </summary>
        private void RecountCategories()
        {
            this.oLogger.Output(CAT("<br/>", EOL, "Recount categories ... "));
            var doCategory   = new DOCategory(this.context.Connection);
            var doItem       = new DOItem(this.context.Connection);
            var dsCategories = doCategory.EnumCategories();

            for (int n = 0; n < dsCategories.GetSize(); n++)
            {
                var oCategory  = dsCategories.GetRow(n);
                var categoryId = STR(oCategory["s_CatId"]);
                var oldCounter = INT(oCategory["i_Counter"]);

                //String filter = STR(oCategory["s_Filter"]);
                //String sqlFilter = DOItem.BuildSqlByFilter(filter);

                var categoryName = STR(oCategory["s_Name"]);
                var sqlFilter    = DOItem.BuildSqlByCategory(categoryName);

                var dsCounters = doItem.EnumIds(CAT("_this.b_Counted = 0 AND ", sqlFilter));
                if (dsCounters.GetSize() == 0)
                {
                    continue;
                }

                var newCounter = INT(dsCounters.GetSize());

                //Update category
                var categoryFields = new THashtable();
                categoryFields["i_Counter"] = oldCounter + newCounter;
                doCategory.UpdateById(categoryId, categoryFields);
            }

            doItem.Update("_this.b_Counted = 1", "_this.b_Counted = 0");

            this.oLogger.Output(CAT(" ... Done<br/>", EOL));
        }