Function

motogarri

Well-Known Member
17.02.2010
200
4
#1
Функция не возвращает переменные определенного мной Type?

Function GetArray(doc As NotesDocument) As MyType

Ругается. Говорит, что неправильный тип возвращаемого значения.
 

motogarri

Well-Known Member
17.02.2010
200
4
#3
Неа. Когда я на выходе из функции пишу:

Arr = MyArr

Говорит про несоответствие типов. У меня многомерный массив, но не (1, 1, 3), а (2, DocName, Field)
 

motogarri

Well-Known Member
17.02.2010
200
4
#6
ну, если писать так:

Код:
Function GetArray(db as NotesDatabase, doc As NotesDocument) As Variant

dim view as notesview
dim doc2 as notesdocument

dim arr() as MyType
Dim k As Integer
Dim i As Integer

Set view = db.GetView("View")
Set dc = view.GetAllDocumentsByKey(doc.ID(0))
Set doc = dc.GetFirstDocument
i = 1
k = dc.Count
Redim arr(1 To k) 
For i = 1 To k
arr(i).Field = doc2.Field(0)
Set doc2 = dc.GetNextDocument(doc2)
Next

GetArray = arr

end Function
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#9
У меня есть подобная реализация, только переменная собственного типа на входе функции. Проблем нет
 

motogarri

Well-Known Member
17.02.2010
200
4
#10
Лучше Type заменить на Class. Меньше ограничений. Лишний New для создания экземпляра не страшно.
Да, с классом проблем нет, кроме одной. Получается набрать массив объектов класса, но не получается классом сделать сам массив.
А что мешает сделать
dim arr as Variant
и
Redim arr(1 To k) As MyType
и соответствующую обработку результата ф-ции?
Ничего не мешает. Попробую, спасибо)

Вчера полдня просидел над этими типами, и решил этот цикл вообще не выносить в библиотеку. Оставил на потом пока.

Добавлено: А у массивов есть строковое представление, как у полей в документе? По типу:
doc.GetItemValue("Field" & Cstr(i))
Как-то можно такое проделать с полем из моего типа? arr(i).mytype.field1
 

TIA

:-)
Lotus team
15.05.2009
790
1
#11
Да, с классом проблем нет, кроме одной. Получается набрать массив объектов класса, но не получается классом сделать сам массив.
Не понял, что значит "классом сделать сам массив"? А как на LS можно Type'ом сделать сам массив?
Массив объектов как и типов понятно:
Redim arrC(1 To k) As MyClass
Redim arrT(1 To k) As MyType
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#12
garri
У Вас есть некая задача. Вы решили реализовать её таким-то образом и задаёте уточняющие вопросы по конкретно Вашей реализации. Было бы лучше обнародовать саму задачу, тогда, возможно, Вам бы посоветовали другие, более оптимальные реализации. В частности, может быть и такое решение:

Код:
Class MyClass
Public MyArr As Variant

Sub New(db as NotesDatabase, doc As NotesDocument)
'...
End Sub
End Class

'использование
Dim Myvar As New MyClass(db, doc)
Forall element In Myvar.MyArr
'...
End Forall
P.S. Прошу не пинать ногами — это на уровне идеи
 

motogarri

Well-Known Member
17.02.2010
200
4
#13
Я понял, спасибо за пинок в нужную сторону))
Задача оптимизировать вложенные циклы, где перебираются документы. На локале работает отлично, по внутренней сети похуже, через интернет вообще труба. Пытаюсь сократить количество обращений к базе. Один раз обратился, засунул нужные поля из нужных документов в массивы и потом работаю с массивами. Подозреваю, что будет быстрее.