Добрый день. Есть деталь от FileDetailV2, нужно сделать так, чтобы в зависимости от настроек, сделанных на странице редактирования, в детали показывалась кнопка "добавить". В детали я определяю атрибут:

"isAddVisible": {
   dataValueType: Terrasoft.DataValueType.BOOLEAN,
   type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
   value: true
}

и добавляю в diff:

{
  "operation": "merge",
  "name": "AddRecordButton",
  "values": {
    "visible": { bindTo: "isAddVisible" }
  }
}

В схеме страницы в diff определена деталь:

{
  "operation": "insert",
  "name": "UsrReportFileDetail",
    "values": {
      "itemType": 2,
      "markerValue": "added-detail",
      "isAddVisible": "false"
    },
    "parentName": "NotesAndFilesTab",
    "propertyName": "items",
    "index": 0
 }

В перспективе хотелось бы привязать isAddVisible к функции, возвращающей true или false в зависимости от статуса записи (стадии кейса). Но даже в таком виде код не работает: система применяет к кнопке на детали значение по умолчанию true, а не выставленное в странице редактирования значение false. Почему? 

Нравится

2 комментария
Лучший ответ

Кнопка видимости уже привязана к функции getAddRecordButtonVisible, можно заместить эту функцию. Если хотите привязать к своей функции, то bindTо указываете название свой функции. Вот как описано кнопка добавления в самой детали, в ней уже указана функция которое возвращает видимость.

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

Юрий, а зачем там «value: true» в свойствах атрибута? Он задаётся для виртуальных колонок с фиксированным значением, а для каждый раз вычисляемых  функцией — не нужен. Пример приводил в теме ниже.

 

А у Вас, насколько понял, ни то, ни другое, а передача значения извне. Не уверен, что именно так можно, не нашёл аналогичных примеров в «коробке». Если не указывать в самой детали, то будет брать со страницы или будет undefined?

 

Попробуйте передавать свой параметр не в diff, а как из карточки на её детали передают свойства вроде filterMethod или useRelationship:

details: /**SCHEMA_DETAILS*/{
...
	OpportunityContact: {
		schemaName: "OpportunityDetailV2",
		filter: {
			masterColumn: "Contact",
			detailColumn: "Contact"
		},
		defaultValues: {
			Contact: {
				masterColumn: "Contact"
			}
		},
		useRelationship: false,
		filterMethod: "opportunityAccountFilter",
		captionName: "CustomerOpportunitiesCaption"
	},

 

Кнопка видимости уже привязана к функции getAddRecordButtonVisible, можно заместить эту функцию. Если хотите привязать к своей функции, то bindTо указываете название свой функции. Вот как описано кнопка добавления в самой детали, в ней уже указана функция которое возвращает видимость.

{

                "operation": "merge",

                "name": "AddRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "tag": "addFileButton",

                    "fileUpload": true,

                    "filesSelected": {"bindTo": "onFileSelect"},

                    "click": {"bindTo": "onAddFileClick"},

                    "visible": {"bindTo": "getAddRecordButtonVisible"},

                    "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}

                }

            }

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

Добрый день!

Столкнулся с такой проблемой.

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

attributes: {
			"Contact": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					"filters": [
						function() {
							var apt = this.get("VcApartment");
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							filterGroup.add("IsActive",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.EQUAL,
									"[ContactAddress:Contact].VcApt",
									apt.value));
							return filterGroup;
						}
					]
				}
			}
		},

Фильтр отрабатывает нормально. Но если создать новое обращение из карточки Контакта, то  система зависает и в консоли появляется следующая ошибка: Uncaught TypeError: Cannot read property 'value' of undefined. 

Изображение удалено.

 Понятно что ошибка вылазит из за того что поле Квартира не заполнено. Но вот как обойти эту ошибку не могу понять. 

Нравится

2 комментария
Лучший ответ

Добрый день!

Можно так:

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var aptValue = apt && apt.value ? apt.value : "";
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							aptValue ));
					return filterGroup;
				}
			]
		}
	}
}

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

Если нужно отображать все контакты, то

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					if (apt) {
						filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							apt.value));
					}
					return filterGroup;
				}
			]
		}
	}
}

 

Добрый день!

Можно так:

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var aptValue = apt && apt.value ? apt.value : "";
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							aptValue ));
					return filterGroup;
				}
			]
		}
	}
}

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

Если нужно отображать все контакты, то

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					if (apt) {
						filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							apt.value));
					}
					return filterGroup;
				}
			]
		}
	}
}

 

Сидоров Александр В.,

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

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

Всем здравствуйте!

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

Нравится

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

Это называется фильтрация.

"Алейник Алексей Вадимович" написал:Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему.

Да. А потом у контрола, который нужно отфильтровать создаём обработчик события OnPrepareSelectWindow. Обработчик создаётся в левом нижнем блоке окна TSAdmin, на вкладке "События".

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

function edtOpportunityOnPrepareSelectWindow(LookupDataControl) {
	var TaskDataset = dlData.Dataset;
	var AccountID = GetFieldValueFromDisabledField(TaskDataset, 'AccountID');
	var OpportunityDataset = LookupDataControl.DataField.LookupDataset;
	var IsEnabled = (!IsEmptyValue(AccountID));
	ApplyDatasetFilter(OpportunityDataset, 'CustomerID', AccountID, IsEnabled);
}

Пример взят из scr_TaskEdit.

