Вопрос

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.getEntityCollection(function(result) {
                var existsContactsCollection = [];
                if (result.success) {
                    result.collection.each(function(item) {
                        existsContactsCollection.push(item.get(segmentName).value);
                    });
                }
                var config = {
                    entitySchemaName: segmentName,
                    multiSelect: true,
                    columns: ["Type"]
                };
                
                var isAccount;
                if (segmentName === "Account") {
                    config.filters = Ext.create("Terrasoft.FilterGroup");
                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                    isAccount = true;
                }
                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

                    existsFilter.Name = "existsFilter";
                    if (isAccount) {
                        config.filters.add("second", existsFilter);
                    } else {
                        config.filters = existsFilter;
                    }
                }
                this.openLookup(config, function(config) {
                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
                }, this);
            }, this);
        },
где detailColumnName = "Campaing",
segmentName = "Product",
entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));
                
            var config = {
                entitySchemaName: segmentName,
                multiSelect: true,
                columns: ["Type"]
            };
            
            var isAccount;
            if (segmentName === "Account") {
                config.filters = Ext.create("Terrasoft.FilterGroup");
                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                isAccount = true;
            }
            
            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);
            existsFilter.Name = "existsFilter";
            if (isAccount) {
                config.filters.add("second", existsFilter);
            } else {
                config.filters = existsFilter;
            }
            
            this.openLookup(config, function(config) {
                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
            }, this);
        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)
Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)
 

У меня такой же вопрос

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

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

Здравствуйте!
Система - bpm'online service enterprice 7.13 
Раздел Конфигурации(он же Продукты на других версиях) в карточке единицы конфигурации есть деталь Комплектация, где присутствует возможность добавить связанные продукты(ед. конфигурации).
Интересует возможность добавления в контейнер секции(Конфигурации) поля для ввода и кнопки после нажатия на которою устанавливался бы фильтр на ед. конфигурации по названию(которое было введено в поле) и плюс в грид выводились все комплектующие данной ед. конфигурации.
Можно ли такое реализовать?

У меня такой же вопрос

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

Андреев Андрей Сергеевич,

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

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

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

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Можете скриншотами показать, что вы хотите? Как-то все запутано звучит.
Что касается, первой части "Поле для ввода" и "Кнопки" по нажатию на которой в гриде отобразить подходящие значения - реализовать можно, делается достаточно быстро.
В моем понимании этой части вашей задачи все выглядит так: есть раздел Контрагент => Ввел в нужном Поле например Наша компания => клик Найти => в гриде раздела отобразились все записи с названием "Наша компания".
Если верно, то что вы хотите во 2-ой части своего вопроса?

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

http://prntscr.com/lj4zpx

На скрине сама секция - Техника аки Конфигурации

1.Контейнер где должен располагаться фильтр(поле и кнопка)
2. Сущность секции аки Запись

http://prntscr.com/lj50rz

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

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

Как сделать такого рода фильтрацию?

 

Андреев Андрей Сергеевич,

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

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

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

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

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

Спасибо большое!
Чекните ЛС плз.

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

Здравствуйте! Подскажите, а как добавить в фильтры серверного EntitySchemaQuery подзапрос или где в системе можно найти пример? На SQL запрос выглядит следующим образом:

SELECT
   * 
FROM
   [Contract] 
WHERE
   StartDate = (
        SELECT MAX(c.StartDate)
        FROM Premises p
        JOIN PremisesInContract pic ON p.Id = pic.PremisesId
        JOIN Contract c ON spic.ContractId = c.Id
        WHERE p.Id = --@someparameter
   )

 

У меня такой же вопрос

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

Добрый день, похожая ситуация обсуждалась тут https://community.terrasoft.ru/questions/ispolzovanie-kollekcii-v-select

Добрый день, похожая ситуация обсуждалась тут https://community.terrasoft.ru/questions/ispolzovanie-kollekcii-v-select

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

Добрый день!

