день добрый!
в процессе работы возник вопрос связан с содержимым таблицы "dayofweek"

В нескольких базах, которие я проверил  неделя начинается с воскресенья (код дня =1).

Документация гласит, что неделя начинается с понедельника и в понедельника код дня должен бить 1.

https://academy.terrasoft.ua/documents/technic-sdk/7-6-0/dayofweek-metod

Вопрос: можно ли самому изменить номера дней в таблице? может ли это изменение (присвоения понедельнику кода 1, вт=2 ... воск=7 )повлиять на базовый функционал?

 

скрин с моей базы

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

 

 

Нравится

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

Здравствуйте, Юрий

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

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

Добрый день.

Следую инструкции https://academy.terrasoft.ru/documents/marketing/7-11/ustanovka-servisa-globalnogo-poiska застрял на пункте 6. "Предварительные настройки конфигурационных файлов".

Не могу найти значения, которые нужно указать в конфиг-файлах компонентов

  • GlobalSearch.WebApp

  • GlobalSearch.WindowsService

  • GlobalSearch.Worker.WindowsService

Есть более подробное описание по настройке этих файлов или конкретный пример со значениями?

Нравится

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

Здравствуйте, Максим!

 

Для компонента GlobalSearch.WebApp, вам необходимо указать такие значения:

RabbitMq  - формат amqp://логин:пароль@rabbit-url:amqp_port/ где amqp_port – это порт api rabbitmq. Увидеть его можно в админ панели rabbitmq во вкладке overview:

ApiKey – пустая строка «»

DbName — название БД. – не используется

DbServerName — название сервера БД. - не используется

ElasticSearchUrl — URL к серверу ElasticSearch. Пример http://ru1-es-bpm.bpmonline.com:9201/

ConfigFolder – путь к доступной директории в файловой системе. Пример \\tscore-dev-15\GSSConfigs

 

Для компонента GlobalSearch.WindowsService.exe.config, необходимо указать такие значения:

DataCenterName = OnSiteDataCenter -  имя датацентра, в котором работает сервис.

DBServerNameTemplate – {0} - шаблон названия сервера БД

 

Все другие значения, которые указаны в инструкции на Академии https://academy.terrasoft.ru/documents/marketing/7-11/ustanovka-servisa-globalnogo-poiska?_ga=2.15657590.1384539171.1517901712-1106679796.1517901712#XREF_10690_bat есть в конфигурационных файлах.

 

Спасибо за обращение в службу поддержки Terrasoft.

Анна Журавель, здравствуйте.

Спасибо за помощь в настройке конфигов. Теперь столкнулся со следующей проблемой: 

https://academy.terrasoft.ru/documents/marketing/7-11/opisanie-api-servisa-globalnogo-poiska#XREF_17963_API

 здесь дан пример кода. Вот что у меня получилось

Я нашел, что можно с этим сделать, но получаю другую ошибку

Почему может не находиться метод addsite?

 

 

Здравствуйте, Максим!



Судя по Вашим скриншотам, вы не совсем правильно сформулировали POST запрос и не прописали ApiKey и SiteName.

Данный POST запрос должен идти не к ElasticSearch, а к Global Search Service. В POST запросе необходимо указывать адрес сервиса который указан в IIS,а не путь к файлам сервиса.

