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

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

Glossary Item Box

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

Описанный процесс добавления правила массового поиска дублей актуален для Creatio версий 7.13.2 и ниже. Для версий системы 7.13.4 и выше функциональность поиска дублей описана в статье “Поиск и объединение дублей”, а работа с правилами поиска дублей при сохранении записи — в статье "Добавление правила поиска дублей при сохранении записи".

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

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

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

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

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

Описание примера

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

Алгоритм реализации примера

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

Так как в стандартной странице редактирования контакта поле [ИНН] отсутствует, добавьте его на страницу, например, с помощью мастера раздела. Процесс добавления поля на страницу подробно описан в статье "Как настроить поля страницы".

Свойства нового поля:

  • [Заголовок] ([Title]) — "ИНН" ("Taxpayer ID");
  • [Название в БД] ([Name in DB]) — "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

Иногда возможно возникновение ошибки "Cannot resolve the collation conflict between "Cyrillic_General_CI_AS" and "Cyrillic_General_CI_AI" in the equal to operation". Чтобы ее исправить, укажите при создании колонки таблицы нужный COLLATE.

CREATE TABLE #searchContact ([Name] NVARCHAR(128) COLLATE Cyrillic_General_CI_AI, [BirthDate] DATETIME, [SortDate] DATETIME );

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. — Правило поиска дублей по полю [ИНН] ([Taxpayer ID])

 

© Terrasoft 2002-2020.

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

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