Подскажите, пожалуйста, можно ли сделать так чтобы значение справочного поля равнялось значению атрибута. Чтобы вопрос не казался странным, расскажу откуда растут корни. В атрибуте храниться значение Id продукта, который подбирается сложным, составным фильтром. Это значение надо передать в справочное поле продукта (привязанное к детали страницы), которое будет скрыто. Почему сделано так, потому что не смог реализовать комплексный фильтр к справочному полю детали (не нашел подходящего примера).

У меня такой же вопрос

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

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

Можете более подробно описать Вашу задачу (со скриншотами интерфейса пользователя), что и куда Вы хотите передавать?

Да. Вот моя страница подбора продукта.

На самом деле мне просто нужно сохранить подобранный продукт в детали. Я не смог найти как можно настроить комплексный фильтр для справочного поля детали. Смог только реализовать через esq для атрибута. Но теперь не могу значение этого атрибута передать в деталь. 

Руслан Хасанов пишет:
На самом деле мне просто нужно сохранить подобранный продукт в детали

Если Вам нужно сохранить нужный продукт в деталь, то сделать это можно либо с помощью бизнес-процесса, либо с помощью классов InsertQuery для клиентской или серверной части приложения bpm'online.

На самом деле хотелось бы просто передать значение Id продукта на клиентской схеме. Вариант прямого сохранения в объект детали используя запрос не удобен тем что:
1. Если пользователь редактирует запись детали, то инсерт вставит еще одну запись и их количество будет расти с каждым нажатием кнопки сохранения

2. Второе происходит из первого - надо проверять есть ли такой Id в детали, если да то йпдейт. 

3. Надо переопределить кнопку сохранения

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

Может есть способ передать подобранное значение в виртуальной колонке в колонку детали на схеме страницы?

А что мешает например при загрузке загрузить в справочник ваше значение атрибута и настроить чтоб при изменении атрибута менялось значения справочника или вам что-то другое нужно?  Обмен данными между страничкой и деталью можно через подписку на события реализовать.Таким событием может стать например изменение атрибута(виртуальной колонки)

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

Нашел ветку в которой обсуждалась данная тема https://community.terrasoft.ru/questions/znacenie-v-pole-spravocnik

Вот решение для этого вопроса: 

this.loadLookupDisplayValue("Type", constants.ContractType.Standard);

Большое спасибо Сергею за подсказку.

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

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

Как вы добиваетесь в английской версии bpm'online того, чтобы в фильтрах Week начинался не с воскресенья, а с понедельника?

Спасибо

У меня такой же вопрос

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Да, некоторые вещи в системе непонятно почему захардкодены...

Уже в версии 7.12.3 получили какие-то изменения, но опять привязали Европу к американским стандартам :(

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

Здравствуйте у меня небольшой вопрос по OData

Делаю OData запрос. Выставляю в $filter=ModifiedOn ge datetime'...+03:00', модифицирую запись, и запускаю запрос на выборку. Почему-то данные не считываются из-за того что текущее время на клиенте - 10 минут не пересчитывается во время сервера. Подскажите как мне можно задать вопрос чтобы с таблицы можно было считать изменённые записи за 10 минут. Время естественно у меня локальное.

У меня такой же вопрос

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

Добрый день, 

Для начала хочу обратить внимание на то,
что время в БД записывается в UTC (таймзона +00:00).

При отправке времени в формате "yyyy-mm-ddThh:mm:ssZ"
передается фактическое значение времени, без учета таймзоны сервера и клиента. 

Если отправлять время в формате "yyyy-mm-ddThh:mm:ss"
значение записывается в БД с учетом таймзоны сервера.

Если передавать данные в фармате  "yyyy-mm-ddThh:mm:ss+TZ"  пример "2018-01-31T08:24:49+03:00", это время с чететом часового пояса клиента. 

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

 

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

            attributes: {
                "SpeakAddress": {
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    referenceSchemaName: "AccountAddress",
                    isLookup: true,
                    lookupListConfig: {
                        "filter": function () {

Как написать sql запрос

select ad.id, ad.Address

from 
  AddressType at, 
  AccountAddress ad

where 
    at.Name = 'Собеседования' and 
    at.Id = ad.AddressTypeId

                        }
                    }
                    //isRequired: true
                },

У меня такой же вопрос

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

Здравствуйте попробуйте что то вроде такого:
 

lookupListConfig: {
    "filters": [ 
        function () {
            var addressTypeId = this.get("AddressType").value;            
            var filterGroup = Ext.create("Terrasoft.FilterGroup");
            filterGroup.add("CV", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"[AccountAddress:AddressType].Name", "Собеседования"));
            filterGroup.add("Type", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"[AccountAddress:AddressType].Id", addressTypeId));
            return filterGroup;
             }
    ]
}

 

