Добрый день.

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



Вроде этот функционал уже был в terrasoft 3.x и bpmonline 5.x.

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

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

Я передал Вашу идею аналитикам продукта на рассмотрение актуальности и возможности реализации такого функционала в будущих версиях приложения.

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

Симптомы:

Ошибка: Could not load file or assembly 'SharpSvn'

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

Причина:

При обновлении клиента с 7.11.3 на 7.12.0

Решение:

Новая настройка безопасности. Чтобы можно было запускать консоль с удаленных серверов нужно в app.config консоли добавить/отредактировть параметр:

true" />

Нравится

Поделиться

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

Метод, реализующий выделение всех загруженных записей.

this.methods.selectAll = function() {
    var grdData = this.get('gridData');
    if (!this.get('multiSelect')){
        this.switchGridMode();
    }
    this.set('selectedRows', grdData.collection.keys);
}

 

Нравится

Поделиться

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

Основные причины потери производительности:

  1. IIS
  2. Процесс приложения
  3. SQL
  4. Redis
  5. Сеть

1. Приложение может виснуть от превышения количество запросов в очереди (по умолчанию 1000).

2. Проверить загруженность системы (ЦП и память). Процесс W3wp. Утилиты DotMemory, DotTrace и др.

3. Проверка выполнения скорости запросов в БД.

В профайлере настроить по условию время выполнения больше 2000 мс, так как большая часть запросов выполняются очень быстро можно отсеять только те, что могут тормозить наше приложение. Также можна проверить выполнение запросов напрямую в БД. Может быть проблема с индексами или не оптимизирован запрос.

4. Проверить Редис. При достаточно больших объёмах данных и неправильное работы, редис часть данных сохраняет на диск. Очевидным становится проблема медленных дисков, ибо при не нахождении в оперативной памяти начинает искать на медленном диске.

5. Проверка сети. С помощью утилит посылать пакеты разных размеров и следить за временем ответа сервера. Если ответы слишком долгие, то нужно смотреть.

Нравится

Поделиться

0 комментариев
Показать все комментарии
Публикация

Вопрос

Суть ошибки: не компилируется один из Package (пакет оракла, а не нашего приложения) с ошибкой, содержащей текст:

ORA-00932: inconsistent datatypes

или

После входа ошибка Authorization Failed

Ответ

Cсылка на багу оракла и патч, который нужно скачать и установить на сервер при возникновении ошибки. Воспроизводится точно на версии 11.2.0.4 (и, судя по описанию патча, еще и 11.2.0.3).

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2003626_1.html

Дополнительно:

There's a known bug related to this see - MOS note 2003626.1. 

It's fixed in patch 18139621. 

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9519164900346280654

https://stackoverflow.com/questions/43589677/ora-00932-expected-number-got/43591908

Нравится

Поделиться

0 комментариев
Показать все комментарии
define('ContactPage', ['terrasoft', 'Contact', 'ContactPageStructure', 'ContactPageResources'],
    function(Terrasoft, Contact, structure, resources) {
    structure.userCode = function() {
        var account;
        var accountPhone;
        var groupIndex = 0;
        var itemIndex = 0;
        var group = this.schema.leftPanel[groupIndex];
        var item = group.items[itemIndex];
        //перебором ищем нужный контрол по имени
        while (item.name !== 'Account') {
            if (itemIndex === group.items.length - 1) {
                groupIndex++;
                itemIndex = -1;
                group = this.schema.leftPanel[groupIndex];
            }
            itemIndex++;
            item = this.schema.leftPanel[groupIndex].items[itemIndex];
        }
        //пушим новую виртуальную колонку номера контрагента
        this.schema.leftPanel[groupIndex].items.push({
            type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
            caption: "Account Phone",
            columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            name: 'AccountPhone',
            dataValueType: Terrasoft.DataValueType.TEXT,
            visible: true,
            customConfig: {
                enabled: false
            },
            dependencies: ['Account'],
            methodName: 'onAccountChange'
        });
        //описываем выборку из базы значения номера телефона по Id текущего контрагента
        //и заполняем добавленную виртуальную колонку
        var baseOnAccountChange = this.methods.onAccountChange;
        this.methods.onAccountChange = function() {
            if (Ext.isFunction(baseOnAccountChange)) {
                baseOnAccountChange.call(this);
            }
            account = this.get('Account');
            var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                rootSchemaName: 'Account'
            });
            esq.rowCount = 1;
            esq.addColumn('Id');
            esq.addColumn('Name');
            esq.addColumn('Phone');
            esq.getEntity(account.value, function(result) {
                var entity = result.entity;
                accountPhone = entity.get('Phone');
                this.set('AccountPhone', accountPhone);
            }, this);
        };
        //вызываем функцию заполнения колонки при первичной загрузке страницы
        var childOnAccountChange = this.methods.onAccountChange;
        var baseInit = this.methods.init;
        this.methods.init = function() {
            if (Ext.isFunction(baseInit)) {
                baseInit.call(this);
            }
            childOnAccountChange.call(this);
        };
    };
    return structure;
});

 

