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

Пытаюсь реализовать сортировку справочного поля типа ENUM.

attributes: {
			"LeadType": {"isRequired": false},
			"Stage": {
				"lookupListConfig": {
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
								sortProperty: "Number"
							});
							filterGroup.add("ActiveStage",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.EQUAL,
										"UsrShowInMiniPage", "1"));
							filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
							filterGroup.add("Sort",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.GREATER_OR_EQUAL,
										"Number", "0"));
							return filterGroup;
 
						}
					]
				}
			}
		},

Предположил, что sortProperty не срабатывает из-за отсутствия такой колонке в запросе, поэтому добавил еще одно условие, как все-таки правильно это сделать?

Нравится

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

А если вот так?

"Stage": {
	"lookupListConfig": {
		"filters": [
			function() {
				var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
					sortProperty: "Number"
				});
				filterGroup.add("ActiveStage",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
							"UsrShowInMiniPage", "1"));
				filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
				filterGroup.add("Sort",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.GREATER_OR_EQUAL,
							"Number", "0"));
				return filterGroup;
 
			}
		],
		"columns": ["Number"]
	}
}

 

Добрый день.

Добавьте свойство orders в lookupListConfig. К примеру:

"Owner": {

    lookupListConfig: {

        columns: ["Name"],

        orders: [

            {

                columnPath: "Name",

                direction: Terrasoft.OrderDirection.DESC

            }

        ]

    }

},

Терещук Сергей,

Сортировка таким образом не работает. Ни при указании колонки "Name", ни при какой-либо другой колонки. Direction также не влияет на порядок отображения

Варфоломеев Данила,

Сортировка также не работает, тем не менее, колонка "Number" добавляется в ответ от сервера

Проблема в том, что Террасофт запилил поддержку orders только в BasePageV2. Если у вас мини-карточка или какая-то другая карточка, которая не наследуется от BasePageV2, то сортировка работать не будет. Но всегда можно заместить родителя и реализовать в нем сортировку по аналогии с базовой карточкой

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

Добрый день.

Подскажите пожалуйста алгоритм доступа к перечислениям TSObjectLibrary > Перечисления.

Нравится

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

Добрый день, Станислав.
Уточните пожалуйста что Вы имеете в виду?
Механизм доступа к сервису перечисления "enm_" в конфигурации?
Или Вам необходимо подключить библиотеку TSObjectLibrary к стороннему приложению и там обратиться к сервису перечисления конфигурации Terrasoft?

Павел, добрый день!

Речь идет о доступе к перечислениям непосредственно из TerraSoft. В рамках библитеки TSObjectLibrary существует набор перечислений, как получить доступ к одному из них, а именно: enum _RoundingTypeEnum ?

Для примера:

var RT = CreateObject('TSObjectLibrary._RoundingTypeEnum ');

Благодарю за помощь.

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

Пример: в WindowLibrary.dll объявлен enum

    enum _DirectionEnum {
      dHorizontal = 0,
      dVertical = 1
};

В сервисах конфигурации мы данные константы объявляем явно, например в scr_SysEnums:

// Constants for enum _DirectionEnum
   dHorizontal = 0x00000000;
   dVertical = 0x00000001;

Использование: у элемента формы "Frame" есть свойство "Direction", тип которого _DirectionEnum. Соответственно из конфигурации ему можем присвоить значение dVertical = 1 выражением:
Frame.Direction = dVertical;

Интересующее Вас перечисление RoundingTypeEnum также описано в scr_SysEnums:

// Constants for enum _RoundingTypeEnum
drNone = 0x00000000;
drHalfEven = 0x00000001;
drHalfPos = 0x00000002;
drHalfNeg = 0x00000003;
drHalfDown = 0x00000004;
drHalfUp = 0x00000005;
drRndNeg = 0x00000006;
drRndPos = 0x00000007;
drRndDown = 0x00000008;
drRndUp = 0x00000009;
Показать все комментарии

Здравствуйте, уважаемые коллеги!

Заметил серьёзную ошибку в поведении датасета.

В 3.3.2.262 (независимо подтверждено в 240 и в 198) при изменении значения в ENUM-поле событие OnDatasetDataChange происходит два раза. При изменении полей других типов это событие происходит как следует, один раз.

