Как получить программно и из базы данные по динамическим группам
Добрый день, Как можно получить данные которые попадают в определенную динамическую группу из базы и в самом CRM-е( по скрипту, если сам этот раздел не был открыт) ?
Спасибо
Нравится
Что касается выборке на уровне базы данных, то это не возможно, так как реализация фильтра описана в скриптах, в саму базу данных передается информация в таком примерно виде :
0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C46696C746572734275696C646572526F6F744E6F646520547970653D2246696C746572734275696C6465724974656D73223E0A20203C4974656D20547970653D224C6F6F6B757046696C746572734275696C6465724974656D2220446174614669656C644E616D653D22436F6E74616374547970654944223E0A202020203C4974656D2056616C75653D227B34374342433642422D443734452D343837322D413438382D3735434330313132323133367D222F3E0A202020203C446973706C617946696C656456616C7565733E0A2020202020203C4974656D2056616C75653D22D0A1D0BED182D180D183D0B4D0BDD0B8D0BA20D092D0B0D188D0B5D0B920D0BAD0BED0BCD0BFD0B0D0BDD0B8D0B822205549443D224533414645443245313346393439423342333737443836424332333530443443222F3E0A202020203C2F446973706C617946696C656456616C7565733E0A20203C2F4974656D3E0A3C2F46696C746572734275696C646572526F6F744E6F64653E0A
Как Вы сами понимаете, оперировать этими данными нет возможности, единственным вариантом , используя запросы, есть вариант используя стандартную конструкцию 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 сервере в случае их обновлений для приложения (сайта). Так же станет вопрос с параметрами и системными переменными.
Добрый день.
Скажите на одном примере запроса: как получить все-таки это поле searchdata?
Либо где посмотреть в коде?
Спасибо!
Кирилл, Выше же есть пример, где получаем SerachData, и на основании его пытаемся воссоздать фильтр EntitySchemaQuery:
var valueColumn = entitySchema.Columns.GetByColumnValueName ("SearchData");
"Sergey Karpenko" написал:Что касается выборке на уровне базы данных, то это не возможно, так как реализация фильтра описана в скриптах, в саму базу данных передается информация в таком примерно виде :0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C46696C746572734275696C646572526F6F744E6F646520547970653D2246696C746572734275696C6465724974656D73223E0A20203C4974656D20547970653D224C6F6F6B757046696C746572734275696C6465724974656D2220446174614669656C644E616D653D22436F6E74616374547970654944223E0A202020203C4974656D2056616C75653D227B34374342433642422D443734452D343837322D413438382D3735434330313132323133367D222F3E0A202020203C446973706C617946696C656456616C7565733E0A2020202020203C4974656D2056616C75653D22D0A1D0BED182D180D183D0B4D0BDD0B8D0BA20D092D0B0D188D0B5D0B920D0BAD0BED0BCD0BFD0B0D0BDD0B8D0B822205549443D224533414645443245313346393439423342333737443836424332333530443443222F3E0A202020203C2F446973706C617946696C656456616C7565733E0A20203C2F4974656D3E0A3C2F46696C746572734275696C646572526F6F744E6F64653E0A
Как Вы сами понимаете, оперировать этими данными нет возможности, единственным вариантом , используя запросы, есть вариант используя стандартную конструкцию select ......join... where....