Проверка дублей при сохранении контакта

Долго не мог понять, почему если я вношу телефон в "Средство связи 1", а такой же указан в "Средство связи 2" другого контакта, то CRM меня не предупреждает?
Вижу, не только меня этот вопрос интересует...
http://community.terrasoft.ua/forum/topic/4121
Как можно решить?

Мой вариант (предлагаю использовать процедуру, для быстроты поиска)

CREATE PROCEDURE [dbo].[tsp_CheckForDoublet] (
        @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

Процедура вылавливает дубли даже с тире и пробелами :lol:
8-032-229-99-99 и 2299999 - в данном случае считаются дублями. Если Вас это не устраивает, просто в параметр NumOfDigits большое количество символов для обработки

CreateSPParameter(Parameters, 'NumOfDigits', pdtInteger, 12);

Добавим права доступа на запуск данной процедуры группой "Все пользователи"

Правим событие в файле scr_Contact

function SelfOnDatasetBeforePost(Dataset, DoPost) {

..........
/* 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 и заполнять реестр нового окна ссылками на контактов, с возможностью "перейти к" (В данном варианте мы не знаем где именно дубль, но зато проверяем по всей базе, даже если отсутствуют права на чтение)

Развиваем идею здесь!

Нравится

Поделиться

51 комментарий

Сам сервис поиска дублей имеется, но в нем есть недостаток, описанный автором темы: сервис не различает дубли, если они в разных колонках таблицы (например: Средство связи 1 и Средство связи 2).

Хатемкин В.А.
ОАО "Пилот-Медиа"

Показать все комментарии