Можно ли как-то прочитать название если в объекте в колонке указан справочник, так как там указан Guid?

Пример:

[#Читать данные контакта.Первый элемент результирующей коллекции.Страна#] узнать название страны при чтении из "Читать данные"

Нравится

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

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

Алла Савельева,

Первый способ не подходит, там 18 справочником, выйдет многовато читать. Второй способ я использовал, но руководство не совсем приветствует использование C# скриптов

Придётся делать подряд 2 элемента чтения данных: в первом читать из контакта Id страны, во втором — из справочника стран, отфильтрованного по этому Id, получать название.

Зверев Александр у меня 6 таблиц которые нужно заполнить данными. Для каждой таблицы порядка 20 справочников читать. Выйдет адский труд

Если таких слишком много и писать скрипты не хотите, можно ещё сделать view с текстовыми колонками, потом создать по нему объект и работать с ним.

Prime Source,

Prime Source пишет:

руководство не совсем приветствует использование C# скриптов

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

К сожалению, пока вычитать данные из связанных таблиц в элементе 'Чтение данных' невозможно.

Как вариант, можно реализовать представление, которое содержит все нужные данные и обращаться к нему из элемента 'Чтение данных', но это такой вариант костыля и потом, так как мне не до конца известна Ваша задача, то не факт, что представление будет лучше, чем C# код.

Алла Савельева,

Спасибо, мне нужно было что бы люди тоже подтвердили мое мнение начальству. Скрипт я написал, он сам чиатет и сам пишет все в таблице трансферную которую мне нужно

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

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

Здравствуйте! Интересует вопрос по интеграции с телефонией Asterisk. в статье https://academy.terrasoft.ru/documents/sales-team/7-10/sravnenie-vozmoz… обнаружил, что у Asterisk нет возможности принимать входящие звонки.

Можно будет ли доработать функционал для принятия звонков?

Поскольку для интеграции необходимо установить Terrasoft Messaging Service ,какое дополнительное оборудование придется приобретать?

И какой коннектор лучше использовать? (Asterisk, или коннектор к любой ip телефонии)

 

Спасибо!

Нравится

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

Чесноков Егор, 

да, там только пакет с коннектором устанавливается. Но нужно понимать, что в системе будут сохранятся только те звонки, которые прошли когда у пользователя была открыта bpm'online. Если этого недостаточно, то смотрите в сторону webitel call manager. Но это АТС, которую все равно необходимо настраивать. 

Используйте Webitel AnyVoip как транспорт. Вместо коннектора Asterisk. 

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

Я правильно понимаю, что при использовании этого коннектора мы можем обойтись без TMS?

Чесноков Егор, 

да, там только пакет с коннектором устанавливается. Но нужно понимать, что в системе будут сохранятся только те звонки, которые прошли когда у пользователя была открыта bpm'online. Если этого недостаточно, то смотрите в сторону webitel call manager. Но это АТС, которую все равно необходимо настраивать. 

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

Спасибо!

По настройке Asterisk есть отдельная статья. Terrasoft Messaging Service ставится на сервер под Windows.

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

Здравствуйте! Задача, создать группу чекбоксов меняющуюся в зависимости от значения другого поля. В bpmonline вообще можно реализовать группу чекбоксов? Или есть другой способ реализации этой задачи (постановка ниже)?

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

Нравится

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

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

Каждый чекбокс логическое поле, или виртуальная колонка (атрибут).

Их группировка возможна либо через группу полей, либо просто в одном месте страницы разместите (например, в контейнер)

Для изменения чекбоксов стоит прописать зависимость значений от поля(ей) и прописать методы обработки изменений 

Есть пример на академии по реализации вычисляемых полей https://academy.terrasoft.ru/documents/technic-sdk/7-13/dobavlenie-vych…

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

Каждый чекбокс логическое поле, или виртуальная колонка (атрибут).

Их группировка возможна либо через группу полей, либо просто в одном месте страницы разместите (например, в контейнер)

Для изменения чекбоксов стоит прописать зависимость значений от поля(ей) и прописать методы обработки изменений 

Есть пример на академии по реализации вычисляемых полей https://academy.terrasoft.ru/documents/technic-sdk/7-13/dobavlenie-vych…

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

Подскажите,можно ли виртуальное поле типа LOOKUP сделать выпадающим списком?

Если меняю на тип ENUM, то поле визуально выглядит списком, но данные при нажатии на стрелочку не выпадают.

Нравится

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

А если не менять данные есть?

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

Спасибо. Все получилось.

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

Добрый день!

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

Нравится

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

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

Есть инструкция для разделов: https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-v-ra…

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

Можно ли вытащить в виде быстрого фильтра текстовую строку?

Нравится

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

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

Идея - настраивать фильтр и запускать обновление грида детали только по добавленной кнопке "Применить".

В разделах есть деталь «Хронология», там сверху текстовое поле поиска работает именно так, ищет только после нажатия Enter. Но там же при изменении даты начала и конца фильтр применяется автоматически. Блок фильтров этой детали сделан в TimelineFiltersSchema.

Смородинов Денис,

 

А как в итоге решили проблему с добавлением?

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

Добрый день! 

Задача -  задать полю Примечание свойство, чтобы оно было всегда в режиме "без форматирования".

Подскажите пжлст, какое свойство отвечает за этот параметр?

 

Благодарю!

 

Нравится

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

Насколько понимаю такого свойства нет, но что мешает заместить вам детель и вместо поля примечания вставить свое многострочное поле ввода?

Насколько понимаю такого свойства нет, но что мешает заместить вам детель и вместо поля примечания вставить свое многострочное поле ввода?

Ну если я правильно понял, то нужно выбрать последний элемент, среди компонентов форматирования, можно сделать например так:

$(document).bind("DOMNodeInserted", function(e) {
if (e.target.id === "cke_ContactPageV2NotesHtmlEdit-html-edit-textarea") {
	var tabs = Ext.getElementById("ContactPageV2NotesHtmlEdit-html-edit-toolbar");
 
	var elem = Ext.get(tabs.children[9]);
	elem.dom.children[1].className = "t-btn-wrapper t-btn-no-text-padding t-btn-style-default t-btn-pressed";
 
}
}.bind(this));



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

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

Версия 7.12.4.

Добавил деталь в р. "Обращения портала"

При инициализации детали получаю ошибку: 

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

После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина  ProcessEntryPointUtilities.

В результате этой ошибки деталь не отображается в карточке Обращения на портале.



 

 

Нравится

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

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

/**
 * Initializes "Run process" menu items in detail.
 * @param {Function} callback Callback function.
 * @param {Object} scope Execution context.
 * @protected
 */
initDetailRunProcessButtonMenu: function(callback, scope) {
	var processButtonMenu = this.get("RunProcessButtonMenuItems");
	if (!processButtonMenu) {
		processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection");
		this.set("RunProcessButtonMenuItems", processButtonMenu);
	}
	if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {
		this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
	} else {
		callback.call(scope);
	}
},

Возможно, для стандартной детали до else и не доходит.

Илья, добрый день.

В том то и дело, что 

Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);

НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind

Т.о. при выводе детали для пользователя портала  получаем ошибку

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

Мотков Илья,

Деталей на портале нет. 

Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback

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

Мотков Илья,

Метод initDetailRunProcessButtonMenu  вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)

Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu  не принимает аргументов)

Сам метод initDetailRunProcessButtonMenu   описан в схеме-миксине ProcessEntryPointUtilities



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



Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.

Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.

Мотков Илья,

Илья, решение я уже нашёл (заместил 

BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)

Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает. 

Чтобы это по возможности было исправлено в следующих релизах.

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

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

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

Добрый день!



Есть небольшая задача:

1) по нажатию кнопки открывается всплывающее окно с возможностью оставить комментарии в ленту

2) после нажатия ОК - окно закрывается и комментарий добавляется в ленту этого объекта



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



По примеру, понимаю что можно сделать обычное модальное окно, но используя обычный пример выдается ошибка: ModalBox.show is not a function

Единственное где используется:                  

var renderTo = ModalBox.show(config, function() 
{sandbox.unloadModule(moduleId, renderTo); });

Или пример корявый или где-то что-то надо еще делать. Сам пример: https://community.terrasoft.ru/articles/prosteisee-modalnoe-okno-modalb…

 

Нравится

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

2) Как то так значение полей подберите сами

var insert = Ext.create("Terrasoft.InsertQuery", {
		rootSchemaName: "SocialMessage"
	});
	insert.setParameterValue("Message", data.message, Terrasoft.DataValueType.TEXT);
	if (data.entityId) {
		insert.setParameterValue("EntitySchemaUId", data.entitySchemaId, Terrasoft.DataValueType.GUID);
		insert.setParameterValue("EntityId", data.entityId, Terrasoft.DataValueType.GUID);
	}
	insert.execute(function(result) {
		if (result.success) {
			//чтото делаем если успешно добавлена запись
		});
	}

 

Могу предложить по сути то же, что и в той теме, но чуть более расписанное, для понимания:

 

