Здравствуйте.
Необходимо добавить на грид детали кнопку. Причем нужно, чтобы кнопка отображалась только на записях, у которых в определенной колонке имеется определенное значение.
На Комьюнити нашел пример для управления видимостью кнопок на реестре раздела. 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

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

Добрый день!

Есть ли обработчик наведения на заголовок грида?

ЗАДАЧА: нужно при наведении на заголовок (название колонки) грида отображать расширенное наименование названия.
ПРИМЕР: Наименование колонки "Ответственный", всплывающий текст при наведении "Сотрудник, который отвечает за заказы данного клиента" .

Спасибо.

Нравится

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

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

Какую версию клиента Террасофт Вы используете?

"Резниченко Сергей" написал:

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

Какую версию клиента Террасофт Вы используете?

Сергей, добрый день!
Версия с билдом 3.4.1.171 (правда у большинства пользователей стоит билд 91 :sad: )

Добрый день, AleXS!

Начиная с версии 3.4.0.63 у большинства компонентов системы появилось свойство Hint. Но для колонки грида у меня не получилось его добавить. Я передал вопрос коллегам из департамента разработки, для того чтобы прояснить ситуацию с данным функционалом. По результатам сразу напишу.

"Резниченко Сергей" написал:По результатам сразу напишу.

Спасибо, Сергей! Очень жду...

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

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

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

Добрый день

В окне есть DataGrid, привязанный к набору данных A. Под DataGrid'ом есть WindowContainer внутри которого есть DataGrid привязанный к набору данных B.
Набор данных B основан на мудрёном запросе на выборку, основанном на приличном количестве таблиц.

Прошу пояснить как осуществляется процесс добавления записи из набора A в набор B и отобразить сие действо в DataGrid'е окна контейнера.

Делаю следующие шаги.
1. Беру запись из набора A
2. Беру набор B (

var B = Services.GetNewItemByUSI('B');
)
3. Определяю поля и значения
var Fields = new Array(...);
var Values = new Array(...);

4. Использую
AppendRecordInDataset(B, Fields, Values, true);

Прошу помощи в понимании данного процесса.

1. Добавление из A в B.
2. Обновление DataGrid для отображения того что добавили.

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

Нравится

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

Как я полагаю, надо слать Notify. Вопрос чему - Окну (и там проводить обработку) или Набору данных?

Если есть наборы данных А и В, привязанные через DatasetLink к соответствующим гридам и необходимо скопировать выделенную запись из А в В, то нужно:
var Fields = new Array(имена полей, которые копируем);
var Values = new Array(значение из набора данных А (например, А('Поле1') и т.д.));
AppendRecordInDataset(B, Fields, Values, true);
B.RefreshRecord(B('ID'), true);

Если наборы данных находятся в разных окнах, то надо слать Notify окну, в котором В, а в качестве данных передать набор данных А. Функии копирования поместить в обработку OnNotify окна с В.

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

Подскажите плс, каким образом можно получить набор selected строк в datagrid?

Нравится

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

Валентин, здравствуйте.

Если Ваш грид унаследован от wnd_BaseGridArea, то можно вот так:

var SelectedIDs = Window.ComponentsByName('grdData').SelectedIDs.CommaText.split(',');

В итоге SelectedIDs - массив идентификаторов.

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

Как то можно повлиять на выгрузку в Excel из DataGrid? Не устраивает как даты выгружаются, хотелось бы дописать логику выгрузки. Еще есть необходимость проставлять типы ячеек.

Нравится

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

Здравствуйте, Михаил Евгеньевич!

Механизм экспорта записей из реестра в MS Excel реализован на уровне ядра приложения Terrasoft.

В связи с этим, возможности внести конфигурационные изменения в него нет.

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

Что нужно сделать, что бы DataGrid уже привязанный к DataSet даталинка отобразил данные. В любом месте проинициализировать DataSet и DataGrid автоматом все отобразит(колонки настроены)?

P.S. вопрос решен, действительно нужно просто правильно DataSet инициализировать

Нравится

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

На OnPrepare грида пропишите

scr_BaseGridArea.wnd_BaseGridAreaOnPrepare(Window);

И автоматом все будет отображать.

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

Доброго времени суток.
Вопрос у меня такой.
Как сделать добавление записи в DataGrid с несколькими полями, одна из которых берется из справочника.
Справочник уже создан.
DataGrid с 2 записями 1 название, 2 тип(берется из справочника).
DataGrid тоже создан. Под ним 2-а соответствующих поля для ввода. При изменении поля название, автоматически добавляется запись.
Но при попытке выбрать тип из выпадающего списка происходит зависание системы.
Дебагер ругается на Nulll в поле типа.
В чем может быть причина?

Нравится

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

Илья, если я правильно поняла, при заполнении карточки редактирования (создание записи), а именно при попытке выбора значения из поля [Тип] приложение зависает.
Вам необходимо проверить:
- Корректно ли указали свойства поля в датасет (поле для поиска и поле для отображения)
/system/files/_1__4.png
- Заполнено ли первичное поле для отображения в таблице и датасете справочника:
/system/files/_2__1.png

Спасибо, уже разобрался. :smile:
Есть другой вопрос касательно

 RefreshCommonDetail(BaseWorkspace, wndSolutionsDetail, 'IncidentID',
'IncidentID', '', '', '', AlwaysRefresh);

Можете в общем виде описать принцип обновления детали, и атрибуты вызываемой функции RefreshCommonDetail();

