Добрый день, коллеги!

Помогите разобраться с проблемой.

Создал древовидный грид. При попытке добавить в него запись, появляется ошибка "BaseGridArea' - определение отсутствует". Источник ошибки - функция AddRequiredValuesToDictionary скрипта scr_BaseTreeArea.

Что я делаю не так?

Нравится

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

Есть идеи?

Здравствуйте, Николай!

Уточните, пожалуйста, есть ли в таблице, привязанной к реестру, поле родительской записи, и указано ли оно в настройках реестра?

111

Да, поле родительской записи есть, и в свойстве ParentDataFieldName оно указано.

if (Assigned(EditDataField)) {
		EditFieldName = EditDataField.Name;
	} else {
	    //Added for compatibility
	    EditDataField = Dataset.DataFields(NameFieldName);
	    if (Assigned(EditDataField)) {
	        EditFieldName = EditDataField.Name;
		} else {
		    EditFieldName = BaseGridArea.TreeDataset.DataFields.Items(1).Name; // Вот на этой строке возникает ошибка
		}
	}

С этим, вроде бы разобрался - в DataSet'e не было указано первичное поле для отображения. Указал поле Title. Ошибка пропала.

Но, зато появилась другая - уже на этапе сохранения новой записи в реестр: "Поле Title не активно" :(

Вот тут:

// scr_DB 
 
function RefreshDataset(Dataset) {
	CheckAssigned(Dataset, 'Dataset');
	Dataset.Close();
	Dataset.Open(); // Ошибка
}

Николай, установите в сервисе запросе sq_ для данного реестра признак "всегда выбирать в запросе" для основного полоя отображения (Title)

Спасибо, получилось!

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

Создаю новое окно, указываю в качестве родительского BaseTreeArea, сохраняю и переоткрываю, определяю колонки, указываю для DataGrid свойство ActiveView, но определенных колонок не вижу (не помогает ни переоткрытие сервиса, ни перезагрузка администратора ). Что странно в клиенте все колонки отображаются. Странно, так же, что ActiveView приходится вписывать, а не выбирать из списка как в 3.3.2.

Нравится

2 комментария

Олег, колонок Вы не увидите. Это особенность отображения контрола древовидного реестра.
В режиме работы с клиентом колонки будут отображаться, но не на этапе дизайна сервиса.

Спасибо, Виталий. Понял.

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

Хочу создать новый раздел. В нем добавить окошко в котором отображались бы имеющиеся проекты.
Всё сделал по образцу с wnd_ProjectWorkspace и соответственно ProjectGridArea.

В этом обработчике InitializeGridData возникает ошибка:

function InitializeGridData() {
debugger
  var GridWindow = wndGridData.Window;
  PrepareGridWindow(GridWindow, dlProject);
  PrepareCommonDetails('ProjectID', true);
}

В PrepareGridWindow(GridWindow, dlProject); ошибка "Предполагается наличие объекта".

Что не так, не могу разобраться никак.

Нравится

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

Здравствуйте, Ильдар.

Прежде всего, проверьте, указан ли в свойствах Вашего wnd_***Workspase TemplateWindowUSI = wnd_BaseWorkspace, поскольку функция PrepareGridWindow прописана в скрипте scr_BaseWorkspace.
Если не указан, то укажите, но при этом, предварительно сделайте бекап сервиса, потому что, когда Вы укажите новый TemplateWindowUSI наработки, которые Вы сделали в этом окне пропадут и появится пустое базовое окно.
Если же TemplateWindowUSI указан, то попробуйте просто прикрепить к скрипту Вашего окна скрипт BaseWorkspace.

Возможно, Вам также будет интересно почитать описание создания нового раздела по этой ссылке: http://community.terrasoft.ru/developer/advice/4576

Спасибо, Инна, помогло (указал шаблон окна wnd_BaseWorkspace).

Но возникла следующая проблема в дереве отображаются узлы, но названий нет. Такое ощущение, что это VirtualStringTree.

Но я не знаю хорошо работу с Terrasoft, не могли бы вы помочь и с этим вопросом?

И еще, тут же. Как после этого выбрать какой то проект и создать на его основе запрос для отображения его в другом окне?

К сожалению, в чем именно может проблема так сразу сказать сложно.
попробуйте следующее:
- проверьте, выбраны ли у Вас поля для отображения в реестре;
- выполните sq_ Вашего раздела и проверьте, возвращает ли он записи;
- указано ли в датасете первичное поле для отображения;
- если запрос возвращает значения, то проверьте GridArea, пошагово сравните ее с GridArea раздела "Проекты".

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

Кстати, тогда еще пару вопросов:
1) как удалить все эти окна, которые я насоздавал? Они не удаляются по причине:
а) у них где-то какой-то одинаковый идентификатор;
б) совпадающее имя.
Их теперь не исправить и не изменить.
2) Как сделать так, чтоб в дереве сразу отображалось много записей, а не первые 10?

