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

Здравствуйте, хотел написать свое правило поиска дублей для контактов пример того как сделать взял с академии но во время выполнения скрипта появляется ошибка что переменная @parsedConfig имеет недопустимый тип данных. и еще в таблице ContactDuplicateSearchResult нету поля SysAdminUnitId вместо него идет поле GroupHash. Как изменить скрипт чтобы он заработал? bpm 7.8.0

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

Нравится

3 комментария

Здравствуйте, я новичок в системе. Но насколько, я понял, статья https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-pravi… с примером справедлива для bpm 7.8.3 и выше... В версии 7.8.0 в таблице DuplicatesRule нет поля "Название процедуры"... Поэтому непонятно, как будет происходить вызов вновь созданной процедуры в 7.8.0, если только изменить DeduplicationSearch...

Здравствуйте,
Правила дедупликации расположены в таблице [DuplicatesRule]
Там же в колонке [ProcedureName] указаны имена хранимых процедур, ответственных за обработку.
Почитайте код любой из данных процедур и напишите свой по аналогии.
К примеру, во вложении, код процедуры [tsp_FindAccountDuplicateByWeb]

new_text_document.txt

Здраствуйте
1. Касательно этого блока:
IF @parsedConfigRowsCount = 0
BEGIN
-- Добавление во временную таблицу данных для поиска дублей.
INSERT INTO #searchContact ([Name], [AccountId],[SortDate])
-- Запрос на выборку данных контактов.
SELECT
-- Выбираются колонки ИНН даты модификации контакта.
[Name],[AccountId],
MAX([ModifiedOn])
FROM [Contact]
-- Добавляется группировка по полям для возможности использовать проверку на количество.
GROUP BY [Name],[AccountId]
-- Таблица заполняется только в случае наличия более одного контакта.
HAVING COUNT(*) > 1;
END;

Я бы сделал как в базовой хранимке:
IF @parsedConfigRowsCount = 0
BEGIN
INSERT INTO #searchAccount ([Name], [SortDate])
SELECT
[dedup].[Name],
MAX([dedup].[SortDate]) [SortDate]
FROM (
SELECT [Id],
[dbo].[fn_NormalizeString]([Name], @validChar) AS [Name],
MAX([ModifiedOn]) [SortDate]
FROM [Account]
GROUP BY [Id], [Name]
) AS [dedup]
GROUP BY [dedup].[Name]
HAVING COUNT(*) > 1;
END;
ELSE
BEGIN
INSERT INTO #searchAccount ([Name], [SortDate])
SELECT
[Name],
GETDATE() AS [SortDate]
FROM @parsedConfig
END;
2. В версии 7.8 в таблице ContactDuplicateSearchResult были поля ContactId, GroupId, RuleId, GroupHash
А где-то с 7.8.3 добавилось ещё поле SysAdminUnitId
Но GroupHash не добавлялось и раньше, было так:
INSERT INTO [ContactDuplicateSearchResult] ([ContactId], [GroupId], [RuleId])
А теперь так:
INSERT INTO [ContactDuplicateSearchResult] ([ContactId], [GroupId], [RuleId], [SysAdminUnitId])

3. Что касается "Названия процедуры", то это поле действительно появилось с 7.8.3. Так что инструкция с академии подходит именно для версий 7.8.3+, т.к.

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