Вопрос

Здравствуйте, в детали [Амбулаторная карточка] есть поле [ФИО Врача] и поле [Специализация Врача]. Нужно вывести [Специализацию Врача] из установленного поля [Фио Врача]. Врач-это контакт и у него уже есть поле Специализации. Везде описывают кейс с числовыми значениями, но вывод из БД нигде нет. Буду очень благодарен, если подскажите.

У меня такой же вопрос

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

Все можно проще сделать укажите чтоб для доктора вычитывались колонки ФИО и Специлизация и используйте их!

"UsrDoctor": {
  lookupListConfig: {
   columns: ["FIO","UsrDoctorsSpecialization"]
  }
 },

После єтого можно обращатся к полю как UsrDoctor.UsrDoctorsSpecialization

Если я правильно понял, то надо сделать вот так:

attributes: {
//Здесь мы "смотрим" внутрь справочного поля [UsrDoctor], которое ссылается на раздел [Контакты]
//и ищем там специализацию [UsrDoctorsSpecialization]
 "UsrDoctor": {
  lookupListConfig: {
   columns: ["UsrDoctorsSpecialization"]
  }
 },
//Здесь мы вызываем метод, который будет устанавливать специализацию, когда пользователь 
//внесет изменения в поле [UsrDoctor]
 "UsrDoctorsSpecialization": {
  dependencies: [
   {
    columns: ["UsrDoctor"],
    methodName: "setDoctorsSpecializtion"
   }
  ]
 }
},
methods: {
//собственно метод, который устанавливает специализацию в нужное поле
//условие можно и изящней написать. Сделал так, чтобы было понятно.
 setDoctorsSpecializtion: function() {
  var doctor = this.get("UsrDoctor");
  if (doctor) {
   if (doctor.UsrDoctorsSpecialization) {
    this.set("UsrDoctorsSpecialization", doctor.UsrDoctorsSpecialization);
   }
   else {
    this.set("UsrDoctorsSpecialization", null);
   }
  } 
  else {
   this.set("UsrDoctorsSpecialization", null);
  }
 }
},

 

Все можно проще сделать укажите чтоб для доктора вычитывались колонки ФИО и Специлизация и используйте их!

"UsrDoctor": {
  lookupListConfig: {
   columns: ["FIO","UsrDoctorsSpecialization"]
  }
 },

После єтого можно обращатся к полю как UsrDoctor.UsrDoctorsSpecialization

Григорий Чех,

Вау, почему в документации еще нет этого способа?:)

Есть:

lookupListConfig — свойство, отвечающее за свойства поля-справочника. Подробнее об использовании данного параметра можно узнать из статьи "Применение фильтрации к справочным полям". Это конфигурационный объект, который может содержать в себе следующие опциональные свойства:

  • сolumns — массив имен колонок, которые будут добавлены к запросу дополнительно к колонке Id и первичной для отображения колонке.
  • orders — массив конфигурационных объектов, которые определяют сортировку данных при отображении.
  • filter — метод, возвращающий объект класса Terrasoft.BaseFilter или его наследника, который, в свою очередь, будет применен к запросу. Не может использоваться совместно со свойством filters.
  • filters — массив фильтров (методов, возвращающих коллекции класса Terrasoft.FilterGroup). Не может использоваться совместно со свойством filter.
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

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

Значение, получаемое из этой суммы, необходимо записать в отдельное поле в пользовательском разделе. Пробовал через процесс - не получилось.

Подскажите пожалуйста, как записать получаемое значение в поле и сделать его изменяемым, в зависимости от новых оплат

У меня такой же вопрос

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

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

Записать значение из дашборда в запись не получится. 

Данную задачу можна реализовать с помощью бизнес процесса. Логика работы будет следующая:
1) Стартовый сигнал добавление или изменение записи (можно реализовать как на добавление так и на изменение);
2)  С помощью элемента "Читать данные" считаем сумму оплат по определенному поставщику;
3) С помощью элемента "Изменить данные" записываем значение в необходимое поле.

 

