Array(x,y)

Тема в разделе "Lotus - Программирование", создана пользователем allex, 26 янв 2010.

Статус темы:
Закрыта.
  1. allex

    allex Гость

    Имеем кусок кода, который пробегает по полученной коллекции vecoll

    Хочу в массив вида Array(x,y) положить в
    x = entry.Columnvalues(1)
    y = entry.Document

    Вопрос: помогите распутать путаницу в динамическом расширении массива

    Код (Text):
    Dim entry As NotesViewEntry
    Dim vecoll As NotesViewEntryCollection
    Set vecoll = view_characters.Getallentriesbykey(uin)
    Set entry = vecoll.Getfirstentry()
    Stop

    ReDim docArray(0,0)
    'ReDim docArray(vecoll.Count-1,vecoll.Count-1)
    q = 0
    While Not (entry Is Nothing)
    If (entry.IsDocument) Then
    docArray(q,q) = entry.Columnvalues(1)
    ReDim Preserve docArray(q,q+1)
    Set docArray(q,q+1) = entry.Document
    End If
    q=q+1
    *********** засада тут *****************
    ReDim Preserve docArray(q,q)
    Set entry = vecoll.GetNextEntry(entry)
    Wend
     
  2. K-Fire

    K-Fire Гость

    Array(x, y) - двумерный массив, матрица X строк и Y столбцов.
    Ты же насколько я понял, пытаешься положить туда 2 значения, строку и нотес-документ.

    Т.е. массив должен быть Array(x, 2).

    Не знаю для каких целей затем массив этот будет нужен (и почему нельзя обработку сразу вести в цикле по ентри), но лучше использовать List.

    Dim youlist List as NotesDocument

    и в цикле

    Set youlist (entry.Columnvalues(1)) = entry.Document
     
  3. allex

    allex Гость

    альтернатива конечно есть,
    Код (Text):
    Dim loft List As Variant
    While Not (entry Is Nothing)
    If (entry.IsDocument) Then
    Set loft(entry.Columnvalues(1)) = entry.Document
    End If
    Set entry = vecoll.GetNextEntry(entry)
    Wend
    но засада в то что, имена loft(entry.Columnvalues(1)) могут быть одинаковые и значения в массиве перезаписывается.

    В принципе можно сделать проверку на одинаковость предыдущего значения и сделать пометку у последующего

    Добавлено:
    Этот массив я потом передам в обработчик, который будет представлять диалог выбора из значений entry.Columnvalues(1).
    При выборе нужного, возьмем соответствующий документ entry.Document

    Добавлено: Пробую так
    Код (Text):
    q = 0
    ReDim docArray(q,1)
    While Not (entry Is Nothing)
    If (entry.IsDocument) Then
    docArray(q,0) = entry.Columnvalues(1)
    ReDim Preserve docArray(q,1)
    Set docArray(q,1) = entry.Document
    End If
    q=q+1
    ReDim Preserve docArray(q+1,1) ********тут в ошибку вылетает
    'ReDim Preserve docArray(UBound(docArray)+1,UBound(docArray)+1)
    Set entry = vecoll.GetNextEntry(entry)
    Wend
    Что не так ?
     
  4. K-Fire

    K-Fire Гость

    Про невозможность дублирования в листе я забыл :rolleyes:

    В данном случае можно вообще 1мерным массивом обойтись. Собрать строку entry.Columnvalues(1) + разделитель + UniversalID.
    Не помню, в промпте пайп работает или нет, если да, то можно разделитель | использовать.

    А насчет диалога выбора, может лучше воспользоваться PickList() ?
     
  5. allex

    allex Гость

    Задача решена ...

    Код (Text):
    q = 0
    ReDim docArray(vecoll.Count-1,1)
    While Not (entry Is Nothing)
    If (entry.IsDocument) Then
    docArray(q,0) = entry.Columnvalues(1)
    Set docArray(q,1) = entry.Document
    End If
    q=q+1
    Set entry = vecoll.GetNextEntry(entry)
    Wend
     
  6. K-Fire

    K-Fire Гость

    Может все таки обычным PickListCollection можно было воспользоваться? :rolleyes:
     
  7. allex

    allex Гость

    Это для документов, которые во встроенной в форму вьюхе лежат
    да и к тому же, мне этот механизм в последующем потребуется... поэтому требовалось написать универсальную функцию

    Добавлено: Я не спорю что в этом

    Set notesDocumentCollection = notesUIWorkspace.PickListCollection( type% [, multipleSelection ], server$, databaseFileName$, viewName$, title$, prompt$ [, Singlecategory$ ] )


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

    _____________________________________________________________________________

    Добавлено: А как дело обстоит с размером массива, вес самих документов не будет влиять на ограничения массива ?
     
  8. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Уфф. Ну нельзя держать открытыми сразу множество документов. Памяти не хватит. Попробуйте сделать так, чтоб во вьюхе было хотябы 10 тысяч документов, килобайт по 20 каждый. И выполните свой код.

    Лучше как предлагал K-Fire оперировать UNID.
     
  9. allex

    allex Гость

    Да..., про кол-во открытых документов я запамятовал.
    Ну столько документов я думаю не будет. Это вьюха обслуживает документы, создаваемые не больше 15-20 доков за месяц (и то это с большой натяжкой). А по прикидкам - это порядка 5 док-ов в месяц
    Наверное так и поступлю. Ибо с двумерным массивом не хоцца возиться
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Можно ещё создать свой тип с нужным числом элементов или класс.
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    ключ хэша - можно дополнить счётчиком цикла (для уникальности)
    хранить UNID (как упоминали)
    если не нужен док целиком, а только его поля - вынести в ентирсы (в разумном пределе)
     
Статус темы:
Закрыта.

Поделиться этой страницей