Документация по разработке bpm’online
PDF
Документация по разработке
Разработка в bpm'online на примерах

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

Glossary Item Box

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

Процесс дедупликации использует правила, которые оформлены в виде хранимых процедур. Каждое правило при выполнении наполняет таблицу 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-2019.

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

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