Новак Руслан,

Скажите пожалуйста,

В элементе "Изменить данные" ставить условие Пользовательское поле в разделе=Читать данные проекта.Сумма оплаты поставщику ?

Просто раздел Проекты никак не связан с Пользовательским разделом, поэтому вопрос как связать?

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

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

Отвечаю на Ваши вопросы:

1) В принципе верно, но все зависит от того какую именно Вы хотите посчитать сумму.

2) А прямая связь и не нужна. К примеру если в пользовательском разделе и в проекте есть поле Поставщик, то можно выстроить связь таким образом.

3) Все зависит только от фильтра, который Вы установить в элементе "Читать данные". Т.е. можно посчитать как по одному поставщику, так и сразу по всем.

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

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

addItemsToGridData: function() {
    this.callParent(arguments);
	debugger;
	var gridDataItems = this.getGridData().getItems();
	gridDataItems.forEach(function(item) {
		item.set("IsUpdated", 1);
	});
.....

Можно ли в реестр вывести IsUpdated, чтобы пользователи его видели?

У меня такой же вопрос

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

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

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

Добрый день!

Столкнулся со следующей задачей: есть два поля datetime - UsrEnsFromDate и UsrPolisEndDate. Необходимо, чтобы при изменении UsrEnsFromDate, менялся и UsrPolisEndDate (UsrEnsFromDate+ 1 год - 1 день). С этим справился:

attributes: {
  "UsrPolisEndDate": {
    dataValueType: this.Terrasoft.DataValueType.DATE,
      dependencies: [
        {
           columns: ["UsrEnsFromDate"],
           methodName: "onUsrEnsFromDateChanged"
        }
      ]
  }
}

methods: {
  onUsrEnsFromDateChanged: function() {
    var toDate = this.Terrasoft.deepClone(this.get("UsrEnsFromDate"));
    toDate.setFullYear(toDate.getFullYear() + 1).setDate(toDate.getDate() - 1);
    if (!this.Ext.isDate(toDate)) {
      return;
    }
    this.set("UsrPolisEndDate", toDate);
  }
}

Далее, требуется при создании новой записи, заполнять поля значениями по умолчанию. UsrEnsFromDate = текущая дата, UsrPolisEndDate = UsrEnsFromDate+ 1 год - 1 день. Настроил для поля UsrEnsFromDate значение по умолчанию. Но, при этом не срабатывает заполнение зависимого поля UsrPolisEndDate :(

При ручной смене значения в поле UsrEnsFromDate - все работает прекрасно.

Подскажите, в какую сторону копать?

У меня такой же вопрос

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

О, спасибо!
Вторая ссылка - как раз мой случай :)

Войдите или зарегистрируйтесь, чтобы комментировать
Идея

Сделать возможность добавлять простые вычисляемые (отображаемые) поля (ссылающиеся на поле в связанном объекте) в мастере раздела. Навеяно топиком http://www.community.terrasoft.ua/forum/topic/11510

Одобрена
0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

В SDK bpm'online в подраздел "Примеры решения типовых задач" добавлены решения кейсов, связанных с разработкой пользовательского интерфейса и бизнес-логики приложения.
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте как:

Статьи расположены в разделе "Разработка конфигураций на платформе" в подразделе "Примеры решения типовых задач"

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Товарищи, это что же получается? Пишешь пишешь код, а тут бац - в модной 7ой версии не могу сделать отображаемое поле :( просветите, люди добрые примером что-ли?

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

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

Вот как это сделать в 2.х, 3.х, 5х знаю, а как в 7.х - не знаю...

У меня такой же вопрос

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

Интересный вопрос. Возможно, его можно решить с помощью Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN ?

"Салихов А" написал:Возможно его можно решить с помощью Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN ?

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

Возможно это поможет:

{
type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
name: 'ReverseAccountA',
caption: resources.localizableStrings.AccountCaption,
columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
dataValueType: Terrasoft.DataValueType.LOOKUP,
customConfig: {
	enabled: false
},
rules: [{
	ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
	property: BusinessRuleModule.enums.Property.VISIBLE,
	conditions: [{
		leftExpression: {
			type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
			attribute: 'RelationTypeFilter'
 
		},
		comparisonType: Terrasoft.core.enums.ComparisonType.EQUAL,
		rightExpression: {
			type: BusinessRuleModule.enums.ValueType.CONSTANT,
			value: 'Account'
		}
	}]
}],
dependencies: ['AccountB'],
methodName: 'setReverseAccountA'
},
......
 
 
		this.methods.setReverseAccountA = function() {
			var accountB = this.get('AccountB');
			if (accountB) {
				this.set('ReverseAccountA', accountB);
			} else {
				this.set('ReverseAccountA', null);
			}
		};

Нашел в RelationshipDetailPage

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

"Салихов А" написал:Нашел в RelationshipDetailPage

Вот так по кирпичикам может и решиться вопрос) Спасибо за наводку, покопаюсь там. Смущает только то, что это опять же реестр и его колонки - в него то можно и вьюшку сделать да из нее все тащить.

"Салихов А" написал:кроме как делать запрос в бд в методе и результат записывать в виртуальное поле

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

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

Скорее всего вопрос изначальный можно переформулировать - как создать на странице редактирования некое поле или визуальный объект типа label или ему подобный, и при этом не связывать его с данными. Создавать видимо надо кодом, так как мастер не предлагает ничего кроме полей данных.
Как назначить ему текст/значение/прочее в скрипте примеры есть.

"Александр Кудряшов" написал:Смущает только то, что это опять же реестр и его колонки - в него то можно и вьюшку сделать да из нее все тащить.

Не, это не реестр) Это страница редактирования записи детали, но не сама деталь.

