Array(x,y)

  • Автор темы allex
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

allex

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

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

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

Код:
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
 
K

K-Fire

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

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

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

Dim youlist List as NotesDocument

и в цикле

Set youlist (entry.Columnvalues(1)) = entry.Document
 
A

allex

альтернатива конечно есть,
Код:
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)) могут быть одинаковые и значения в массиве перезаписывается.

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

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

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

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

Добавлено: Пробую так
Код:
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
Что не так ?
 
K

K-Fire

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

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

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

allex

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

Код:
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
 
K

K-Fire

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

allex

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

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

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


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

_____________________________________________________________________________

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

TIA

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

Уфф. Ну нельзя держать открытыми сразу множество документов. Памяти не хватит. Попробуйте сделать так, чтоб во вьюхе было хотябы 10 тысяч документов, килобайт по 20 каждый. И выполните свой код.

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

allex

Уфф. Ну нельзя держать открытыми сразу множество документов. Памяти не хватит.
Да..., про кол-во открытых документов я запамятовал.
Ну столько документов я думаю не будет. Это вьюха обслуживает документы, создаваемые не больше 15-20 доков за месяц (и то это с большой натяжкой). А по прикидкам - это порядка 5 док-ов в месяц
Лучше как предлагал K-Fire оперировать UNID.
Наверное так и поступлю. Ибо с двумерным массивом не хоцца возиться
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
ключ хэша - можно дополнить счётчиком цикла (для уникальности)
хранить UNID (как упоминали)
если не нужен док целиком, а только его поля - вынести в ентирсы (в разумном пределе)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!