один цикл по документам внутри другого

Тема в разделе "Lotus - Программирование", создана пользователем oxystile, 15 фев 2008.

  1. oxystile

    oxystile Гость

    Set doc = view(w).GetFirstDocument

    ''''некий код///////

    Set doc = view(w).GetNextDocument(doc)


    теоретически можно ли внутри этого цикла(обхода документов) сделать еще один обход
    т.е. взяли doc , получили некоторое поле
    и делаем обход
    Set view1=db(w).GetView("InDocs")
    Set doc1=view1.GetFirstDocument
    While Not(doc1 Is Nothing)
    '''''
    Set doc1=view1.GetNextDocument(doc1)
    Wend
    у меня слетает после первого обхода на строке Set doc = view(w).GetNextDocument(doc)
    но ведь doc и view значения не слетали и не менялись?
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: oxystile
    Можно. Зависит от того, что делаешь. Может ты во втором цикле меняешь документы и они пропадают из представления view(w)?
    Вообще правильно перед обработкой (перед циклом) ставить notesView.AutoUpdate = False. Потом обратно notesView.AutoUpdate = True. К тому же так быстрее будет.
     
  3. oxystile

    oxystile Гость

    нет, документы не изменяю, чисто подсчет
    но даже с notesView.AutoUpdate = False
    после успешного обхода внутренено цикла на внешнем ошибка на:
    Set doc = view(w).GetNextDocument(doc)
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну сделай так:

    Код (Text):
    View.AutoUpdate = False

    Dim Doc as NotesDocument
    Dim NextDoc as NotesDocument

    Set Doc = view.GetFirstDocument
    While Not Doc Is Nothing
    Set NextDoc = View.GetNextDocument(Doc)
    'абсолютно пофик какой код :)
    Set Doc = NextDoc
    Wend

    View.AutoUpdate = True
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: oxystile
    Без кода сложно сказать. :)
     
  6. oxystile

    oxystile Гость

    вот, упрощенный код:
    For w = 0 To jj-1
    View(w).AutoUpdate = False
    Dim Doc As NotesDocument
    Dim NextDoc As NotesDocument
    Set doc = view(w).GetFirstDocument
    While Not(doc Is Nothing)
    Set NextDoc = View(w).GetNextDocument(doc) '-ошибка здесь, после того, как пройден внутренний цикл
    If Takemetka1(doc)=1 Then ' это функция проверки, соответсвует ли дата поступления дока, заданному диапазону
    ''------------------------------внутренний цикл--------------------------------------------------
    Dim doc1 As NotesDocument
    Dim view1 As notesview
    Dim temp1 As Integer
    Set view1=db(w).GetView("InDocs")
    Set doc1=view1.GetFirstDocument
    While Not(doc1 Is Nothing)
    Set doc1=view1.GetNextDocument(doc1)
    Wend
    ''--------------------------------------------------------------------------------
    End If
    Set doc = NextDoc
    Wend
    View(w).AutoUpdate = True
    Next
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Какая ошибка ?
     
  8. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Чуток переписал код, а то жесть нечитаемая по умолчанию.
    Я не вижу, почему может быть проблема.
    Кстати, а что за ошибка?
    "Object variable not set"?
    Может ты какой лишний объект где-то коцаешь?
    Глобалного зла (переменных) нету?

    Код (Text):
    Dim Doc As NotesDocument
    Dim NextDoc As NotesDocument
    Dim View As NotesView

    Dim InnerDb As NotesDatabase
    Dim InnerView As NotesView
    Dim InnerDoc as NotesDocument

    For w = 0 To jj-1
    Set View = View(w)

    View.AutoUpdate = False

    Set InnerDb = Db(w)
    Set InnerView = InnerDb.GetView("InDocs")

    Set doc = View.GetFirstDocument
    While Not (doc Is Nothing)
    Set NextDoc = View.GetNextDocument(doc)

    If Takemetka1(doc) = 1 Then
    Set InnerDoc = InnerView.GetFirstDocument
    While Not (InnerDoc Is Nothing)
    Set InnerDoc = InnerView.GetNextDocument(InnerDoc)
    Wend
    End If

    Set doc = NextDoc
    Wend
    View.AutoUpdate = True
    Next
    Кстати названия переменных типа doc1, view1 - не лучшая находка :)
     
  9. oxystile

    oxystile Гость

    Set View = View(w), только не View а че-ниб др. т.к. уже есть View(w)
    вставила этот код, опять на Set NextDoc = View.GetNextDocument(doc) ошибка, USER-DEFINED error
    глобальное зло есть это как раз-таки и View() все это дело в библиотеке.
    но назначить View() глобальным было удобно, на самом деле
    сейчас уберу, раз так
     
  10. oxystile

    oxystile Гость

    убрала глоб. переменные обход цикла в цикле поместила вообще на кнопку.
    дебагерр прошелся по внутреннему циклу, после выхода из него на строке
    Set NextDoc = ViewExt.GetNextDocument(doc) сказал что Document не принадлежит ViewExt
    т.о. видимо слетает указатель, соответсвенно если убрать внутренний обход, то работает.
    кстати, если задать имя внутреннего и внешнего вью одинаковыми, то цикл в цикле сработает

    у меня же ViewExt отличается от ViewInt и содержит даже намного меньше доков(((
    т.о. перед от обхода частного view к обходу внешнего не работает, наоборот бы сработало :)
     
  11. Yakov

    Yakov Гость

    Для: oxystile
    Вынесите внутренний цикл в процедуру/функцию. Может, поможет. :)
     
  12. oxystile

    oxystile Гость

    уже пробовала-та же фигня
     
  13. Sandr

    Sandr Гость

    Для: oxystile
    Вынесли? А ViewExt Вы в нее параметром передаете?
     
  14. oxystile

    oxystile Гость

    нет, это не важно. на самом деле переменные doc & view() после выхода из внутреннего цикла, не теряются, единственное, что у doc меняется parentview на тот, кот использовался для обхода во внутреннем цикле - это и провоцирует ошибку.
    "перевернутый выход":если после внутреннего цикла добавить еще один с обходом по внешнему view, то переменная doc вернет себе начальное значение parentview
    ...надеюсь, я не слишком загрузила :huh:
     
  15. Sandr

    Sandr Гость

    Мой Вам совет - по возможности не используйте глобальные переменные... Лучше параметром передавать...
     
Загрузка...

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