"Салихов А" написал:Не, это не реестр) Это страница редактирования записи детали, но не сама деталь.

Так, пойду прямо сейчас читать код да разбираться с ней :smile:

Выложите потом результат, если все получится)

С помощью вот такой чудо конструкции создал label.

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "label_name",
	"values": {
		itemType: Terrasoft.ViewItemType.LABEL,
		"caption": "Test3",
		"layout": {
			"column": 10,
			"row": 5,
			"colSpan": 12,
			"rowSpan": 1
		}
	}
}

Дальше в общем то надо просто при открытии/обновлении писать туда нужный текст, вытащенный как угодно, запросом через EntityShemaQuery например.

Остался осадочек.
1. Terrasoft.ViewItemType.LABEL написал наугад, не нашел список возможных значений нигде, что лишний раз говорит о безобразном состоянии документации.
2. Это все ж label, а хотелось бы просто TextEdit (стандартно создается поле, где обязателен параметр bind to, а биндить то мне понятно некуда). Гадать, какой ViewItemType будет содержать нужное значение неохота.

Как доделаю полностью заполнение caption по событиям, выложу сюда.

"Александр Кудряшов" написал:1. Terrasoft.ViewItemType.LABEL написал наугад

А как же консоль браузера? Там можно вытащить все значения.

"Салихов А" написал:А как же консоль браузера? Там можно вытащить все значения.

Вот копаюсь сейчас там )) надо привыкать к семерке, мозг под нее подстраивать ))

Коллеги, постараюсь Вам помочь в Ваших мучениях)
В принципе, направление мысли правильное, только непонятно, для чего делать еще один запрос для получения значения дополнительного поля, если можно это сделать в уже текущем запросе (см. http://www.community.terrasoft.ru/forum/topic/10906).
В целом, решение добавления колонки "Альтернативное название контрагента" может выглядеть следующим образом:

attributes: {
	"Account": {
		lookupListConfig: {
			columns: ["AlternativeName"]
		}
	},
	"AccountAlternativeName": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
	}
},
methods: { 
	onEntityInitialized: function() {
		this.callParent();
		var account = this.get("Account");
		var accountAlternativeName = account ? account.AlternativeName : "";
		this.set("AccountAlternativeName", accountAlternativeName);
	}
}
diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"parentName": "Header",
		"propertyName": "items",
		"name": "AccountAlternativeName",
		"values": {
			"layout": {"column": 12, "row": 3, "colSpan": 12},
			"caption": "Альтернативное название контрагента" //лучше использовать локализированную строку
		}
	}
