Реалізував механізм відслідковування посилань на юр.особу з двох таблиць.
Формую ds_ на основі запиту-вибірки з таблиць в якому здійснюється об'єднання записів:

SELECT
        [ID],
        [ObjectID],
        [ObjectName],
        [ObjectType],
        [ObjectDatasetUSI]
FROM
        (SELECT
        NEWID() AS [ID],
        [tbl_ContactCareer].[ID] AS [ObjectID],
        [tbl_ContactCareer].[JobTitle] AS [ObjectName],
        N'Кар''єра' AS [ObjectType],
        N'ds_ContactCareer' AS [ObjectDatasetUSI]
FROM
        [dbo].[tbl_LegalPersons] AS [tbl_LegalPersons]
LEFT OUTER JOIN
        [dbo].[tbl_ContactCareer] AS [tbl_ContactCareer] ON [tbl_ContactCareer].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_ContactCareer].[ID] IS NULL)
UNION ALL
SELECT
        NEWID() AS [ID],
        [tbl_AccountBillingInfo].[ID] AS [ObjectID],
        [tbl_AccountBillingInfo].[Name] AS [ObjectName],
        N'Платіжний реквізит' AS [ObjectType],
        N'ds_AccountBillingInfo' AS [ObjectDatasetUSI]
FROM
        [dbo].[tbl_LegalPersons] AS [tbl_LegalPersons]
LEFT OUTER JOIN
        [dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfo] ON [tbl_AccountBillingInfo].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_AccountBillingInfo].[ID] IS NULL)) AS [U]
ORDER BY        3 ASC

Такий запит нормально відпрацьовує.
Далі спробував доповнити запит ще на один UNION ALL:
SELECT
        [ID],
        [ObjectID],
        [ObjectName],
        [ObjectType],
        [ObjectDatasetUSI]
FROM
        (SELECT
        NEWID() AS [ID],
        [tbl_Contact].[ID] AS [ObjectID],
        [tbl_Contact].[Name] AS [ObjectName],
        N'Контакт' AS [ObjectType],
        N'ds_Contact' AS [ObjectDatasetUSI]
FROM
        [dbo].[tbl_LegalPersons] AS [tbl_LegalPersons]
LEFT OUTER JOIN
        [dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_Contact].[ID] IS NULL)
UNION ALL
SELECT
        NEWID() AS [ID],
        [tbl_AccountBillingInfo].[ID] AS [ObjectID],
        [tbl_AccountBillingInfo].[Name] AS [ObjectName],
        N'Платіжний реквізит' AS [ObjectType],
        N'ds_AccountBillingInfo' AS [ObjectDatasetUSI]
FROM
        [dbo].[tbl_LegalPersons] AS [tbl_LegalPersons]
LEFT OUTER JOIN
        [dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfo] ON [tbl_AccountBillingInfo].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_AccountBillingInfo].[ID] IS NULL)
UNION ALL
SELECT
        NEWID() AS [ID],
        [tbl_ContactCareer].[ID] AS [ObjectID],
        [tbl_ContactCareer].[JobTitle] AS [ObjectName],
        N'Карєра' AS [ObjectType],
        N'ds_ContactCareer' AS [ObjectDatasetUSI]
FROM
        [dbo].[tbl_LegalPersons] AS [tbl_LegalPersons]
LEFT OUTER JOIN
        [dbo].[tbl_ContactCareer] AS [tbl_ContactCareer] ON [tbl_ContactCareer].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_ContactCareer].[ID] IS NULL)) AS [U]
ORDER BY        3 ASC

Такий варіант дає стабільно "Разрушающий сбой".
Я перевірив, що будь-яка пара таблиць опрацьовується нормально, і тільки три об'єднання приводять до збою.

Працюю з версією 3.3.2.205
Це глюк, чи є якісь нюанси в налаштуваннях ?

Нравится

7 комментариев

