Колонки из датагрида

Добрый день.
Есть 2 вопроса.

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

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

Нравится

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

Здравствуйте Олег,
По поводу второго вопроса

У нас версия 3.0.4 в настройках такой функции нету.
Скорее всего где то функцию писать придется

По поводу первого вопроса :

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

Window.ComponentsByName('название DataGridColun').IsVisible = false;

Пример:

Window.ComponentsByName('colNameDataGridView').IsVisible = false;

Спасибо огромное. Оказалось все очень просто=)

Насчет первого вопроса. У нас установлена версия 3.0.4. В данной версии нету таких настроек. Может быть можно через скрипты как то решить этот вопрос?

Олег Александрович, реализация данного функционала трудоемка. Перенести ее на версию 3.0.4 будет достаточно сложно поскольку необходимо не только заново реализовать всю логику, но и учесть особенности сохранения профиля пользователя (в более старых версиях способ хранения профиля отличается).

Может можно как нибудь сохранять текущее состояние в файл, а потом загружать с него ? есть же обработчики onPrepare и onCancel. Или так не получится в террасофте?

Сделать то, чтобы Terrasoft 3.0 стартовал с последнего активного раздела можно разными способами, только трудоемко это, как правильно заметили выше - основная проблема именно с этим.
Файл, профиль тут наверное и не нужен, сделайте в базе табличку, где будет при закрытии Terrasoft сохраняться признак последнего активного раздела, ID пользователя и считывайте оттуда при загрузке нужную запись, инициализируйте нужный раздел для каждого свой. И настройку можно вынести в системные - использовать последний активный или нет...
Как вариант, сделайте для разных групп пользователей разный стартовый раздел (фиксированный), может быть этого будет уже достаточно

Олег, попробуйте реализовать идею Александра, если у Вас возникнут вопросы, обращайтесь.

Может быть подскажете каким образом в террасофте сохраняется профиль? Необходимо вносить изменнения, а я не знаю куда смотреть. И хотелось бы уточнить, если у части пользователей сбрасываются настройки время от времени, с чем это может быт связано?

Олег посмотрите таблицу tbl_ProfileData, на нее есть соответствующие сервисы iq,sq,uq

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

И в какой момент происходит загрузка профиля? Можно ли загружать форматирование ячеек после загрузки профиля?

Здравствуйте Олег,
Последняя версия бинарных файлов для вашей версии 3.0.4.121, на сколько я понимаю вы работаете с версией 3.0.4.112. Предлагаю вам написать на support@tscrm.com с темой пиьсьма "Обновление бинарных файлов до 3.0.4.121"

3.0.4.120, а на что могут повлиять бинарные файлы?

Нашел решение проблемы, повесил на OnShow

Еще такой вопрос. Необходимо, чтобы при открытии окна, проекты сортировались по возрастанию даты начала проекта. Как это можно сделать? Я знаю что в sq_Opportunity можно на поле поставить "Сортировка по возрастанию". Но установка значения результата не дает.
+ как сделать наложение быстрого фильтра при открытии окна?

Насчет сохранения колонок, да, у тех людей, у кого сбивается, стоит 112. А у меня 120, поэтому и все норм.

Дело в том, что для раздела [Проекты] используется древовидный реестр и завязано много дополнительной функциональности именно которая перекрывает сортировку.

Если для Вас критично – сортировать проекты в реестре, то тогда Вам необходимо в Terrasoft Administrator скрипте scr_ProjectUtils закомментировать текст функции SetProjectDatasetSortOrder, как показано на скриншоте ниже, сохранить изменения и перезапустить систему:

[URL=http://imageshack.us/photo/my-images/52/15038725.png/][IMG]http://img52…]

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

По поподу фильтра при открытии окна. Что именно должно фильроваться?

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

При нажатии на грид можно ввести быстрый фильт. Например "Проект ОА". Я хочу, чтобы когда я открывал раздел проекты, фильтр сам накладывался.

Этот вопрос решают динамические группы.

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

Олег, над этим вопросом подумать можно.

Но зачем Вам это? То есть, ошибка при заполнении карточки приведет к тому, что запись существовать будет, но ее вообще никто не увидит.

Если Вы хотите чтобы в реестре были записи с определенным названием, то что мешает их сразу создавать с таким названием?

У меня есть проекты разных типов. Я использую проекты определенного типа. Тип проектов - справочник. Положим, мне нужен проект с типом "Тип н1". Когда я загружаю террасофт и выбираю раздел проекты, я вижу проекты всех типов. Для того, чтобы отсеять ненужные, я накладываю быстрый фильтр по типу проектов и вижу только проекты типа "Тип н1". Я хочу, чтобы быстрый фильтр накладывался на этот раздел при загрузке раздела проекты. Например на OnPrepare или OnShow. Проверка при запуске будет производиться по ID определенного пользователя, либо группы.
Функция проверки уже готова. Вот мне и интересно, можно ли, чтобы при загрузке этот быстрый фильтр сам накладывался или нет.

Здравствуйте Олег,
Если вы будете реализовывать логику которую вы описали, то скорее всего вы будете добавлять ApplyDatasetFilter на OnPrepare

Хочу обратить ваше внимание на скрипт scr_ProjectWorkspace

function dlProjectOnDatasetBeforeOpen(Dataset, DoOpen) {
	BaseWorkspace.GridDataset = Dataset;
	if (!GetIsInSingleRowMode()) {				
		ApplyWorkspaceFilters(Dataset);		
	} else {
		PrepareProjectFilters(Dataset, true, true);
	}
}

где вызывается функция ApplyWorkspaceFilters

function ApplyStandardWorkspaceFilter() {
	EnableDatasetFilters(BaseWorkspace.GridDataset, false);
	fbcFilters.ApplyFilter();
	ApplyDatasetGroupIDFilter(BaseWorkspace.GroupsDataset,
		BaseWorkspace.GridDataset);
	var Grid = BaseWorkspace.Grid;
	ApplyGridViewFilter(Grid.ActiveView);
}

котороя выключает все фильтры

В окне wnd_TaskEdit есть поле, где я выбираю инцидент из ds_Incident.
Как я понимаю, при выборе открывается wnd_BaseLookup.
Форматирование в данном окне постоянно сбивается. Это видно на скриншоте.

Возможно ли каким либо образом наложить на это окно свойство, чтоб если в нем открывался ds_Incident, колонки форматировались нужным мне образом?

Здравствуйте Олег

Советую последовать указаниям в теме http://www.community.terrasoft.ru/forum/topic/2626

Яворский Алексей
Эксперт 3-й линии поддержки

Таким образом можно было бы решить проблему. Но в каком окне менять свойство? В wnd_BaseLookup?

В данном случае попробуйте изменить свойство UseProfile в wnd_BaseLookup

Свойство поменял на true. Колонки настроил. Через минут 15 настройки слетели. Причем ничего в общем то и не делал для этого. Просто открыл справочник, а форматирование сбито.

Здравствуйте Олег

Данную проблему нам воспроизвести не получилось, предлагаю вам написать support@tscrm.com с пометкой (Для Алексея), рассмотрим вариант удаленного доступа.

Я вижу решение проблемы в следующем:
1.Отловить экземпляр окна wnd_BaseLookup
2.Наложить на него форматирование колонок. Сделать видимыми только те, которые мне нужны.
Если в датасете убрать галочку "колонка для отображения" на ненужных мне колонках, то они будут отсуствовать в списке свернутых колонок, а мне надо, чтобы были.

Вопрос в том как отловить экзампляр именно справочника инциденты например. И как мне накладывать свойства видимости колонок, если я не знаю их названия.

Заполнение колонок в грид происходит в scr_BaseLookup.Initialize в фрагменте

                // Creating grid columns and filling enum values   
                for (var i = 0; i < BaseLookup.CurrentDataset.DataFields.Count; i++) {    
                               var DataBaseField = BaseLookup.CurrentDataset.DataFields.Items(i);
                               // Creating new column

Реализация Вашей идеи будет иметь примерный вид:

                               var DataBaseField = BaseLookup.CurrentDataset.DataFields.Items(i);
                               // Creating new column
                               if (BaseLookup.CurrentDataset.Caption != 'Инцидент' ||
                                                               (BaseLookup.CurrentDataset.Caption == 'Инцидент' &&
                                                               IsStringInArray(DataBaseField.Name,['ВидимоеПоле1','ВидимоеПоле2',...]))) {
                                               if (DataBaseField.IsDisplayField) {
                                                               var DataFieldName = DataBaseField.Name;
                                                               var DataGridColumn = Window.CreateComponent(DataGridColumnCode,
                                                                 'col' + DataFieldName);
                                                               DataGridColumn.DataFieldName = DataFieldName;
                                                               gvData.Add(DataGridColumn); 
                                                               if (IsEmpty(BaseLookup.FirstDisplayFieldName)) {
                                                                              BaseLookup.FirstDisplayFieldName = DataFieldName;
                                                               }                       
                                               }
                               }

Для инцидентов сформируйте массив колонок, которые вы хотите видеть ['ВидимоеПоле1','ВидимоеПоле2',...]

А как мне отловить названия полей. Типо ID из датасета = colID?
А если повесить обработчик на окно задачи, на edtIncidentIDOnPrepareSelectWindow(LookupDataControl, SelectWindow).
Только опять же остается вопросом как отловить названия колонок

Все названия столбцов отследил через дебагер. Осталось видимость наложить. Но не знаю на какое окно теперь накладывать=) Мне нужно, чтобы если открывалось окно сформированное с помощью ds_Incident, накладывалась видимость столбцов.
Через дебагер ловил название окна, везде отображалось wnd_IncidentEdit, но это же окно раздела инцидентов, и открывается ведь не оно.
Как то так получается:

function edtIncidentIDOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
	//debugger;
	var Window = Services.GetSingleItemByUSI('wnd_IncidentEdit');
 	var colID = Window.ComponentsByName('colID');
	colID.IsVisible = false;
}