Нравится

Поделиться

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

В английских сборках BPMonline 7x есть проблема с замещением объектов: при попытке выбрать родительский объект выпадающий список пустой.

Это возникает из-за символа ' (апостроф, или одинарная кавычка) в заголовке объекта. Исправить это досадное недоразумение можно выполнив следующий запрос:

update SysSchema
set Caption = replace (Caption, '''', '')

 

Нравится

Поделиться

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

Добавляем действие перехода к контакту на деталь «Карьера контакта»

Чтобы добавить кнопку «Перейти к контакту» необходимо реализовать несложный замещающий модуль страницы детали «Деталь карьера контакта».

define('ContactCareerDetail', ['terrasoft', 'ContactCareer', 'ContactCareerDetailStructure',
'ContactCareerDetailResources'],
function(Terrasoft, ContactCareer, structure, resources) {
    structure.userCode = function() {
        //в этом методе можно работать со списком действий детали
        this.modifyUtilsButton = function(utilsButton) {
            //получаем список действий
            var utilsMenuItems = utilsButton.menu.items;
            //добавляем новый пункт в начало списка
            utilsMenuItems.unshift(actionGoToContact);
            return utilsButton;
        };
        var actionGoToContact = {
            caption: resources.localizableStrings.GoToContact,
            click: {
                bindTo: 'goToContact'
            },
            enabled: {
                bindTo: 'isAnySelected'
            }
        };
        this.methods.goToContact = function() {
            var selectedRows = this.GetSelectedItems();
            if (Ext.isEmpty(selectedRows)) {
                return;
            }
            var viewModel = this;
            var cardSchemaName;
            var moduleStructure = Terrasoft.configuration.ModuleStructure.Contact;
            var config = Terrasoft.configuration.EntityStructure[this.entitySchema.columns.Contact.name];
            if (config) {
                cardSchemaName = config.pages[0].cardSchema;
            }
            var gridData = this.get('gridData');
            var contactId;
            gridData.collection.items.forEach( function(item) {
                if (item.values.Id == selectedRows[0]) {
                    contactId = item.values.Contact.value;
                }
            });
            if (contactId) {
                var token = moduleStructure.cardModule + '/' + cardSchemaName + '/view/' + contactId;
                Terrasoft.Router.pushState(null, null, token);
            }
            else {
                return;
            }
        };
    };
return structure;
});

 

Нравится

Поделиться

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

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

Возможно ли сделать нумерацию строк в каждом реестре 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. Если я что-то добавлю (контакт, учетная запись и т. Д.) в bpm'online эти данные экспортируются в мобильное приложение после выполнения синхронизации (это нормально. Но когда я удаляю что-то в bpm'online, эти данные не удаляются  в мобильном приложении после синхронизации, почему?
  2. В Mobile Wizard у меня нет вкладки Dashboard, но в bpm'mobile у меня есть эта вкладка, почему?
  3. Во вкладке Продажи Супервизор не видит продажи. Как я помню, вы написали мне, что это нормально, но как я могу это изменить? Я хочу, чтобы супервизор увидел все продажи.

Решение

1. К сожалению, мобильное приложение не синхронизирует информацию об удаленных записях в bpm'online. Мы знаем об этой ошибке и планируем ее исправить в одном из будущих выпусков. 

2. Вы не можете настроить диаграмму Dashboard в Mobile Wizard, эта функция доступна только в планах.

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

Нравится

Поделиться

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