как работать с фильтрами описано в статье - https://academy.terrasoft.ru/documents/technic-sdk/7-12/primenenie-filt…

Нигрескул Алексей,

Спасибо. 

Своими силами попробовал написать и совпало с вашим советом

 "filter": function () {
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            filterGroup.add("IsAddressType",
                                Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.EQUAL,
                                    "[AccountAddress:AddressType].Id",
                                    "[AccountAddress.AddressType].Id"));//из таблицы
                            filterGroup.add("IsSpeak",
                                Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.EQUAL,
                                    "[AccountAddress:AddressType].Name",
                                    "Собеседования"));
                            return filterGroup;
                        }

Делал как раз по той статье, клиентский esq синтаксис - это для наркоманов :)

QArt,

Нигрескул Алексей,

Не заработало

Добрый день.

Вот оптимизированный sql запрос:

Вот esq строка для фильтра:

Так же проверьте устраивает ли вас результат исходного sql запроса (т.е. выполните запрос непосредственно из SQL Server Management Studio)

 

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

Приветы, помогите как написать запрос на esq или select

SELECT TOP 1000 aa.[Id]
      ,aa.[AddressTypeId]
      ,aa.[Address]
      ,aa.[AccountId]
      ,aa.[SxSubwayStationId]
  FROM [BetaPressBPM].[dbo].[AccountAddress] aa, [BetaPressBPM].[dbo].[Account] a
  aa.AccountId = a.Id and a.Id = 'AcountId_Value' 
  and aa.AddressTypeId='FB7A3F6A-F36B-1410-6F81-1C6F65E50343'
 

У меня такой же вопрос

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

Тут зависит от того, где будет писаться запрос: на сервере или у клиента. 

Если у клиента: https://academy.terrasoft.ru/documents/technic-sdk/7-11/ispolzovanie-entityschemaquery-dlya-chteniya-dannyh-iz-bd

Если на сервере: https://academy.terrasoft.ru/documents/technic-sdk/7-11/crud-operacii-na-servere

Для TOP 1000 нужно использовать RowCount на сервере или rowCount на клиенте.

Все остальное достаточно подробно и с примерами описано на академии по ссылкам выше.

Золотарев Артем Андреевич,

Спасибо,

Мы нашли вот такую возможность https://prnt.sc/ix4znc

Покажите пример как сие настроить кодом?? 

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

 

Вот ссылка, где описаны бизнес-правила, создаваемые из кода, а не мастера: https://academy.terrasoft.ua/documents/technic-sdk/7-12/biznes-pravila-i-ih-primenenie Там еще 5 вложенных статей (посмотрите в левой части в содержимом).

Там достаточно подробно описано применение с примерами.

Золотарев Артем Андреевич,

Посмотрел, спасибо. В коде не разобрался как указать что справочник и конкретное значение справочника. И есть вот такая задача (хак нужен):

Дано

 

Есть самописная страница на которую добавлена ссылка из cti panel и вроде как удобно пользователям

 

Найти

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

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

У обычной самописной страницы не получится вызвать визуальный редактор. Мастер разделов работает со связкой Объект-Раздел-Страница. 

Золотарев Артем Андреевич,

Вид адреса у нее

http://practice-clone.local/0/Nui/ViewModule.aspx#CardModuleV2/SxCandid…

подменили все как положено, но из меню <вид> -> <открыть дизайнер страницы>  ничего не открывается, хотя вроде как связка соблюдена

Вероятнее всего страница редактирования не привязана к сущности.

Посмотрите подобный вопрос по ссылке: https://community.terrasoft.ua/questions/registracia-stranicy-redaktirovania-obekta

Там в комментариях достаточно хорошо описали порядок действий.

Золотарев Артем Андреевич,

