IRdsDictionaryElementsSearch.SetIterator

Синтаксис Fore

SetIterator(Value: IRdsElementsIterator);

Синтаксис Fore.NET

SetIterator(Value: Prognoz.Platform.Interop.Rds.IRdsElementsIterator);

Параметры

Value. Итератор.

Описание

Метод SetIterator устанавливает итератор, среди элементов которого выполняется поиск.

Комментарии

Свойство актуально только для табличных справочников НСИ.

Свойство IRdsDictionaryElementsSearch.IsIterator возвращает признак того, выполняется ли поиск среди элементов итератора.

При получении итератора объект поиска отстраивает дерево элементов, поэтому при очень больших объемах выборки может не хватать ресурсов оперативной памяти. В данном случае выдается ошибка «Недостаточно памяти для завершения операции».

Пример Fore

Для выполнения примера в репозитории предполагается наличие репозитория НСИ с идентификатором «RDS». Данный репозиторий должен содержать табличный справочник НСИ с идентификатором «DIC».

Добавьте ссылки на системные сборки «Metabase», «Rds», «Dimensions».

Sub UserProc;
Var
    mb: IMetabase;
    rdsKey: Integer;
    RdsInst: IRdsDictionaryInstance;
    elSearch: IRdsDictionaryElementsSearch;
    Dict: IRdsDictionary;
    Filter: IRdsDictionaryFilterConditions;
    Condition: IRdsDictionaryFilterCondition;
    Iter: IRdsElementsIterator;
    Crit: IDimTextCriteria;
    Res: IRdsDictionaryElementList;
    i: Integer;
Begin
    mb := MetabaseClass.Active;
    rdsKey := mb.GetObjectKeyById("RDS");
    // Получаем справочник, в котором будет выполняться поиск
    RdsInst := mb.ItemByIdNamespace("DIC", rdsKey).Open(NullAs IRdsDictionaryInstance;
    Dict := RdsInst.Dictionary;
    // Создаем объект для поиска по справочнику
    elSearch := RdsInst.CreateSearch;
    // Проверяем: выполняется ли поиск среди объектов, полученных из итератора
    If Not elSearch.IsIterator Then
        // Создаем фильтр итератора
        Filter := New RdsDictionaryFilterConditions.Create;
        Condition := Filter.Add(Dict.Attributes.FindById("NAME"));
        Condition.Operation := RdsConditionOperation.Like;
        Condition.Value := "%1%";
        // Создаем итератор
        Iter := RdsInst.BigElements.CreateIterator(1, RdsInst.Elements.Count, Filter, Null);
        // Устанавливаем созданный итератор для объекта, выполняющего поиск
        elSearch.SetIterator(Iter);
        // Приводим итератор к первому элементу
        Iter.First;
        // Выводим элементы итератора в окно консоли
        Debug.WriteLine("Элементы итератора:");
        While Iter.Next Do
            Debug.WriteLine(Iter.Element.Name);
        End While;
    End If;
    // Задаем условия поиска
    elSearch.Attributes.Attributes := "NAME";
    Crit := New DimTextCriteria.Create;
    Crit.CriteriaOptions := TextCriteriaOptions.SearchStringAttributes;
    Crit.Text := "a";
    elSearch.SetTextCriteria(Crit);
    // Выполняем поиск
    Res := elSearch.FindAllList;
    // Выводим результаты в окно консоли
    Debug.WriteLine("Результат поиска:");
    For i := 0 To Res.Count - 1 Do
        Debug.WriteLine(Res.Item(i).Name);
    End For;
End Sub UserProc;

После выполнения примера будет выполнен поиск среди элементов справочника НСИ. Параметры поиска:

Найденные элементы и элементы, содержащиеся в итераторе, будут выведены в окно консоли.

Пример Fore.NET

Для выполнения примера в репозитории предполагается наличие репозитория НСИ с идентификатором «RDS». Данный репозиторий должен содержать табличный справочник НСИ с идентификатором «DIC».

Imports Prognoz.Platform.Interop.Rds;
Imports Prognoz.Platform.Interop.Dimensions;

[STAThread]
Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    rdsKey: uinteger;
    RdsInst: IRdsDictionaryInstance;
    elSearch: IRdsDictionaryElementsSearch;
    Dict: IRdsDictionary;
    Filter: RdsDictionaryFilterConditions;
    Condition: IRdsDictionaryFilterCondition;
    Iter: IRdsElementsIterator;
    Crit: DimTextCriteria;
    Res: IRdsDictionaryElementList;
    i: Integer;
Begin
    mb := Params.Metabase;
    rdsKey := mb.GetObjectKeyById("RDS");
    // Получаем справочник, в котором будет выполняться поиск
    RdsInst := mb.ItemByIdNamespace["DIC", rdsKey].Open(NullAs IRdsDictionaryInstance;
    // Создаем объект для поиска по справочнику
    elSearch := RdsInst.CreateSearch();
    // Проверяем: выполняется ли поиск среди объектов, полученных из итератора
    If Not elSearch.IsIterator Then
        // Создаем фильтр итератора
        Filter := New RdsDictionaryFilterConditions.Create();
        Dict := RdsInst.Dictionary;
        Condition := Filter.Add(Dict.Attributes.FindById("NAME"));
        Condition.Operation := RdsConditionOperation.rcoLike;
        Condition.Value := "%1%";
        // Создаем итератор
        Iter := RdsInst.BigElements.CreateIterator(1, RdsInst.Elements.Count, Filter, Null);
        // Устанавливаем созданный итератор для объекта, выполняющего поиск
        elSearch.SetIterator(Iter);
        // Приводим итератор к первому элементу
        Iter.First;
        // Выводим элементы итератора в окно консоли
        System.Diagnostics.Debug.WriteLine("Элементы итератора:");
        While Iter.Next() Do
            System.Diagnostics.Debug.WriteLine(Iter.Element.Name);
        End While;
    End If;
    // Задаем условия поиска
    elSearch.Attributes.Attributes := "NAME";
    Crit := New DimTextCriteria.Create();
    Crit.CriteriaOptions := TextCriteriaOptions.tecropSearchStringAttributes;
    Crit.Text := "a";
    elSearch.SetTextCriteria(Crit);
    // Выполняем поиск
    Res := elSearch.FindAllList();
    // Выводим результаты в окно консоли
    System.Diagnostics.Debug.WriteLine("Результат поиска:");
    For i := 0 To Res.Count - 1 Do
        System.Diagnostics.Debug.WriteLine(Res.Item[i].Name);
    End For;
End Sub;

После выполнения примера будет выполнен поиск среди элементов справочника НСИ. Параметры поиска:

Найденные элементы и элементы, содержащиеся в итераторе, будут выведены в окно консоли.

См. также:

IRdsDictionaryElementsSearch