Воспроизвести очень легко: поставить debugger на DataChange. Стоит в карточке поменять поле enum - войдёт в отладчик дважды.

При этом проверка DataField.Value == DataField.OldValue оба раза возвращает false, отличить реальный DataChange от повторного срабатывания по этому признаку нельзя, приходится запоминать прежнее значение в глобальном объекте скрипта, чтобы обойти ошибку.

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

//ScriptObject - глобальный объект, объявлен в начале всего скрипта

function dlDataOnDatasetDataChange(DataField) {
        var DataFieldName = DataField.Name;
        var DataFieldValue = DataField.Value;
        if (DataField.FieldType == dftEnum){//Для полей типа ENUM
                if (ScriptObject[DataFieldName] == DataFieldValue){
                        return;//Если значение в действительности не менялось - выходим, это второй, ошибочный заход
                } else {
                        ScriptObject[DataFieldName] = DataFieldValue;
                }
        }
// дальше сама обработка...

Нравится

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

Cпасибо, Анатолий! Действительно, и у меня такая проблему проявлялась (на версии 3.2.2.171). Долго искала, в чем загвоздка, пока не предположила, что это ошибка в ядре.

В пост призываются специалисты технической поддержки с номером инцидента и сроками разрешения:smile:

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

Анатолий, данная проблема уже была отмечена сотрудником Terrasoft Константином Пихало и исправлена начиная с версии 3.4.1.28

На 3.4.0. и 3.3.2 пока не переносили данные изменения.

Здравствуйте, коллеги!
Обходное решение есть, проблема исправлена в версии 3.4.1. К сожалению, перенос исправления на 3.4.0, и на 3.3.2 не планируется.

А что там с переходом с 3.4 на 3.4.1? А то как то неприятно получается актуальная версия уже без планов на исправление багов

Перенос исправления пусть не планируется, а исправить ошибку надо!

Предполагаю что билд 3.3.2.262 поновее чем 3.4.1, тем более что на 3.4.1 проекты можно по пальцам пересчитать.

По данному вопросу создан запрос на изменение, Deadline по запросу на изменение: 06.04.2012

Здравствуйте, коллеги
Исправление войдет в сборки начиная с:

  • 3.3.2.266+
  • 3.4.0.118+
  • в 3.4.1 это исправление уже было.

Выслал Вам на почту ссылку на скачивание бинарных файлов 3.3.2.266

"Яворский Алексей" написал:

Спасибо за помощь и оперативность!

Спасибо, оперативно!

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

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

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

Заранее спасибо!!!

Нравится

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

"Kat" написал:Оно заполянется только при наличии значения в другом поле, а иначе пустым остается.

"Оно" это поле или перечисление?
Если перечисление, то попробуйте у контрола филд сбросить в null, а потом востановить. Если не поможет, дополнительно сбросьте в null енум у филда.
А может сделать как в карточке задачи - на спровочниках.

Оно - это про перечисление.
при создании новой записи, вроде, Enum обнуляю (enmTranslations.Enum = System.EmptyValue), но значение в поле остается старое. Такая же ситуация и при открытии записи. При первом открытии все ок, отображается нужное значение, при последующих отображается значение первой открытой записи.
DataField у EnumControl нет, поэтому я его обнулить не могу, вот это:
enmTranslations.Value.Caption = ''
не помогает :(

Вот мой код:

function wnd_ShowTimeEditOnPrepare(Window) { //debugger;
	scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);
	enmTranslations.Enum = System.EmptyValue;  
	var IntervalID = dlData.Dataset('IntradayIntervalID');
	var ShowID = dlData.Dataset('ShowID');
	var Translations = dlData.Dataset.ValAsInt('Translations');
	if (IntervalID != null){
		var Enum = FillEnum(IntervalID, ShowID);
		enmTranslations.Enum = Enum;	
	}
	if (!IsZeroValue(Translations)){
		enmTranslations.Value = Enum.ItemsByCaption(Translations.toString()); // присваивается нужное значение, но в поле все равно старое
	}
}

как на справочниках - не получится, наверно. Enum создается и заполяняется в коде при изменении значения другого поля и потом просто переприсваиваю заново контролу:

//функция создания и заполения перечисления

function FillEnum(IntervalID, ShowID){ 
	var BlocksPerInterval = CalcBlocksPerInterval(IntervalID, ShowID);
	var Enum = Services.CreateItem(EnumCode);
	for (var i = 1; i < 11; i++) {
		    var EnumItem = Enum.CreateItem();
		    EnumItem.ID = EnumItem.Code = 'BlocksPerInterval_' + i;
		    EnumItem.Caption = BlocksPerInterval * i;
		    Enum.Add(EnumItem);
		}
	 return Enum;
}

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

function wnd_ShowTimeEditOnPrepare(Window) { //debugger;
        scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);
        enmTranslations.Value = System.EmptyValue;  
        enmTranslations.Enum = System.EmptyValue;  
        var IntervalID = dlData.Dataset('IntradayIntervalID');
        var ShowID = dlData.Dataset('ShowID');
        var Translations = dlData.Dataset.ValAsInt('Translations');
        if (IntervalID != null){
                var Enum = FillEnum(IntervalID, ShowID);
                enmTranslations.Enum = Enum;    
        if (!IsZeroValue(Translations)){
                        enmTranslations.Value = Enum.ItemsByCaption(Translations.toString()); 
    }
        }
}

