Непонятная ошибка в Lotus Script

  • Автор темы Azrael
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Azrael

#1
Кто-нибудь встречался с подобным ранее: простейший код вызывает ошибку, притом только в отдельных репликах базы (естественно там, где нужно, чтобы все работало ясно и четко :( )
[codebox]
...
Dim view As NotesView
...
Set view=db.GetView(stView)
....
Set coll=view.GetAllDocumentsByKey(stUNID,True)
For i%=1 To coll.Count
Set dc=coll.GetNthDocument(i%)
If Cstr(dc.GetItemValue("kol")(0))<>"" Then
.....
[/codebox]

в последней строчке и вылезает ошибка "Object variable not set". При этом явно ругается на dc... Пришлось ставить после присвоения dc условие if not(dc is Nothing) then .... Теперь вот не уверен в том, что все считает как надо. Вообще как может быть, что получение i-ого документа из коллекции возвращает Nothing?
 

LuMee

Well-known member
02.05.2006
477
0
#2
Посмотри отладчиком, при каких i такое получается - может просто коллекция кончилась раньше, чем цикл? Он тогда вроде вместо ошибки Out of range просто вернет Nothing.
 
A

Azrael

#3
да не должно быть: "... To coll.Count"... потом, почему тогда только в одной реплике такая ерунда?
Единственное, на что грешу, так это, то, что процедура рекурсивная и в самом лотусе загон образуется, но опять же не понимаю, почему только в одной реплике... :(
 
30.05.2006
1 345
11
#4
Кто-нибудь встречался с подобным ранее: простейший код вызывает ошибку, притом только в отдельных репликах базы (естественно там, где нужно, чтобы все работало ясно и четко :angry: )
[codebox]
...
Dim view As NotesView
...
Set view=db.GetView(stView)
....
Set coll=view.GetAllDocumentsByKey(stUNID,True)
For i%=1 To coll.Count
Set dc=coll.GetNthDocument(i%)
If Cstr(dc.GetItemValue("kol")(0))<>"" Then
.....
[/codebox]

в последней строчке и вылезает ошибка "Object variable not set". При этом явно ругается на dc... Пришлось ставить после присвоения dc условие if not(dc is Nothing) then .... Теперь вот не уверен в том, что все считает как надо. Вообще как может быть, что получение i-ого документа из коллекции возвращает Nothing?
Ну что, значит нет там такого item-а. Пиши безопасные конструкции типа
i
Код:
f dc.HasItem("kol") then
...
Или обработку ошибок предусматривай.
В чем причина "явления"? Возможно, в данонной реплике искомый док-т удален, а индекс НЕ обновлен. Т.о. ты нашел deletion stub.
PS: пользоваться конструкциями типа coll.GetNthDocument(i%) - дурной тон. Они очень дорого обходятся. Лучше:
Код:
set doc = coll.GetFirstDocument
While not doc is Nothing
....
set doc = coll.GetNextDocument(doc)
Wend
Тем более, что "унутре" coll.GetNthDocument(i%) все равно стоит что-то вроде
Код:
set doc = coll.GetFirstDocument
for n=0 to i-1
set doc = coll.GetNextDocument(doc)
Next
 

morpheus

скриптописец
07.08.2006
3 915
1
#5
<!--QuoteBegin-Constantin A Chervonenko+10:12:2006, 18:50 -->
<span class="vbquote">(Constantin A Chervonenko @ 10:12:2006, 18:50 )</span><!--QuoteEBegin-->PS: пользоваться конструкциями типа coll.GetNthDocument(i%) - дурной тон
[snapback]50334" rel="nofollow" target="_blank[/snapback]​
[/quote]
100%

Для: Azrael -зделайте проверку на наличие Итема, и обязательно пользуйтесь деббагером, не поленитесь и проверте документ в ручную на наличие полей
 
A

Azrael

#6
item там есть 100% (сюда проверку просто не скидывал,). дебаггером пользуюсь. там dc - это Nothing. Насчет GetNthDocument... с циклом while на той же реплике он не проходит по всем документам! (должно быть 5, застревает на 3). Работает нормально только с проверкой if not(dc is Nothing)... как раз для getNth...
 

morpheus

скриптописец
07.08.2006
3 915
1
#7
Для: Azrael
IsValid провертека этой функией докмент на правильность .. возмжно документ "битый"

а завтревание возможно спровоцированно Вашим же кодом , где то присвоивате doc всё время одно и тоже значение, такое бывает
 
F

Fossil Code

#8
Кто-нибудь встречался с подобным ранее: простейший код вызывает ошибку, притом только в отдельных репликах базы (естественно там, где нужно, чтобы все работало ясно и четко :angry: )

в последней строчке и вылезает ошибка "Object variable not set". При этом явно ругается на dc... Пришлось ставить после присвоения dc условие if not(dc is Nothing) then .... Теперь вот не уверен в том, что все считает как надо. Вообще как может быть, что получение i-ого документа из коллекции возвращает Nothing?
A) Не встречал случая, чтобы где-нибудь было нужно, чтобы все работало неясно и нечетко. ;)

Б) В репликах, бывает, портятся индексы. От этого может зависеть значение счетчика коллекции. Фиксап, компакт с удалением индексов, шифт - эф9, нью копи...
 
A

Azrael

#9
A) Не встречал случая, чтобы где-нибудь было нужно, чтобы все работало неясно и нечетко.
реплика начальника производства :blink:
IsValid провертека этой функией докмент на правильность .. возмжно документ "битый"
я теперь уже теперь все проверки вставляю: doc is Nothing, doc.IsValid, doc.IsDeleted....
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#11
я как правило обновляю взгляд, если он есть, затем получаю коллекцию, если count > 0
получаю первый документ и использую цикл while not(doc is nothing) для работы с данными получаемого документа и получении следующего документа в цикле.. такой подход не дает сбоев (пока не встречал) :blink:
 
A

Azrael

#12
для Ogion7: как обычно:
Код:
dim stView as String
stView="имя_представления"
set view=db.GetView(stView)
if view is Nothing then
...
 
Статус
Закрыто для дальнейших ответов.