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

Нравится

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

Добрый день,

 

Мы подумали как можно это реализовать и возможный вариант такой:

 

1) В схеме детали нужно создать два аттрибута:

attributes: {
			"GridDataCollectionAttr": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				value: {}
			},
 
			"ClickNumber": {
				dataValueType: Terrasoft.DataValueType.INTEGER,
				value: 0
			},
		},

В первом GridDataCollectionAttr будет храниться скопированная коллекция реестра детали, во втором ClickNumber - количество кликов по кнопке.

 

2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):

onGridDataLoaded: function() {
				this.callParent(arguments);
				const gridData = this.getGridData();
				if (gridData && gridData.collection.length > 0) {
					// var test = {...gridData};
					var gridDataCollectionClone = gridData.collection.clone();
					// var test = Ext.clone(gridData);
					this.set("GridDataCollectionAttr", gridDataCollectionClone);
					gridData.clear();
					// test.collection.addAll(gridDataCollectionClone.items);
					var copiedGridData = this.get("GridDataCollectionAttr");
					var originalKey = copiedGridData.keys[0];
					var originalItem = copiedGridData.getAt(0);
					gridData.insert(0, originalKey, originalItem);
				}
			},
 
			onContactAddressLoadButtonClick: function() {
				var copiedGridData = this.get("GridDataCollectionAttr");
				var copiedGridDataLength = copiedGridData.length;
				if (copiedGridDataLength != 0) {
					var numberOfClicks = this.get("ClickNumber");
					numberOfClicks += 1;
					this.set("ClickNumber", numberOfClicks);
					if (copiedGridData.length == numberOfClicks) {
						this.set("ClickNumber", 0);
						numberOfClicks = 0;
					}
					const gridData = this.getGridData();
					var keyToAdd = copiedGridData.keys[numberOfClicks];
					var itemToAdd = copiedGridData.getAt(numberOfClicks);
					gridData.clear();
					gridData.insert(0, keyToAdd, itemToAdd);
					console.log(copiedGridData);
				}
			}

3) В diff добавить саму кнопку:

 {
                "operation": "insert",
                "name": "ShowNextRecordButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"},
                    "click": {"bindTo": "onContactAddressLoadButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
            }

И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.

 

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

 

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

Добрый день,

 

Мы подумали как можно это реализовать и возможный вариант такой:

 

1) В схеме детали нужно создать два аттрибута:

attributes: {
			"GridDataCollectionAttr": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				value: {}
			},
 
			"ClickNumber": {
				dataValueType: Terrasoft.DataValueType.INTEGER,
				value: 0
			},
		},

В первом GridDataCollectionAttr будет храниться скопированная коллекция реестра детали, во втором ClickNumber - количество кликов по кнопке.

 

2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):

onGridDataLoaded: function() {
				this.callParent(arguments);
				const gridData = this.getGridData();
				if (gridData && gridData.collection.length > 0) {
					// var test = {...gridData};
					var gridDataCollectionClone = gridData.collection.clone();
					// var test = Ext.clone(gridData);
					this.set("GridDataCollectionAttr", gridDataCollectionClone);
					gridData.clear();
					// test.collection.addAll(gridDataCollectionClone.items);
					var copiedGridData = this.get("GridDataCollectionAttr");
					var originalKey = copiedGridData.keys[0];
					var originalItem = copiedGridData.getAt(0);
					gridData.insert(0, originalKey, originalItem);
				}
			},
 
			onContactAddressLoadButtonClick: function() {
				var copiedGridData = this.get("GridDataCollectionAttr");
				var copiedGridDataLength = copiedGridData.length;
				if (copiedGridDataLength != 0) {
					var numberOfClicks = this.get("ClickNumber");
					numberOfClicks += 1;
					this.set("ClickNumber", numberOfClicks);
					if (copiedGridData.length == numberOfClicks) {
						this.set("ClickNumber", 0);
						numberOfClicks = 0;
					}
					const gridData = this.getGridData();
					var keyToAdd = copiedGridData.keys[numberOfClicks];
					var itemToAdd = copiedGridData.getAt(numberOfClicks);
					gridData.clear();
					gridData.insert(0, keyToAdd, itemToAdd);
					console.log(copiedGridData);
				}
			}

3) В diff добавить саму кнопку:

 {
                "operation": "insert",
                "name": "ShowNextRecordButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"},
                    "click": {"bindTo": "onContactAddressLoadButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
            }

И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.

 

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

 

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

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

Как удалить эту кнопку на преднастроенной странице:

Изображение удалено.

Нравится

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

Добрый день!

Чтобы данная кнопка не отображалась нужно выключить фичу UseProcessPerformerAssignment на странице /0/Nui/ViewModule.aspx#Features после чего очистить кэш.

Дима Вовченко,

 

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

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

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