В инструкции на Академии (https://academy.terrasoft.ru/documents/marketing/7-11/opisanie-api-servisa-globalnogo-poiska?_ga=2.128212741.845169317.1518421536-1106679796.1517901712#XREF_17963_API) указано, какие значения нужно присвоить параметрам ApiKey и SiteName, а именно :

•ApiKey — ключ авторизации (указывается в Web.config). Указывать нужно если не указали в этом файле.

•SiteName — название Вашего сайта.

Кроме этого, обращаем Ваше внимание на то, что Global Search Service нужно развернуть как отдельный сайт в IIS, а не как приложение сайта bpmonline.

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

Добрый день. При разработке нового раздела в мобильном приложении возникла проблема с настройкой с выбором колонки реестра для стандартной детали. Настройка первичной колонки будто вовсе не срабатывает. В качестве отображаемого значения всегда выводится guid-ное значение (id строки). При этом вторичная колонка настраивается без каких-либо проблем. 

Terrasoft.sdk.GridPage.setPrimaryColumn("MyModel", "MyModelField1");
 
Terrasoft.sdk.GridPage.setSecondaryColumn("MyModel", "MyModelField2");

Пробовал устанавливать значения через convertFunction, но она вообще не вызывается.

В чём может быть причина подобного поведения?

Нравится

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

Добрый день!

Для решения вашей бизнес цели Вы можете использовать следующее:

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

  1. Добавляем новую схему типа "Module" с именем UsrИмя_вашей_схемы
  2. Пишем в ней примерно такой код:

    Terrasoft.sdk.GridPage.setPrimaryColumn("ContactCareer", "JobTitle");

    Terrasoft.sdk.RecordPage.addColumn("ContactCareer", {

            name: "JobTitle",

            position: 1

        }, "primaryColumnSet");

    Terrasoft.sdk.RecordPage.removeColumn("ContactCareer", "Contact", "primaryColumnSet");

    Где ContactCareer - имя таблицы, которая соответствует нашей детали;

          JobTitle - имя колонки, которую нужно отобразить

Подключаем данную схему в манифесте мобильного приложения MobileApplicationManifestDefaultWorkplace:

Находим блок модели Ваш_блок(например, ContactCareer) и в PagesExtensions добавляем наш модуль UsrИмя_вашей_схемы

 

Гриценко Игорь,

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

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

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

 

 

define("InvoiceProductPageV2", [], function() {

    return {

        entitySchemaName: "InvoiceProduct",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        attributes: {

                "Usrcenabez": {

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                    dependencies: [

                        {

Amount].

                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],

                            methodName: "calculatecenabezNDS"

                        }

                    ]

                },

                "UsrNDS": {.

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                    dependencies: [

                        {

                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],

                            methodName: "calculatebezNDS"

                        }

                    ]

                },

                "UsrbezNDS": {

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                    dependencies: [

                        {

                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],

                            methodName: "calculateNDS"

                        }

                    ]

                },

                "UsrStoimsdos": {

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                    dependencies: [

                        {

                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],

                            methodName: "calculateStoim"

                        }

                    ]

                },

                "Usrcenasdost": {

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                    dependencies: [

                        {

                            columns: ["UsrStoimsdos", "Quantity"],

                            methodName: "calculateCena"

                        }

                    ]

                }

            },

            methods: {

                onEntityInitialized: function() {

                                        this.callParent(arguments);

                                        this.calculateCena();

                                    },

                calculateCena: function() {

                                        var ct = this.get("UsrStoimsdos");

                                        var kol = this.get("Quantity");

                                            //}

                                        var res = ct / kol;

                                        this.set("Usrcenasdost", res);

                                    },

                onEntityInitialized: function() {

                                        this.callParent(arguments);

                                        this.calculatecenabezNDS();

                                    },

                calculatecenabezNDS: function() {

                                        var q = this.get("UsrbezNDS");

                                        var g = this.get("Quantity");

                                        var rez = q / g;

                                        this.set("Usrcenabez", rez);

                                    },.

                onEntityInitialized: function() {

                                        this.callParent(arguments);

                                        this.calculatebezNDS();

                                    },

                calculatebezNDS: function() {

                                        var ob = this.get("UsrStoimsdos");

                                        var dt = this.get("UsrbezNDS");

                                        var rez = ob - dt;

                                        this.set("UsrNDS", rez);

                                    },

                onEntityInitialized: function() {

                                        this.callParent(arguments);

                                        this.calculateNDS();

                                    },

                calculateNDS: function() {

                                        var st = this.get("UsrStoimsdos");

                                        var rez = st / 1.18;].

                                        this.set("UsrbezNDS", rez);

                                    },

                onEntityInitialized: function() {

                                        this.callParent(arguments);

                                        this.calculateStoim();

                                    },

                calculateStoim: function() {

                                        var amount = this.get("TotalAmount");

                                        var dost = this.get("Usrfff");

                                        var result = amount + dost;\

                                        this.set("UsrStoimsdos", result);

                                    }

            },

            rules: {},

            businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/

        };

});

 