//...
]/**SCHEMA_DIFF*/

Андрей, огромное спасибо!
Добавил динамически меняющееся значение поля при изменении контрагента в карточке

methods: {
	getAccountCode: function() {
		var account = this.get("Account");
		var accountAlternativeName = account ? account.AlternativeName : "";
		this.set("AccountAlternativeName", accountAlternativeName);
	}
}
attributes: {
	"AccountAlternativeName": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		dependencies: [
			{
				columns: ["Account"],
				methodName: "getAccountCode"
			}
		]
	}
}

Использую динамические поля в детали...но потом не могу отобразить в виде колонок. Как это сделать?

"Юсупов Марат" написал:Использую динамические поля в детали...но потом не могу отобразить в виде колонок. Как это сделать?

А никак, в реестре вы можете вывести только физические колонки.

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

Необходимо иметь возможность сортировать/фильтровать список счетов по количеству дней просрочки с оплатой. Как это можно реализовать?

Спасибо.

У меня такой же вопрос

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

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

Спасибо. А как организовать ежедневный расчет?

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

Здравствуйте Сергей

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

         Date1 = new Date (Dataset.Values('ContractPayDate'));
         Date2 = new Date (Dataset.Values('PaymentDate'));
         Date3 = new Date();
         res = 0;
 
      if (Date1.getTime() == 0 ) {
                        res = 0
      } else {
            if (Date2.getTime() == 0) {
                        res = Math.floor((Date3.getTime() - Date1.getTime())/(1000*60*60*24))}
                  else {
                        res = Math.floor((Date2.getTime() - Date1.getTime())/(1000*60*60* 24))}
                                                        };

Предлагаю данную логику реализовать по средствам job на MS SQL Server 2008, как советует Олег

Как это сделать:
1. Логике описанной в блоке javascript соответсвует следующий Update

update tbl_invoice
set DelayCalc = ISNULL(DateDiff(minute,ContractPayDate,ISNULL(PaymentDate,{fn NOW()} )),0) 

Пояснения:
Если ContractPayDate не заполнено тогда Просрочка DelayCalc = 0
ContractPayDate -> Null ->DateDiff(minute,ContractPayDate,ISNULL(PaymentDate,{fn NOW()} )) = NULL
ISNULL(DateDiff(minute,ContractPayDate,ISNULL(PaymentDate,{fn NOW()} ))) = 0

Если PaymentDate не заполнено, тогда берем текущую дату высчитывем DelayCalc = ContractPayDate - ТекущаяДата в минутах
ISNULL(PaymentDate,{fn NOW()} )
{fn NOW()} - взять текущую дату
ISNULL - функция отработки в случае если 1й аргумент NULL (в данном случае PaymentDate), если не NULL функция возвращает само значение 1го аргумента (в данном случае PaymentDate)

Если заполено ContractPayDate и DelayCalc вычисляем DelayCalc = ContractPayDate - PaymentDate в минутах

Подробнее про DateDiff http://msdn.microsoft.com/en-us/library/ms189794.aspx

Коллеги, спасибо, будем пробовать

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

Уважаемые гуру, коллеги, товарищи!

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

Задачка простая вроде бы...
Создал такое в датасете ("SomeField", тип булевское). Добавляю на карточку BoolDataControl, пытаюсь назначить DataFieldName для контрола но тут же получаю сообщение в лог "Невозможно установить имя поля "SomeField" для компонента "BoolDataControl". Соответственно назначить не могу.

