Добрый день!

Подскажите,пожалуйста, как написать условие в условном потоке и учесть сразу два варианта. Например, категория= 2 и сумма>100.
&& - не подходит. при сохранении выпадает ошибка.(Допущена ошибка в формуле: Expression expected)

Нравится

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

Светлана, здравствуйте!

Логическое И - это единственный вариант. Например:
(Условие 1) && (Условие2)
Примечание! Попробуйте второй параметр в условном потоке реализовать через параметр процесса.
Условно:
1ый параметр - [Читать данные в объекте 1. Категория]
2ой параметр - [Читать данные в объекте 1. Сумма]
Необходимо создать параметр процесса с таким же типом как и 2ой параметр (скорее всего Дробное или Целое число). В значении параметра указать маппинг на [Читать данные в объекте 1. Сумма].
В результате условный поток будет выглядеть так:
([Читать данные в объекте 1. Категория] = 2) && ([Параметр процесса] > 100)

Спасибо! Дело было в скобках ().

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

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

ФИЛЬТР.JPG
(там где начало и завершение)

Нравится

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

Здравствуйте.
При установке вручную, вызывается метод базовой секции:
setFilter: function(key, value, filtersValue) {
Вы можете поставить в нем точку остановки, и посмотреть какие значения он принимает. Зная формат данных, вы можете вызывать его программно в любой момент, с такого же формата данными, но другими датами, что вызовет сохранение фильтрации в профиль. После чего вызвать: this.initFilters(); что обновит фильтрацию и грид под выше сохраненную в профиле фильтрацию.

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

Обычное дело: как в 7.8 менять цвет строки в зависимости от значения колонок
вот как тут: https://community.terrasoft.ru/forum/topic/12359
только для 7.8

Нравится

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

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

Виталий, здесь посмотрите - http://www.community.terrasoft.ru/forum/topic/12855

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

Здравствуйте.
Чтобы среагировать на событие закрытие карточки, достаточно переписать метод onSaved карточки. Другое дело что это карточка, и код вы пишите в карточке, а чтобы секция об этом узнала, то вам необходимое использовать песочницу (сообщения). О песочнице читайте здесь:
http://www.community.terrasoft.ru/forum/topic/15210
Алгоритм:
Сохраняется карточка, в методе onSaved делаете публикацию сообщения.
В секции слушаете это сообщение и делаете reloadGridData

а разве нельзя переписать существующую функцию, ту что обновляет данные из колонок?

А как она узнает что запись изменилась? Никак, для этого и нужна песочница(сообщения).

"Радчук Виталий Владимирович" написал:

а разве нельзя переписать существующую функцию, ту что обновляет данные из колонок?


Можно попробовать переопределить метод onCardModuleResponse в нужной схеме раздела (вычислил путем отладки). Этот метод изначально объявлен в схеме NUI.BaseSectionV2 и выглядит следующим образом (взял пример из 7.6):

	/**
	 * Обрабатывает ответ карточки после сохранения записи.
	 * @param {Object} response
	 * @return {Boolean}
	 */
	onCardModuleResponse: function(response) {
		this.set("IsCardInChain", response.isInChain);
		this.loadGridDataRecord(response.primaryColumnValue);
		return true;
	}

У метода loadGridDataRecord вторым параметром можно передать callback метод, который выполнится после обновления полей активной записи грида полями из сохраненной карточки редактирования этой записи. В этом callback-методе и проверять значение нужной вам колонки и менять подсветку записи при необходимости.

Пример реализации, если взять, что цвет записи в гриде зависит от значения кастомного поля TsSpecialFeature:

	/**
	 * Обрабатывает ответ карточки после сохранения записи.
	 * @overridden
	 * @param {Object} response
	 * @return {Boolean}
	 */
	onCardModuleResponse: function(response) {
		this.set("IsCardInChain", response.isInChain);
		this.loadGridDataRecord(response.primaryColumnValue, this.onCardModuleResponseCallback);
		return true;
	},
	/**
	 * Callback-функция обработки результата перечитывания указанной записи из базы данных
	 * @protected
	 */
	onCardModuleResponseCallback: function() {
		var activeRow = this.getActiveRow();
		if (activeRow) {
			var tsSpecialFeature = activeRow.get("TsSpecialFeature");
			if (tsSpecialFeature &&
				tsSpecialFeature.value !== TSCConstants.TsSpecialFeature.None.value) {
				activeRow.customStyle = { "background-color": lightTomatoColor};
			} else {
				activeRow.customStyle = null;
			}
		}
	}
Показать все комментарии

Здравствуйте в Активностях у нас есть новое поле с типом ДАТА. Менеджеры привыкли не вносить дату, а копировать с открытого источника. Вот только проблема, дата там указана в формате dd.mm.yy, а не dd.mm.yyyy. Если копировать и вставить - сайт не меняет формат на нужный. Что можете посоветовать?

Нравится

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

"Полищук Виталий Романович" написал:Что можете посоветовать?

Правильно заполнять дату.

Ну или сделать onChange ивент поля с датой и в функции форматировать значение (первое что приходит в голову). Плюс где-то в коде я видел пример formatter в controlConfig-е... Не могу вспомнить точно, но можно в этом направлении покопать.

Тоже у многих пользователей есть желание вводить дату быстро и просто - без разделителей, а иногда и без года...
Например, 04042017 или 0404

Но, как понимаю, это невозможно в принципе?

Добрый день, Владимир!

К сожалению, сейчас вариантов замещения данной логики нет. Единственный вариант быстро ввести дату - выбрать из маленького календаря.

Ну, или сделать строковое поле для редактирования, а дату вытягивать из него программно (на клиенте, на объекте или на триггере) и писать в другое поле типа «дата».

"Зверев Александр" написал:Ну, или сделать строковое поле для редактирования, а дату вытягивать из него программно (на клиенте, на объекте или на триггере) и писать в другое поле типа «дата».

Да, в критических местах уже сделали. Но тогда пропадает "календарик" :D

Поле с календарём тоже можно вытянуть на эту карточку и синхронизировать с текстовым в обе стороны.

"Зверев Александр" написал:Поле с календарём тоже можно вытянуть на эту карточку и синхронизировать с текстовым в обе стороны.

Брррр, как-то это не о лучшей CRM-системе :)

