Добрый день, Как можно получить данные которые попадают в определенную динамическую группу из базы и в самом CRM-е( по скрипту, если сам этот раздел не был открыт) ?
Что касается выборке на уровне базы данных, то это не возможно, так как реализация фильтра описана в скриптах, в саму базу данных передается информация в таком примерно виде :
Как Вы сами понимаете, оперировать этими данными нет возможности, единственным вариантом , используя запросы, есть вариант используя стандартную конструкцию select ......join... where....
Если использовать конфигурацию самой CRM системы, то это может иметь примерно вот такой вид:
[javascript]
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(
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);
}
}
[/javascript]
Возможно, были допущены некоторые опечаточки, прошу отнестись снисходительно :)
Теоретически решить задачу можно.
Самый простой вариант:
Доработать конфигурацию и БД. В таблице рядом с полем, где храниться фильтр, добавить текстовую колонку и писать 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 - параметр, добавленный в список параметров сервиса.
В скрипте
[javascript]
//получение сервиса
var Command = GetSingleItemByCode('adc_ExportData');
//где 'adc_ExportData' - название сервиса ADOCommand
// установка параметров
SetParameterValue(Command.Parameters, 'GroupID', GroupID);
//запуск на исполнение
Command.Execute();
[/javascript]