Окно на базе wnd_BaseMasterDetail

Добрый день.

Помогите пожалуйста разобраться в следующей ситуации. Terrasoft 3.3.2
В реестре контрагенты у меня есть 2 типа контрагентов
1. Партнеры
2. Поставщики.

У каждого поставщика может быть несколько продуктов.
Для каждого продукта каждого поставщика каждый партнер должен занести свою информацию: квота, цена и т.д.
Я делаю это через деталь контрагентов Продукты поставщика.
Там применяю окно на базе wnd_BaseMasterDetail, где в верхнем разделе использую стандартное окно из этой детали, а для нижнего создал окошко на базе wnd_BaseGridArea, в котором должен выводится список партнеров, привязанных к записи из верхнего окна. Создал для него сервисы tbl, sq и ds.
Проблема в том, что три датасета (из главного реестра и каждого из окон ) не связываются друг с другом.
При открытии окна выдается окно предупреждения: “ Запись удалена” и дальше валится по ошибке «Исключение брошено и не поймано »

Нравится

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

Скорее всего, в подчиненном sq_ у вас включен какой-то фильтр, например по ID, а также нет фильтра с кодом поля-родителя.

Нет включенных фильтров.
И есть фильтры с кодом родителя.
Я это сразу проверил.

Тогда надо в OnPrepare окна вставлять debugger, и пошагово вычислять, на какой операции будет ошибка

У меня вроде была такая проблема по следующей причине:
Возможно у вас разные датасеты детали и карточки редактирования.
На датасете детали подключен датасет связи продукта и партнера, а не самого партнера,
а на карточке редактирования привязан датасет партнера.
В результате система передает на карточку редактирования ID не партнера, а ID его связи с продуктами.

Мне кажется, проблема в том, что не передается параметр ChildFilterName в функцию RefreshDetailData скрипта scr_DB. Он не определен и дальше при попытке применить фильтр все и вылетает. Но где его нужно заполнять я не понимаю.

Кирилл, Вам следует вместо использования стандартного механизма RefreshDetail написать собственную функцию обновления. Пример ниже:

function RefreshTrainedDetail() {
	if (ContactsWorkspace.InitializeTrainedFlag != true) {
		InitializeTrainedDetail();                           
		ContactsWorkspace.InitializeTrainedFlag = true;
	}
	var ContactID = BaseWorkspace.GridDataset.ValAsGUID('ID');
	if (ContactID == ContactsWorkspace.TrainedOldContactID) {
		return;
	} else {
	ContactsWorkspace.TrainedOldContactID = ContactID;  
	}
	SetAttribute(ContactsWorkspace.TrainedWindow, 'ParentItemID', ContactID);
	RefreshDetailData(BaseWorkspace.GridDataset, 'ID', 
		ContactsWorkspace.TrainedDataset, 'ContactID');
}

Так и не разобрался.
Переделал окно на базе wnd_BaseDBEdit
Вставил в него Windows контейнер и в него окно на базе wnd_BaseGridArea.
Стало лучьше, хотябы стало появляться и сохранятся без ошибок :smile:
Но все равно не могу подключить датасет из wnd_BaseGrigArea.
Отдельно все окна работают.

Нашел целые объект в датасете Dataset.KeyDataField
Как я понимаю это имменно то что нужно ??? Но что с ним делать не понятно....

Кирилл, в моем случае ошибка с сообщением "Запись удалена" лечилась в scr_BaseDBEditUtils.
В function InitializeDBEdit вместо

	if (RecordID == '') {	
		RecordID = GUID_NULL;
	}

задать:

	if (IsEmptyValue(RecordID)) {
		RecordID = GUID_NULL;
	}

А дальше дебаггером уже смотреть на чем валится.
Я пологаю, что Вы создается окно, подключаете несколько датасетов инициализируете их и открываете.
Если дальше самосмостоятельно не получится разобраться, направьте нам свои сервисы. По словесвному описанию будет довольно сложно помогать.

Спасибо, я уже разобрался все заработало...
А в этом месте я поставил проверку if ((RecordID == '') || (RecordID == null)) {
RecordID = GUID_NULL;

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