Пример: Открываю список там 2 значения, выбираю первое, потом передумал и хочу поменять на второе, открываю опять список но там только первое значение, второго нету. Что может быть не так?

Нравится

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

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

 

Уточните, пожалуйста, как именно вы реализовывали данный процесс?

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

Приветствую.

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

После этого в системе, как я подумал, слетели права для Supervisor, но не понятно, как пароль влияет на права. Подумал я так, потому что ни один справочник не отображается, не пускает в системные настройки, и при попытке, например, открыть Функциональные роли, выдает сообщение что нет прав, обратитесь к администратору.

 

Возможно кто то знает в какую сторону надо копать что бы побороть вышеописанное.

Спасибо.

PS

Версия 8.0.1.1990

 

 

 

Нравится

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

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

Я предоставил вам скрипты, для того, чтобы вы смогли восстановить роли Supervisor: 

 

insert into, "SysAdminUnitInRole"

("SysAdminUnitId""SysAdminUnitRoleId")

values

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', 'A29A3BA5-4B0D-DE11-9A51-005056C00008'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '83A43EBC-F36B-1410-298D-001E8C82BCAD'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '7F3B869F-34F3-4F20-AB4D-7480A5FDF647')



insert into "SysUserInRole"

("SysUserId","SysRoleId")

values

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', 'A29A3BA5-4B0D-DE11-9A51-005056C00008'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '83A43EBC-F36B-1410-298D-001E8C82BCAD')

 

Я был рад помочь!

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

Я предоставил вам скрипты, для того, чтобы вы смогли восстановить роли Supervisor: 

 

insert into, "SysAdminUnitInRole"

("SysAdminUnitId""SysAdminUnitRoleId")

values

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', 'A29A3BA5-4B0D-DE11-9A51-005056C00008'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '83A43EBC-F36B-1410-298D-001E8C82BCAD'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '7F3B869F-34F3-4F20-AB4D-7480A5FDF647')



insert into "SysUserInRole"

("SysUserId","SysRoleId")

values

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', 'A29A3BA5-4B0D-DE11-9A51-005056C00008'),

('7F3B869F-34F3-4F20-AB4D-7480A5FDF647', '83A43EBC-F36B-1410-298D-001E8C82BCAD')

 

Я был рад помочь!

Добрый день.

 

Спасибо за помощь.

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

Здравствуйте, система не заходить в чем проблема скажите пожалуйста?Изображение удалено.

Нравится

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

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

 

Обратитесь напрямую в техническую поддержку (support@creatio.com) для продолжения анализа, так как нужно больше деталей для определения проблемы. 



С уважением,

Анастасия

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

При большой нагрузке и большом количестве вызываемых БП (свыше 25000 экземпляров в сутки) начинается их отложенное выполнение. Все БП работают не по расписанию. Очередь Quartz пустая. В журнале процессов сразу появляется запись, когда БП инициируется. Но первый шаг БП выполняется с задержкой в 1+ часов. Пиковая загрузка ЦП приложения не превышает 60%. Загрузка ОЗУ 25%. Не знаете в какой ресурс упирается приложение?

Нравится

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

Добрый день!



Как вы определяете, что очередь Quartz  пуста. Правильно ли я понимаю что записей в таблице QRTZ_FIRED_TRIGGERS нет?

Рекомендую просмотреть также порядок запусков задач планировщика это позволить прояснить алгоритм выполнения задач:

 

declare @timezoneOffsetHours float = 3.0; --set time zone offset here

declare @timezoneOffsetTicks float = 10000000.0 * 60.0 * 60.0 *

@timezoneOffsetHours;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT

t.[SCHED_NAME],

t.[JOB_NAME],

t.[JOB_GROUP],

t.[TRIGGER_NAME],

t.[TRIGGER_GROUP],

