2014-02-03

Атрибутивный поиск в DocsVision

Для поиска карточек в DocsVision в основном используется атрибутивный поиск.
Поисковые запросы можно создавать в конструкторе и сохранять, чтобы потом привязывать к виртуальным папкам, либо использовать в скриптах для получения списка карточек.
Конструктор поисковых запросов присутствует в Navigator и DVExplorer.
Создание запроса в конструкторе хоть и долгое и нужно пройти кучу окон, но все же более наглядное, чем разработка в коде.

Рассмотрим пример создания и использования поисковых запросов в коде.

// создаем запрос
SearchQuery searchQuery = this.Session.CreateSearchQuery();

if (folder_id != null && folder_id != Guid.Empty)
{
    // можно ограничить папкой
    searchQuery.Scope.Folders.AddNew(folder_id).IncludeSubfolders = true;
}

// Поиск по типу карточки
CardTypeQuery typeQuery = searchQuery.AttributiveSearch.CardTypeQueries.AddNew(new Guid(CARDTYPE_ID));

// Поиск по секциям
if (doc_department != null)
{
 SectionQuery sectionAddInfoQuery = typeQuery.SectionQueries.AddNew(new Guid(CARD_SECT_ADDINFO_ID));
 sectionAddInfoQuery.Operation = SectionQueryOperation.And;
 ConditionGroup condAddInfo = sectionAddInfoQuery.ConditionGroup;
 condAddInfo.Operation = ConditionGroupOperation.And;
 condAddInfo.Conditions.AddNew(SectAddInfo.RegDepartment.ToString(), FieldType.RefId, ConditionOperation.Equals, doc_department);
}
if (doc_date != null)
{
 SectionQuery sectionAgendaQuery = typeQuery.SectionQueries.AddNew(new Guid(CARD_SECT_AGENDA_ID));
 sectionAgendaQuery.Operation = SectionQueryOperation.And;
 ConditionGroup condAgenda = sectionAgendaQuery.ConditionGroup;
 condAgenda.Operation = ConditionGroupOperation.And;
 condAgenda.Conditions.AddNew(SectAgenda.ДатаПроведенияЗаседания.ToString(), FieldType.DateTime, ConditionOperation.Equals, doc_date);
}
SectionQuery sectionSystemQuery = typeQuery.SectionQueries.AddNew(CardDocument.System.ID);
sectionSystemQuery.Operation = SectionQueryOperation.And;
ConditionGroup condSystem = sectionSystemQuery.ConditionGroup;
//condSystem.Operation = ConditionGroupOperation.And;
condSystem.Conditions.AddNew(CardDocument.System.Kind, FieldType.RefId, ConditionOperation.Equals, new Guid(CARD_KIND_ID));

// Получение текста запроса
String query = searchQuery.GetXml();

// query будет содержать запрос в виде xml, аналогичный тому, что генерируется в конструкторе поискового запроса, то есть можно использовать заранее подготовленный xml из конструктора

// выполнение поиска и получение коллекции карточек
CardDataCollection result = this.Session.CardManager.FindCards(query);