Всё предусмотреть невозможно. Кто-то захочет вводить дату в виде «04042017», кто-то UNIX-время, кто-то по юлианскому или другому альтернативному календарю, хоть римскими цифрами от основания Города.
Если такой механизм нужен многим, его могут реализовать в новых версиях.

Что-то вы понавыдумывали костылей, господа)
Почему не сделать свой модуль:

define("TmDateEdit", ["DateEdit"], function() {
 
	Ext.define("Terrasoft.controls.TmDateEdit", {
		extend: "Terrasoft.DateEdit",
		alternateClassName: "Terrasoft.TmDateEdit",
 
		tryParseDate: function (a, b, c) {
			try {
				debugger;
				return Terrasoft.parseDate(a, b, c);
			} catch (d) {
				return console.warn(d);
			}
		}
	});
 
});

Далее переопределить ViewGeneratorV2, чтобы он генерил TmDateEdit вместо DateEdit,
и тут

return Terrasoft.parseDate(a, b, c);

возвращать всё, что нам угодно и как угодно форматировать(по-умолчанию он парсит через Ext.Date.parse).

"Варфоломеев Данила" написал:

Что-то вы понавыдумывали костылей, господа)

Почему не сделать свой модуль:

define("TmDateEdit", ["DateEdit"], function() {



        Ext.define("Terrasoft.controls.TmDateEdit", {

                extend: "Terrasoft.DateEdit",

                alternateClassName: "Terrasoft.TmDateEdit",

               

                tryParseDate: function (a, b, c) {

                        try {

                                debugger;

                                return Terrasoft.parseDate(a, b, c);

                        } catch (d) {

                                return console.warn(d);

                        }

                }

        });



});

Далее переопределить ViewGeneratorV2, чтобы он генерил TmDateEdit вместо DateEdit,

и тут

return Terrasoft.parseDate(a, b, c);

возвращать всё, что нам угодно и как угодно форматировать(по-умолчанию он парсит через Ext.Date.parse).


Добрый день. А не могли бы Вы подсказать как переопределить ViewGeneratorV2?

"Сурмачевский Евгений Александрович" написал: А не могли бы Вы подсказать как переопределить ViewGeneratorV2?