Нравится

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

Алена, добрый день. Если под "добавление записи" вы подразумеваете сохранение, вам необходимо переопределить метод save или onSaved и вызвать в нем ваши методы. Если речь об открытии карточки новой записи - аналогичные действия для методы onEntityInitialized.

Кот Владимир Владимирович,

Можете подробно рассказать как мне это сделать?

Алена, да, конечно. Повторно посмотрев ваш код стало ясно что вы были на правильном пути. Ваши methods должны выглядеть так: 

onEntityInitialized: function() {
	this.callParent(arguments);
	this.calculateCena();
	this.calculateNDS();
	this.calculatebezNDS();
	this.calculatecenabezNDS();
	this.calculateStoim();
},
calculateCena: function() {
	var ct = this.get("UsrStoimsdos");
	var kol = this.get("Quantity");
		//}
	var res = ct / kol;
	this.set("Usrcenasdost", res);
},
calculatecenabezNDS: function() {
	var q = this.get("UsrbezNDS");
	var g = this.get("Quantity");
	var rez = q / g;
	this.set("Usrcenabez", rez);
},
calculatebezNDS: function() {
	var ob = this.get("UsrStoimsdos");
	var dt = this.get("UsrbezNDS");
	var rez = ob - dt;
	this.set("UsrNDS", rez);
},
calculateNDS: function() {
	var st = this.get("UsrStoimsdos");
	var rez = st / 1.18;].
	this.set("UsrbezNDS", rez);
},
calculateStoim: function() {
	var amount = this.get("TotalAmount");
	var dost = this.get("Usrfff");
	var result = amount + dost;\
	this.set("UsrStoimsdos", result);
}

 

Кот Владимир Владимирович,

Спасибо большое, а как мне сделать чтобы рассчитывалось сразу после сохранения, а не после редактирования какого то значения

Алена, та же  логика - вызвать все ваши методы чтобы установились необходимые аттрибуты, а потом сохранить:

save: function() {
	this.calculateCena();
	this.calculateNDS();
	this.calculatebezNDS();
	this.calculatecenabezNDS();
	this.calculateStoim();
	this.callParent(arguments);
}

 

Кот Владимир Владимирович,

Владимир.   

    "Usrcenabez": {

                // Тип данных колонки модели представления.

                    dataValueType: Terrasoft.DataValueType.FLOAT,

                // Массив конфигурационных объектов, определяющих зависимости колонки [UsrBalance].

                    dependencies: [

                        {

                        // Значение колонки [UsrBalance] зависит от значений колонок [Amount] 

                        // и [PaymentAmount].

                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],

                        // Метод-обработчик, который вызывается при изменении значения одной из колонок [Amount] 

                        // и [PaymentAmount].

                            methodName: "calculatecenabezNDS"

                        }

                    ]

                },

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

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

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

В таком случае рекомендуем посмотреть нет ли ошибок в консоли, скорее всего у вас значения согласно вашей бизнес-логики рассчитываются только если заполнены все необходимые поля. Если причину такого поведение обнаружить не удастся, напишите, пожалуйста, письмо на support@terrasoft.ru с описанием кейс воспроизведения и ссылкой на ваш сайт и этот пост.

Кот Владимир Владимирович,

можете мне подсказать что нужно сделать в странице

ProductSelectionModule  чтобы продукты рассчитывались сразу

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

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

Возникла необходимость доработать раздел шаблонов email сообщений. Добавил замещающую схему для раздела и страницы. Если входить в раздел из справочников, то всё работает нормально, но если зайти в раздел напрямую из меню разделов, то страница падает с ошибкой 

