Здравствуйте, хотел написать свое правило поиска дублей для контактов пример того как сделать взял с академии но во время выполнения скрипта появляется ошибка что переменная @parsedConfig имеет недопустимый тип данных. и еще в таблице ContactDuplicateSearchResult нету поля SysAdminUnitId вместо него идет поле GroupHash. Как изменить скрипт чтобы он заработал? bpm 7.8.0
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
Нравится
Здравствуйте, я новичок в системе. Но насколько, я понял, статья 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]
Здраствуйте
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+, т.к.