Создать замещающую схему, родитель "Генератор представления", из ViewGeneratorV2 перекопировать все методы и ресурсы, сохранить

Владимир Соколов пишет:

Тоже у многих пользователей есть желание вводить дату быстро и просто - без разделителей, а иногда и без года... Например, 04042017 или 0404Но, как понимаю, это невозможно в принципе?

в 7.11.3 заметил, что пожелание реализовали! Круто, на самом деле! 

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

Добрый день!

Пытаемся настроить FishEye на работу с нашим SVN-хранилищем с целью проведения ревью кода. Столкнулись с такой проблемой: при фиксации пакета в хранилище файлы с кодом схем (metadata.json) фиксируются со свойством svn:mime-type = application/octet-stream. В результате чего FishEye видит данные файлы как binary, не позволяя увидеть diff между версиями. Подскажите, пожалуйста, каким образом можно обойти данный момент? Может где-то в конфигах есть возможность указать какой тип использовать? И можно ли как-то добиться построчного отображения разницы между файлами? Оперировать одной большой строкой метаданных в целях ревью крайне неудобно...

Заранее признателен за Вашу помощь!

Нравится

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

Тут пишут, как добавить свой тип.

"Зверев Александр" написал:

Тут пишут, как добавить свой тип.


Спасибо, но проблема не в том чтобы добавить свой тип. В конфигурационном файле FishEye этот тип есть. Суть в том, что FishEye, по всей видимости, интерпретирует как бинарные файлы, которые попадают в SVN после фиксации пакета в хранилище. Я так понимаю, bpm выставляет им соответствующее свойства при фиксации.

А проблема только в FishEye или во всех SVN-клиентах?

"Зверев Александр" написал:

А проблема только в FishEye или во всех SVN-клиентах?


Я пробовал смотреть diff, используя TortoiseSVN. В нем разницу видно (правда, все в том же слабочитаемом однострочном виде), т.е. его, по все видимости, этот атрибут svn:mime-type = application/octet-stream его не смущает. А вот FishEye, видимо, анализирует этот атрибут и не дает возможности построчно просматривать изменения, т.к. считает файл бинарным.

Здравствуйте!

Сейчас metadata.json не является mergeable. В планах на следующий релиз (7.10 и выше) привести его к mergeable виду.
Пока мы позволяем сравнивать .cs, .less, .js-файлы.

"Сергей Кy6риш" написал:

Здравствуйте!

Сейчас metadata.json не является mergeable. В планах на следующий релиз (7.10 и выше) привести его к mergeable виду.

Пока мы позволяем сравнивать .cs, .less, .js-файлы.

С уважением,

Группа компаний Terrasoft


Сергей, большое спасибо за ответ! Но неужели нет возможности обойти данное ограничение каким-либо образом. В конце концов, в Вашей компании ведется непрерывная и активная разработка в рамках 7.7. и процесс ревью кода наверняка отлажен. Может поделитесь секретом?) ну или намекните как можно грамотно организовать данный процесс.

Большой спасибо!

Добрый день!

Никакого секрета здесь нет:) У нас в метаданные напрямую изменения не вносятся.

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

Здравствуйте! Подскажите, пожалуйста, можно ли стандартными средствами скрывать/отображать детали на страницах редактирования в зависимости от значения в справочном поле ?

Нравится

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

Добрый день!

Подскажите, как лучше выполнить импорт данных из Access. Кроме обычных данных, таблицы содержат BLOB-поля. Каким образом их лучше всего перенести в bpm'online?

Спасибо!

Нравится

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

Если у Вас on-site, то можно в SQL Management Studio подключиться к Access как к linked-серверу и перенести данные SQL-запросами.

Владимир,

В случае наличия в Access только обычных данных, достаточно выполнить экспорт в MS Excel и последующих пользовательский импорт из MS Excel в bpm'online.
Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

"Бондарь Наталия" написал:Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

А если это on-demand, то можно подключиться к СУБД через какой-нибудь VPN или еще как?

"Владимир Соколов" написал:
Бондарь Наталия пишет:

Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

А если это on-demand, то можно подключиться к СУБД через какой-нибудь VPN или еще как?

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

