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

  • Автор темы oxystile
  • Дата начала
O

oxystile

Гость
#1
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 значения не слетали и не менялись?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
36
Россия, Калуга
#2
Для: oxystile
Можно. Зависит от того, что делаешь. Может ты во втором цикле меняешь документы и они пропадают из представления view(w)?
Вообще правильно перед обработкой (перед циклом) ставить notesView.AutoUpdate = False. Потом обратно notesView.AutoUpdate = True. К тому же так быстрее будет.
 
O

oxystile

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

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#4
Ну сделай так:

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

oxystile

Гость
#6
вот, упрощенный код:
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
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#8
Чуток переписал код, а то жесть нечитаемая по умолчанию.
Я не вижу, почему может быть проблема.
Кстати, а что за ошибка?
"Object variable not set"?
Может ты какой лишний объект где-то коцаешь?
Глобалного зла (переменных) нету?

Код:
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 - не лучшая находка :)
 
O

oxystile

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

oxystile

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

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

Yakov

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

Sandr

Гость
#13
Для: oxystile
Вынесли? А ViewExt Вы в нее параметром передаете?
 
O

oxystile

Гость
#14
Для: oxystile
Вынесли? А ViewExt Вы в нее параметром передаете?
нет, это не важно. на самом деле переменные doc & view() после выхода из внутреннего цикла, не теряются, единственное, что у doc меняется parentview на тот, кот использовался для обхода во внутреннем цикле - это и провоцирует ошибку.
"перевернутый выход":если после внутреннего цикла добавить еще один с обходом по внешнему view, то переменная doc вернет себе начальное значение parentview
...надеюсь, я не слишком загрузила :huh:
 
S

Sandr

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