Всем доброго дня.

Подскажите пожалуйста, как проще всего добавить номер по порядку при создании новой записи в детали через "+"? 

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

Нравится

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

Я делал автонумерацию через процесс на объекте. Триггер на срабатываение кода - после добавления записи или после удаления.

 

Код следующий, на сколько тут все хорошо не знаю, но вроде работает. Ручное переименование можно запретить, либо добавить "стрелочки" с перетаскиванием позиции вверх-вниз на клиенте.

 

using System.Linq;
 
public virtual void RunNumeration()
        {
            string parentEnityName = "UsrParent"; //Колонка с родителем, например Invoice для объекта InvoiceProduct
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Entity.Schema.Name);
            var positionNumberColumn = esq.AddColumn("UsrPositionNumber").Name; //колонка с номером по порядку
            esq.AddAllSchemaColumns();
            if (parentEnityName.IsNotNullOrEmpty())
            {
                Guid parentEnityId = Entity.GetTypedColumnValue<Guid>(parentEnityName+"Id");
                if (parentEnityId != Guid.Empty)
                {
                    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, parentEnityName, parentEnityId));
                    var entityProductsCollection = esq.GetEntityCollection(UserConnection)
		            .OrderBy(x => x.GetTypedColumnValue<int>(positionNumberColumn) == 0)
		            .ThenBy(x => x.GetTypedColumnValue<int>(positionNumberColumn));
		            int newNumber = 0;
		            foreach (var item in entityProductsCollection)
		            {
		                int number = item.GetTypedColumnValue<int>(positionNumberColumn);
		                newNumber++;
		                if (number != newNumber)
		                {
		                    item.SetColumnValue("UsrPositionNumber", newNumber);
		                    item.Save();
		                }
		            }
                }
            }
        }

 

Я делал автонумерацию через процесс на объекте. Триггер на срабатываение кода - после добавления записи или после удаления.

 

Код следующий, на сколько тут все хорошо не знаю, но вроде работает. Ручное переименование можно запретить, либо добавить "стрелочки" с перетаскиванием позиции вверх-вниз на клиенте.

 

using System.Linq;
 
public virtual void RunNumeration()
        {
            string parentEnityName = "UsrParent"; //Колонка с родителем, например Invoice для объекта InvoiceProduct
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Entity.Schema.Name);
            var positionNumberColumn = esq.AddColumn("UsrPositionNumber").Name; //колонка с номером по порядку
            esq.AddAllSchemaColumns();
            if (parentEnityName.IsNotNullOrEmpty())
            {
                Guid parentEnityId = Entity.GetTypedColumnValue<Guid>(parentEnityName+"Id");
                if (parentEnityId != Guid.Empty)
                {
                    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, parentEnityName, parentEnityId));
                    var entityProductsCollection = esq.GetEntityCollection(UserConnection)
		            .OrderBy(x => x.GetTypedColumnValue<int>(positionNumberColumn) == 0)
		            .ThenBy(x => x.GetTypedColumnValue<int>(positionNumberColumn));
		            int newNumber = 0;
		            foreach (var item in entityProductsCollection)
		            {
		                int number = item.GetTypedColumnValue<int>(positionNumberColumn);
		                newNumber++;
		                if (number != newNumber)
		                {
		                    item.SetColumnValue("UsrPositionNumber", newNumber);
		                    item.Save();
		                }
		            }
                }
            }
        }

 

Трефилов Павел Сергеевич, 

 

спасибо, отлично работает с вашим кодом)

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

Есть необходимость по галке в основной карточке делать деталь с редактируемым реестром(и) ТДЧ. 

Судя по публикациям здесь, в текущей версии бизнес-правилами это не реализуемо. 

В разработке на Creatio я недавно, поэтому творческие варианты решения данной задачи приходят со скрипом. На данный момент решение такое:

 

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

Или есть другие более удачные решения данной задачи? 

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

Нравится

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

Если отвечать на вопрос, то с помощью механизма сообщений.

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

Если отвечать на вопрос, то с помощью механизма сообщений.

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

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

Добрый день!

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

ПРОБЛЕМА в том, что при добавлении записи на деталь вручную появляется ошибка .

Как исправить? (В обработчик события получения сообщения реестр детали обновляю вот так: this.updateDetail({detail: "UsrToursDetailGrid01695b42", realoadAll: true});)

И вообще, правильная ли у меня функция для обновления реестра?

Нравится

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

Либо удалять типа такой записи
ALTER TABLE [dbo].[qrtUsers]
drop constraint [FK7HPrCHgRbriWspbaL6QwqDxLWL0]

Либо разбираться в источнике проблемы

Dima Avdoshin,

Дело в том, что при отработке БП все нормально работает. А проблема именно при ручном добавлении. Я считаю, что удалять точно ничего не надо.

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

Возможно, после обновления при помощи обработчика есть какие-то отличия во внешнем виде детали, её кнопок?

 

Зверев Александр,

Не редактирую, а добавляю новую. При редактировании ошибки нет.

Павел, этот Id 98c... принадлежит добавленной программно в БП записи в UsrTours? Его там же в процессе задают?

Зверев Александр,

Нет. Запись с данным Id 98c833... - это запись, которую я добавляю вручную (нажимаю на + возле детали). А при добавлении с помощью БП все хорошо.

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

Зверев Александр,

Спасибо! Обошел данную проблему другим способом.

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

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

Нравится

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

//в карточке
messages: {
    "Message1": {
        mode: this.Terrasoft.MessageMode.PTP,
        direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
    }
},

methods: {
    this.sandbox.subscribe("Message1", function(args) {
        console.log(args);
    },this, ["Message1"]);
}