Можно залить данные в свою базу с копией таблиц боевой базы с идентичной структурой. А потом передать её и попросить перенести, приложив SQL-запросы с Insert-Select по этим таблицам.

"Зверев Александр" написал:Можно залить данные в свою базу с копией таблиц боевой базы с идентичной структурой. А потом передать её и попросить перенести, приложив SQL-запросы с Insert-Select по этим таблицам

Да, при первоначальном импорте так и поступим - попросим базу, проимпортируем, вернем обратно. Спасибо за помощь!

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

Добрый день. Стоит задача сделать справочник с отображением в виде списка. Изначально справочник был со страницей редактирования, когда ставлю галочку для отображения в виде списка в объекте то в карточке из справочника пропадают все значения.

Нравится

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

Здравствуйте, Александр.

Данное поведение не может быть связано с зарегистрированной страницей редактирования для объекта справочника. Вам стоит смотреть в сторону "Первичной для отображения колонки" объекта, поскольку именно из нее берутся значения для выпадающего списка. Так же проверьте ошибки консоли.

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

Здравствуйте.
Необходимо добавить на грид детали кнопку. Причем нужно, чтобы кнопка отображалась только на записях, у которых в определенной колонке имеется определенное значение.
На Комьюнити нашел пример для управления видимостью кнопок на реестре раздела. https://community.terrasoft.ru/forum/topic/15313
Однако в детали у меня этот пример не заработал. Вот мой код.

 

define("Schema3Detail", [], function() {
        return {
                entitySchemaName: "FinApplicationSettings",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
                        {
                                "operation": "merge",
                                "name": "DataGrid",
                                "values": {
                                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                                        "activeRowActions": []
                                }
                        },
                        {
                                "operation": "insert",
                                "name": "Choose",
                                "parentName": "DataGrid",
                                "propertyName": "activeRowActions",
                                "values": {
                                        "className": "Terrasoft.Button",
                                        "style": this.Terrasoft.controls.ButtonEnums.style.GREEN,
                                        "tag": "choose",
                                        "caption": "Выбрать",
                                        "visible": {"bindTo": "getChooseButtonVisible"}
                                }
                        }              
                ]/**SCHEMA_DIFF*/,
                methods:{
                               
                                addColumnLink: function(item) {
                                        debugger;
                    var self = this;
                    item.getChooseButtonVisible = function() {
                        return self.getChooseButtonVisible.call(self, this.get(this.primaryColumnName));
                    };
                    return this.callParent(arguments);
                },
                               
                                getChooseButtonVisible: function(activeRow) {
                                        debugger;
                                        if (!activeRow) return true;
                                        var settingsSource = this.get("GridData").get(activeRow).get("FinAppSettSource");
                                        return settingsSource && settingsSource.value == 'e7769f6c-d688-40a3-a609-e794ac5f862a' ? true : false;
                                }
        };
});

 

Нравится

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

Здравствуйте, Андрей.

Реестр детали не предназначен для добавления в него Action buttton. Рекомендую Вам добавлять кнопку указывая родительским элементом Detail. В данном случае кнопка будет отображаться возле кнопок добавления записи и меню детали.

Свойство visible детали необходимо привязать к атрибуту булевого типа. Само же значение атрибута необходимо менять в зависимости от значений выделенной строки.

Пример:

define("UsrSchema6Detail", [], function() {
	return {
		entitySchemaName: "UsrTestTest",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "TestButton",
				"parentName": "Detail",
				"propertyName": "tools",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"click": {"bindTo": "testClick"},
					"visible": {bindTo: "IsButtonVisible"},
					"enabled": true,
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"caption": "Test button"
				}
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			testClick: function() {
				console.log("click");
			},
			onActiveRowChange: function() {
				var gridData = this.getGridData();
				var activeRow = this.get("ActiveRow");
				if(gridData && activeRow) {
					var currentRow = gridData.get(activeRow); 
					this.set("IsButtonVisible", currentRow && currentRow.get("UsrSTRING") === '111');
					return;
				}
				this.set("IsButtonVisible", false)
			},
		},
		attributes: {
			IsButtonVisible: {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				dependencies: [{
					columns: ["ActiveRow"],
					methodName: "onActiveRowChange"
				}],
				value: false
			}
		}
	};
});

