ПОмогите пожалуйста! Я тока начал осваивать терасофт, никак не пойму вообще как он программируется, ни документации ничего толком нет.. Вот никак не могу узнать как сделать мне функцию автоматического создания задач в отдел монтажа по договору (Монтаж оборудования по договору для транспортных средств по договору). Начал с элементарного. При нажатии на кнопку вызвал окно с окном грида транспортных средств по договору( во вкладке договоры которое отображается внизу в пейдж контроле), Новое окно с гридом естественно пустое.. Нужно как то передать параметр ContractID для нового окна, и соответственно в новом окне отфильтровать записи по этому ID. Как передать параметр, как добавляется Dataset, как отфильтровать, на какое событие это все вешать..я тут пока ниче толком не могу понять. Если есть у кого примеры похожие - поделитесь пожалуйста! Я так понимаю, готовое окно с гридом которое я прикрепил к вызываемому мною новому окну уже имеет свой датасорс, квери и тд. Как это все отфильтровать? Что писать куда писать? Как передать номер договора на новое окно чтобы там отфильтровать?

Нравится

1 комментарий

Здравствуйте, Раймир!

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

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

Найти его можно в скрипте раздела scr_ContractsWorkspace

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

Надо было мне сделать фильтр для задач, чтобы выбрать те, которые начинаются через N дней.
Наверное, это можно сделать средствами построителя запросов в админке, но мне как-то сразу показалось, что проще сделать CustomSQL Filter.
Но... я понял, что не понимаю как это сделать...
Озадачился, надо сказать, не на шутку: полез на msdn, sql.ru, забился в гугл... Слава богу вовремя остановился :confused:

((getdate() - tbl_Task.StartDate) = :StartDateDiff)
-- параметр - разница в днях (целое или дробное)

Нравится

Поделиться

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

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

RefreshCommonDetail(BaseWorkspace, wndCustomersTaskDetail, 'AccountID', 'AccountID');

Не работает. А что нужно?

Нравится

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

Добрый день, Александр.
Ошибка здесь в BaseWorkspace, нужно обращаться к ID текущей записи (которая в данный момент открыта на редактирование).

Для этого использовать вместо RefreshCommonDetail лучше другую функцию: RefreshDetailData.
Пошаговою инструкция как это слделать прикреаляю здесь же.

Возможно вы не так поняли, мне не нужна запись, которая открыта для редактирования, а запись, которая выделена в гриде.
Все решилось таким скриптом:

var AccountID = GetFieldValueFromDisabledField(BaseWorkspace.GridDataset, 'AccountID');
RefreshCommonDetail(null, wndCustomersTaskDetail, 'AccountID', 'AccountID', null, null, null, null, null, AccountID);
Показать все комментарии

Здравствуйте, подскажите как изменить фильтруемое поле в compare filter,
хочу сделать возможность выбора этого поля в форме ?
(как в быстром фильтре)

Нравится

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

Здравствуйте, Руслан!
Попробуйте примерно так:

//фильтр в определенном датасете
var Dataset =  Services.GetNewItemByUSI('ds_xxx');  
var SelectQuery = Dataset.SelectQuery;
var PrimarySelect = SelectQuery.Items(0);
var Filter = PrimarySelect.Filters.ItemsByCode('FilterName'); //filter
//нужная колонка
Table = Services.GetSingleItemByUSI(TableUSI); //table
var TableFields = Table.Fields;	
var Field = TableFields.ItemsByName(FieldName);//column
//подстановка колонки в фильтр	
Filter.TestExpression.Field = Field;

Взяла из своего кода (у меня другая задача была, там еще и джойны генерировались) -- поэтому должно работать. Если нет -- проверьте свойства фильтра/колонки отладчиком, может, последнюю строчку иначе можно написать.

Здравствуйте, Ольга ! Спасибо за ответ , буду пробовать .

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