Uncaught TypeError: Cannot read property 'primaryDisplayColumn' of undefined
    at constructor.<anonymous> (ProfileUtilities.js:90)
    at constructor.nextStep (commonutils.js:103)
    at commonutils.js:488
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.enable (require.js:1173)
    at Module.init (require.js:786)
    at require.js:1457
(anonymous) @ ProfileUtilities.js:90
nextStep @ commonutils.js:103
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
(anonymous) @ ProfileUtilities.js:86
nextStep @ commonutils.js:103
Terrasoft.utils.common.chain @ commonutils.js:106
getSectionDefaultGridSettings @ ProfileUtilities.js:84
initSectionProfile @ ProfileUtilities.js:101
(anonymous) @ ProfileUtilities.js:121
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
XMLHttpRequest.send (async)
profileRequest @ profile.js:44
load @ profile.js:50
(anonymous) @ require.js:1092
(anonymous) @ require.js:134
on @ require.js:515
callPlugin @ require.js:953
fetch @ require.js:822
check @ require.js:854
enable @ require.js:1173
enable @ require.js:1554
(anonymous) @ require.js:1158
(anonymous) @ require.js:134
each @ require.js:59
enable @ require.js:1110
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
requireProfile @ ProfileUtilities.js:30
getProfile @ ProfileUtilities.js:113
initSchemaProfile @ SchemaBuilderV2.js:162
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:156
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
getEntitySchema @ SchemaBuilderV2.js:94
initSchemaEntitySchema @ SchemaBuilderV2.js:154
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:142
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
getSchemaResources @ SchemaBuilderV2.js:89
initSchemaResources @ SchemaBuilderV2.js:140
nextStep @ commonutils.js:103
initSchemaCustomAttributes @ SchemaBuilderV2.js:134
nextStep @ commonutils.js:103
requireSchema @ SchemaBuilderV2.js:114
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:221
nextStep @ commonutils.js:103
Terrasoft.utils.common.chain @ commonutils.js:106
requireAllSchemaHierarchy @ SchemaBuilderV2.js:219
buildSchemaHierarchy @ SchemaBuilderV2.js:317
(anonymous) @ SchemaBuilderV2.js:286
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
callGetModule @ require.js:1200
completeLoad @ require.js:1587
onScriptLoad @ require.js:1714
core.js:581 user: BPMOutsource2/aa3ba720-d1cd-46f3-9cce-33ccc71e0113
 file: https://msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js
 line: 90
 column: 45
 message: Uncaught TypeError: Cannot read property 'primaryDisplayColumn' of undefined 
 date: Tue Dec 19 2017 19:47:38 GMT+0300 (Russia TZ 2 Standard Time)
 stack: TypeError: Cannot read property 'primaryDisplayColumn' of undefined
    at constructor.<anonymous> (https://msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js:90:45)
    at constructor.nextStep (https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:103:10)
    at https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:488:12
    at Object.execCb (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1693:33)
    at Module.check (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:881:51)
    at Module.enable (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1173:22)
    at Module.init (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:786:26)
    at https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1457:36

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

//attributes
            CanAddOrEdit: {
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                value: false
            },
//diff
            {
                "operation": "merge",
                "name": "DataGridActiveRowCopyAction",
                "values": {
                    "visible": {"bindTo": "CanAddOrEdit"}
                }
            }

Кто-то либо сталкивался с подобными проблемами?

Нравится

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

Добрый день!

На счет первого вопроса: можете уточнить что именно вы дорабатывали, т.к. не совсем ясен характер ошибки. Если можете - представьте ваш код раздела шаблонов email.

А на счет второго вопроса - сложность в том, что строчка реестра - это чаще всего BaseSectionGridRowViewModel (если он для раздела не переопределен) и он не видит атрибуты и методы, которые определены в разделе. Для того, чтобы переопределить свой SectionGridRowViewModel необходимо для начала сообщить разделу, что у него будет другой SectionGridRowViewModel, переопределив метод в разделе:

getGridRowViewModelClassName: function() {
	return "Terrasoft.UsrEmailTemplateSectionGridRowViewModel";
}

В данном примере имя одной строки раздела будет определено как UsrEmailTemplateSectionGridRowViewModel. diff остается такой же, как указан у вас.

После этого необходимо уже непосредственно создать обьект UsrEmailTemplateSectionGridRowViewModel, который должен расширять базовый BaseSectionGridRowViewModel. В нем же и нужно определить тот метод (либо атрибут) CanAddOrEdit, который и будет вызываться при выборе строчки реестра. Для примера, если у нас есть метод, который будет определять видимость кнопки, то обьект выглядит примерно так:

define("UsrEmailTemplateSectionGridRowViewModel", ["ext-base",
	"terrasoft", "BaseSectionGridRowViewModel"],
	function(Ext, Terrasoft) {
 
	Ext.define("Terrasoft.configuration.UsrEmailTemplateSectionGridRowViewModel", {
		extend: "Terrasoft.BaseSectionGridRowViewModel",
		alternateClassName: "Terrasoft.UsrEmailTemplateSectionGridRowViewModel",
		CanAddOrCopy: function() {
			var result = ... //логика для определения видимости кнопки
			return result;
		}
	});
	return Terrasoft.UsrEmailTemplateSectionGridRowViewModel;
});

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

Напишите, получилось ли у вас и уточните более подробно на счет первого вопроса, будем разбираться :)

