Вопрос

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

В базе данных bpmonline я создал представление dbo.UsrGetStats c нужными мне атрибутами (Contact, MaxTime, MinTime, AvgTime).

Такой вопрос, как создать объект на основе этого DB VIEW (UsrGetStats)? 

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

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

Добрый день.

Создаете так же, как и простую схему объекта. Подробнее об этом почитайте на академии.

Важно, чтобы названия колонок совпадали с названиями колонок в представлении и, если это справочная колонка, как например, Contact, то в представлении она должна называться ContactId, а в схеме Contact (это только в случае, если Вы ее хотите сделать справочной в схеме).

Также при создании схемы не забудьте указать признак 'Представление в базе данных':

Добрый день.

Создаете так же, как и простую схему объекта. Подробнее об этом почитайте на академии.

Важно, чтобы названия колонок совпадали с названиями колонок в представлении и, если это справочная колонка, как например, Contact, то в представлении она должна называться ContactId, а в схеме Contact (это только в случае, если Вы ее хотите сделать справочной в схеме).

Также при создании схемы не забудьте указать признак 'Представление в базе данных':

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

Здравствуйте, спасибо за ответ, помогло!

Примечание: во View не было Id из-за этого выходила ошибка.

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

Здравсвуйте! Создал View, нужно открыть модальное окно этой вьюшки, в конфиге для LookupUtilities.Open указываю эту вьюшку.

var config = {
	entitySchemaName: "ScVwSLPBalanseFApp",
);

LookupUtilities.Open(this.sandbox, config, this.loadFinStatementForPeriod, this, null, false, false);

Модальное окно открывается, но видна только одна запись. Хотя во вьюшке 20 записей, и самое интересное, что при поиске выдает нужные записи). Может кто-нибудь подскажет в чем причина?

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

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

Скорее всего, накладывается какой-то фильтр.

Посмотрите через SQL Profiler, какой запрос уходит в базу.

В response приходят все записи, что странно, почему отображаются не все.

По идее, различия в работе отображения данных между таблицей и view быть не должно. Возможно, дело во включенной древовидности, или же в самом view что-то сделано некорректно, не хватает какой-либо из системных колонок, дублирующиеся значения Id  или ещё что-то подобное.

Какая колонка у вас указана как идентификатор и как вы ее заполняете в вашей вьюхе?

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

Спасибо за ответ, да дело было в Id во вьюшке.

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

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

Появилась задача, которая потребовала обращения методом из схемы страницы редактирования к кастомной view, созданной в базе. Для начала решение было отработано на демо-стенде по следующему алгоритму:

1. Создается объект UsrVwTest , который наследуется от базового, в нем не добавляется ни одного поля (в view будет 1 колонка с идентификаторами контакта), у него устанавливается признак, что это представление в базе, он сохраняется и публикуется.

2. После этого, через расширение SqlExecutor выполняется что-то в духе

create view UsrVwTest as select top 1 Id as 'Id' from Contact

3. После это прямо из консоли пробую посчитать записи, которые там есть, выполняя следующее:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrVwTest" });
esq.addColumn("Id");
esq.getEntityCollection(function (result) {
	if (!result.success) {
		// обработка/логирование ошибки, например
		this.showInformationDialog("Ошибка запроса данных");
		return;
	}
	console.info(result.collection.getCount());
}, this);

Консоль выдает мне 1, то есть проблем с доступом к view нет, там одна строка, как и должно быть.

После этого я повторяю тот же алгоритм на on-site проекте 7.11, в том же порядке. После этого я на аналогичное обращение к view из консоли получаю 500 (InvalidObjectStateException). Запрос в Network падает также с кодом "ErrorCode":"InvalidObjectStateException". Обработка результата падает в ветку с !result.success. Пробовал дополнительно компилировать конфигурацию на разных этапах алгоритма, создавать view различными способами (напрямую в базе, через установку скрипта в конфигурации и т.д.), получаю тот же ответ. Названия view в базе и в конфигурации совпадают, название и количество колонок тоже.  Кроме того, на проекте уже есть view, реализованные ранее, с которыми ведется работа, они реагируют по-разному. Некоторые так же выдают 500, некоторые послушно пишут количество записей внутри себя. 

Резюмируя, мог бы кто-то подсказать, в чем может быть проблема или какой единственно верный алгоритм реализации такой связки? Поиск по статьям привел меня именно к тому алгоритму, который заработал на демо-стенде, но упорно не хочет работать на on-site площадке. 

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

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

Поправка:

По всей видимости, все уже существующие представления ошибок не вызывают. Случаи, когда запрос к ним из консоли выдает 500 - превышение 20 000 записей на выгрузку. 

 

Все получилось. Оказалось, что view нужно создавать именно как dbo.ViewName, а не просто ViewName, иначе InvalidObjectName

 

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

