Добрый день. 

Следуя инструкции на академии добавил действие на страницу карточки.       

getActions: function() {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator",
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		"Caption": {bindTo: "Resources.Strings.SendTTForApprovalCaption"},
		"Tag": "onSendTTForApprovalClick",
		"Enabled": {bindTo: "isSendTTForApprovalEnabled"}
	}));
	return actionMenuItems;
},
isSendTTForApprovalEnabled: function() {
	return !Ext.isEmpty(this.get("Status")) ?
		this.get("Status").value === JSConstants.Change.Status.WritingTTId :
		false;
}

 Также добавил локализируемую  строку и метод, на который биндится свойство enabled, на страницу раздела

isSendTTForApprovalEnabled: function(activeRowId) {
	activeRowId = this.get("ActiveRow");
	var gridData = this.get("GridData");
	var selectedChange = gridData.get(activeRowId);
	var status = selectedChange.get("Status");
	return status.value === JSConstants.Change.Status.WritingTTId;
}

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

 

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

Нравится

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

Добрый день,

У меня такой вопрос, есть представление VwExample, я добавил SQL сценарий на его изменение через ALTER VIEW, добавил пару колонок. При выборке через MSSQL Server все нормально выбирает.

Однако в коде почему то говорит 

Terrasoft.Common.ItemNotFoundException: Значение с именем "TestColumn" не найдено

 

Выбираю следующим образом 

 

var esqActivity = new EntitySchemaQuery(userConnection.EntitySchemaManager, "VwExample");
esqActivity.AddAllSchemaColumns(true);
var entities = esqActivity.GetEntityCollection(userConnection);

Значения получаю так: 

foreach (var entity in entities)
{
    var test = activity.GetTypedColumnValue("TestColumn");
    
}

Такое ощущение что в BPM хранится предыдущее представление до его изменения, хотя в базе данных при Select * from VwExample" выводит все колонки, в том числе TestColumn. Я что то забываю?

Нравится

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

ESQ берёт информацию о колонках не из самой таблицы или view в базе, а из объекта в конфигурации. Соответственно, нужно открыть дизайнер объекта и добавить и там все новые колонки.

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

Всем доброго времени суток. Версия 7.11.

Можно ли реализовать подобное:

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

То есть всплывающую подсказку, вроде стандартного title, всплывающего по наводке на заголовок колонки. В идеале ещё по наводке на строку "всплывать" поле Name.

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

Нравится

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

Краткая инструкция (как делал я всплывающие окна в редактируемом гриде на проекте):

1) Запилить свой грид с  ̶б̶л̶е̶к̶д̶ж̶е̶к̶о̶м̶  mouseOver-ивентами. Которые выпаливают fireevent. Который отлавливается в diff-описании грида. На который биндится функция, которая вызывает п.6.

2) Сделать свой Listener (наподобие дефолтного. который открывает мини-странички). При инициализации детали загружать его.

3) В listener-е описать ContainerviewModel. Его тоже нужно будет описать в отдельной схеме.

4) Для ContainerviewModel вызвать свой модуль (Не забыть и его создать, вместе со схемой страницы)

5) Вот уже эту страницу наполнять как угодно, реализовывать любую логику.

6) Ну и чтобы это все работало в детали перехватывать сообщение от грида, вызвать

 Terrasoft.MyPageListener.open(...)

 

Ну и ещё отладить весь этот велосипед. Вот. Желательно предварительно запастись недельным запасом чая.

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

Добрый день!

Создал новый список в итогах раздела Активности, и всё бы хорошо, но хочется исключить из списка записи с 0 (подсчитывал кол-во завершённых активностей для сотрудников).

В параметрах отображения выбирал "Активность(по колонке ответственный) количество > 0" но это не помогло.

Вариантов кроме создания представления в БД и соответствующего объекта в конфигурации, чтобы строить аналитику по нему нет?

Нравится

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

В SQL за это отвечает инструкция having (условия постобработки выборки), на сколько я понимаю, пока этого в итогах нет

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

Например, есть запрос на sql такого вида:

declare @DocumentTypeId uniqueidentifier

declare @InvoiceTypeId uniqueidentifier

update I

set

    I.TypeId = @InvoiceTypeId

from Invoice I

    join Document D on D.Id = I.DocumentId

where D.TypeId = @DocumentTypeId

Можно ли его реализовать с помощью класса Update на C#?

Нравится

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

Добрый день.

При попытке сохранить новую запись в бд через esq возникает ошибка на методе Save():

"Ссылка на объект не указывает на экземпляр объекта..    в Terrasoft.Core.DB.Select.GetSqlText()"

Код:

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderProduct");
			var esqEntity = schema.CreateEntity(UserConnection);
			esqEntity.SetColumnValue("Id", entity.BpmId);
            ....
            esqEntity.SetColumnValue("CurrencyId", entity.CurrencyId);
            esqEntity.UseAdminRights = false;
            esqEntity.Save();

 

Нравится

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

Сообщение «Ссылка на объект не указывает на экземпляр объекта» означает, что в C#-коде конфигурации или ядра в какое-то поле попадает Null, а с ним пытаются работать как с объектом. Например, обращаться к его полям и методам. Не видя полного кода и стека сложно сказать точно, где именно.

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

Коллеги, у кого был опыт, поделитесь лучшими практиками.

Есть bpm'online CRM 7.3, которая автоматически на 7.4 (и далее) не переводится. Техподдержка предложила сделать всё руками на новой системе (что технически возможно).

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

Возможно, в мире существует набор SQL-скриптов, которые делают это для базовой конфигурации (для измененной уже допишем)?



Заранее спасибо за варианты решения

Нравится

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

Добрый день.

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