Прочел sozdat_svoe_okno_filtracii_dlya_otcheta.doc (указано в https://community.terrasoft.ua/forum/topic/6590 ). Создал собственное окно фильтрации. Дошел успешно до "После этого переменная будет доступна в отчете и Вы ее сможете вытянуть в отчет."
Переменная доступна, в отчете могу ее разместить, но мне нужно из этого окна часть переменных выводить на страницах отчета, а часть использовать как параметры при фильтрации в запросе.

wnd_ReportScoreboard - собственное окно фильтрации
wnd_ReportScoreboardScript - скрипты к нему
sq_ReportScorecard - запрос к отчету
в нем :Parameters
:OrderStartDate
:OrderFinishDate
Мне надо присвоить OrderStartDate значение из edtDateStart (IDataTimeControl в окне wnd_ReportScoreboard) и OrderFinishDate присвоить значение из edtDateАштшыр (IDataTimeControl в окне wnd_ReportScoreboard)
Как это можно сделать для отчета на fastreport?

Нравится

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

Возьмите как пример лучше отчет Прайс-лист (Offerings\Reports\Offering Price\fr_ReportOfferingsPrice). Для этого отчета есть свое окно фильтрации wnd_FilterOfferingPrice. В этом окне применение фильтров реализовано более корректно, чем в указанном Вами документе. Обязательно обратите внимание на параметры регистрации отчета.
Если не разберетесь с примером - пишите.

Спасибо за совет. Разобрался. Работает.

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

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

Guid SomeId_1 = new Guid("...");
//Guid SomeId_2 = new Guid("...");

Page.SomeEditField.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        e.Filters.Add(new Dictionarystring, object> {
                {"comparisonType", FilterComparisonType.Equal},
                {"leftExpressionColumnPath", "Type"},
                {"useDisplayValue", false},
                {"rightExpressionParameterValues", new object[]{SomeId_1} }});
};

А вот если отфильтровать надо по двум возможным типам? Тогда как быть? FilterComparisonType.Equal не подходит... Нужно, чтобы отобразились записи типа SomeId_1 или SomeId_2.

Guid SomeId_1 = new Guid("...");
Guid SomeId_2 = new Guid("...");

Нравится

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

Разобрался сам :)

Guid SomeId_1 = new Guid("...");
Guid SomeId_2 = new Guid("...");
 
Page.SomeEditField.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        e.Filters.Add(new Dictionary<string, object> {
                {"comparisonType", FilterComparisonType.Equal},
                {"leftExpressionColumnPath", "Type"},
                {"useDisplayValue", false},
                {"rightExpressionParameterValues", new object[]{SomeId_1, SomeId_2} }});
};

Опоздала :)

Коллеги, добрый день.

Хотел бы реанимировать эту тему) в версии 7.9 подскажите, плиз, как сделать фильтрацию по двум айдишникам:

У меня есть справочник Vocabulary, в нем два айди: ID_1 и ID_2. Сейчас код фильтрует только по 1 айдишнику. Подскажите, плиз, как сделать фильтрацию по 2 и более значениям справочника

	rules: {
				"FieldToBeFiltered": {
				"FiltrationByType": {
					"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
					"autocomplete": true,
					"autoClean": true,
					"baseAttributePatch": "Vocabulary",
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					"type": BusinessRuleModule.enums.ValueType.CONSTANT,
					"value": "ID_1"
					}
				}
			},

Дмитрий, здравствуйте!

На данный момент в 7.х такой возможности нет, но зафиксировали Ваше пожелание для рассмотрения возможной реализации в будущих версиях.

Обходные варианты:
- написать второе бизнес-правило, которое будет фильтроваться по другой колонке (не проверяли);
-с помощью filtergroup прописать бизнес-правила. На community есть множество тем на подобный запрос: http://www.community.terrasoft.ru/search/node/filtergroup

Пример (cхема «AccountPageV2», пакет «UIv2»):

emailDetailFilter: function() {
						var recordId = this.get("Id");
						var filterGroup = new this.Terrasoft.createFilterGroup();
						filterGroup.add("AccountNotNull", this.Terrasoft.createColumnIsNotNullFilter("Account"));
						filterGroup.add("AccountConnection", this.Terrasoft.createColumnFilterWithParameter(
								this.Terrasoft.ComparisonType.EQUAL, "Account", recordId));
						filterGroup.add("ActivityType", this.Terrasoft.createColumnFilterWithParameter(
								this.Terrasoft.ComparisonType.EQUAL, "Type", ConfigurationConstants.Activity.Type.Email));
						return filterGroup;
					},
Показать все комментарии

У меня есть раздел с полем период, в нем деталь в которую я хочу выводить контакты(по определеному условию) и сумму операций за предыдущий период.

Подскажите, пожалуйста, как правильно накладывать фильтр, на деталь?

Нравится

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

Здравствуйте!
обновление деталей и, соответственно, накладывание фильтров происходит в функции RefreshDetails() скрипта соответствующего раздела.
"Ветка" для Вашей детали выглядит примерно так:

