Creatio development guide
Это документация Creatio версии 7.8.0. Мы рекомендуем использовать новую версию документации.

Добавление правила поиска дублей

Glossary Item Box

Общие положения

Процесс дедупликации использует правила, которые оформлены в виде хранимых процедур. Каждое правило при выполнении наполняет таблицу ContactDuplicateSearchResult списком дублей. Результаты поиска группируются по правилам и отображаются на странице поиска дублей. Подробно эта функциональность описана в разделе документации "Поиск и объединение дублей".

Алгоритм добавления пользовательского правила поиска дублей

1. При необходимости следует добавить в схему объекта колонку, по значению которой будет производится поиск дублей.

2. Добавить хранимую процедуру поиска в базу данных приложения.

3. Зарегистрировать хранимую процедуру как новое правило.

Пример добавления пользовательского правила поиска дублей

Описание кейса

При запуске процесса дедупликации контакты, у которых совпадают значения в колонке [ИНН], должны считаться дублями и отображаться в результатах поиска.

Алгоритм реализации кейса

1. Добавление поля, по значению которого будет производится поиск дублей

Поскольку в стандартной странице редактирования контакта поле [ИНН] отсутствует, необходимо добавить его на страницу, например, с помощью мастера раздела.  Для страницы раздела [Контакты] необходимо добавить поле со значением "ИНН" свойства [Заголовок] и значением "UsrInn" свойства [Название в БД]. Мастер автоматически добавит необходимую колонку в объект. Информация о том, как добавить поле на страницу, доступна в статье "Как настроить поля страницы".

2. Добавление хранимой процедуры поиска в базу данных приложения

Для того чтобы реализовать поиск дублей по какому-либо разделу, необходимо в базу данных добавить соответствующую хранимую процедуру. Для добавления хранимой процедуры поиска дублей по полю [ИНН] необходимо выполнить следующий SQL-запрос:

-- Проверка наличия хранимой процедуры с именем tsp_FindContactDuplicateByInn.
IF NOT OBJECT_ID('[dbo].[tsp_FindContactDuplicateByInn]') IS NULL
BEGIN
    -- Удаление хранимой процедуры.
    DROP PROCEDURE [dbo].[tsp_FindContactDuplicateByInn];
END;
GO
-- Создание хранимой процедуры.
CREATE PROCEDURE [dbo].[tsp_FindContactDuplicateByInn] (
    -- Этот табличный параметр передается только в случае сохранения нового контакта.
    -- Содержит данные нового контакта.
    -- В случае запуска процесса глобального поиска дублей переданный параметр не содержит данных.
    @parsedConfig CreatingObjectInfo READONLY,
    -- Уникальный идентификатор пользователя, который запустил поиск дублей.
    @sysAdminUnit UNIQUEIDENTIFIER,
    -- Идентификатор текущего правила из таблицы [ContactDuplicateSearchResult].
    -- Этот идентификатор создается после регистрации правила в системе.
    @ruleId UNIQUEIDENTIFIER
)
AS
BEGIN
    -- Получение количества записей из принимаемой таблицы для определения запуска глобального поиска дублей.
    DECLARE @parsedConfigRowsCount INT = (SELECT COUNT(*) FROM @parsedConfig);
    -- Создание временной таблицы с данными контактов для поиска.
    CREATE TABLE #searchContact (
        [UsrInn] INT,
        [SortDate] DATETIME
    );
    -- В случае глобального поиска выполняется заполнение временной таблицы данными.
    IF @parsedConfigRowsCount = 0
    BEGIN
        -- Добавление во временную таблицу данных для поиска дублей.
        INSERT INTO #searchContact ([UsrInn], [SortDate])
        -- Запрос на выборку данных контактов.
        SELECT
            -- Выбираются колонки ИНН даты модификации контакта.
            [UsrInn],
            MAX([ModifiedOn])
        FROM [Contact]
        -- Добавляется группировка по полям для возможности использовать проверку на количество.
        GROUP BY [UsrInn]
        -- Таблица заполняется только в случае наличия более одного контакта.
        HAVING COUNT(*) > 1;
    END;
    
    -- Заполнение таблицы результатов.
    INSERT INTO [ContactDuplicateSearchResult] ([ContactId], [GroupId], [RuleId], [SysAdminUnitId])
    SELECT
        -- Идентификатор дубля контакта.
        [vr].[Id],
        -- Формирование номера группы.
        DENSE_RANK() OVER (ORDER BY [vr].[SortDate] DESC, [vr].[UsrInn]),
        -- Идентификатор правила.
        @ruleId RuleId,
        -- Идентификатор пользователя, под которым запущен процесс поиска дублей.
        @sysAdminUnit
    FROM (
        -- Подзапрос, из которого заполняется таблица дублей.
        SELECT
            -- Идентификатор контакта.
            [v].[Id],
            --ИНН контакта.
            [v].[UsrInn],
            -- Дата сортировки.
            [r].[SortDate]
        -- Таблицы, из которых берутся данные.
        FROM [Contact] [v], #searchContact r
        -- Правило, по которому определяется, что контакты — дубли.
        WHERE [v].[UsrInn] = [r].[UsrInn]
        -- Группировка результата поиска.
        GROUP BY [v].[UsrInn], [r].[SortDate], [v].[Id]
    ) [vr];
END;
GO

3.

Регистрация хранимой процедуры как нового правила

Для регистрации созданной хранимой процедуры как нового правила поиска дублей необходимо добавить соответствующую запись в таблицу DuplicatesRule. Для этого небходимо выполнить следующий SQL-запрос:

-- Переменная, хранящая значение колонки UId схемы Contact.
DECLARE @ContactUId UNIQUEIDENTIFIER;

-- Получает значение колонки UId схемы Contact.
Set @ContactUId = (SELECT TOP 1 SysSchema.UId FROM SysSchema
WHERE SysSchema.Name = 'Contact' AND SysSchema.ExtendParent = 0);

-- Добавляет новое правило в систему.
INSERT INTO DuplicatesRule ([IsActive], [ObjectId], [ProcedureName], [Name]) VALUES
  (1, @ContactUId, 'tsp_FindContactDuplicateByInn', 'Дубли контактов. ИНН');

Для применения изменений необходимо обновить страницу раздела с удалением кеша. После этого в списке правил поиска дублей появится новое правило (рис. 1).

Рис. 1. — Правило поиска дублей по полю [ИНН]

 

 

© Terrasoft 2002-2016.

Был ли данный материал полезен?

Как можно улучшить эту статью?