Я сподівався, що створену схему можна буде вільно нарощувати в залежності від потреби :(

Поменяйте местами таблицы в секции FROM, и поставьте Inner Join. Должно помочь.

Порядок змінив.
Не допомогло.
Зрештою, сам запит-то функціонує нормально...

Допомогла вставка команди
BaseGridArea.GridDataset.DisableEvents();
в скрипт:

function wnd_LegalPersonsDepGridAreaOnPrepare(Window) {
	Initialize(Window);
	scr_BaseGridArea.wnd_BaseGridAreaOnPrepare(Window);
	ApplyDatasetFilter(BaseGridArea.GridDataset
		,LPDepGridArea.ParentItemFieldName
		,LPDepGridArea.ParentItemID
		,true);
 
	BaseGridArea.GridDataset.DisableEvents();
 
	BaseGridArea.GridDataset.Open();
 
	BaseGridArea.GridDataset.EnableEvents();
 
	LPDepGridArea.DataGrid	= GetAttribute(Window,'DataGrid');
}

Отож маємо у версії 3.3.2.205 :
ds_ на основі запиту з двох UNION ALL у вікні типу wnd_BaseGridArea обробляється успішно,
а вже третій UNION ALL викликає ситуацію "Разрушающий сбой"
яка лікується відключенням обробника подій

В даній ситуації мені не потрібно було обробляти ситуацію відкриття набору даних.
А якби було потрібно ?

Да, как-то странно.
У меня есть сервисы с 5-ю и более объединениями. Работают стабильно.
Может действительно глюк?

Здравствуйте Игорь,
Можете, пожалуйста, выгрузить сервисы, на которых воспроизводится данная проблема, будем пытаться воспроизвести.

Я вчора відіслав базу упаковану

Здравствуйте Игорь,
В обращении в тех. поддержку вы задали 2 вопроса:

1) Робота зі списком посилань на юр.особу - «ds_LegalPersonsDep» формується на базі «sq_LegalPersonsDep», саме з цим набором даних пов’язане питанн я про три UNION ALL
На юр.особу може йти посилання з певних таблиць, в моєму варіанті їх виявилось три. Пишу виявилось, бо модель відпрацьовував з двома таблицями і з ними все було добре, а як добавив ще одну таблицю, от тоді й проявилась проблемка. В поточному варіанті я вийшов з положення тим, що постарався всі позиції відкриття набору даних здійснювати при відключеному обробнику подій.

Сервис sq_LegalPersonsDep в препросмотре имел такой вид:

SELECT
	[ID],
	[ObjectID],
	[ObjectName],
	[ObjectType],
	[ObjectDatasetUSI]
FROM
	(SELECT
	NEWID() AS [ID],
	[tbl_Contact].[ID] AS [ObjectID],
	[tbl_Contact].[Name] AS [ObjectName],
	N'Контакт' AS [ObjectType],
	N'ds_Contact' AS [ObjectDatasetUSI]
FROM
	[dbo].[tbl_Account] AS [tbl_Account]
INNER JOIN
	[dbo].[tbl_LegalPersons] AS [tbl_LegalPersons] ON [tbl_LegalPersons].[AccountID] = [tbl_Account].[ID]
INNER JOIN
	[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_Contact].[ID] IS NULL)
UNION ALL
SELECT
	NEWID() AS [ID],
	[tbl_AccountBillingInfo].[ID] AS [ObjectID],
	[tbl_AccountBillingInfo].[Name] AS [ObjectName],
	N'Платіжний реквізит' AS [ObjectType],
	N'ds_AccountBillingInfo' AS [ObjectDatasetUSI]
FROM
	[dbo].[tbl_Account] AS [tbl_Account]
INNER JOIN
	[dbo].[tbl_LegalPersons] AS [tbl_LegalPersons] ON [tbl_LegalPersons].[AccountID] = [tbl_Account].[ID]
INNER JOIN
	[dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfo] ON [tbl_AccountBillingInfo].[LegalPersonID] = [tbl_LegalPersons].[ID]
WHERE(NOT [tbl_AccountBillingInfo].[ID] IS NULL)
UNION ALL
SELECT
	NEWID() AS [ID],
	[tbl_ContactCareer].[ID] AS [ObjectID],
	[tbl_ContactCareer].[JobTitle]+' : ('+[tbl_Contact].[Name]+')' AS [ObjectName],
	N'Кар''єра' AS [ObjectType],
	N'ds_ContactCareer' AS [ObjectDatabaseUSI]
FROM
	[dbo].[tbl_Account] AS [tbl_Account]
INNER JOIN
	[dbo].[tbl_LegalPersons] AS [tbl_LegalPersons] ON [tbl_LegalPersons].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_ContactCareer] AS [tbl_ContactCareer] ON [tbl_ContactCareer].[LegalPersonID] = [tbl_LegalPersons].[ID]
INNER JOIN
	[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_ContactCareer].[ContactID]
WHERE(NOT [tbl_ContactCareer].[ID] IS NULL)) AS [U]
ORDER BY
	3 ASC

т.е в нем 2 Union ALL
union
Пытался воспроизвести ошибку на бинарных файлах версии 3.3.2.215, в предпросмотре сервиса sq_LegalPersonsDep никаких ошибок не было, далее создал окно, унаследовал его от wnd_BaseGridArea и подключил к нему ds_LegalPersonsDep, вывел результаты, ошибок также не было замечено.

Предлагаю вам использовать обновленные бинарные файлы, ссылку на которые я написал Вам в письме.

2) Сервіс «wnd_ContactEdit» , поле «edtAccount» (контрагент). При першому відкритті випадаючого списку сам список виявляється порожній, наступні відкриття – все добре. В чому причина я не розібрався і все залишається як описано.

Проблему решило отключение набора фильтров TaskFilters в сервисе sq_Account

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