Администрирование
21
Июл
3

Поиск не используемых атрибутов CRM

Со временем, использование CRM системы на каком-либо предприятии, неизменно претерпевает изменения. Это может происходить по разными причинами: изменение бизнес-процессов на предприятии, структурная перестройка подразделений и т.д. И CRM системе приходится «подстраиваться» (конечно, не без помощи из вне 🙂 ) под эти изменения. И в конечном счете происходит «захламление» системы различными ненужными артефактами. Одним из которых являются неиспользуемые атрибуты объектов. И поддерживать систему в таком захламленном состоянии либо затратно, либо попросту невозможно содержать. Поэтому время от времени необходимо провыодить ее ревизию. И прежде всего, необходимо удалить все лишнее. Более «крупные» объекты системы, такие как Бизнес-процессы, нужно рассматривать индивидуально, а вот поиск и удаление ненужных атрибутов вполне можно производить массово. Для этого Вам понадобится примерно такой SQL запрос:

declare
@entityName nvarchar(64) = 'account', -- Объект
@customOnly bit = 0, -- Отбирать только кастомные атрибуты?
@maxThreshold int = 100, -- Максимальное кол-во использования атрибута
@attrName nvarchar(50),
@sql nvarchar(1024);

-- Создаем курсор
declare cur cursor fast_forward
	for
		select a.name from attribute a
		join entity e on a.entityid = e.entityid
		where
		1=1
		and e.name = @entityName
		and a.IsLogical = 0 
		and (
			(@customOnly = 1 and a.IsCustomField = 1)
			or
			isnull(@customOnly, 0) = 0
		)

-- Создаем временную таблицу
create table #tmp (EntityName nvarchar(64), AttributeName nvarchar(50), ValueCount int)

-- Открываем и просматриваем курсор
open cur
fetch next from cur into @attrName
while @@fetch_status = 0
begin
	-- Подсчитываем количество использования атрибутов для указанного объекта
	-- И заносим результат во временную таблицу
	set @sql = 'insert #tmp
		select ''' +
			@entityName + ''', ''' + 
			@attrName + ''', ' + 
			'count(*)
		from ' + @entityName + 
		' where ' + @attrName + ' is not null' +
		case
			when 
				@maxThreshold is not null
			then
				' having count(*) <= ' + cast(@maxThreshold as nvarchar)
			else
				''
		end;

		exec (@sql)

fetch next from cur into @attrName
end

-- Закрываем курсор
close cur
deallocate cur

-- Выбираем данные из временной таблицы
select
	EntityName as 'Объект',
	AttributeName as 'Атрибут',
	ValueCount as 'Кол-во'
from #tmp
order by 3 desc

-- Удаляем временную таблицу
drop table #tmp
go

Вам нужно только в начале определить три параетра:

  • @entityName – имя объекта, в котором производится подсчет атрибутов;
  • @customOnly – требуется ли подсчитывать только кастомные атрибуты (1 — да, 2 — нет);
  • @maxThreshold – максимальное кол-во использования атрибута. Атрибуты, имеющее большее значение не будут выводится в списке.


Комментарии (3)
  • Vladislav Osmanov 21.07.2010

    Отличный скрипт.

    Заметил опечатку:
    «@customOnly – требуется ли подсчитывать только кастомные атрибуты (1 – да, 2 – нет);»

    @customOnly битовое поле, поэтому 0 — нет, 1 — да.

  • Mariya 21.07.2010

    чтобы выбрать по всем сущностям
    select e.name, a.name
    вместо and e.name = @entityName
    ставим e.IsCustomizable = 1
    и
    fetch next from cur into @entityName,@attrName

    а удалять их как-то массово можно?

  • slivka_83 21.07.2010

    Массово? 🙂 Все так запущено? 🙂

    З.Ы. Вроде никак нельзя. Да и не нужно. Система при удалении проверяет где поле задействовано и выдает кучу ошибок. так что в массовом удалении нет большого смысла 🙂

*

code