Как правильно создать деталь в детали?

Почему-то во вторую деталь не передается Id-шник родительской детали.

Пробовал сделать добавлением  - "useRelationship": true . Но все равно не работает. В качестве примера использовал вот этот эту статью:

https://community.terrasoft.ru/questions/peredaca-id-v-samopisnuu-detal

Нравится

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

Не забудьте установить в объекте главной детали поле для отображения.

Не забудьте установить в объекте главной детали поле для отображения.

Владимир Соколов,

 Что вы имеете в виду установить поле для отображения? Добавить в объект первой детали поле с ссылкой на объект второй детали? Или же в карточке первой детали прописать?

Евгений, речь об этом, настраивается на уровне объекта:

Спасибо. Да, действительно помогло. Получается решение с помощью строки "useRelationship": true  не дает ничего

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

Коллеги, добрый день.

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

Необходимо, чтобы в функционале полной версии ленты была возможность указывать запись из раздела документы и все файлы из детали "Файлы и ссылки" раздела "Документы" отображались в новости ленты.

Далее, чтобы эти файлы можно было открыть в мобильной версии из записи ленты и в полной версии.

 Кто-то реализовывал деталь в ленте мобильного приложения и в полной версии?

Нравится

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

Владислав, можно просто программно создать в ленте сообщение со ссылками на скачивание в системе нужных файлов с адресами вроде http://адрес_сайта/0/rest/FileService/GetFile/ 7b332db9-3993-4136-ac32-09353333cc7a/935b6ecb-3509-4c8a-bc7e-03ab0661da24. Как они формируются, см. в этой теме.

 

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

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

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

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

Есть необходимость записывать в объект File поля Name и Notes через всплывающее окно. Не могу определить что нужно использовать, ModalBox или MiniPage. Вкратце задача состоит в том, чтобы при вводе поля Name генерировать ссылку и записывать её в поле Notes. 

Получилось создать ModalBox, но не удалось найти как сохранять поля в базу данных, также как через метод this.save(); в BasePage.

А вызывать MiniPage своей же кнопкой, совсем не удалось

Буду благодарен за подробный ответ и конкретные статьи с примерами. Спасибо.

Нравится

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

Здравствуйте, Илья!

 

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

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

Добрый день. Прошу помощи - третий день мучаюсь с этой задачкой. Есть страница редактирования. В ней есть деталь, отображающая (только чтение) записи из того же реестра. Отбор записей в деталь должен проводиться по ряду условий, связанных с полями основной записи на странице редактирования. Мысль в том, чтобы по этим условиям отобрать через EntitySchemaQuery несколько Id и назначить их в фильтр детали через createColumnInFilterWithParameters.



Проблема в том, что результаты EntitySchemaQuery.getEntityCollection отрабатываются в callback-функции, и происходит это в большинстве случаев позже, чем завершается работа функции filterMethod детали, в которой делается вызов getEntityCollection. Фильтр получается пустым.



Ниже проблемный код:

// функция назначена как "filterMethod" детали
applyFilter: function() {
    //
    var vFGroup = Terrasoft.createFilterGroup();
    vFGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
 
    //
 
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "Tenants"
    });
 
    esq.addColumn("Id");
    esq.addColumn("ReportMonth");
    esq.addColumn("Area");
 
    var vArea = this.get("Area");
 
    // фильтры запроса - должна совпадать дата, и площадь быть в +-20%                    
    esq.filters.add("ReportMonthFilter", 
        esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
            "ReportMonth", this.get("ReportMonth")));
    esq.filters.add("AreaFilter", 
        esq.createColumnBetweenFilterWithParameters("Area", 
            vArea * 0.8, vArea * 1.2));
 
    // до этого места все работает корректно 
    // теперь запускаем запрос и получаем данные
     // насколько я понимаю, архитектурно система распараллеливает задачи,
    // т.е. function(result) и следующая инструкция после getEntityCollection()
    // начинают отрабатываться одновременно
    esq.getEntityCollection(function (result) {
        if (result.success) {
 
            // добавляем фильтр как UID по списку
            // здесь так можно, больших выборок не предполагается
            var vSelected = [];                        
            result.collection.each(function (item) {
                vSelected.push(item.get("Id"));
            });
 
            var vIdF = Terrasoft.createColumnInFilterWithParameters("Id", vSelected);
 
            // нужно как-то гарантировать, чтобы эта операция всегда выполнялась раньше, чем 
            // return vFGroup; в конце функции. Иначе в фильтры попадает пустой список, и фильтр
            // не работает. 
            vFGroup.add("vIdF", vIdF);
        }
    }, this);
 
    // Интересно, что при первом открытии детали после обновления 
    // страницы операция return vFGroup; 
    // выполняется корректно, т.е. после vFGroup.add("vIdF", vIdF);. 
    //Если дальше закрыть страницу и через реестр
    // открыть другую запись - уже не работает.
 
    // Также интересно, что если вбить вот сюда:
    // window.alert("!");
    // то пауза будет достаточна для формирования vFGroup 
    // независимо от того, в первый раз я открываю
    // запись или нет
 
    return vFGroup;
},

 