Функция RefreshCommonDetail предназначена для обновления детали раздела.
Параметры функции:
BaseWorkspace – рабочее пространство раздела, деталь которого будет обновляться.
WindowContainer – окно детали (например, wndAnniversariesDetail).
ParentItemFieldName – название поля, являющего родительским со стороны раздела по отношению к детали (например, в случае детали «Знаменательные события» раздела [Контрагенты] – это поле 'AccountID').
ChildFilterName – название фильтра, по которому будут фильтроваться записи детали.
DatasetUSI – USI датасета детали.
EditWindowUSI – USI карточки редактирования детали.
AdditionalAttributes – дополнительные атрибуты.
AlwaysRefresh – признак, указывающий на то, всегда ли будет обновляться деталь (независимо от внесения изменений в родительскую запись).
SimpleRefresh – признак, указывающий на то, что нужно выполнять простое обновление (посредством закрытия-открытия датасета детали).
ParentItemID – идентификатор родительской записи.
DoNotDisableAllFilters – признак, указывающий следует или нет отключать все фильтры запроса детали перед фильтрацией по ParentItemID.
DatasetAdditionalAttributes – дополнительные атрибуты датасета детали.

Принцип работы функции:

1. Выполняется проверка проинициализирована ли деталь. Если деталь не была проинициализирована, тогда в атрибуты окна детали записываются значения: USI карточки редактирования детали (EditWindowUSI), USI датасета детали (DatasetUSI), название поля, являющего родительским со стороны раздела по отношению к детали (ParentItemFieldName), дополнительные атрибуты.
2. Считывается значение идентификатора родительской записи (ParentID). Если рабочее пространства (BaseWorkspace) определено, ParentID устанавливается равным идентификатору выделенной записи реестра, в обратном случае – берется из параметра функции.
3. Если ParentID не изменялся (не менялся фокус записи в реестре) и параметр AlwaysRefresh равен false, происходит выход из функции без обновления датасета детали. В обратном случае считывается датасет детали и выполняется его обновление.

В стандартном случае при вызове функции достаточно определить 4 параметра, например:

RefreshCommonDetail(BaseWorkspace, wndProjectDetail, 'ClientID', 'ClientID');

Пример вызова функции с 6 определенными параметрами:

RefreshCommonDetail(BaseWorkspace, wndAnniversariesDetail,
'AccountID', 'AccountID', 'ds_AccountAnniversary', 'wnd_AnniversaryEdit');

Спасибо большое, буду разбираться.

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

1. Выставляю значения OrderPosition столбцов в DataGrid, меняю их порядок с помощью стрелочек - но в клиенте порядок столбцов не меняется. Как это исправить?
2. Ставлю значение поля IsVisible = false, но в клиенте это поле всё равно отображается. Как это исправить?

Нравится

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

Кэш и профиль чистили?

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

Кэш и профиль чистили?


Нет, а как?

Нашёл:
C:\Documents and Settings\UserName\Application Data\Terrasoft\3.4.0\Cache
C:\Documents and Settings\UserName\Application Data\Terrasoft\3.4.0\Profile

И помогло?

Добрый день!
Я делал так:
1) Закрыл клиентское ПО вместе с TSAdmin.
2) Очистил папку %appdata%\Terrasoft\3.4.0\Profile\
3) В TSAdmin внес изменения.
4) Запустил клиента.

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

И помогло?


Да!

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

Добрый день!
В DataGrid есть колонка "Действует по" - тип данных "Дата".
Если это поле не заполнено, как мне вывести в ячейке DataGrid'a значение "по настоящее время", не меняя его в БД?

Нравится

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

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

Я бы порекомендовал создать в датасете вычисляемое поле. А на событии OnDatasetCalcFields, в зависимости от значения в поле "Действует по", заполнять данное поле либо "по настоящее время", либо самим значением "Действует по".
Далее, просто вытяните в реестр данную колонку, сработает событие OnDatasetCalcFields - и вы получите нужный результат.
Саму же колонку "Действует по" с реестра можно убрать.

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

Всплывающие подсказки для заголовков столбцов DataGrid-а не отображаются, если DataGrid.IsMultiLineHeader=true. Для ячеек подсказки отображаются. При IsMultiLineHeader=false всё работает отлично.
Для примера: поле набора данных имеет заголовок "Рентабельность, %" и многострочный заголовок "Общие|Рентабельность, %".
Без подсказок к заголовкам столбцов возникает определенное неудобство. Есть решение?

Нравится

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

Добрый день, Антон.

Проблема решаема. Передал Ваше обращение в отдел разработки.
Зарегистрирован инцидент под номером: 0124065.
Чуть позже, можно будет узнать о сроках решения.
Исправления войдут в следующую сборку бинарных файлов, ссылку на скачивание можно будет получить обратившись в службу поддержки по адресу support@terrasoft.ru

Отлично! Спасибо.

На сегодня особенно для меня актуален новый билд для XRM 3.4.

Добрый день, Антон!
К концу текущей недели планируется выход новой сборки бинарных файлов версии 3.4.0.
Исправления войдут в сборку 3.4.0.144.
Приятной работы!

Доброго времени суток, Антон!
Готова новая сборка приложения 3.4.0.144 c исправлением ошибки.
Для получения ссылки на скачивание обратитесь, пожалуйста, в службу поддержки по адресу support@terrasoft.ru

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