Долго не мог понять, почему если я вношу телефон в "Средство связи 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
Процедура вылавливает дубли даже с тире и пробелами
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 и заполнять реестр нового окна ссылками на контактов, с возможностью "перейти к" (В данном варианте мы не знаем где именно дубль, но зато проверяем по всей базе, даже если отсутствуют права на чтение)
Развиваем идею здесь!