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



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



Вроде бы все должно работать, и значение поля CalculatedValue должно вычисляться после загрузки страницы и после изменения значений в полях TurnoverF и TurnoverP. Но реально изменение случается только при загрузке страницы - т.е. метод, прописанный в dependencies, не срабатывает. Почему?

entitySchemaName: "UsrTenant",
attributes: {
 "CalculatedValue": {
     dataValueType: Terrasoft.DataValueType.FLOAT,
     dependencies: {
       columns: ["TurnoverF", "TurnoverP"], 
       methodName: "calculateValue"
     }
  }
},
methods: {
  onEntityInitialized: function() {
    this.callParent(arguments);				
    this.calculateValue();
  },
  calculateValue: function() {
    var turnoverF = this.get("TurnoverF");
    if (!turnoverF) {
      turnoverF = 0;
    }
    var turnoverP = this.get("TurnoverP");
     if (!turnoverP) {
       turnoverP = 0;
     }				
    var result = (turnoverP === 0) ? 0 : (turnoverF / turnoverP - 1);
    this.set("CalculatedValue", result);
  }
},
diff : {
//.....................
{
  "operation": "insert",
  "name": "INT_TurnoverF",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 0,
      "row": 0,
      "layoutName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333"
    },
    "bindTo": "TurnoverF",
    "enabled": true
  },
  "parentName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333",
  "propertyName": "items",
  "index": 0
},
{
  "operation": "insert",
  "name": "INT_TurnoverP",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 12,
      "row": 0,
      "layoutName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333"
    },
    "bindTo": "TurnoverP",
    "enabled": true
  },
  "parentName": "Tab7ec5c1bfTabLabelGridLayout4f9aa333",
  "propertyName": "items",
  "index": 1
},
{
  "operation": "insert",
  "name": "INTCalculatedValue",
  "values": {
    "caption": "Вычисляемое поле",
    "bindTo": "CalculatedValue",
    "layout": {
      "column": 12, 
      "rowSpan": 1,
      "row": 4, 
      "layoutName": "Header",
      "colSpan": 9
    }
  },
  "parentName": "Header",
  "propertyName": "items",
  "enabled": true,
  "index": 9
},
//.....................
}

 

Нравится

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

Добрый день.

Попробуйте добавить квадратные скобки после dependencies, как на примере ниже:

	"dependencies": [
		{
			"columns": ["Patient"],
			"methodName": "setPatientFieldsValue"
		}
	]

 

Добрый день.

Попробуйте добавить квадратные скобки после dependencies, как на примере ниже:

	"dependencies": [
		{
			"columns": ["Patient"],
			"methodName": "setPatientFieldsValue"
		}
	]

 

Алла Савельева,

как и предполагалось, ошибка была абсолютно дурацкой...

Спасибо!

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

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

Если в блоке define модуля родителя уже есть список зависимых модулей при копировании в модуль - потомок они будут перенесены. Нужно ли их дополнительно вручную в блок dependencies в меню справа добавлять эти модули? Какая разница между разделом справа и просто списком в объявлении define?

Также, при добавлении элемента в LocalizableString в модуле-потомке с тем же именем, что и в модуле-родителе при компиляции появляются предупреждения со смыслом: переменная с таким именем уже существует и будет скрыта, измените имя переменной или используйте слово new для объявления новой. Как переносить данный раздел в замещающий модуль, если возникают данные ошибки?

Нравится

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

Евгения, добрый день!

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

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

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

Добрый день, Олег.

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

Спасибо

Евгения, добрый день!

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

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

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

Спасибо за ответ. Вопрос исчерпан.

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