Сделал всё по аналогии. В результате: при вызове функции ApplyDatasetFilter() ошибка небработанного исключения (см. приложенный скриншот).

Возможно, не всё правильно в SelectQuery. Там должны быть и фильтр, и параметр с одинаковыми названиями.

Взгляните пожалуйста на скриншоты SelectQuery, может быть это внесёт ясность и поможет найти у меня ошибку

Вроде бы правильно. А скрипт?

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

function edtPaymentsDetailIDOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
	//TODO
	var OrderDataset = dlData.Dataset;
    var ConsigneeID = GetFieldValueFromDisabledField(OrderDataset, 'ConsigneeID');
    var PaymentsDetailDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(ConsigneeID));
    ApplyDatasetFilter(PaymentsDetailDataset, 'CustomerID', ConsigneeID, IsEnabled);
}

А почему фильтр 'CustomerID', а не 'ConsigneeID'?

О, не заметил, спасибо!

Исправил, но к сожалению, ошибка та же: необработанное исключение

Значит, что-то ещё не заметили. Можете в отладчике дойти до момента свала, последовательно заходя в функции и заметить, где "что-то пошло не так". Или в момент свала посмотреть стек вызова функций.

В тех. поддержке подсказали, в чём проблема. Я передавал в функцию ApplyDatasetFilter() вторым параметром название несуществующего параметра SQL-запроса. Первый параметр этой функции - это исходный датасет (в моём случае - AccounBilllingInfo), из которого выбирается параметр SQL-запроса (в моём случае - AccountID). А это значит, что текст моего скрипта должен был выглядеть вот так:

function edtPaymentsDetailIDOnPrepareSelectWindow(LookupDataControl) {
    var OrderDataset = dlData.Dataset;
    var ConsigneeID = GetFieldValueFromDisabledField(OrderDataset, 'ConsigneeID');
    var PaymentsDetailDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(ConsigneeID));
    ApplyDatasetFilter(PaymentsDetailDataset, 'AccountID', ConsigneeID, IsEnabled);
}

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

Да, все равно, спасибо Вам большое, Вы мне очень помогли:twisted:

Стал переносить логику из тестовой конфигурации на рабочую. В результате заимел ошибки при добавлении новой заявки через действие "Резервирование/Заявка" в разделе счета и через добавление кнопкой "Добавить" из раздела "Заявки" (см. скриншот add.png). Скрипты тестовой и рабочей конфигураций полностью совпадают. Остальные сервисы также тщательно сверил, но ошибку найти никак не могу. Проблема ещё в том, что не до конца понятно, как пользоваться MS Editor для отладки. Документации по нему почти никакой нету.
Может кто поможет мне локализовать ошибку, где её искать? Заранее благодарен.

Судя по скриншоту, в SelectQuery не добавлена колонка DocumentName или в Dataset-е для этого поля не прописано значение колонки для отображения.

Действительно! Почему-то очистилось несколько полей отображения в датасете. Спасибо!

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

function edtContractIDOnPrepareSelectWindow(LookupDataControl) {//обработчик поля "Договор"
	//TODO
	var OrderDataset = dlData.Dataset;
    var InvoiceID = GetFieldValueFromDisabledField(OrderDataset, 'InvoiceID');
	var InvoiceID = OrderDataset.Values('InvoiceID');
    var ContractDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(InvoiceID));
    ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled);   
//    debugger;
}
 
function edtDocumentIDOnPrepareSelectWindow(LookupDataControl) {//обработчик поля "Документ"
	//TODO
	var OrderDataset = dlData.Dataset;
    var InvoiceID = GetFieldValueFromDisabledField(OrderDataset, 'InvoiceID');
    var DocumentDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(InvoiceID));
    ApplyDatasetFilter(DocumentDataset, 'ID', InvoiceID, IsEnabled);
//    debugger;
}

"Алейник Алексей Вадимович" написал:

ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled); 


Вам нужен фильтр не 'ID', а какой-то другой. Возможно, 'InvoiceID'.

"Зверев Александр" написал:
Алейник Алексей Вадимович пишет:

ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled);

Вам нужен фильтр не 'ID', а какой-то другой. Возможно, 'InvoiceID'.


Взгляните сами - все эти поля есть в стандартной конфигурации. Я попробовал заменить 'ID' на 'InvoiceID' и, как я и предполагал, террасофт выдал ошибку о том в SelectQuery запрашиваемого датасета (в моём случае, как видно из скриншота invoice2.png этим датасетом является ds_Invoice, а SelectQuery - sq_Invoice) нет такого параметра.

Фильтр 'ID' - это фильтр по ID, как это ни странно. Сейчас вы хотите найти те документы, у которых ID совпадает с ID выбранного счёта. Естественно, таких нет.

Нужно добавить фильтр 'InvoiceID' в sq_Contract и sq_Document, если там такого ещё нет.

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

Здравствуйте!!
необходимо добавить доп атрибуты на грид. Чтобы открыть этот грид нужно совершить цепочку действий: Раздел "Контрагенты" - деталь "Платежные реквизиты" - там где атрибут Банк и нарисована лупа - т.о. открывается необходимый грид под названием "Выбор банка", на нем я хочу добавить атриуты "БИК" и "КорСчет". В администраторе я перерыла все классы и просмотрела почти все гриды, но не нашла то что мне нужно. Подскажите пожалуйста, каким образом я могу добавить атрибут.

С уважением, Гашникова Екатерина

Нравится

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

Спасибо!!

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