Добрый день! Столкнулся с такой проблемой.
Нужно было создать View.
1) Написал SQL скрипт, который бы создавал View.
2) создал обьект (свойства для обьекта View рис. 1)
3) Как видим это справочник. После опубликования все в системе, есть новый справочник рис. 2
4) Далее мне нужно было отразить данный спровочник на странице «Продажа». Заместил объект продаж добавил справочник рис. 3
После опубликования вылетает следующая ошибка рис. 4
После чего функционал работает. Но нельзя обновить структуру БД.
Помогите исправить данную проблему. Спасибо!

Прикрепил документ doc. Там все показано на скриншотах.

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

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

Друзья, помогите пожалуйста решить проблему.

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

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

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

Здравствуйте, возникла проблема.
Есть объект с некоторыми полями и представление наследуемое от этого объекта, я создал замещающий объект который наследуется от этого объекта и такое же представление.
Проблема в том что в замещающем объекте я добавил поля, но они не отображаются в представлении в MS SQL Server. И я не могу удалять данные из этого объекта, так как отсутствуют поля которые я добавил самостоятельно.

BPM 7.1.0.172

Скрин из BPMa
Скрин из MS SQL Server

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

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

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

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

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

"Выбранные элементы удалить невозможно, так как они используются в других объектах"

Попробовал дебажить. Выбивает ошибку "View or function 'dbo.VwInvoiceProduct' is not updatable because the modification affects multiple base tables"

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

Никаких новых связей я не создавал. Просто добавил два новых поля (UsrComment, UsrCompleted).
Без них данные удаляются без проблем.

Можете профайлером отловить запрос на удаление?

Тарас,

Судя по всему, ваше представление не является обновляемым с точки зрения СУБД (объединяет в себе данные более, чем из одной таблицы, содержит агрегирующие функции и т.д.). Более подробно про то, какие представления обновляемые представления, изложено здесь.

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

Также Вам возможно будет полезна информация из статьи SDK про работу с представлениями. Не смотря на то, что в ней описан кейс для версии 5.Х, общий принцип работы с представлениями как с объектами в BPMonline остался неизменным и для 7-ки.

Спасибо за помощь. Проблему решил, добавив триггер.

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

Здравствуйте!
Я решил сделать в продажах деталь продукты по аналогии с разделом документы.
Для этого создал представление на основе таблицы "Продукты в продаже" чтобы имя подставлялось в зависимости от заполненного поля(продукт, произвольный продукт). Все работает, но при удалении продукта из детали, возникает ошибка: "Выбранные элементы удалить невозможно, так как они используются в других объектах.".
Так же в события Страницы реестра интересов к продуктам я добавил два событийных подпроцесса(по аналогии с продуктами в документах): OfferingChanged и DeleteYesMessage. Правда не понял откуда они вызываются и где их нужно регистрировать, чтобы они работали. Но они вроде как и нужны для того, чтобы удаление работало.
Подскажите, пожалуйста, что можно сделать, чтобы удаление работало?
Спасибо!

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

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

Здравствуйте, Павел!

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

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

Добрый день, Павел!

В данном случае, для проведения анализа реализованного Вами функционала, прошу предоставить ссылку на бекап БД (в личном сообщении), или предоставить сеанс удаленного подключения к Вашему ПК.

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

А подскажите, уважаемые гуру, как можно создать представление?
Я так понимаю алгоритм таков - создаем Объект, в нем ставим галочку "Представление в базе данных" в свойствах (кстати, а что такое галочка "Виртуальный"? совсем не понятно).
Указываем родительский объект (например тот, откуда большинство полей мне в представлении пригодиться) и публикуем.
Теперь вот самое интересное и неожиданное - у меня не появилось в БД нового представления, хотя должно было... как его редактировать? как вписать в него хитрый запрос для расчета значения поля?
BPMOnline 5.3

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

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

что такое галочка "Виртуальный"?
Она означает, что объект физически не создается в БД.
Например есть BaseAddress от которого наследуется ContactAddress и AccountAddress, но в базе присутствуют только последние 2 таблицы.

у меня не появилось в БД нового представления
А откуда системе узнать что туда должно было попасть? :wink:

как его редактировать?
Вручную создать view с таким же именем и alias на колонках как они названы в объекте.

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

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

"Булавин Владислав Геннадиевич" написал:у меня не появилось в БД нового представления
А откуда системе узнать что туда должно было попасть? :wink:

Таблицы попадают при создании объекта. Логично предположить... ну да ладно:smile:

"Булавин Владислав Геннадиевич" написал:как его редактировать?
Вручную создать view с таким же именем и alias на колонках как они названы в объекте.

А вот здесь самое интересное. Если доступ к системе клиента только через браузер и в базу напрямую никто не пускает? Ответ знаю, готовим скрипты и отсылаем тем полноправным, что имеют доступ к базе.
Выходим на старый добрый уровень прямой работы в БД, что имхо не совсем красиво.
В любом случае спасибо за ответы!

"Александр Кудряшов" написал:Таблицы попадают при создании объекта. Логично предположить... ну да ладно

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

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

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

