Добрый день, Как можно получить данные которые попадают в определенную динамическую группу из базы и в самом CRM-е( по скрипту, если сам этот раздел не был открыт) ?
Что касается выборке на уровне базы данных, то это не возможно, так как реализация фильтра описана в скриптах, в саму базу данных передается информация в таком примерно виде :
Как Вы сами понимаете, оперировать этими данными нет возможности, единственным вариантом , используя запросы, есть вариант используя стандартную конструкцию select ......join... where....
Если использовать конфигурацию самой CRM системы, то это может иметь примерно вот такой вид:
string serializedString = string.Empty;
var FolderId =" Folder Guid";
var schemaName ="Activity";// Получаем строку из базы по идентификатору группы
var manager = UserConnection.GetSchemaManager("EntitySchemaManager") as Terrasoft.Core.Entities.EntitySchemaManager;
var entitySchema = manager.GetInstanceByName(schemaName);
Entity entity = entitySchema.CreateEntity(UserConnection);
var valueColumn = entitySchema.Columns.GetByColumnValueName("SearchData");if(entity.FetchFromDB(entitySchema.GetPrimaryColumnName(), FolderId)){using(MemoryStream stream = entity.GetStreamValue(valueColumn.ColumnValueName)){if(stream != null){
stream.Position=0;
serializedString = Terrasoft.Common.StreamUtilities.GetStreamContent(stream);}else{
serializedString = String.Empty;}
stream.Flush();}}//Если ничего не нашел очищаем текущие фильтрыif(string.IsNullOrEmpty(serializedString)){if(string.IsNullOrEmpty(FilterName)){
FilterName ="FilterEdit";}
var oldFilters = dataSource.CurrentStructure.Filters.FindByName(FilterName) as DataSourceFilterCollection;if(oldFilters != null){
oldFilters.Clear();}return;}//Конвертируем строку в фильтры
var jsonConverter =new DataSourceFiltersJsonConverter(UserConnection, dataSource){
PreventRegisteringClientScript =true};
var filters = JsonConvert.DeserializeObject<DataSourceFilterCollection>(
serializedString, jsonConverter);//Загружаем фильтры для текущего датасорса, можно использовать и в запросеif(filters != null){
var existingFilterCollection = dataSource.CurrentStructure.Filters.FindByName(filters.Name) as DataSourceFilterCollection;if(existingFilterCollection != null){
existingFilterCollection.Clear();
var filtersCollection = filters as DataSourceFilterCollection;
foreach (var filterItem in filtersCollection){
existingFilterCollection.Add(filterItem);}
existingFilterCollection.LogicalOperation= filters.LogicalOperation;
existingFilterCollection.IsEnabled= filters.IsEnabled;
existingFilterCollection.IsNot= filters.IsNot;}else{
dataSource.CurrentStructure.Filters.Add(filters);}}
Возможно, были допущены некоторые опечаточки, прошу отнестись снисходительно :)
Теоретически решить задачу можно.
Самый простой вариант:
Доработать конфигурацию и БД. В таблице рядом с полем, где храниться фильтр, добавить текстовую колонку и писать sql текст фильтра. Его можно будет получить методами на уровне приложения. Для этого у запросов есть методы для получения текста запроса сразу со значением параметров. Но тут есть нюанс с системными переменными - такими как текущий пользователь и т.п. На уровне приложения их можно узнать из текущей сессии, но на уровне sql сервера - нет такой информации.
Смотрите из SDK: BuildParametersAsValue GetSqlText
Вариант сложный:
Написать CLR хранимую процедуру, которая используя наши .net сборки, сможет получить текст фильтра на уровне sql севера. В таком случае необходимо будет постоянно обновлять сборки на sql сервере в случае их обновлений для приложения (сайта). Так же станет вопрос с параметрами и системными переменными.
"Sergey Karpenko" написал:Что касается выборке на уровне базы данных, то это не возможно, так как реализация фильтра описана в скриптах, в саму базу данных передается информация в таком примерно виде :
Как Вы сами понимаете, оперировать этими данными нет возможности, единственным вариантом , используя запросы, есть вариант используя стандартную конструкцию select ......join... where....
Добрый день. Подскажите пожалуйста, где можно посмотреть как создать запрос SelectQuery программно? Особенно интересует полностью программное создание join-ов по нескольким полям.
И еще вопрос. У меня на одном экземпляре MS SQL Server работаю две базы: Terrasoft(TS_Original) и база от другой системы (Warehouse). Есть ли возможность из скрипта базы TS_Original делать запросы на вставку и удаление в базу Warehouse?
Такая возможность существует. Вам нужно создать ADOCommand:
добавление компонента происходит (как и для других сервисов)при щелчке правой кнопкой мыши и выборе его из списка.
Компоненту присваивается осмысленное название, например adc_ExportData.
В окне редактирования сервиса есть такие значения, как Строка соединения(можно создать строку соединения без использования существующих
соединений, созданных в компонентах ADOConnection) и Соединение(можно выбрать созданное ранее посредством сервиса ADOConnection соединение).
В поле Текс SQL прописывается команда, например exec ExportData :GroupID, :GroupID - параметр, добавленный в список параметров сервиса.
В скрипте
//получение сервиса
var Command = GetSingleItemByCode('adc_ExportData');//где 'adc_ExportData' - название сервиса ADOCommand// установка параметров
SetParameterValue(Command.Parameters, 'GroupID', GroupID);//запуск на исполнение
Command.Execute();