Здравствуйте, подскажите как создать деталь в разделе, ссылающуюся на связанные записи другого раздела наподобие детали Счета раздела Продажи.

Нравится

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

Здравствуйте.

Используя Террасофт Администратор, Вам необходимо в сервисе окна нужного Вам раздела, добавить новый Page, и внутрь этого Page добавить также WindowContainer. Этому контейнеру установить свойство Window как окно реестра связанного раздела. После этого, Вам останется лишь добавить логику фильтрации данных этого раздела в зависимости от выделенной записи основного раздела. Пример Вы можете посмотреть в любом из скриптов раздела - функция RefreshDetails();.

Дмитрий, спасибо за комментарий. Сделали как написано, добавили в скрипт scr_InvoiceWorkspace следующий код

function InitializeInventoryDetail() {
	var DetailWindow = wndInventoryDetail.Window;
	InvoiceWorkspace.InventoryWindow = DetailWindow;
	SetAttribute(DetailWindow, 'DatasetUSI', 'ds_Inventory');
	SetAttribute(DetailWindow, 'ParentItemFieldName', 'InvoiceID');
	SetAttribute(DetailWindow, 'EditWindowUSI', 'wnd_InventoryEdit');
 
	DetailWindow.Prepare();
	var DetailDataset = DetailWindow.ComponentsByName('dlData').Dataset;
	InvoiceWorkspace.InventoryDataset = DetailDataset;
}
 function RefreshInventoryDetail() {
	if (InvoiceWorkspace.InitializeInventoryFlag != true) {
		InitializeInventoryDetail();
		InvoiceWorkspace.InitializeInventoryFlag = true;
	}
	var InvoiceID = BaseWorkspace.GridDataset.ValAsGUID('ID');
	if (InvoiceID == InvoiceWorkspace.InventoryOldInvoiceID) {
		return;
	} else {
		InvoiceWorkspace.InventoryOldInvoiceID = InvoiceID;
	}
	SetAttribute(InvoiceWorkspace.InventoryWindow, 'ParentItemID', InvoiceID);
	RefreshDetailData(BaseWorkspace.GridDataset, 'ID',
		InvoiceWorkspace.InventoryDataset, 'InvoiceID');
}
if (pcDetails.ActivePage.Name == pgSclad.Name){
		RefreshInventoryDetail();
	} else 

Но при открытии раздела Счет и перебора основных записей раздела, деталь остается пустой. При этом запись из детали создается и при ее сохранении в Детали отображаются все записи соответствующего связанного раздела.

Датасет связанного раздела ds_Inventory, InvoiceID поле типа справочник для связи с разделом Счет. Название окна детали wndInventoryDetail.

Может где-то упустили что-то.

Вероятно нету фильтра сравнения в сервисе SelectQuery "подчиненного" раздела.

У меня получилось реализовать данный функционал следующим образом:

1. Создаем раздел "Test" через "Мастер создания разделов".
2. В администраторе добавляем колонку InvoiceID в сервисе tbl_Test.
3. В sq_Test добавляем JOIN - tbl_Test.InvoiceID = tbl_Invoice.ID
3.1. Тут же добавляем выборку поля tbl_Test.InvoiceID, tbl_Invoice.InvoiceNumber.
3.2. Тут же добавляем параметр InvoiceID и фильтр сравнения InvoiceID - tbl_Test.InvoiceID = Parameter:InvoiceID.
4. В ds_Test добавляем LookupDataField: колонка InvoiceID, источник данныз - ds_Invoice, колонка для отображения - InvoiceNumber.
5. В окно wnd_TestEdit добавляем LookupDataControl. DatasetLink = dlData, DataField = InvoiceID.
6. Идем в сервис wnd_InvoicesWorkspace. Добавляем новый Page, Window. Устанавливаем свойство Window как wnd_TestGridArea.
7. Переходим в событие OnChangeActivePage для pcDetails. Видим там функцию RefreshDetails(); - переходим в нее и в конец добавляем:

if (pcDetails.ActivePage.Name == pgTest.Name) {
 
		RefreshCommonDetail(BaseWorkspace, wndTestDetail, 
			'InvoiceID', 'InvoiceID');
}

где pgTest - имя контрола Page, wndTestDetail - имя контрола Window.

Сохраняемся.

Результат - деталь корректно фильтруется.

Сервисы раздела Test, а также модифицированный сервис scr_InvoiceWorkspace, wnd_InvoicesWorkspace во вложении.

1

2

Дмитрий, все получилось, спасибо за помощь. Действительно не было фильтра

Дмитрий, подскажите как добавить ссылку в контекстное меню детали "Перейти к" для перехода в главный раздел, как, например, в разделе Продажи в детали Счета ссылка "Счет"?

в скрипт GridArea целевого раздела вставил функцию

function InitializeGridMenu(Window) {
	if (!IsEmptyValue(Window.Attributes('ParentItemFieldName'))) {
		SetAttribute(Window, 'AddSelfReference', true);
		SetAttribute(Window, 'SelfReferenceCaption', "Склад");
	}
}

в scr_WindowUtil вставил

RefDictionary.Add('ds_Inventory', 'wnd_InventoryWorkspace');

Александр, здравствуйте.

Прочтите, пожалуйста, вот эту тему. Если ен получится реализовать, напишите что именно не получилось.

В function Initialize(Window) скрипта scr_InventoryGridArea вставил только параметры

   SetAttribute(Window, 'AddSelfReference', true);
   SetAttribute(Window, 'SelfReferenceCaption', "Склад");

Все получилось, спасибо.

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