Направьте на путь истинный, либо в отпуск на отдых порекомендуйте если совершаю я где ошибку досадную - как же это поле все-таки сделать?

Terrasoft 3.3.2.215

У меня такой же вопрос

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

Попробовал TextDataControl - не выдает ошибок :) Будет выводить 0 или 1, а может и null.

"Кошкаров Андрей" написал:Будет выводить 0 или 1, а может и null.

Будет. TextDataControl работает всегда...
Но на дворе 2011 год, хотелось бы обойтись без CheckBox, в которую проставляем предварительно рассчитанную галочку, а нормальный BoolDataControl.

"Александр Кудряшов" написал:Будет. TextDataControl работает всегда...

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

"Валерий Андрусик" написал:Насколько я знаю, с вычисляемым полями умеет работать только TextDataControl, все остальные "ругаются", даже если подходят по типу...

Интересно, зачем тогда в пользовательском поле выбирается тип значения, если по этому типу нельзя потом добавить BoolDataControl в окне редактирования? ...

"Кошкаров Андрей" написал:Интересно, зачем тогда в пользовательском поле выбирается тип значения, если по этому типу нельзя потом добавить BoolDataControl в окне редактирования

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

[удаляюсь делать CheckBox]

Передали данный вопрос в отдел разработки.

Спасибо!

По данному вопросу, заведен запрос на изменение 106055, работы запланированы на конец августа

Инцидент выполнен.
Изменения войдут в сборку 3.3.2.222

Значит запросим обновление.. а что поправили - только булевское или вообще все типы вычисляемых полей?

Large Binary Object и Enum остались в том же виде, а остальные поля поправили

"Артем Гура" написал:
#11 Артем Гура 22 августа 2011 – 9:46

Large Binary Object и Enum остались в том же виде, а остальные поля поправили

расчехлим старую тему
3.4.0.104
В датасете создано вычисляемое поле с типом float
На карточке для FloatDataControl не могу назначить это поле. Для TextDataControl все прекрасно работает.
Баг?

Здравствуйте Александр!
Спасибо за ваше замечиние, данная проблема будет исправлена в следующей сборке бинарных файлах.

"Александр Кудряшов" написал:В датасете создано вычисляемое поле с типом float
На карточке для FloatDataControl не могу назначить это поле. Для TextDataControl все прекрасно работает.
Баг?

Процитирую сам себя
теперь и в версии 3.0.4.117

"Александр Кудряшов" написал:
Александр Кудряшов пишет:

В датасете создано вычисляемое поле с типом float
На карточке для FloatDataControl не могу назначить это поле. Для TextDataControl все прекрасно работает.
Баг?

Процитирую сам себя
теперь и в версии 3.0.4.117


Возможно 3.4.0.117?
Но не суть, так как изменения вошли в сборку 3.4.0.118+

Запросил обновление...
update: Подтверждаю, на 118 версии все работает как надо! Спасибо!

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

Добрый день!
Подскажите, почему не работает форматирование вычисляемых полей в наборах данных? Это баг, или фича? (с)
Нужно, чтобы в вычисляемом поле типа "Дробное число" работало отсечение до двух знаков после запятой, а также разделитель тысяч. На данный момент отсечение происходит до четырёх знаков после запятой, разделитель тысяч не работает.
Могу и руками, но хотелось бы, чтобы всё же централизованно дело шло.

У меня такой же вопрос

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

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

Будем сообщать всю дополнительную информацию по Вашему вопросу.

Егор, добрый день.

Сообщаю, что работы по Вашему запросу запланированы на первую половину июня.

Будем сообщать всю дополнительную информацию по Вашему вопросу.

Егор, добрый день.

Работы по Вашему запросу завершены. Данная проблема решена, начиная с версии Terrasoft 3.3.2.94. Для получения бинарных файлов этой версии сделайте, пожалуйста, письменный запрос в Службу поддержки Terrasoft по адресу: support@tscrm.com

Спасибо!

Войдите или зарегистрируйтесь, чтобы комментировать