Function

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

  1. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Функция не возвращает переменные определенного мной Type?

    Function GetArray(doc As NotesDocument) As MyType

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    variant, должно прокатить
     
  3. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Неа. Когда я на выходе из функции пишу:

    Arr = MyArr

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    а что такое тогда Arr
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Опишите класс
    Код (LotusScript):
    Function MyFunction(...) As MyClass
    Dim ret As New MyClass

    Set MyFunction = ret
    End Function
     
  6. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    ну, если писать так:

    Код (Text):
    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
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    опечатка? вроде doc2 должно быть...
    А что мешает сделать
    dim arr as Variant
    и
    Redim arr(1 To k) As MyType
    и соответствующую обработку результата ф-ции?
     
  8. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Лучше Type заменить на Class. Меньше ограничений. Лишний New для создания экземпляра не страшно.
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    У меня есть подобная реализация, только переменная собственного типа на входе функции. Проблем нет
     
  10. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Да, с классом проблем нет, кроме одной. Получается набрать массив объектов класса, но не получается классом сделать сам массив.
    Ничего не мешает. Попробую, спасибо)

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

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Не понял, что значит "классом сделать сам массив"? А как на LS можно Type'ом сделать сам массив?
    Массив объектов как и типов понятно:
    Redim arrC(1 To k) As MyClass
    Redim arrT(1 To k) As MyType
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    garri
    У Вас есть некая задача. Вы решили реализовать её таким-то образом и задаёте уточняющие вопросы по конкретно Вашей реализации. Было бы лучше обнародовать саму задачу, тогда, возможно, Вам бы посоветовали другие, более оптимальные реализации. В частности, может быть и такое решение:

    Код (Text):
    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. Прошу не пинать ногами — это на уровне идеи
     
  13. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Я понял, спасибо за пинок в нужную сторону))
    Задача оптимизировать вложенные циклы, где перебираются документы. На локале работает отлично, по внутренней сети похуже, через интернет вообще труба. Пытаюсь сократить количество обращений к базе. Один раз обратился, засунул нужные поля из нужных документов в массивы и потом работаю с массивами. Подозреваю, что будет быстрее.
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    если положение полей (в массиве) строго задано - то массив, если нет - List
     
Загрузка...
Похожие Темы - Function
  1. CaptainBob
    Ответов:
    1
    Просмотров:
    1.050
  2. dimat
    Ответов:
    15
    Просмотров:
    4.842
  3. Реник
    Ответов:
    5
    Просмотров:
    3.090
  4. Zeka
    Ответов:
    6
    Просмотров:
    2.986
  5. fedotxxl
    Ответов:
    29
    Просмотров:
    10.943

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