//в детали
messages: {
    "Message1": {
        mode: this.Terrasoft.MessageMode.PTP,
        direction: this.Terrasoft.MessageDirectionType.PUBLISH
    }
},

methods: {
    this.sandbox.publish("Message1", args, ["Message1"]);
}

//в карточке
messages: {
    "Message1": {
        mode: this.Terrasoft.MessageMode.PTP,
        direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
    }
},

methods: {
    this.sandbox.subscribe("Message1", function(args) {
        console.log(args);
    },this, ["Message1"]);
}

//в детали
messages: {
    "Message1": {
        mode: this.Terrasoft.MessageMode.PTP,
        direction: this.Terrasoft.MessageDirectionType.PUBLISH
    }
},

methods: {
    this.sandbox.publish("Message1", args, ["Message1"]);
}

Показать все комментарии
//в diff
"ContractDetailV20ddfbca0": {
    "schemaName": "ContractDetailV2",
     "entitySchemaName": "Contract",
     "filter": {
        "detailColumn": "Account",
         "masterColumn": "Id"
    },   //не забываем здесь поставить запятую
    "filterMethod": "filtrationNrbFinApplicationDoubleDetail" // добавляем такую строчку. Название (справа) может быть любым.
},
 
//в методах
filtrationNrbFinApplicationDoubleDetail: function () {
	var filterGroup = new this.Terrasoft.createFilterGroup(); 
	filterGroup.add("ByIdFilter", this.Terrasoft.createColumnFilterWithParameter(
		this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", this.get("Id"))
	);
	return filterGroup;
},

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
define("NrbFinApplicationDoubleDetail", [], function() {
	return {
		entitySchemaName: "FinApplication",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			init: function(){
				this.callParent(arguments);
				var currentHistoryState = this.sandbox.publish('GetHistoryState');
				var recordId = currentHistoryState.hash.recordId;
				if(!Ext.isEmpty(recordId)){
 
				}
			}
		}
	};
});

 

Нравится

Поделиться

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

Спасибо, то что я искал, а как передать из детали в карточку ?

В соседней теме уже ответили.

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

Добрый день!

 

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

 

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

 

Нравится

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

Что интересно, если открыть настройку колонок детали, то там в предпросмотре так, как Вы хотите.

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

Сходу нашёл, как смена стандартного word-wrap: normal на word-wrap: break-word; у [class*='grid-cols-'] меняет перенос по словам на перенос по буквам, но как сделать чтобы вообще без переноса, пока не нашёл. Может, у Вас выйдет.

Уже заведена и принята идея:

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

1. реестр раздела
2. списки в итогах

Но пока в планах на новые версии её нет.

Зверев Александр, 

Спасибо за мысль! Подумаю, что делать с этим))  Было бы здорово, если бы такая функция  появилась

Показать все комментарии
/*
* Вызывает Бизнес-процесс обновления отклика в мероприяиях.
*/
callMassiveChangeResponseEventProcess: function (resultValueId) {
	let selectedItems = this.getSelectedItems();
	if (!Ext.isEmpty(resultValueId) && !Ext.isEmpty(selectedItems)) {
 
		let selectedItemsJson = JSON.stringify(selectedItems);
 
		let args = {
			sysProcessName: "NrbMassiveChangeResponseEvent",
			parameters: {
				NrbRecordsId: selectedItemsJson,
				NrbEventResponseId: resultValueId
			},
			callback: function () {
                       //скрытие маски
				this.hideBodyMask();
                       //перезагрузка детали
				this.reloadGridData();
			},
			scope: this
		};
		ProcessModuleUtilities.executeProcess(args);
	};
},

 

Нравится

Поделиться

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

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

Нравится

2 комментария
addRecord: function() {
              	var defaultValues = this.get("DefaultValues");
 
              	this.console.log("Данные")
              	this.console.log(defaultValues);
			 	this.showInformationDialog("Select All not implemented yet...");
 
 
			// 	//this.callParent(arguments);
 
			 },

Случайно нашел, в дефолт валуис =) содержится необходимая нам информация , айди и представление

Dima Avdoshin,

Все правильно там оно и лежит. Можете еще вывести console.log(this); там в values и не только можно найти интересные значения.

Также можно самому дописывать значения в defaultValues в коде карточки на которой размещена деталь.

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

Добрый день. Можете подсказать как добавить дополнтельную кнопку после + и троеточия? 

 

Прикрепленные файлы

Нравится

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

Например так, в схему нужно детали добавить код:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "ButtonName",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": Terrasoft.controls.ButtonEnums.style.DEFAULT,
			"caption": resources.localizableStrings.ButtonCaption,
			"visible": { 
				"bindTo": "isButtomEnabled" 
			},
			"click": { 
				"bindTo": "buttomClick" 
			}
		}
	}
]/**SCHEMA_DIFF*/,

isButtomEnabled - метод для проверки видимости кнопки, если нужно всего отображать, то просто вернуть true

"caption": resources.localizableStrings.ButtonCaption - название кнопки (из строк локализации)

buttomClick - метод, который запускается при клике на кнопку

Например так, в схему нужно детали добавить код:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "ButtonName",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": Terrasoft.controls.ButtonEnums.style.DEFAULT,
			"caption": resources.localizableStrings.ButtonCaption,
			"visible": { 
				"bindTo": "isButtomEnabled" 
			},
			"click": { 
				"bindTo": "buttomClick" 
			}
		}
	}
]/**SCHEMA_DIFF*/,

isButtomEnabled - метод для проверки видимости кнопки, если нужно всего отображать, то просто вернуть true

"caption": resources.localizableStrings.ButtonCaption - название кнопки (из строк локализации)

buttomClick - метод, который запускается при клике на кнопку

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