Модальное окно состоит из 3 частей.
 
Часть 1.
Указываем define
 
define("DocumentPageV2", ["ServiceHelper", "ModalBox", "ModalBoxSchemaModule"],
    function(ServiceHelper, ModalBox, resources) {
 
Вызов данного окна в нужной нам части:
Вызываем например по кнопке.
    {
                "operation": "insert",
                "name": "createActivity",
                "values": {
                    "itemType": 5,
                    "visible": true,
                    "caption": "Создать активности",
                    "click": {
                        "bindTo": "createActivity"
                    },
                    "layout": {
                        "column": 2,
                        "row": 1,
                        "colSpan": 1
                    }
                },
                "parentName": "ActionDashboardContainer",
                "propertyName": "items",
                "index": 0
            },
 
Затем в самом методе вызываем окно, так же можно повесить дополнительный функционал:
 
    onMyClick: function() {
                this.openTransactionPage();
            },
 
добавляем методы:
 
    openTransactionPage: function() {
                this.sandbox.loadModule("ModalBoxSchemaModule", {
                    id: this.getTransactionPageId()
                });
            },
 
            getTransactionPageId: function() {
                return this.sandbox.id + "_OpModalPageDateTO";
            }
 
    subscribeSandboxEvents: function() {
                debugger;
                this.callParent(arguments);
                this.sandbox.subscribe("DataFromModal", function(arg) {
                    console.log("msg from modal: " + arg.test);
                }, this, [this.sandbox.id + "_" + "OpModalBoxSchemaModule"]);
                this.sandbox.subscribe("ButtonClose", function() {
                    var moduleName = "OpModalBoxSchemaModule";
                    var moduleId = this.sandbox.id + "_" + moduleName;
                    var config = {
                        heightPixels: 420,
                        widthPixels: 750
                    };
                    var renderTo = ModalBox.show(config, function() {
                        sandbox.unloadModule(moduleId, renderTo);
                    });
                    this.sandbox.unloadModule(moduleId, renderTo);
                    this.sandbox.unsubscribePtp("ButtonClose");
                    ModalBox.close(true);
                }, this, [this.getTransactionPageId()]);
 
 
                this.sandbox.subscribe("GetModuleInfo", function() {
                    return {
                        schemaName: "OpModalPageDateTO"
                    };
                }, this, [this.getTransactionPageId()]);
            },
 
 
            onEntityInitialized: function() {
                this.callParent(arguments);
            },
 
 
Часть 2.
Создаем новый модуль. Наследуемся от "Базовый модуль схемы ( NUI )"
define("OpModalBoxSchemaModule", ["ModalBox", "BaseSchemaModuleV2"],
function(ModalBox) {
    Ext.define("Terrasoft.configuration.OpModalBoxSchemaModule", {
        extend: "Terrasoft.BaseSchemaModule",
        alternateClassName: "Terrasoft.OpModalBoxSchemaModule",
        messages: {
            "ButtonClose": {
                "mode": this.Terrasoft.MessageMode.PTP,
                "direction": this.Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        },
        CloseModalBox: function() {
            this.callParent(arguments);
        },
        subscribeSandboxEvents: function() {
            this.callParent(arguments);
            this.sandbox.subscribe("ButtonClose", function() {
                this.sandbox.unloadModule("ModalBoxSchemaModule");
            }, this, [this.getTransactionPageId()]);
        },
        init: function() {
            this.callParent(arguments);
        },
        /**
         * @inheritDoc Terrasoft.BaseSchemaModule#generateViewContainerId
         * @overridden
         */
        generateViewContainerId: false,
        /**
         * @inheritDoc Terrasoft.BaseSchemaModule#initSchemaName
         * @overridden
         */
        initSchemaName: function() {
            this.subscribeSandboxEvents();
            this.schemaName = "OpDateTO";
        },
        /**
         * @inheritDoc Terrasoft.BaseSchemaModule#initHistoryState
         * @overridden
         */
        initHistoryState: Terrasoft.emptyFn
    });
    return Terrasoft.OpModalBoxSchemaModule;
});
 
 
Часть 3. Создаем карточку модального окна, которое мы увидим, при вызове.
В качестве родителя для модуля указываем "Базовая схема модального окна ( NUI )"
Так же, необходимо создавать свои контейнеры, чтобы в них размещать необходимые нам поля.
 
define("OpModalPageDateTO", ["ServiceHelper", "ModalBox"], function(ServiceHelper, ModalBox) {
    return {
        entitySchemaName: "OpDateTO",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "index": 0,
                "name": "CardContentWrapper",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "wrapClass": ["modal-box-card-content-wrap"],
                    "items": []
                }
            },
            {
                "operation": "insert",
                "parentName": "CardContentWrapper",
                "propertyName": "items",
                "name": "CardContentContainer",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "wrapClass": ["modal-box-card-content-container"],
                    "items": []
                }
            },
            {
                "operation": "insert",
                "name": "MyContainer",
                "propertyName": "items",
                "parentName": "CardContentWrapper",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "items": []
                }
            },
            {
                "operation": "insert",
                "name": "HeaderContainer",
                "index": 1,
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "wrapClass": ["header", "modal-box-page-header-container"],
                    "items": []
                }
            },
            {
                "operation": "insert",
                "parentName": "HeaderContainer",
                "propertyName": "items",
                "name": "CloseButtonContainer",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "wrapClass": ["close-btn-container"],
                    "items": []
                }
            },
            {
                "operation": "insert",
                "parentName": "HeaderContainer",
                "propertyName": "items",
                "name": "HeaderCaptionContainer",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTAINER,
                    "wrapClass": ["header-name-container"],
                    "items": []
                }
            },
            {
                "operation": "insert",
                "parentName": "HeaderCaptionContainer",
                "propertyName": "items",
                "name": "HeaderCaption",
                "values": {
                    "itemType": Terrasoft.ViewItemType.LABEL,
                    "caption": "Выберите месяц и год"
                }
            },
            {
                "operation": "insert",
                "parentName": "MyContainer",
                "propertyName": "items",
                "name": "MyGridContainer",
                "values": {
                    "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                    "items": []
                }
            },
            {
                "operation": "insert",
                "parentName": "MyGridContainer",
                "name": "OkCloseButton",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                    "click": {bindTo: "esqGetNumberMonth"},
                    "markerValue": "OkCloseButton",
                    "caption": "Принять",
                    "layout": { "column": 1, "row": 4, "colSpan": 7 }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyGridContainer",
                "name": "CloseButton",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "style": Terrasoft.controls.ButtonEnums.style.BLUE,
                    "click": {bindTo: "CloseModalPage"},
                    "markerValue": "CloseButton",
                    "caption": "Закрыть",
                    "layout": { "column": 2, "row": 4, "colSpan": 14 }
                }
            },
            {
                "operation": "insert",
                "name": "OpDate",
                "values": {
                    "layout": {
                        "colSpan": 14,
                        "rowSpan": 1,
                        "column": 1,
                        "row": 1,
                        "layoutName": "Header"
                    },
                    bindTo: "OpDate",
                    href: "",
                    "contentType": Terrasoft.ContentType.ENUM
                },
                "parentName": "MyGridContainer",
                "propertyName": "items",
                "index": 11
            }
        ]/**SCHEMA_DIFF*/,
        messages: {
            "ButtonClose": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            },
            "DataFromModal": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function(callback, scope) {
                this.callParent([function() {
                    Ext.callback(callback, scope);
                    this.updateSize(400, 300);
                }, this]);
 
            },
            onCloseButtonClick: function() {
                this.sandbox.publish("DataFromModal", null, [this.sandbox.id]);
                ModalBox.close();
            },
            CloseModalPage: function() {
                this.sandbox.publish("ButtonClose", null, [this.sandbox.id]);
            }
        }
    };
});

 

