Вопрос

Изменить тип поля "Номер"

Добрый день!



Вопрос следующего характера:

Необходимо изменить номера обращений - переделать поле текстовое в числовое. Есть пример https://community.terrasoft.ru/articles/sortirovka-po-nomeru-dogovora-d… но там выводится новая колонка, но моя задача - изменить текущую.



1) Что стоит предусмотреть и что может повлиять на работу? (сейчас создаются новые обращения формата "только цифры")

2) Если в это поле будет писаться текст (случайно попадет) - что изменится?

3) Что станет с БП, которые берут значение этого поля как текст?

Нравится

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

Быстров Сергей,

Как то так попробуй (код набросал на глазок, те сырой нужно  отлаживать)

initQuerySorting: function(esq) {
	var columnName = "Number";
	if (esq.columns.contains(columnName)) {
		//var numColumn = esq.addColumn(columnName);
		var numColumn = esq.columns[columnName];
		if (numColumn.orderPosition && numColumn.orderPosition > 0) {
			var numNewColumn = esq.addColumn("NewNumberIntegere");
			numNewColumn.orderDirection = numColumn.orderDirection;
			numNewColumn.orderPosition = numColumn.orderPosition;
			delete numColumn.orderDirection;
			delete numColumn.orderPosition;
		} else {
			this.callParent(arguments);
		}
}
},

 

А почему нельзя добавить новую колонку, спрятав при необходимости старую, при этом все базовая функциональность и ваши наработки работающие с номерами останется работоспособной

1) трудно сказать  нужно тестировать полностью весь блок работы с обращениями выискивая блох

2) в число текст не впихнуть будет ошибка при сохранении

3) зависит от того как именно обрабатывается строка в БП

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

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

Быстров Сергей,

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

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

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

Быстров Сергей,

Есть еще костыльный вариант установить шаблон маски в SP{0:00000000} тогда номера будут формироватся в виде SP000000001,  SP000000002 и тд что позволит сортировать по текстовому полю номер, возможно вам это подойдет если пользователи не будут ругаться на лидирующие нули.

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

А вот на это ругается первая линия, потому что "лишние цифры - это плохо". Поэтому сразу откинули такой вариант. Может можно как-то переопределить фильтр: когда мы пытаемся фильтровать по номеру, на самом деле фильтр делается по другому полю "UsrNumber"?

Быстров Сергей,

Фильтр не трогать, а можно попытатся переопределить сортировку, те при попытке сортировать по номеру отсортировать по новому числовому полю номер

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

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

Быстров Сергей,

Как то так попробуй (код набросал на глазок, те сырой нужно  отлаживать)

initQuerySorting: function(esq) {
	var columnName = "Number";
	if (esq.columns.contains(columnName)) {
		//var numColumn = esq.addColumn(columnName);
		var numColumn = esq.columns[columnName];
		if (numColumn.orderPosition && numColumn.orderPosition > 0) {
			var numNewColumn = esq.addColumn("NewNumberIntegere");
			numNewColumn.orderDirection = numColumn.orderDirection;
			numNewColumn.orderPosition = numColumn.orderPosition;
			delete numColumn.orderDirection;
			delete numColumn.orderPosition;
		} else {
			this.callParent(arguments);
		}
}
},

 

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

Спасибо за помощь, получилось вот так:

initQuerySorting: function(esq) {
	this.callParent(arguments);
	var columnName = "Number";
	if (esq.columns.contains(columnName)) {
	var numColumn = esq.columns.collection.get(columnName);
		if (numColumn.orderPosition && numColumn.orderPosition === 1) {
			var numNewColumn = esq.columns.collection.get("UsrNumber");
			numNewColumn.orderDirection = numColumn.orderDirection;
			numNewColumn.orderPosition = 0;
			delete numColumn.orderPosition;
		}
	}
},
getGridDataColumns: function() {
	return {
		"UsrVIPobr": {path: "UsrVIPobr"},
		"UsrNumber": {path: "UsrNumber"}
	};
},

 

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