CAST(([NEXT_FIRE_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS

DATETIME) as [NEXT_FIRE_TIME],

CAST(([PREV_FIRE_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS

DATETIME) as [PREV_FIRE_TIME],

([NEXT_FIRE_TIME] - [PREV_FIRE_TIME]) / 600000000.0 [Last repeat interval, min],

t.[TRIGGER_STATE],

t.[TRIGGER_TYPE],

CAST(([START_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS DATETIME)

as [START_TIME],

t.[MISFIRE_INSTR],

st.[REPEAT_COUNT],

st.[REPEAT_INTERVAL] / 1000 / 60 as [REPEAT_INTERVAL, min],

spt.[INT_PROP_1] as [REPEAT_INTERVAL, min],

ct.[CRON_EXPRESSION]

FROM [QRTZ_TRIGGERS] t

left join [QRTZ_SIMPLE_TRIGGERS] st on t.[SCHED_NAME] = st.[SCHED_NAME] and t.

[TRIGGER_NAME] = st.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = st.[TRIGGER_GROUP]

left join [QRTZ_CRON_TRIGGERS] ct on t.[SCHED_NAME] = ct.[SCHED_NAME] and t.

[TRIGGER_NAME] = ct.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = ct.[TRIGGER_GROUP]

left join [QRTZ_SIMPROP_TRIGGERS] spt on t.[SCHED_NAME] = spt.[SCHED_NAME] and t.

[TRIGGER_NAME] = spt.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = spt.[TRIGGER_GROUP]

ORDER BY t.[NEXT_FIRE_TIME] ASC, t.[PRIORITY] DESC





 

Да, в таблицах QRTZ_... 35 записей. Там только БП, которые по расписанию работают и системные процессы, вроде синхронизации с LDAP, EL и т.д. Все остальные БП, которые отрабатывают с задержкой - это БП, в основном, вызываемые с помощью ProcessModuleUtilities из клиентского кода. Запись в Журнале процессов появляется сразу после вызова БП, но сами элементы начинают выполняться спустя некоторое время. От нескольких минут до нескольких часов, в зависимости от того, насколько загружена система.

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

Здравствуйте, Я установил пакет (Anketa2) и хочу изменить скрипт в клиентский модуль (UsrAnketa60f79456Section) но не получается. Что делать?Изображение удалено.Изображение удалено.

Нравится

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

Здравствуйте. Можете детально описать что не получается?

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

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

 

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

 

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

Перенесення даних через пакет з об'єктами. Де можна ознайомитись, який об'єкт переносить які дані?

Наприклад який об'єкт використовується для перенесення даних "Organisatorische rollen"?

Нравится

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

Доброго дня,



Типово, перенесення об'єкту не переносить його данні, а тільки структуру самої таблиці. Для перенесення даних у складі пакету з одного середовища на інше, потрібно створювати прив'язки [даних].

 

У випадку з ролями, наразі описаний вище метод для швидкого перенесення прав не підійде, й також так як цей функціонал тісно пов'язаний з таблицею системних користувачів (SysAdminUnit) ми не рекомендуємо переносити зміни ролей через пакети або скриптами, а налаштовувати структуру на середовищі.

 

Причиною для цього буде той факт що запис про існування ролі теж зберігається у SysAdminUnit, а інформація про те що користувач входить у цю роль - SysUserInRole.

 

Нашою рекомендацією буде спочатку створити структуру ролей на проді, а потім на копії бази даних розгортати дев. Також теоретично можна виконати перенос за допомогою sql інсертів.

 

Назви таблиць, дані яких ви можливо захочете перенести, можна побачити у конфігурації, й якщо у вас є доступ до бази данних середовища - у відповідній програмі роботи з нею.

 

Дякую.

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

Я пытался с помощью new Select найти значение и сравнить его со строкой, но столкнулся с 2 проблемами.



- Не удается преобразовать тип, даже если я его получил ( я пробовал ExecuteScalar).

- Ошибка преобразования типа, если нет найденого значения.



Как мне реализовать поиск определенного значения в таблице, его получение, проверку, существует ли этой значение и потом получить строку как результат (значение в таблице тоже хранится как строка)

Нравится

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

Артем, добрый день!

Для проверки наличия значений вы можете использовать всё тотже dataReader, вот пример с использованием ExecuteScalar:

var result = "";
bool hasRecord = false;
var select = new Select(UserConnection)
    .Column("CountryId")
    .From("City")
    .Where("Name").IsEqual(Column.Parameter("Sacramento")) as Select;
using (DBExecutor executor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dataReader = select.ExecuteReader(executor)) {
 		while (dataReader.Read()) {
    		hasRecord  = true;
  		}
		if (hasRecord){
			result = select.ExecuteScalar<Guid>().ToString();
		}
 	}
}

 

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

Есть емеил адрес, от которого будут рассылаться письмо (например в бизнес процессе). На локальной среде этот адрес зарегистрировали (прописали логин пароль и т.д.)

В БП настроили отправку сообщений из этого адреса, но после поставки на следуюющую среду, в БД в елементе отправки писем, пустой отправитель.

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

 

Подскажите пожалуйста, в каких таблицах храняться эти "техничесские" Email, и как правильно их привязаться в поставку? + на сколько помню еще права нужно настраивать, что письма отрпавлялись от любого пользователя (тот кто запускает БД). 

 

спасибо

Нравится

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

* в БП елементе отправки писем, пустой отправитель

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

 

 

Данные "технические" настройки электронной почты хранятся в таблице MailboxSyncSettings в базе данных. Однако, обратите внимание, что авторизация для учетных записей электронной почты и разрешения на отправку писем не передаются автоматически с помощью связывания данных.

 

Необходимо настраивать синхронизацию и права уже на таргет-сайте вручную.

 

Были рады помочь!

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