Золотарев Артем Андреевич, Ошибку с замещением удалось исправить, проблема была в том, что в коде замещающей схемы не было явно указано значение entitySchemaName.

Спасибо за пример со строками реестра. Он заработал. Но у меня такой вопрос, как можно задать значение извне или самой RowViewModel взять его? У меня возможность добавлять, изменять или копировать определяется единоразово при обращении к сервису. Не хотелось бы делал вызов к сервису при клике на каждую строку.

В общем, удалось сделать через статические методы класса. Для моего случая достаточно и такой реализации. И соответственно, надо вызвать в коде реестра установку значения.

define("SxEmailTemplateSectionGridRowViewModel", ["ext-base",
    "terrasoft", "BaseSectionGridRowViewModel"],
    function(Ext, Terrasoft) {
 
    Ext.define("Terrasoft.configuration.SxEmailTemplateSectionGridRowViewModel", {
        extend: "Terrasoft.BaseSectionGridRowViewModel",
        alternateClassName: "Terrasoft.SxEmailTemplateSectionGridRowViewModel",
        statics: {
            _canAddOrEdit: false,
            setCanAddOrEdit: function(value) {
                _canAddOrEdit = value;
            },
            getCanAddOrEdit: function() {
                return _canAddOrEdit;
            }
        },
        getCanCopy: function() {
            return Terrasoft.SxEmailTemplateSectionGridRowViewModel.getCanAddOrEdit();
        }
    });
    return Terrasoft.SxEmailTemplateSectionGridRowViewModel;
});

 

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

Помогите плз. с проблемой:

при попытке сохранить пакет в среде разработки, система выдает ошибку, якобы в пакете, от которого зависит текущая разработка, не указанно хранилище системы контроля версий. Но он - пакет, предоставленный вендером.

Как можно зафиксировать изменения моего пакета? 

Нравится

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

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

Возможным вариантом решения Вашей ситуации будет создание нового пакета и заливка всех схем в него.

Denys Diachenko,

Да, спасибо. Именно так я и поступил:

- создал новый пакет

- перенес все схемы в него

- зафиксировал изменения

- успешно выгрузил из SVN

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

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

1. Можно ли использовать для детали filterMethod, как в основной версии, или каким-либо образом использовать произвольный фильтр, а не только по колонке родительской страницы?

2. Как отключить возможность добавлять, удалять и редактировать записи детали, в зависимости от значений на родительской странице?

Заранее спасибо.

Нравится

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

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

1. Для деталей можно указывать фильтры, используя метод configure() соотв. sdk-класса:

 

