Добрый день.
Помогите пожалуйста разобраться в следующей ситуации. Terrasoft 3.3.2
В реестре контрагенты у меня есть 2 типа контрагентов
1. Партнеры
2. Поставщики.
У каждого поставщика может быть несколько продуктов.
Для каждого продукта каждого поставщика каждый партнер должен занести свою информацию: квота, цена и т.д.
Я делаю это через деталь контрагентов Продукты поставщика.
Там применяю окно на базе wnd_BaseMasterDetail, где в верхнем разделе использую стандартное окно из этой детали, а для нижнего создал окошко на базе wnd_BaseGridArea, в котором должен выводится список партнеров, привязанных к записи из верхнего окна. Создал для него сервисы tbl, sq и ds.
Проблема в том, что три датасета (из главного реестра и каждого из окон ) не связываются друг с другом.
При открытии окна выдается окно предупреждения: “ Запись удалена” и дальше валится по ошибке «Исключение брошено и не поймано »
Нравится
Скорее всего, в подчиненном 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;