Нравится

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

Согласен с Александр Зверев

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

Главное не забыть что во фьюхе должны быть также служебные поля:



DROP VIEW IF EXISTS dbo.VwCaseGroup

GO

CREATE VIEW dbo.VwCaseGroup

AS SELECT

  SAU.ContactId AS Id,

  SUR.SysRoleId,

  SUR.CreatedById,---------<

  SUR.ModifiedById,---------<

  SUR.CreatedOn,---------<

  SUR.ModifiedOn,---------<

  SUR.ProcessListeners---------<

FROM dbo.SysAdminUnit SAU

JOIN dbo.SysUserInRole SUR ON SAU.Id = SUR.SysUserId

GO

Сорри, уже сам разобрался. Надо было всего-то создать property для списка UID и перенести его подгрузку в onEntityInitialized, оставив в applyFilter только сортировку и создание итогового фильтра для детали. 

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

Юрий, вообще, такая постановка намекает, что можно в БД сделать view с нужными данными: каждому Id записи в основном разделе будет соответствовать несколько строк для отображения на детали по нужному условию.

 

Создать объект с такими же колонками, привязать к этой view и далее в разделе настроить деталь стандартными средствами без всякого кода.

Согласен с Александр Зверев

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

Главное не забыть что во фьюхе должны быть также служебные поля:



DROP VIEW IF EXISTS dbo.VwCaseGroup

GO

CREATE VIEW dbo.VwCaseGroup

AS SELECT

  SAU.ContactId AS Id,

  SUR.SysRoleId,

  SUR.CreatedById,---------<

  SUR.ModifiedById,---------<

  SUR.CreatedOn,---------<

  SUR.ModifiedOn,---------<

  SUR.ProcessListeners---------<

FROM dbo.SysAdminUnit SAU

JOIN dbo.SysUserInRole SUR ON SAU.Id = SUR.SysUserId

GO

Генин Юрий,

На всякий случай, для будущих читателей этого треда: вариант с EntitySchemaQuery плох тем, что при больших выборках не успевает отработать до открытия пользователем вкладки с деталью, что приводит к визуальному отсутствию фильтрации. Схема с VIEW этого недочета лишена.

 

 

 

 

 

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

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

И после рефреша всё проходит, но потом может появиться снова

 

Как с этим бороться?Изображение удалено.

Нравится

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

1) Делаем select запрос в EntityConnection, видим поле Position, радуемся, настраиваем порядок.

2) Обновляем деталь, видим беспорядок, грустим (сортировка как бы есть, но её нет, т.к. в коде детали хлам, который не работает)

3) Вспоминаем, что у нас есть руки, и редактируем EntityConnectionsDetailV2:

methods: {
	/**
	 * Убираем позиции с 999 индексом (исключаем ненужные связи)
	 * */
	removePositions: function(item) {
		return item.$Position !== 999;
	},
 
	/**
	 * обработка и сортировка связей
	 * */
	processEntityConnectionsResponse: function(collection) {
		var filtered = collection.filterByFn(this.removePositions, this);
		var sorted = filtered.sort(null, null, function(a, b) {
			var v1 = a.$Position;
			var v2 = b.$Position;
 
			return v1===v2 ? 0 : (v1 &gt; v2 ? 1 : -1);
		});
		collection.clear();
		collection.loadAll(sorted);
		this.loadColumnValues(collection);
 
		return sorted;
	}
}

 

Молитвой и божьим словом, на сколько я помню обращения в саппорт коллег))

1) Делаем select запрос в EntityConnection, видим поле Position, радуемся, настраиваем порядок.

2) Обновляем деталь, видим беспорядок, грустим (сортировка как бы есть, но её нет, т.к. в коде детали хлам, который не работает)

3) Вспоминаем, что у нас есть руки, и редактируем EntityConnectionsDetailV2:

methods: {
	/**
	 * Убираем позиции с 999 индексом (исключаем ненужные связи)
	 * */
	removePositions: function(item) {
		return item.$Position !== 999;
	},
 
	/**
	 * обработка и сортировка связей
	 * */
	processEntityConnectionsResponse: function(collection) {
		var filtered = collection.filterByFn(this.removePositions, this);
		var sorted = filtered.sort(null, null, function(a, b) {
			var v1 = a.$Position;
			var v2 = b.$Position;
 
			return v1===v2 ? 0 : (v1 &gt; v2 ? 1 : -1);
		});
		collection.clear();
		collection.loadAll(sorted);
		this.loadColumnValues(collection);
 
		return sorted;
	}
}

 

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

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

 

