Долго не мог понять, почему если я вношу телефон в "Средство связи 1", а такой же указан в "Средство связи 2" другого контакта, то CRM меня не предупреждает?
Вижу, не только меня этот вопрос интересует...
http://community.terrasoft.ua/forum/topic/4121
Как можно решить?
Мой вариант (предлагаю использовать процедуру, для быстроты поиска)
@ID AS uniqueidentifier,
@Communication1 AS nvarchar(250),
@Communication2 AS nvarchar(250),
@Communication3 AS nvarchar(250),
@Communication4 AS nvarchar(250),
@NumOfDigits AS int,
@ReturnResult AS int = 0 OUTPUT
)
AS
SET @ReturnResult = 0
IF EXISTS (SELECT [ID] FROM [dbo].[tbl_Contact] WHERE
[ID] > @ID AND (
RIGHT(REPLACE(REPLACE([Communication1], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication2], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication3], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
OR
RIGHT(REPLACE(REPLACE([Communication4], '-', ''), ' ', ''), @NumOfDigits) IN (@Communication1, @Communication2, @Communication3, @Communication4)
) ) SET @ReturnResult = 1
RETURN
Процедура вылавливает дубли даже с тире и пробелами
8-032-229-99-99 и 2299999 - в данном случае считаются дублями. Если Вас это не устраивает, просто в параметр NumOfDigits большое количество символов для обработки
Добавим права доступа на запуск данной процедуры группой "Все пользователи"
Правим событие в файле scr_Contact
..........
/* START */
var Parameters = CreateSPParameters();
CreateSPParameter(Parameters, 'ID', pdtGUID, Dataset('ID'));
CreateSPParameter(Parameters, 'Communication1', pdtString, Dataset('Communication1'));
CreateSPParameter(Parameters, 'Communication2', pdtString, Dataset('Communication2'));
CreateSPParameter(Parameters, 'Communication3', pdtString, Dataset('Communication3'));
CreateSPParameter(Parameters, 'Communication4', pdtString, Dataset('Communication4'));
CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 7); //количество символов
CreateSPParameter(Parameters, 'isDoublet', pdtInteger, 0);
Parameters.ItemsByName('isDoublet').ParamType = 1;
var SQLText = 'exec dbo.tsp_CheckForDoublet :ID, :Communication1, :Communication2, :Communication3, :Communication4, :NumOfDigits, :isDoublet OUTPUT';
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
var isDoublet = Parameters.ItemsByName('isDoublet').ValAsInt;
if (isDoublet == 1) {
var Message = 'Дублируются средства связи!';
ShowWarningDialog(Message);
DoPost.Value = false; // не сохранять в базу
}
/* END */
}
Доработки - возвращать массив ID и заполнять реестр нового окна ссылками на контактов, с возможностью "перейти к" (В данном варианте мы не знаем где именно дубль, но зато проверяем по всей базе, даже если отсутствуют права на чтение)
Развиваем идею здесь!
Сам сервис поиска дублей имеется, но в нем есть недостаток, описанный автором темы: сервис не различает дубли, если они в разных колонках таблицы (например: Средство связи 1 и Средство связи 2).
Хатемкин В.А.
ОАО "Пилот-Медиа"