Литвинко Павел,

В Вашем коде у меня была ошибка с ButtonClose. Писал что не подписана карточка на это.



А с кодом по примеру еще пошаманил, но все равно равно ошибки:

ModalBox.show is not a function 

и "console" is not defined (а это и в Вашем коде была ошибка такая)

Быстров Сергей,

Ну по первым двум, нужно смотреть, что не так, а console, если ругается на console.log, то можете смело удалить эту строку

Если вам только запросить у пользователя комментарий то зачем рисовать модальные окна? Имхо проще использовать стандартные диалоги и только если их функционал не устраивает рисовать свои:

Terrasoft.showInputBox("Введите свой бесценный комент", function() {}, ["ok"], null, {
	name : {
		dataValueType: Terrasoft.DataValueType.TEXT,
		value: "",
		customConfig: {
			className: "Terrasoft.MemoEdit",
			height: "215px"
		}
	}
},
{
	defaultButton: 0
});

 

Вот боле полный пример с получением введенного текста

_requestActionComment: function(caption, buttonCaption, maxCommentSize, callback, scope) {
	var controls = {
		comment: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: resources.localizableStrings.Comments,
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "77px",
				maxlength: maxCommentSize
				}
			}
		};
		var config = {
			defaultButton: 0,
			style: {
				borderStyle: "ts-messagebox-border-style-blue visa-action",
				buttonStyle: "blue"
			}
		};
		var yesButton = {
			className: "Terrasoft.Button",
			caption: buttonCaption,
			returnCode: "yes"
		};
		Terrasoft.utils.inputBox(caption, function(result, arg) {
			if (result === yesButton.returnCode) {
				var comment = arg.comment.value;
				if (comment && maxCommentSize && comment.length > maxCommentSize) {
					comment = comment.substring(0, maxCommentSize);
				}
				callback.call(scope, comment);
			}
		}, [yesButton, "cancel"], this, controls, config
	);
},

 