Только название окна неверное. Вот как его отловить не пойму
+отловил template окно которое открывается. wnd_SelectData

Нашел вариант решения:

function wnd_SelectDataExOnPrepare(Window) {
//debugger;
	Initialize(Window);
	var colID = Window.ComponentsByName('colID');
	var colSubject = Window.ComponentsByName('colSubject');
	var Dataset = dlData.Dataset;
	var dsIncident = Services.GetSingleItemByUSI('ds_Incident');
	if(dsIncident)
	{
	    ShowInformationDialog('Hello');
	    colID.IsVisible = false;
	    colSubject.IsVisible = false; 
	}
}

Осталась одна проблема. Как указать террасофту, что открыт именно ds_Incident. Т.к. для других окон без проверки условия вылетают ошибки. Т.к. названия полей не совпадают

var colID = Window.ComponentsByName('colID');
	var colIncidentNumber = Window.ComponentsByName('colIncidentNumber');
	var colDate = Window.ComponentsByName('colDate');
	var colSubject = Window.ComponentsByName('colSubject');
	var colIncidentTypeID = Window.ComponentsByName('colIncidentTypeID');
	var colStatusID = Window.ComponentsByName('colStatusID');
	var colIncidentCategoryID = Window.ComponentsByName('colIncidentCategoryID');
	var colAuthorID = Window.ComponentsByName('colAuthorID');
	var colIncidentAccConname = Window.ComponentsByName('colIncidentAccConname');
	var colIncidentAccConCommunication = Window.ComponentsByName('colIncidentAccConCommunication');
	var colIncidentAccConAddress = Window.ComponentsByName('colIncidentAccConAddress');
	var colDisplayStartDate = Window.ComponentsByName('colDisplayStartDate');
	var colDisplayFinishDate = Window.ComponentsByName('colDisplayFinishDate');
	var colAccountType = Window.ComponentsByName('colAccountType');
	var colContactType = Window.ComponentsByName('colContactType');
	//Конец инициализации
 
	//Формирование справочника инцидентов
	var DictionaryName = Window.WindowCaption;
	if(DictionaryName == "Выбор 'Инцидент'")
	{
		colID.IsVisible = false;
		colIncidentNumber.IsVisible = false;
		colDate.IsVisible = true;
		colSubject.IsVisible = true;
		colIncidentTypeID.IsVisible = true;
		colStatusID.IsVisible = true;
		colIncidentCategoryID.IsVisible = true;
		colAuthorID.IsVisible = false;
		colIncidentAccConname.IsVisible = false;
		colIncidentAccConCommunication.IsVisible = false;
		colIncidentAccConAddress.IsVisible = false;
		colDisplayStartDate.IsVisible = false;
		colDisplayFinishDate.IsVisible = false;
		colAccountType.IsVisible = false;
		colContactType.IsVisible = false;
	}
	//Конец

Решил проблема так, но хотелось бы сделать более человеческую проверку, ежели по заголовку окна. Хотелось бы проверять по названию датасета, из которого извлекаются данные.

Олег, доступ к свойствам подключаемого датасета можно получить, например следующим образом Window.ComponentsByName('dlData').Dataset

Пример:

Window.ComponentsByName('dlData').Dataset.USI

Я как то не понял как мне этим воспользоваться, чтобы проверить ds_Incident это или нет.

Пример 1:

	if (Window.ComponentsByName('dlData').Dataset.USI.indexOf('ds_Incident')>0 )
	{
		//Логика если Dataset= ds_Incident
	}
	else
	{
		//Логика если Dataset не ds_Incident
	}

