Переменные и разделение памяти в lotusscript

Тема в разделе "Lotus - Программирование", создана пользователем erhe, 24 сен 2015.

  1. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Здравствуйте.

    Впервые с таким столкнулся, вот и в недоумении :(
    Код (LotusScript):
    Dim doc1 As NotesDocument
     
    Dim doc2 As NotesDocument
    Dim view1 As NotesView
    Dim view2 As NotesView
     
    ...
    Set view1 = db.GetView("My View1")
    Set doc1 = view1.GetFirstDocument
    While Not (doc1 Is Nothng)
      Set view2 = db.GetView("My View2")
      Set doc2 = view2.GetFirstDocument
      While Not (doc2 Is Nothing)
        ...
        Set doc2 = view2.GetNextDocument(doc2)
      Wend
      Set doc1 = view1.GetNextDocument(doc1) ' (*)
    Wend
     
    Во view2 попадается документ с таким же Form как у doc1, и которые есть во view1 -- по завершении внутреннего цикла в строке (*) получаю ошибку: документ не во view1

    Получается лотус для каких-то целей "совместил" переменные?! В отладчике видно, что у doc1 поле parentview поменялось с view1 на view2. Как обойти-то эту глупость?
     
    #1 erhe, 24 сен 2015
    Последнее редактирование модератором: 25 сен 2015
  2. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    1. вынесите Set view2 = ... за первый while!
    2. покажите ошибку, которая генерится.
    3. выполните код действительно без кода, который вы заменили на ..., возможно там doc1 меняется или убивается
    4. если не поможет, то следующий документ можно получать в следующей строке за while, а в конце цикла присваивать обрабатываемому в цикле
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    ставлю на это ;)
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    view1.AutoUpdate = False
    Документ может больше не попадать во вьюху по параметрам отбора.
    Посмотрите что Вы с ним делаете, если это влияет на формулу отбора, то надо отключать автообновление.
     
  5. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    1. Вынес -- не помогло
    2. Ошибка 4151: The Document is not in View ИР в строке 51
    3. код работал, пока не добавил вьюху, в которой есть документы из основного набора, т.е. поле FORM одинаковое
    4.
    Код (LotusScript):
     Set viewCat = currdb.GetView("СведенияИР") ' вспомогательная вьюха
    Set view = currdb.GetView("ИР")
    Set doc = view.GetFirstDocument
    While Not (doc Is Nothing)
        Set nextDoc = view.GetNextDocument(doc) ' сделал как рекомендовано
        ' категории
        Set docCat = viewCat.GetFirstDocument
        While Not (docCat Is Nothing)
            If docCat.IsResponse Then
                If docCat.Short_Name(0) = doc.Short_Name(0) Then
                    Call BordersDrawAndWrite(reportXls, "C" & Cstr(ni%), docCat.ResourceDesc(0))
                End If
            End If
            Set docCat = viewCat.GetNextDocument(docCat)
        Wend
     
        ' и вот тут и doc и nextdoc якобы принадлежат "СведенияИР", а не "ИР" как было...
     
        ' я убрал тут код, он не влияет на работу
     
        Set doc = nextDoc
    Wend
     
    #5 erhe, 24 сен 2015
    Последнее редактирование модератором: 29 сен 2015
  6. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Да ничего я с ним не делаю: нашел, вывел поля в Excel-файл, использовал поля для отбора других документов.
    [DOUBLEPOST=1443099235,1443099028][/DOUBLEPOST]
    Выигрыш уходит к казино! Т.е. -- мимо, не помогло.
     
  7. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @erhe, меняйте формулу отбора у вспомогательной вьюхи.
    Вы обрабатываете только респонсы, нет смысла там держать еще и родителя.
    Какая текущая формула?
     
  8. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    @erhe,
    view1.AutoUpdate = False
    view2.AutoUpdate = False

    если это не помогло, переписывайте на работу с коллекциями
     
  9. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Знать бы ещё как эти респонсы отобрать. Простой выбор SELECT (Form="СведенияИР") ничего не дает -- выдает пустое множество (на экране пусто, хотя может документы там и есть... сейчас попробую).
     
  10. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Да, исправилось. Если брать только респонсы, то сбоев нет. (Странно, что они вообще возникают... :( )
     
  11. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    видимо, это кеш. похоже на многопоточно незащищенный объект.
     
  12. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Э-э-э, я как бы в самом клиенте сижу, а не в браузере... И как-то нигде не написано, что нужно об этом думать :(
     
  13. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    512
    Симпатии:
    13
    в лотусе много чего не написано. если хотите писать на нем (LotusScript, @Formula), придется привыкнуть.
    из моей практики: перебор доков по вьюхе очень редно используется (а может и вообще не используется), лучше коллекции, навигаторы, ViewEntryCollection.
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    может битый индекс...
    тогда жди чудес любых
    load updall -R ...
    [DOUBLEPOST=1443213872,1443213721][/DOUBLEPOST]
    считается потокобезопасным, хотя освобождение автоматическое объектов сделали с версии 5-ой или 6-ой, до того - надо было самому делать Delete doc с присвоением временной переменной
     
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    смутные воспоминания (или просто глючит меня), но надо поэксперементировать - если из 2-ух вьюшек получить один и тот же док - итератор одной вьюшки его "потеряет"...
    вопрос в области: уровень модуля, уровень класса, уровень приложения
    и по коду - я не понимаю почему здесь используется перебор доков по вьюшке, а не получается навигатор/коллекция...
     
  16. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    внутри "такого" цикла тоже может быть не хорошо
    docCat.ResourceDesc(0) - иногда такие вещи надо избегать (docCat.GetItemValue("ResourceDesc"))
    И да
     
  17. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    а для второго цикла почему так же не сделано?
     
  18. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    в этом коде, прежде всего, надо разобраться с логикой
    что нужно получить?
    если док внутреннего цикла является респонсом с доку внешнего - то к чему весь этот "цирк" с вложением циклов?
    [DOUBLEPOST=1443526035,1443525831][/DOUBLEPOST]что мы видим - сканируется ВЕСЬ view1
    затем отбираются доки из view2, у кот. значения неких полей совпадают
    что мешает создать вьюшку для отчета, у кот. эти условия соблюдаются? (речь не идет о реляциях, если чё ;) )
     
  19. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    Да я уже потихоньку ко странностям привыкаю :)

    А по поводу перебора доков во вьюхе... Мне в наследство досталось несколько баз и там полно такого кода. Писал, кстати, товарищ, которого обучали на курсах программирования Лотусу и даже сертификат об этом у него есть...
    [DOUBLEPOST=1443553439,1443553292][/DOUBLEPOST]
    "Мы робили как умели" :)

    По поводу навигатора/коллекции -- почитаю, попробую.
     
  20. erhe

    erhe Well-Known Member

    Регистрация:
    5 мар 2013
    Сообщения:
    48
    Симпатии:
    0
    мешает малый опыт программирования под Лотус.

    Например, требуется простая на вид вещь: в документ нужно добавить набор атрибутов. В обычной программе это -- список неограниченного размера. Причем, список из нескольких столбцов -- не проблема. В Лотусе мне известно решение только через встроенную вьюху (у которой первый столбец вычисляется формулой @Text($Ref); просто добавить окно со списком не получится -- выбирается только один столбец значений, а нужно несколько -- документ). И вроде все хорошо, только одно НО -- документы такой вьюхи нельзя редактировать, Лотус прибивает в них поле $Ref и документ выпадает из вьюхи (точнее он в ней остается, но в нужном документе его нет). Можно как-нибудь красиво сделать без встроенных вьюх и полноценной правкой?
     
Загрузка...
Похожие Темы - Переменные разделение памяти
  1. gx6060
    Ответов:
    3
    Просмотров:
    315
  2. sasha465
    Ответов:
    0
    Просмотров:
    1.367
  3. Дайнеко
    Ответов:
    5
    Просмотров:
    10.878
  4. AndreyS
    Ответов:
    3
    Просмотров:
    2.681
  5. azat20
    Ответов:
    0
    Просмотров:
    3.119

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