Terrasoft.sdk.Details.configure("Contact", "ActivityDetailV2StandartDetail", {
   filters: Ext.create("Terrasoft.Filter", {
      type: Terrasoft.FilterTypes.Group,
      subfilters: [
         Ext.create("Terrasoft.Filter", {
            compareType: Terrasoft.ComparisonTypes.NotEqual,
            property: "Type",
            value: Terrasoft.GUID.ActivityTypeEmail
         })
      ]
   })
});

2. В целом, изменение режима работы детали делается так:

Terrasoft.sdk.Details.setChangeModes("Contact", "ActivityDetailV2StandartDetail", [Terrasoft.ChangeModes.Read]);

Но если нужно менять режим работы от условия, то для этого в контроллерах страниц есть метод getChangeModes(). Т.е. в контроллерах соотв. страниц (грида, просмотра, редактирования) нужно расширить этот метод:

 

getChangeModeOperations: function() {
   var detailConfig = this.getDetailConfig();
   if (detailConfig) {
      var parentRecord = detailConfig.parentRecord;
      if (parentRecord.get("IsNonActualEmail") === false) {
         return {
            canCreate: false,
            canUpdate: false,
            canDelete: false
         };
      }
   }
   return this.callParent(arguments);
}
Показать все комментарии

Возможно ли расположить кнопку напротив каждой строки детали? Например кнопку "Удалить".

Примерно так:

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

Нравится

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

И "Редактировать"!

Не знаю как с кнопками в конце, но в схеме разделов можно подсмотреть код и реализовать такой вариант:

Чисто теоретически можно забиндаться к добавлению записи в грид и вставлять свой контейнер с кнопкой на то место что вам требуется. Ну и конечно придётся поиграться со стилями. Что-то подобное мы уже пытались делать. Одно могу сказать что к добавлению элемента в DOM мы уже имели опыт биндинга и выполнения своей логики, а так же создания произвольных HTML элементов на странице.

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

{
	id: "duplicateGrid",
	className: "Terrasoft.Grid",
	type: "tiled",
	primaryColumnName: "Id",
	activeRow: {bindTo: "activeRow"},
	columnsConfig: [columnsConfig],
	collection: {bindTo: "gridData"},
	activeRowAction: {bindTo: "onActiveRowAction"},
	activeRowActions: [
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsNotDuplicateCaption,
			tag: "IsNotDuplicate",
			visible: {bindTo: "getGridButtonIsNotDuplicateVisible"}
		},
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsDuplicateCaption,
			tag: "IsDuplicate",
			visible: {bindTo: "getGridButtonIsDuplicateVisible"}
		}
	]
}

 

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

Добрый день коллеги.

При попытке удалить Изменение из раздела "Изменения"

DELETE FROM [dbo].[Change]

Where Number = 'CR00001863'

получил ошибку типа:

The DELETE statement conflicted with the REFERENCE constraint "FK5Kbu9RCt70eQZWfPa41rONXsAM". The conflict occurred in database "NameDB", table "dbo.SysChangeRight", column 'RecordId'.

Залез в таблицу dbo.SysChangeRight - да, там есть записи с данным Id изменения.

Вопрос: достаточно ли будет удаления из таблицы dbo.SysChangeRight записей с Id.изменения, чтобы получить возможность выполнить верхний скрипт? 

Нравится

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

Необязательно. Вдруг есть ещё ссылки из других таблиц.

А вообще, в таблице SysChangeRight должна быть каскадная связь на поле RecordId, чтобы удаляло вместе с основной записью автоматически. Если нет, можно добавить, поставив галочку в объекте.

 

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

Ссылки из других таблиц были - (деталь: активности) - они удалились каскадно средствами дизайнера. Не удалились каскадно, средствами дизайнера, история по данному Изменению и Согласование данного изменения - это все я "навернул"  запросом в SQL. А дальше - проблема, описанная выше...

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

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

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

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

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

 

Нравится

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

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

if (this.isAddMode()) {....вызов функций...}

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