Пример 2:

	if (System.ExtractUSICode(Window.ComponentsByName('dlData').Dataset.USI) == 'ds_Incident' )
	{                 
		//Логика если Dataset= ds_Incident
	}
	else
	{
		//Логика если Dataset= ds_Incident
	}

Спасибо, такая проверка намного лучше, чем по заголовку окна)) Тему можно закрывать

Еще вопрос по наложению фильтров. Фильтры то я выключаю. А вот как наложить быстрый фильтр из скрипта. У меня есть поле в ds_Oppotrunity, например Name. Помечено, для фильтрации и поиска. Поле текстового типа.
Я хочу, чтобы когда я открывал раздел "Проекты" у меня сразу накладывался фильтр "Мой текст фильтра"

Здравствуйте Олег.

"Зголич Олег Александрович" написал: А вот как наложить быстрый фильтр из скрипта. У меня есть поле в , например Name. Помечено, для фильтрации и поиска. Поле текстового типа.

Наложить быстрый фильтр из скрипта можно например следующим образом:

Пример:

	Dataset = Services.GetNewItemByUSI('ds_Oppotrunity');
	ApplyDatasetFilter(Dataset,'Name',' ИмяПродажи',true);

"Зголич Олег Александрович" написал:Я хочу, чтобы когда я открывал раздел "Проекты" у меня сразу накладывался фильтр "Мой текст фильтра"

Принцип наложения фильтров тот же, только советую обратить внимание на совет http://www.community.terrasoft.ru/forum/topic/6730#comment-29072

К примеру, наложите фильтр на wnd_ProjectGridAreaOnPrepare (wnd_ProjectGridAreaScript)

	Dataset = Window.ComponentsByName('dlData').Dataset;
	ApplyDatasetFilter(Dataset,'Name','098 - Разработка буклета',true);

Только в этом случае в sq_Project в коробочной версии нет фильтра сравнения и параметра Name, следовательно, его надо добавить.

А можно ли таким образом:

ApplyDatasetFilter(LookupDataset, 'IncidentTypeID', '{56EBBD0A-47CF-46BC-B94E-C621031F0A65}', IsEnabled);

Наложить фильтр, чтобы выбирало не только этот ID, а еще второй. Т.е. сейчас филтьтр по '{56EBBD0A-47CF-46BC-B94E-C621031F0A65}', а мне надо например еще по '{aaaa-aaaa-aaaaaa-aaaaa}'

Следует использовать ApplyDatasetIncludeFilter
Пример:
Фильтруем ds_Account по двум id {C2CD1B9C-660C-4EFB-8A4A-A828CB9850FD} и {71BBF868-20C7-49D1-984D-5EAF6E7C1D4A}

До фильтрации

После фильтрации

Код:

    var	Dataset = dlData.Dataset;
	Dataset.Close();	
	ApplyDatasetIncludeFilter(Dataset,'IDs',	['{71BBF868-20C7-49D1-984D-5EAF6E7C1D4A}', '{C2CD1B9C-660C-4EFB-8A4A-A828CB9850FD}'],true);
	Dataset.Open();

Для ApplyDatasetIncludeFilter можно объявить массив

	var arr = new Array();

и записать в него значения :

	arr.push('{71BBF868-20C7-49D1-984D-5EAF6E7C1D4A}');
	arr.push('{C2CD1B9C-660C-4EFB-8A4A-A828CB9850FD}');
        ApplyDatasetIncludeFilter(Dataset,'IDs',arr,true);

или написать просто использовать запись

['{71BBF868-20C7-49D1-984D-5EAF6E7C1D4A}', '{C2CD1B9C-660C-4EFB-8A4A-A828CB9850FD}']
	ApplyDatasetIncludeFilter(Dataset,'IDs',	['{71BBF868-20C7-49D1-984D-5EAF6E7C1D4A}', '{C2CD1B9C-660C-4EFB-8A4A-A828CB9850FD}'],true);

Замечу что в sq_Account есть Include фильтр под названием IDs

Здравствуйте Сергей!
По поводу видимости колонок. В версии 3.2.1.61 свойство колонки IsVisible вызывает эффект только в оболочке Администратора и игнорируется при выполнении. После выполнения кода

function wnd_TechViewActGridAreaOnPrepare(Window) {
Initialize(Window);
wnd_BaseGridAreaOnPrepare(Window);
Window.ComponentsByName('colContactCommunication1').IsVisible = false;
Window.ComponentsByName('colContactCommunication1').IsEnabled = false;
btnDelete.IsVisible = !IsUserInGroup(ManagerGroupID);
}

колонка colContactCommunication1 остается видимой и доступной даже если в оболочке администратора задать IsVisible = false.

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