P.S.
"И еще, тут же. Как после этого выбрать какой то проект и создать на его основе запрос для отображения его в другом окне?"
В общем по этому вопросу я сделал так, в той форме где находится TreeArea (мои проекты) на DblClick я повесил функцию из основного окна раздела. Это правильная реализация?

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

Второе, попробуйте в sq установить значение "Выбрать первые" равное -1

А по третьему вопросу, я не совсем понимаю, о чем идет речь, но если все работает так, как Вам нужно, то хорошо.

Инна Безверхняя,
II линия службы поддержки Terrasoft.

По первому вопросу, я никак не могу окна исправить, изменить. И удалить соответственно тоже.

По второму, у уже проверял это свойство и там действительно -1. Что интересно, что в основном разделе "Проекты" все проекты отображаются на одной странице. А у меня нет. Что и как установить до меня так и не дошло.

Ну а последний вопрос пока отложу в сторонку.

Спасибо за ответы!

Ну видимо мой вопрос очень труден :)

1) как удалить все эти окна, которые я насоздавал? Они не удаляются по причине:
а) у них где-то какой-то одинаковый идентификатор;
б) совпадающее имя.
Их теперь не исправить и не изменить.
2) Как сделать так, чтоб в дереве сразу отображалось много записей, а не первые 10?

Ильдар, попробуйте удалить лишние окна непосредственно из таблицы сервисов (tbl_service)в БД, выполнив в MS SQL Server запрос: delete * from tbl_service where .....
Что касается количества записей, отображаемых в дереве, оно может быть изменено следующим образом:
- в сервисе датасета необходимо создать обработчик события OnDataserBeforeOpen
- в функции обработки данного события прописать Dataset.FetchRecordsCount = 40;

Спасибо, Наталия!

По первому пункту действительно помогло, я бы сам вряд ли нашел где это физически хранится в БД.

Но вот по второму вопросу - не помогло. У меня также отображается только 10.
На странице с проектами - отображаются все проекты, а у на моей созданной странице только первые 10. Но я так и не нашел, где можно это изменить.

Ильдар, проверьте какое количество записей возвращает запрос выбора (sq_xxx), возможно, согласно Вашему запросу их всего 10.

я уже по этому поводу писал выше у меня стоит параметр -1. Я решил проблему по другому, я установил свойство grdData.Mode = dtmFull.

Но теперь у меня другой вопрос. Как соединяются задачи и файлы? Как к задаче прикрепляются файлы?

Я посмотрел таблицу tbl_Task и tbl_Files, но не нашел никакую связь.

Вам необходимо обратить внимание на таблицу tbl_FileInTask, именно она используется для хранения информации о файлах в разделе "Задачи".

Спасибо за ответ.

Но для меня всё так же остался непонятным вопрос.
Вот есть у меня список проектов, по щелчку на определенный проект, я хочу выполнить запрос, который бы в соответствии с ID проекта в окне grd_Data отображал дерево из другой таблицы.
Как бы это реализовать?

В общем описываю предыдущий вопрос.

Имеется новый раздел. Слева в wndGroups описываются все проекты системы.

По клику на какой-нибудь проект в правом окне реестра должна отобразится древовидная структура созданной мною таблицы.


Это вид запроса.

Что мне теперь прописать в обработчике события двойного нажатия клавиши, и как после выполнения запроса отобразить в реестре таблицу в виде дерева?

Обработка переключения элементов в дереве групп происходит по событию OnDatasetAfterPositionChange датасета групп, которое обычно вызывает базовый обработчик scr_BaseWorkspace.dlGroupsOnDatasetAfterPositionChange. Вам следует обратить внимание на обработку в этих двух функциях.

а как мне прописать выполнение запроса?
как передать параметры запросу? Я не очень понимаю этот момент.

Используйте уже написанные скрипты конфигурации. Передача значения ID происходит через атрибуты. Накладывание фильтра можно производить по ApplyDatasetFilter(Dataset, 'Filter_Name', Filter_Value, true) - при этом название параметра должно совпадать с названием фильтра сравнения в запросе. Второй вариант - передавать параметры через Dataset.SelectQuery.Parameters('Param_Name').Value = ParamValue и использовать EnableDatasetFilters(Dataset, true, 'Param_Name') для включения отдельного фильтра с последующим открытием (и выполнением) запроса Dataset.SelectQuery.Open()

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