else
	if (pcDetails.ActivePage.Name == pgContactsDetail.Name) {
	    SetAttribute(wndContactsDetail.Window, 'HideButtonsFrame', true);
	   RefreshCommonDetail(BaseWorkspace, wndContactsDetail, 
			ParentItemFieldName, ChildFilterName;
	} 

атрибут 'HideButtonsFrame' отвечает за то, чтобы кнопки "добавить" и т.д. были недоступными
pgContactsDetail--название Вашей детали
wndContactsDetail--название контейнера окна Вашей детали

RefreshCommonDetail -- это функция стандартного обновления детали ( как оно именно работает, можете глянуть в скрипте cr_WorkspaceUtils)

Вам же нужно прописать свой рефреш. А именно -- передать в параметры фильтра нужные значения.
"Достучаться" до параметра можно примерно так:

var ContactsDataset = wndContactsDetail.ComponentsByName('dlData').Dataset;
var Parameters = ContactsDataset .SelectQuery.Parameters;
Parameters('FilterName') = FilterValue;

это нужно совместить с базовым рефрешом детали.
Если что-то непонятно, или будут еще вопросы (потому что и Ваш вопрос не очень конкретный) -- пишите. удачи!

Добрый день!

Или может так :wink:

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

Добрый день Всем!

Ольга, спасибо большое за отличный пост!
Арсений, думаю, наиболее правильный ответ именно тот, что описала Ольга, поскольку нужно в деталь выводить записи, привязанные к записи раздела, т.е. отфильтрованные по ParentItemID.

фильтрует, спасибо всем

Добрый день!
Сделайте по аналогии с

   if (pcDetails.ActivePage.Name == pgContactsInAccountDetail.Name) {
		SetAttribute(wndContactsInAccountDetail.Window, 'HideButtonsFrame', true);
		RefreshCommonDetail(BaseWorkspace, wndContactsInAccountDetail, 
			'AccountID', 'AccountID');
	}

в Accounts\General\Main Grid\scr_AccountsWorkspace

Если применить фильтрацию датасета детали по дополнительному параметру PeriodID- измените RefreshCommonDetail или создайте свою фикцию, по ее подобию и передавайте этот параметр туда. Т.к. в вашей реализации на последнем вызове обновления этот параметр сбрасывается.

параметр Вы передали, а фильтр включили?
думаю, лучше галочку в Администраторе поставить, чтобы он все время был включенным.
либо включать его здесь, после установки параметра (перед базовым рефрешем), функцией

var Filters = DetailDataset.SelectQuery.Filters;
EnableFilter(Filters, 'FilterName', true)

Правда, честно говоря, я не очень уверена насчет переменной Filters, то есть, какое у нее значение -- но тут лучше уже поэкспериментировать+посмотреть в коде этой функции, что она делает.

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

Добрый день!
Задача состоит в следующем: создать фильтр (подобие фильтра по ответственным в модуле Задачи), для отображения определенных данных за определенный период, например за "Май 2012". В итоге наткнулся на два момента: во-первых, какой смысл в сервисе sq_Period выбора TOP 1 значений? Где это используется? Каковы последствия, если исправить на выборку всех значений? И второе, на данный момент в таблице tbl_Period хранятся записи с января 2008 по декабрь 2012. Что будет 1 января 2013? Система сгенерирует новые записи периодов, или это нужно делать пользователю самому?

Нравится

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

"Constantine" написал: Что будет 1 января 2013?

Создайте новые записи в справочнике Периоды, никакой магии тут не будет :)
"Constantine" написал:во-первых, какой смысл в сервисе sq_Period выбора TOP 1 значений?

Смысл в том что это лукапное поле.

"АльфаКрыса" написал:

Создайте новые записи в справочнике Периоды, никакой магии тут не будет :)


То, что магии не будет, это понятно. Да и в принципе скриптом добавить значений в таблицу тоже не проблема.. ИМХО, не совсем удобно пальчиками набирать новые периоды по истечении "коробочных". Автоматизация этого процесса, думаю, не влечет за собой особых трудностей, странно, что это не реализовано в стандартной конфигурации
"АльфаКрыса" написал:

Смысл в том что это лукапное поле.


Возможно я что-то не так понял, но в системе куча справочников, на основе которых реализованы лукапные поля, и при этом там нет никаких ТОР 1. Этим то и вызван вопрос, возможно в этом загодочном ТОРе скрыт более "глубокий смысл"?)

Откровенно говоря, нигде в TS не видел, что бы использовался этот справочник, я его использовал в своих целях, и очень доволен. У меня сложилось впечатление, что он остался как приданое от прошлых версий :). Поэтому никто и не заморачивался написанием SQL запроса / процедуры для его заполнения.

Добрый день, Константин.
Справочник периодов заполняется при формировании сборки конфигурации. Но в данное время не используется более, АльфаКрыса в этом прав.

В запросах если select TOP равен значению -1 будет происходить выборка всех значений без ограничения.
В случае с TOP = 1 выборка будет ограничиваться начальной настройкой = 40 записей. Задается в окне запуска клиента, в дополнительных настройках, параметр Dataset Fetch Record Count.