Да, там не соответствие корневых схем... 

https://prnt.sc/j1pqw3 вот как такое кодом сделать в rules? есть пример

Пример бизнес-правил есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/primer-primeneniya-pravila-filtration, а пути к колонкам пишуться как в EntitySchemaQuery

Золотарев Артем Андреевич,

Угу, спасибо

 

Вот у меня есть БП созданное мастером, такое же нужно перенести на самописную страницу

                "BpDicWorkAddr": {
                    "efe924fb-a8b5-4522-870f-ca545fe50156": {
                    "uId": "efe924fb-a8b5-4522-870f-ca545fe50156",
                    "enabled": true,
                    "removed": false,
                    "ruleType": 1,
                    "baseAttributePatch": "AddressType",
                    "comparisonType": 3,
                    "type": 0,
                    "value": "fb7a3f6a-f36b-1410-6f81-1c6f65e50343",
                    "dataValueType": 10
                    }
                }

 

"efe924fb-a8b5-4522-870f-ca545fe50156" - это наверно произвольное имя, а вот дальше какие гуиды не так очевидно???

QArt,

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

Золотарев Артем Андреевич,

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

efe924fb-a8b5-4522-870f-ca545fe50156, например, efe924fb-a8b5-2222-870f-ca545fe50156 и вставить этот код в другую схему самописной страницы и оно заработало :)

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

Доброго времени суток,

Я бы хотел попросить помощи в реализации подобного SQL запроса через entitySchemaQuery на фронт енде

Select id,
       name
from TableA 
where 
    accountId = '777' 
    and (name <> 'Igor' 
         OR name <> 'Alex') 

Из того что я пробовал

var esQuery = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "TableA" });
				esQuery.addColumn("Id");
				esQuery.addColumn("Name");
 
var esqMainFilter = esQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "account", "777");
 
var esqFirstFilter = esQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL, "Name", "Igor");
var esqSecondFilter = esQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL, "Name", "Alex");
 
 
var secondaryFilter = Terrasoft.createFilterGroup();
secondaryFilter.logicalOperation = Terrasoft.LogicalOperatorType.OR;
secondaryFilter.add("esqFirstFilter", esqFirstFilter);
secondaryFilter.add("esqSecondFilter", esqSecondFilter);
 
 
esQuery.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esQuery.filters.add("esqMainFilter", esqMainFilter);
esQuery.filters.add("esqSecondaryFilter", secondaryFilter);

Спасибо!

У меня такой же вопрос

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

Добрый день, 

Вот пример похожего запроса через entitySchemaQuery на клиенте

esQuery = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" });
esQuery.addColumn("Name");
 
var esqMainFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Account", "b3f737a4-d95b-4c87-9082-8d0deb421882");
esQuery.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esQuery.filters.addItem(esqMainFilter);
 
var esqFirstFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL, "Name", "test2");
var esqSecondaryFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL, "Name", "test3");
 
var filterCollection = this.Terrasoft.createFilterGroup();
filterCollection.logicalOperation = Terrasoft.LogicalOperatorType.OR;
filterCollection.addItem(esqFirstFilter);
filterCollection.addItem(esqSecondaryFilter);
 
esQuery.filters.addItem(filterCollection);
esQuery.getEntityCollection();

используем this.Terrasoft.createFilterGroup() для того что бы добавить группу фильтров с OR.

выполнив этот запрос в консоли браузера профайлером отловила запрос который пришел в БД, выглядит он следующим образом:

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

При попытке выбрать активности по Ответственному используя Http-запрос выбрасывает ошибку.

Делаю запрос:

https://dev-goldcoachcrm.bpmonline.com/0/ServiceModel/EntityDataService…'

 

и получаю в браузере ошибку: http://prntscr.com/h9v8l8

"Элемент коллекции с именем OwnerId не найден" - Но такое поле есть в Активности.

В чем проблема тогда? 

У меня такой же вопрос

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

Добрый день, без данных самого запроса сложно определить причину ошибки. Рекомендую вам ознакомиться с документацией по ссылке https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/rabota-s-obekt…

В документации есть примеры выборки записей по ответственному.

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