Есть БП, внутри которого в Сценарии на C# вычисляется большая таблица данных. Её нужно один-в-один положить в БД. Все поля известны.

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

Нравится

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

Добрый день

Конечно не очень хорошо в памяти держать большую таблицу :), но раз так, то подумаем логически что нам нужно сделать:

  1. Можно попробовать передать по одной записи, но тогда будут потери времени на уровне сетевых устройств + постоянное создание транзакций 
  2. Можно одним запросом реализовав хранимую процедуру

Лучше всего использовать хранимую процедуру, которая может иметь также 2 варианта:

  1. Передаются данные параметром (все записи вместе)
  2. Хранимая процедура берет данные из файла (который уже положен на диск, если есть такая возможность)

Оптимальный вариант №1. Но какой параметр. Варианта опять 2:

  1. Зарегистрировать свой тип на уровне БД 
  2. Передать все в виде xml

Оба варианта не понятны будут для приложения bpmonline, но, тип xml хорошо преобразовуется в nvarchar(max) и обратно.

Поэтому финальный вариант я вижу такой:

  1. На сервере в С# коде готовим XML с данными
  2. На уровне БД пишем хранимую процедуру с входящим параметром nvarchar(max)
  3. Внутри процедуры преобразовуем в xml и начинаем работать с xml на уровне SQL (https://docs.microsoft.com/ru-ru/sql/t-sql/xml/nodes-method-xml-data-type

 

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

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

 

Я создал деталь с редактируемым реестром и страницу для нее.

 

Мне нужно либо скрыть в активной записи на конкретном справочнике, либо повесить обработчик на событие нажатия на эту кнопку.  И получить в обработчике  информацию на какой записи и справочнике был клик.

https://academy.terrasoft.ru/jscoresdk/source/clearicon.html

По ссылке нашел некоторые методы, но не знаю как их использовать.

Нравится

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

Вооружаемся напильником и в схеме детали прописываем что-то вроде

getDefaultCellControlsConfig: function(columnName, params) {
	var config = {
		itemType: Terrasoft.ViewItemType.MODEL_ITEM,
		name: columnName,
		labelConfig: {visible: false}
	};
	//columnName - название колонки из объекта
	if (columnName === 'ContainerType') {
		config.hasClearIcon=false;
	}
	return this.Ext.apply(config, params);
},

 

 Добрый день.

Если вы хотите поставить свой обработчик, то в таком случае нужно заместить модуль ConfigurationGrid, в нем переопределить метод renderRowControls. В этом методе происходит генерация моделей полей. Вам нужно в модели нужного поля подписаться на событие “cleariconclick “. Например viewModel.on(“cleariconclick “, myHandler).

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

Есть хорошая статья

https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/kak-vydelit-cv…

и всё, что в ней написано, хорошо работает. 

Но мне надо, чтобы активная запись не меняла свой цвет на дефолтный. Как это сделать?

Нравится

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

Добрый день, Алексей!

Не совсем ясна задача. Вы хотите, чтобы активная запись выделялась другим цветом? Тогда вам нужно создать модуль (не замещающий, а именно просто модуль), на вкладке LESS прописать CSS стили для CSS-класса grid-row-selected, например так:

.grid-row-selected {
	background-color: #000000 !important;
}

На первой вкладке с названием "Исходный код" прописать название модуля, чтобы не запутаться советую использовать название модуля в котором будет меняться стиль и в конце добавить суфикс Css. Например, для раздела контактов можно написать такой код в этом модуле:

define("UsrContactSectionCss", [],
		function() {
			return {};
		});

Теперь нужно переопределить ContactSectionV2 и в него прописать зависимость от наших прописанных стилей, добавив беред названием модуля "css!", т.е. код может быть такой:

define("ContactSectionV2", ["css!UsrContactSectionCss"], function() {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

При таких манипуляциях активная запись будет иметь черный фон. Так можно работать с любыми стилями.

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

Коллеги, посоветуйте, пожалуйста, какой формат даты и времени выбрать, чтобы иметь возможность вводить её в общепринятом виде dd.MM.yyyy?

Перепробовали очень многие, но на такой так и не нарвались (версии 7.8 и 7.11)

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

Нравится

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

Возможно ли сделать нумерацию строк в реестре?

Возможно ли сделать нумерацию строк в каждом реестре BPM (разделы, детали)?

Пишу сюда в надежде на помощь ибо нет даже предположений как это сделать(

Нравится

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

А вам нужна именно нумерация строк или записей?

Второе решается более-менее стандартными методами, а цель первого не совсем понятна

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

именно строк, меняем сортировку, фильтры - нумерация та самая - 1,2,3,4. Многие цели клиентов нам не понятны...

Добрый день, Виталий!

Самый простой способ сделать это в разделе - это заместить обьект и добавить к нему целочисленное поле, в котором динамически проставлять нумерацию. Можно сделать и добавление колнки динамически, а не через обьект, но это намного сложнее и может привести к проблемам в некоторых разделах. Например, к разделу "Контакт" добавим поле с именем UsrRowNumber. Для этого после добавления поля к обьекту "Контакт" нужно настроить отображение колонок и вывести новосозданное поле. А потом на странице раздела ContactPageV2 переопределить метод onGridDataLoaded, чтобы получилось примерно такое:

onGridDataLoaded: function() {
  this.callParent(arguments);
  for (var i = 0; i < this.getGridData().collection.items.length; i++) {
    var itemId = this.getGridData().collection.items[i].get("Id");
    this.getGridData().get(itemId).set("UsrRowNumber", (i + 1));
  }
},

Таким образом, будет работать нумерация в разделе "Контакты". Скорее всего вам не нужна будет сортировка по этой колонке реестра, так как это не даст никакой сортировки. В этом случае можно переопределить также метод sortColumn, в котором проверять какая колонка сейчас будет отсортирована и не сортировать, если это колонка UsrRowNumber. Как пример:

sortColumn: function(index) {
  var columnsSettingsProfile = this.get("Profile");
  var columnsConfig = columnsSettingsProfile.DataGrid.listedConfig;
  var columnName;
  if (!Ext.isEmpty(columnsConfig)) {
    var columns = this.Ext.decode(columnsConfig);
    var column = columns.items[index];
    columnName = column.bindTo;
  }
  if (columnName !== "UsrRowNumber") {
    this.callParent(arguments);
  }
}

Тогда при нажатии на заголовок колонки UsrRowNumber в реестре ничего не произойдет, а во всех других случаях все будет работать.

Если же говорить про детали, то тут немного проще динамически добавить колонку. Можно попробовать перехватить Profile детали в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig). 

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig (или tiledConfig) для изменения конфигурации колонок грида. Сначала конфиг нужно распарсить (можно использовать либо Ext.decode, либо JSON.parse), модифицировать как вам необходимо и вернуть орбатно с помощью this.set("Profile", newProfile).

Может и пойдет такое, но хотят чтобы это было в каждом раздели и детали, представление только списком будет. Без создания колонки в объекте можно сделать? Динамически нужно)

Радчук Виталий Владимирович,

Чтобы сделать сразу на всех деталях нужно делать перехват Profile как описано выше, но этот перехват делать на базовой клиентской схеме детали грида (например, BaseGridDetailV2) и тогда все будет работать для всех деталей, которые от него наследуются.

То же самое можно сказать и для раздела, но там все сложнее. Модифицировать придется также базовый раздел BaseSection, но тут нет метода initProfile, поэтому сложнее динамически модифицировать колонки.

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

Требуется вывести раздел особым, ни на что стандартное не похожим образом.

Например, убрать кнопки (Открыть, Копировать) по нажатию на элемент, вывести несколько элементов в строке и т.д.

Возникает вопрос - как отменить базовые стили раздела (т.к. они применяются еще и к тэгам)? Как убрать названия и кнопки и т.д.?

Нравится

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

Андрей, здравствуйте! 

Вам необходимо переопределять базовые стили, которые есть в различных схемах. Например, схема "SectionModuleV2" или "CommonCSSV2" (вкладка LESS)

Похожие топики можете поискать на community - https://community.terrasoft.ru/search?search_api_fulltext=%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C+%D1%81%D1%82%D0%B8%D0%BB&field_tags=&sort_by=search_api_relevance

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

Есть у меня раздел, а у сущности есть поле "дата доставки".

Как мне отфильтровать так, чтобы вывести только объекты доставленные более Х дней назад, где Х - произвольное число?

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

Там есть фильтр "Предыдущих дней", но он как-то странно работает.

Нравится

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

Здравствуйте, Алексей

Прошу Вас уточнить что Вы имеете ввиду под "...но он как-то странно работает"?

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

Denys Diachenko,

Я ставлю <= Предыдущих дней "5" и получаю все сущности, как будто и фильтрации не было.

Если я что-то делаю не так, подскажите как. И, если знаете, расскажите, что это за фильтр такой? В какой запрос он конвертируется?

У функции сравнения с датой есть интересная фича (кажется, недокументированная):

Когда Вы используете фильтр <= 100 то учитываются предыдущие 100 дней.

А когда Вы устанавливаете <100, то учитываются даты которые были до предыдущих 100 дней.

 

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

Блин, точно! Равенство здесь применять нельзя для моего случая.

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

Как открыть карточку? например существующей записи из раздела или детали? Если это новая запись и некоторые поля нужно предзаполнить?

Я нашел только такой пример:

var defaultValues = [];

                defaultValues.push({

                    name: "UsrTotalAmountLotRR",

                    value: 0

                });

                this.sandbox.publish("OpenCard", {

                    moduleId: "SectionModuleV2_edit_Usrtenders1Section_CardModuleV2_detail_UsrSchema15Detaild4b8" +

                        "30e8UsrCommercialPartInTenderUsrUsrCommercialPartInTender1Page00000000-0000-0000-0000-000000000000",

                    schemaName: "UsrUsrCommercialPartInTender1Page",

                    operation: enums.CardStateV2.ADD,

                    id: recordId,

                    defaultValues: defaultValues

                }, [this.sandbox.id]);

Но поле UsrTotalAmountLotRR - пустое

Нравится

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

Добрый день

Попробуйте отладить this.sandbox.publish и посмореть как используется defaultValues. Можете сразу посмотреть в BaseSchemaViewModule в методе openCardInChain, проследив цепочку

Если просто открыть то так:

this.openCardInChain({

                        id: message2,

                        schemaName: "InvoicePageV2",

                        operation: enums.CardStateV2.EDIT,

                        moduleId: "SectionModuleV2_edit_OrderSectionV2_CardModuleV2_detail_InvoiceInvoiceInvoicePageV200000000-0000-0000-0000-000000000000"

                    });

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

Мною была создана деталь по это инструкции: https://academy.terrasoft.ru/documents/technic-sdk/7-10/sozdanie-detali-s-redaktiruemym-reestrom

 

С помощью SQL запроса деталь была зарегистрирована. И затем добавлена на вкладку [Доставка] страницы заказа, через мастер.  По полям Колонка детали: запрос и колонка объекта: id.

В схему детали был добавлен код:

        attributes: {            
            "UsrOrder": {
                dependencies: [
                    {
                        columns: ["UsrOrder"],
                        methodName: "calculateBalance"
                    }
                ]
            }
        },
 
        methods: {
            calculateBalance: function() {
                var param1 = this.get("UsrOrder");
console.log(param1);
            }
        },

 

В результате метод  calculateBalance не срабатывает.

Как реализовать отлов события изменения значения колонки и изменение соседних колонок в методе сработавшим на изменение.

Нравится

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

У меня абсолютно такой же способ срабатывает. Вы компилировали конфигурацию после регистрации страницы через sql?

Варфоломеев Данила,  полностью перекомпилировал конфигурацию, не помогло. А так же не знаю, плохо ли, такая ошибка после нажатия на кнопку обновить выбранные в базе данных: Не удалось обновить структуру для схем: UsrCourierServiceDetail ....   

Такой вопрос, нужно ли, где-либо прописывать bindTo на атрибут, может поэтому событие не происходит?

То что осталась ошибка "Не удалось обновить структуру для схем: UsrCourierServiceDetail" - плохо. Поскольку структура БД не была обновлена, и там попросту нет таблицы с актуальными колонками UsrCourierServiceDetail. Потому сначала нужно решить проблему с обновлением структуры БД, после выполнить перекомпиляцию приложения. После внесенных изменений должен отрабатывать метод calculateBalance.

Привет

Внимательно разберитесь с примером https://academy.terrasoft.ru/documents/technic-sdk/7-10/dobavlenie-vych…

Вы пытаетесь использовать вычисляемый атрибут, который пересчитывается с помощью метода calculateBalance при изменении колонки UsrOrder. А так как колонка детали UsrOrder никогда  не меняется после создания, то и метод не вызывается :)

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

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

Добрый день.

Хотел задать вопрос по поводу создания нового рабочего пространства. В документации написано, что для создания нового рабочего пространства необходимо в настройках IIS добавить в веб-сайт новое приложение WebApp указав в качестве псевдонима следующий порядковый номер, оставив при этом все остальные настройки такими же как и для рабочего пространства 0. Правильно ли я понимаю, что физически на диске будет одна папка Terrasoft.WebApp, и с этой одной папкой, в случае нескольких рабочих пространств, будет работать несколько приложений IIS? Или же надо делать на диске копии папки Terrasoft.WebApp и создавать в IIS приложения, каждое из которых работает со своей папкой?

Заранее спасибо за ответ.  

Нравится

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

Здравствуйте, Игорь!

Использовать рабочие пространства (кроме рабочего пространства по умолчанию Default) не рекомендуется. В промышленной среде использовать рабочие пространства (кроме Default) запрещено.

Это функционал является устаревшим и постепенно выводится из приложения.

Большое спасибо за ответ.

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