begin transaction
declare @syncTablesNames TABLE (TableName varchar(50));
declare @sourceDBName varchar(50),
                @tableName varchar(50),
                @columnName varchar(50),
                @sourceColumnExists bit,
                @insertSQLText nvarchar(MAX),
                @selectSQLText nvarchar(MAX),
                @columnExistsSQLText nvarchar(MAX),
                @idExistsCondition nvarchar(MAX),
                @resultSQLText nvarchar(MAX);

SET @sourceDBName = 'SourceDataBaseName';

-- set tables names
INSERT INTO @syncTablesNames 
        SELECT 'tbl_Contact' UNION 
        SELECT 'tbl_Account';


declare tableNameCursor cursor LOCAL FAST_FORWARD FOR SELECT * FROM @syncTablesNames;

open tableNameCursor;

fetch next FROM tableNameCursor INTO @tableName

WHILE (@@fetch_status = 0)
BEGIN
        SET @insertSQLText = 'insert into ' + @tableName + '(';
        SET @selectSQLText = 'select ';
        SET @idExistsCondition = ' where not ID in (select ID from ' + 
           @tableName + ');';

        --Disable Table Constraint 
        exec ('alter table ' + @tableName + ' nocheck constraint all; ');

        declare columnNameCursor cursor LOCAL FAST_FORWARD FOR SELECT COLUMN_NAME                                                   
                                                     FROM information_schema.COLUMNS
                                                     WHERE TABLE_NAME = @tableName;
        open columnNameCursor;
        fetch next FROM columnNameCursor INTO @columnName;
        while (@@fetch_status = 0)
        begin
                SET @columnExistsSQLText = 'if exists (select COLUMN_NAME ' + 
                                                'from ' + @sourceDBName +  
                                                '.information_schema.columns ' +
                                                'where TABLE_NAME = ''' + 
                                                       @tableName + ''' AND ' +
                                                      'COLUMN_NAME = ''' +  
                                                       @columnName + ''') ' +
                                              'set @sourceColumnExists = 1 ' +
                                           'else ' + 
                                              'set @sourceColumnExists = 0 ';
        
                --check remote table column exists
                exec sp_executesql @columnExistsSQLText, 
                                   N'@sourceColumnExists bit out',
                                   @sourceColumnExists = @sourceColumnExists output

                --include column into select-insert statment
                IF (@sourceColumnExists = 1)
                begin
                        SET @insertSQLText = @insertSQLText + @columnName + ', ';
                        SET @selectSQLText = @selectSQLText + @columnName + ', ';
                end;

                fetch next FROM columnNameCursor INTO @columnName;
        end;
        close columnNameCursor;
        deallocate columnNameCursor;

        SET @insertSQLText = substring(@insertSQLText, 1, len(@insertSQLText) - 2);
        SET @selectSQLText = substring(@selectSQLText, 1, len(@selectSQLText) - 2);

        SET @insertSQLText = @insertSQLText + ') ';
        SET @selectSQLText = @selectSQLText + ' from ' + @sourceDBName + '.dbo.' +    
           @tableName + @idExistsCondition;
        
        --result select-insert statment
        SET @resultSQLText = @insertSQLText + @selectSQLText;

        exec (@resultSQLText);

        fetch next FROM tableNameCursor INTO @tableName
END;

close tableNameCursor;
deallocate tableNameCursor;


--Enable Table Constraint 
declare tableNameCursor cursor LOCAL FAST_FORWARD FOR SELECT * FROM @syncTablesNames;
open tableNameCursor;
fetch next FROM tableNameCursor INTO @tableName;

WHILE (@@fetch_status = 0)
BEGIN
        exec ('alter table ' + @tableName + ' check constraint all; ');
        fetch next FROM tableNameCursor INTO @tableName;
END;

close tableNameCursor;
deallocate tableNameCursor;

rollback

Но все же, мне кажется, лучше это делать стандартными средствами - через Excel.

Выгрузить в Excel таблицы с десятками полей из 7.3 - это тоже задача ещё 

Если оценивать по трудоемкости, то мне кажется оптимально:

  1. Сделать вручную генерацию sql-скриптов на 7.3
  2. Запускать на 7.12, пока, не заработаетdevil

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

Меня одно удивляет - в каждом проекте изобретался велосипед?

В каждом проекте перехода с 7.3 до 7.12 да, сейчас конечно обновления на порядок проще

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

Есть ли у кого опыт интеграции d3.js в bpm?

Сталкивался ли кто-нибудь с такой ошибкой:

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

Листинг:

https://gist.github.com/MikeWar1ock/a42fdaa5d5d22d210059187b0338ba7d

Нравится

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

Михаил, стандартно в системе bpm'online и Marketplace нет готовых реализаций интеграции с фреймворком d3.js. Вы можете заказать такую доработку в рамках проекта или разработки для Marketplace.

Судя по скриншоту, Вы положили js-файл прямо в папку с сайтом. Видимо, так нельзя и нужно делать из него отдельную схему в конфигурации, как с jquery. См. тут.

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

Добрый день!

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

Нравится

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

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

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

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

Юлия, спасибо за ответ! уже нашёл похожий пост по хэштегу #среднее время, там как раз про представление в БД.

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

При попытке использовать параметр в запросе $top (см пример запроса)

ProductStockBalanceCollection?$top=100$filter=Warehouse/Id eq guid'ba765c02-b0aa-11e6-bea8-00155d020d02'

получаю ответ о некорректности использования этого параметра

Incorrect format for $top argument '100$filter=Warehouse/Id eq guid'ba765c02-b0aa-11e6-bea8-00155d020d02''.

 

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

Без использования этого параметра - отрабатывает корректно 

Нравится

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