Если же Вам необходимо добавить кнопку в сам грид, рекомендую Вам смотреть в схему BaseSectionV2 и делать по аналогии.

Илья, спасибо за ответ.
Вариант с кнопкой в заглавии детали не подходит, так как количество записей в детали может быть весьма большим. Поэтому желателен вариант именно с кнопкой на гриде. Кстати, забыл упомянуть, что debugger в методах addColumnLink и getChooseButtonVisible не срабатывают при выборе активной строки.

Для добавления кнопок в реестр, Вам стоит смотреть в сторону изменения DataGrid в схеме детали. К примеру, в секции (BaseSectionV2) он добавлен следующим образом:

{
					"operation": "insert",
					"name": "DataGrid",
					"parentName": "DataGridContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID,
						"type": {"bindTo": "GridType"},
						"listedZebra": true,
						"activeRow": {"bindTo": "ActiveRow"},
						"collection": {"bindTo": "GridData"},
						"isEmpty": {"bindTo": "IsGridEmpty"},
						"isLoading": {"bindTo": "IsGridLoading"},
						"multiSelect": {"bindTo": "MultiSelect"},
						"primaryColumnName": "Id",
						"selectedRows": {"bindTo": "SelectedRows"},
						"sortColumn": {"bindTo": "sortColumn"},
						"sortColumnDirection": {"bindTo": "GridSortDirection"},
						"sortColumnIndex": {"bindTo": "SortColumnIndex"},
						"selectRow": {"bindTo": "rowSelected"},
						"canExecute": {"bindTo": "canBeDestroyed"},
						"linkClick": {"bindTo": "linkClicked"},
						"linkMouseOver": {"bindTo": "linkMouseOver"},
						"needLoadData": {"bindTo": "needLoadData"},
						"activeRowAction": {"bindTo": "onActiveRowAction"},
						"activeRowActions": [],
						"getEmptyMessageConfig": {"bindTo": "prepareEmptyGridMessageConfig"}
					}
				},

, а для деталей (BaseGridDetailV2)

								{
					"operation": "insert",
					"name": "DataGrid",
					"parentName": "Detail",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.GRID,
						"listedZebra": true,
						"collection": {"bindTo": "Collection"},
						"activeRow": {"bindTo": "ActiveRow"},
						"primaryColumnName": "Id",
						"isEmpty": {"bindTo": "IsGridEmpty"},
						"isLoading": {"bindTo": "IsGridLoading"},
						"multiSelect": {"bindTo": "MultiSelect"},
						"selectedRows": {"bindTo": "SelectedRows"},
						"sortColumn": {"bindTo": "sortColumn"},
						"sortColumnDirection": {"bindTo": "GridSortDirection"},
						"sortColumnIndex": {"bindTo": "SortColumnIndex"},
						"linkClick": {"bindTo": "linkClicked"}
					}
				},

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

Debbuger не отрабатывает по причине того, что сами методы не отрабатывают.

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

Или удалось как-то это победить?

Честно говоря, не помню чем тогда дело закончилось. Но сейчас, просматривая свой код, есть пара смущающих моментов. Во-первых метод addColumnLink  явно не тот, в который стоит добавлять эту логику, а надо, скорее всего, использовать такой метод, который срабатывает при выборе строки, а addColumnLink срабатывает при прогрузке данных, ну и второе: у деталей данные хранятся не в атрибуте GridData, а в атрибуте Collection

Владимир Соколов,

Посмотрите эту тему https://community.terrasoft.ru/questions/problemy-s-nastroikoi-razdela-…

Там они с разделом работали. Для детали нужно расширять класс BaseGridRowViewModel

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

Здравствуйте. Пользуюсь демоверсией. При публикации замещающего объекта, часто возникают ошибки

С чем это связано и как это избежать?

Нравится

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

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

Данные ошибки указывают на то, что на сервере, где развернуто приложение недостаточно места (памяти). Для решения текущей пролемы, необходимо очистсть временные файлы, удалить/перенести другие приложения/файлы или добавить память на сервер. Если приложение развернуто on-demand и такие ошибки компиляции повторяются часто, то для их устранения Вам необходимо обратится в службу поддержки - support@terrasoft.ru.

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