Столкнулся с проблемой вызова sandbox из детали т.е. заходя из раздела на страницу подписка срабатывает, но если на страницу зайти из детали то нет.

Нравится

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

Поясните пожалуйста где находятся подписки?

Кисловский Михаил Андреевич,

вызывают из схемы детали "Schema5Detail", передают в схему открываемой страницы "...1Page"

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

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

Добрый день!

Делаю иерархическую деталь. Не работает отображение записей в детали. 

*Запрос отправляется.

*Ответ приходит.

*В объекте, по которому делается деталь, "Родитель иерархии" указан.

 

Код детали: 

define("NorbitContactProductDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
	 "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "NorbitContactProduct",
		messages: {},
		mixins: {},
		attributes: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			/**
			 * Скрыть кнопку "Добавить".
			 */
			/*{
				"operation": "remove",
				"name": "AddRecordButton"
			},*/
 
			/**
			 * Подключение иерархии детали.
			 */
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"visible": true,
					"type": "listed",
					"hierarchical": true,
					"hierarchicalColumnName": "NorbitParentContactProduct",
					"useLevelRendering": true
				}
			},
		]/**SCHEMA_DIFF*/,
		methods: {
 
			addGridDataColumns: function (esq) {
			   this.callParent(arguments);
				if (!esq.columns.contains("Name")) {
					esq.addColumn("Name");
				}
				if (!esq.columns.contains("NorbitCount")) {
					esq.addColumn("NorbitCount");
				}
				if (!esq.columns.contains("NorbitParentContactProduct")) {
					esq.addColumn("NorbitParentContactProduct");
				}
			},
 
 
			/**
			 * Скрыть пункт меню "Копировать".
			 */
			getCopyRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Изменить".
			 */
			getEditRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Удалить".
			 */
			getDeleteRecordMenuItem: Terrasoft.emptyFn,
		}
	};
});

 

Нравится

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

Александр, смотрю в существующих схемах деталей, например, в ProjectStructureDetailV2:

"hierarchicalColumnName": "ParentId", 

Может, и у Вас надо было писать не NorbitParentContactProduct, а NorbitParentContactProductId?

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

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

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

 

Вижу два решения задачи:

1) Вариант 1:

 - Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты", базовый объект "Деталь 2" с колонкой привязки к "Деталь 1".

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 2".

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")!

2) Вариант 2:

- Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты" и колонкой "Зарезервировано" (что бы можно было отмечать значения что попадут далее в третью деталь).

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 1" (тут нам и пригодилась колонка "Зарезервировано" так как по ней и будет фильтр и мы просто проставляем значение в эту колонку, а точнее по колонке "Заявка" и "Зарезервировано").

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")! Была идея сделать Вью для отображения не достающего текстового поля, которое заполнять из колонки "Продукты.Название".

Нравится

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

Александр, что-то мне не вполне понятно по структуре того, что хотите отобразить. Вы хотите две детали в разделе продуктов или в каком-то другом разделе, которые связывают его с продуктами (вроде раздела «Договоры» и детали развязки «Продукты в договоре»)? Как между собой связаны раздел и первая деталь, раздел и вторая, первая со второй?

 

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

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

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

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

Тут вопрос не столько в настройке привязки деталей к разделу, сколько в логике выбора записей. Это можно сделать модификацией лукапа второй детали, чтобы там фильтр оставлял только пригодные для выбора записи. Либо вместо лукапа сделать в первой детали, где весь доступный выбор, кнопку или действие, при запуске которого выбранная на первой детали запись обрабатывается, по ней создаётся запись на второй.

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

Добрый вечер.

 

Возникла следующая проблема.

Создал деталь. Зарегистрировал ее в разделе. После хотел добавить поле в деталь. Перехожу в Настроить деталь. Но объект пропал и в страницу перейти не могу.

 

Как можно решить данную проблему?

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

Нравится

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

Сергей, а объект реально создался? Проверьте в разделе «Конфигурация» (в старом интерфейсе). Возможно, после создания ещё не публиковался? Если такой объект есть, можно выбрать из списка в настройках детали его название снова и сохранить.

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

Добрый день.

 

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

https://academy.terrasoft.ru/documents/administration/7-16/sozdanie-novoy-detali

и добавил в раздел, как указано здесь.

https://academy.terrasoft.ru/documents/administration/7-16/dobavlenie-sushchestvuyushchey-detali-na-stranicu-zapisi

Создаю запись детали, но они не сохраняются.

В детали два поля справочник и дробное число.

 

Можете подсказать, как это можно решить?

 

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

Нравится

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

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

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

Добрый вечер.

У меня была подобная проблема из-за того, что у схемы таблицы детали не было указано поле для отображения.

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

Сидоров Александр Валерьевич, Алла Савельева,

 

Спасибо за ваши ответы!

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

 

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