Григорий Чех,

Действительно, это решает мою задачу, но остался вопрос - как создать новый комментарий по введенному тексту?



Немного не понял с callback. Почему нельзя простым this.set? 

1) Можно this.set просто пример более глубокий можно передавать callback

2) Как то так значение полей подберите сами

var insert = Ext.create("Terrasoft.InsertQuery", {
		rootSchemaName: "SocialMessage"
	});
	insert.setParameterValue("Message", data.message, Terrasoft.DataValueType.TEXT);
	if (data.entityId) {
		insert.setParameterValue("EntitySchemaUId", data.entitySchemaId, Terrasoft.DataValueType.GUID);
		insert.setParameterValue("EntityId", data.entityId, Terrasoft.DataValueType.GUID);
	}
	insert.execute(function(result) {
		if (result.success) {
			//чтото делаем если успешно добавлена запись
		});
	}

 

Григорий Чех,

Большое спасибо за помощь. Получилось реализовать все что задумано 

coment: function(caption, buttonCaption, maxCommentSize, callback, scope) {
	var controls = {
		comment: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: resources.localizableStrings.Comments,
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "77px",
				maxlength: maxCommentSize
			}
		}
	};
	var config = {
		defaultButton: 0,
		style: {
			borderStyle: "ts-messagebox-border-style-blue visa-action",
			buttonStyle: "blue"
		}
	};
	Terrasoft.utils.inputBox(caption, function(result, arg) {
		if (result === "ok") {
			var comment = arg.comment.value;
			if (comment != null) {
				comment = "<p>" + comment + "</p>";
				var insert = Ext.create("Terrasoft.InsertQuery", {
					rootSchemaName: "SocialMessage"
				});
				insert.setParameterValue("Message", comment, Terrasoft.DataValueType.TEXT);
				insert.setParameterValue("EntitySchemaUId", "117d32f9-8275-4534-8411-1c66115ce9cd",
					Terrasoft.DataValueType.GUID);
				insert.setParameterValue("EntityId", this.caseRecordId, Terrasoft.DataValueType.GUID);
				window.console.log(insert);
				insert.execute(function(result) {
					if (result.success) {
						window.console.log("dobavili");
					}
				});
			}
		}
	}, ["ok", "cancel"], this, controls, config);
}

 

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

Здравствуйте, подскажите новичку, можно ли в печатную форму добавить поле, в котором будет проводится такой расчет: есть колонка "Сумма" и "Сумма оплаты". Надо подсчитать их разность(то есть получится долг по оплате). Для этого надо создавать такое поле в bpm? или можно обойтись без этого? спасибо!

Нравится

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

Ещё один вариант реализации: реализовать представление (view), в котором вывести все нужные поля для печатной формы + добавить 'виртуальное' значение, которое будет расчитывать разность 2-х полей.

А потом это представление использовать в отчете.

В любом из трех вариантов прийдется немного попрограммировать и, если у Вас соответствующих знаний нет, то самый простой в этом случае, на мой взгляд, ответ под номером 2 Саши Зверева.

Может, лучше всё же сделать новое поле «Долг» и написать БП его заполнения при сохранении. Его можно будет и в реестр раздела вывести, и отсортировать, если потребуется.

Если в базе уже есть записи, нужно будет позаботиться о единоразовом наполнении нового поля для них.

Ещё один вариант реализации: реализовать представление (view), в котором вывести все нужные поля для печатной формы + добавить 'виртуальное' значение, которое будет расчитывать разность 2-х полей.

А потом это представление использовать в отчете.

В любом из трех вариантов прийдется немного попрограммировать и, если у Вас соответствующих знаний нет, то самый простой в этом случае, на мой взгляд, ответ под номером 2 Саши Зверева.

всем спасибо, использовала вариант создания поля и соответствующего БП, высчитывающий разность и сохраняющий значение в это поле

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