Павел, не очень уверен в вашем утверждении

"Фильковский Павел" написал:В случае с TOP = 1 выборка будет ограничиваться начальной настройкой = 40 записей. Задается в окне запуска клиента, в дополнительных настройках, параметр Dataset Fetch Record Count.

скорее выборка будет ограничиваться одним значением, а вот если бы в sq_ стояло TOP = 40 было бы 40 записей.

The TOP clause is used to specify the number of records to return.
The TOP clause can be very useful on large tables with thousands of records. Returning a large number of records can impact on performance.
Note: Not all database systems support the TOP clause.
SQL Server Syntax
SELECT TOP number|percent column_name(s)
FROM table_name

Скорее всего, когда делали справочник периодов, просто забыли написать "-" что бы получилось TOP = -1

Да, Вы правы. Проанализировал конфигурации, в других сборках есть -1.

На заметку: в случае, если sq_ сервис участвует в выборке данных для построения реестра записей окна, параметр TOP берется из системной настройки Dataset Fetch Record Count. Если мы к этому же сервису обращаемся внутри конфигурации как к экземпляру объекта - учитывается заданный в нем параметр TOP. В предпросмотре через TSAdmin параметр TOP игнорируется.

"АльфаКрыса" написал:

Скорее всего, когда делали справочник периодов, просто забыли написать "-" что бы получилось TOP = -1


вполне вероятно :) Поправил sq_Period, никакого "краха империи" не наблюдается

"Фильковский Павел" написал:На заметку: в случае, если sq_ сервис участвует в выборке данных для построения реестра записей окна, параметр TOP берется из системной настройки Dataset Fetch Record Count. Если мы к этому же сервису обращаемся внутри конфигурации как к экземпляру объекта - учитывается заданный в нем параметр TOP. В предпросмотре через TSAdmin параметр TOP игнорируется.

Спасибо, будем знать.
Фишка в том, что если использовать данный спраочник как выпадающий, и в нем будет стоять TOP 1, то в выпадающем справочнике будет видна всего одна запись, даже если в установках конфигурации 40 записей.
Ну в общем не суть.
Спасибо еще раз за комментарий.

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

Доброго времени суток!
Создан новый модуль, в котором основная грида древовидная. Хитрость гриды в том, что родительский элемент дерева - контрагент, а вот подчинненые - продукты из детали продуктов, модуля договоров, где контрагент указан как заказчик, т. е. в свернутом виде видим имена контрагентов, а при клике на плюсик, в той же колонке под контрагентом отображаются продукты из его договоров. Проблема заключается в том, что если пользователь кликает на названии колонки, то фильтруются не просто названия контрагентов, но и продуктов и как итог - рушится логика дерева - по алфавиту фильтруются и контрагенты и продукты. Каким образом можно исправить эту ситуацию? Возможен ли вариант фильтрации только родительских записей? Если такой вариант недостижим, то каким образом можно отключить этот стандартный функционал (может переунаследовать собитие)?

Нравится

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

Добрый день!

Сделать сортировку необходимым образом не получиться. Но отключить ее можно так же, как и в разделе "Проекты" - в функции dlDataOnDatasetBeforeOpen вызвать функцию:

function SetProjectDatasetSortOrder(Dataset, IsSorted) {
	var SelectQuery1 = Dataset.SelectQuery.Items(0);
	var SelectQuery2 = Dataset.SelectQuery.Items(1);
	SetProjectSelectQuerySortOrder(SelectQuery1, IsSorted);
	SetProjectSelectQuerySortOrder(SelectQuery2, IsSorted);
}

Более детально Вы можете посмотреть в реализации раздела "Проекты".

Спасибо, будем смотреть-разбираться

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

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

Нравится

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

Здравствуйте, Егор!

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

Алгоритм примерно следующий:

1. Войти в Terrasoft Administrator и указать для таблицы городов "Администрируется по записям"

2. Установить права доступа на города скриптом;

Еще варианты: реализовать в справочнике городов деталь, которая позволяет регулировать доступ к отдельным записям и раздавать доступ через нее.

реализовать пункт контектного меню, который позволит раздать доступ на запись.

Если нужно только разделить города на видимые и невидимые всем пользователям, можно добавить в карточку города булевское поле (например, IsSecret) и фильтр по нему. А в карточках, где идёт выбор города фильтровать:

function edtCityOnPrepareSelectWindow(LookupDataControl) {
	var Dataset = LookupDataControl.DataField.LookupDataset;
	var IsNotAdmin = !Connector.CurrentUser.IsAdmin;
	ApplyDatasetFilter(Dataset, 'IsSecret', false, IsNotAdmin);
 
}
Показать все комментарии