Желаю удачи!

Мельникова Екатерина

Екатерина, спасибо за помощь, мне не хватало именно enmTranslations.Value = System.EmptyValue, другими способами значение поля не обнулялось.

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

Добрый день!

Необходима помощь знающих людей в следующем вопросе:

на карточке редактирования есть два поля. Первое поле типа справочник. При выборе значения в первом поле необходимо заполнить выпадающий список для второго поля, что бы пользователь смог выбрать только определенные значения. Значения для списка второго поля вычисляются в коде. Они не постоянны, поскольку один из элементов вычисления имеет переменное значение.
Идеальным вариантом был бы мемори датасет, но не получилось привязать его к контролу EnumDataControl.
Так же есть идея заполнять сервис Enum динамически в коде, возможно ли это?
Или есть другой вариант решения задачи?

Заранее благодарю!!!

Нравится

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

http://terrasoft.com.ua/sdk/
IEnumExample.js - пример динамического заполнения перечисления.

спасибо!

Подскажите, пожалуйста, а можно добавлять/удалять элементы у сервиса Enum через код перед его открытием (ShowSelectEnumItemWindow(EnumUSI))? Мне это сделать не удалось. Наверно, что-то не так делаю.

www.informicus.ru

Конечно можно, IEnum в SDK посмотрите.
Что именно не удалось ?

1) Создала сервис Enum без значений.
2) далее заполняю и вызываю его следующим образом в коде:

var enm_ShowsForDay = Services.GetNewItemByUSI('enm_ShowsForDay');
	for (var i = 1; i <= 13; i++) {
	    var EnumItem = enm_ShowsForDay.CreateItem();
	    EnumItem.ID = EnumItem.Code = 'TranslationsPerBlock_' + i;
	    EnumItem.Caption = i;
	    enm_ShowsForDay.Add(EnumItem);
	}
 
	try{
		var TrsPerBlock = parseInt((ShowSelectEnumItemWindow('enm_ShowsForDay')).ResultValue.Caption);
	}
	catch (e){
		return false;
	}

но список оказывается пустым при открытии перечисления.

www.informicus.ru

Разобралась сама.
В функции ShowSelectEnumItemWindow просто заново объект создавался.

var Enum = Services.GetNewItemByUSI('EnumUSI');

создала рядом копию функции,но без вышеуказанной строки.

www.informicus.ru

Кстати перечисления кажется по GetSingleItemByUSI получать надо.

"Underscore a.k.a. _" написал:Кстати перечисления кажется по GetSingleItemByUSI получать надо.

Почему?
GetSingleItemByCode ()
Services.GetNewItemByUSI()

"Раловец Ольга" написал:Почему?
GetSingleItemByCode ()
Services.GetNewItemByUSI()

Прошу прощения, я Вас не совсем понял :)
Я хотел сказать что перечисления как и таблицы получаем с помощью метода GetSingleItemByUSI объекта Services.

Я всегда считала, что правильно Services.GetNewItemByUSI(), но похоже и Services.GetSingleItemByUSI() тоже работает.

:redface:

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

"Underscore a.k.a. _" написал:На самом деле немного стыдно, два раза подряд Вас так ткунуть

Что Вы, напротив, я ценю конструктивную критику.

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