При этом обращение к тем же таблицам средствами дизайнера отчетов вполне успешно. В чем же секрет?

Дело в том, что если таблица администрируется по записям, дизайнер запросов при работе под пользователем автоматически подставляет вместо нее представление. А поскольку CustomSQL-колонки вставляются в запрос как есть, в результате у пользователя нет доступа к таблице, и есть доступ к предоставлению.

Схема работы:
selectquery

Для того, чтобы запрос работал корректно, следует в CustomSQLColumn использовать не таблицу, а ее алиас, заданный в блоке FROM. В случае необходимости - присоединить таблицу в одном из JOIN-ов и также обращаться по алиасу.

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

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

Поделиться

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

"Alimova Anna" написал:

Есть еще один способ - сразу указать в CustomSQLColumn представление таблицы. Однако такой способ медленнее


Кроме того что он будет медленнее для Администратора, он еще почти всегда будет работать некорректно - так как будет проверяться доступ на записи, а как правило Администратору никто его не дает, он и так все "видит".

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

Максим, и что же начнется? :)

В случае добавления безобидной колонки Account.Name
И удалении прав на чтение этой колонки:

TSObjectLibrary.DBDataset: Ошибка открытия источника данных "ds_Account". 
Оригинальное сообщение об ошибке: The SELECT permission was denied on the column 'Name' of the object 'vw_Account", database 'XXX', schema 'dbo'

Это потому, что она ключевая? о_О

И еще: как это обойти?

Нет, это потому, что на нее доступ запрещен на уровне БД в самой таблице(и как следствие во вьюхе). Ядро в таком случае колонки заменяет на NULL, чтоб к ним вообще обращение не шло.
Пока мне известен один способ обхода - создавать отдельную функцию и использовать в CustomSQLColumn:

fn_GetAccountNameByID(Account.ID)
Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Думаю, особенно полезна эта информация будет тем, кто использует MS SQL Server Express (ввиду отсутствия настройки Analysis Services, необходимой для моделирования куба) и желает работать с разделом OLAP.
Для того, чтобы работать с разделом OLAP можно также использовать View-представления.

Поясню, что это. View, в отличие от обычных таблиц реляционной БД, не является самостоятельной частью набора данных, хранящегося в базе. Содержимое представления строится из набора полей нескольких таблиц и динамически вычисляется на основании данных, находящихся в этих таблицах. Изменение данных в реальной таблице БД немедленно отражается в содержимом всех представлений, построенных на основании этой таблицы.

Итак, показываю на практике как строится View и настраивается его соединение с разделом OLAP:
1. Запускаем MS SQL Server. Выбираем рабочую базу и открываем папку Views.
2. При помощи контекстного меню NewView добавляем новое представление:

3.  Предварительно необходимо определиться, по каким полям нужно настроить OLAP, а также в какие таблицы эти поля входят. В новом появившемся окне создаем набор таблиц базы (это может быть либо одна таблица, либо несколько - в зависимости от поставленных Вами задач). После того, как таблицы будут выбраны, нажмите на  кнопку  "Close".

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

5. Здесь же, используя кнопки панели инструментов Вы можете добавить фильтры, группировки, ограничения и т.д.
6. Когда все будет сформировано, закрываем созданный View и даем ему название.
7. Далее запускаем рабочее приложение Terrasoft CRM, переходим в раздел OLAP. Слева при помощи опции контекстного меню "Добавить куб" добавляем новую запись.
8. Нажимаем на кнопку "Параметры подключения". В появившемся окне выбираем опцию "+Подключение к новому источнику данных.odc":

9. В качестве мастера подключения данных выбираем Microsoft SQL Server.
10. Далее вводим параметры, необходимые для подключения к серверу БД.
11. Выбираем нужную базу и созданный View. Также советую Вам предварительно позаботиться о том, чтобы название Вашей базы не содержало никаких знаков препинания (точек, запятых, подчеркиваний и т.д.), а также цифры, поскольку по этой причине список таблиц и представлений в нижеуказанном списке не будет отображаться.

12. Нажимаем на кнопку "Готово".
13. Теперь Вы можете вытягивать с списка поля в нужные Вам области для отображения данных в удобном для Вас виде.

Заметьте, что при изменении данных в таблицах, эти данные будут меняться в View, и следовательно в разделе OLAP.

Желаю удачи!

С уважением,
Мельникова Екатерина

Поделиться

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

то же самое относится и к Firebird?

Владимир, дело в том, что создать View на Firebird - не является проблемой. Все настройки аналогичны построению View на MS SQL Server (во всяком случае при использовании утилиты IBExpert). Но вся проблема заключается в том, что в Terrasoft предусмотрена настройка соединения только с СУБД MS SQL.
Но думаю, что со временем такая возможность в приложении Terrasoft CRM будет реализована :)
http://community.terrasoft.ua/node/3097

Мельникова Екатерина

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