• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Azrael

Кто-нибудь встречался с подобным ранее: простейший код вызывает ошибку, притом только в отдельных репликах базы (естественно там, где нужно, чтобы все работало ясно и четко :( )
[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?
 
L

LuMee

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

Azrael

да не должно быть: "... To coll.Count"... потом, почему тогда только в одной реплике такая ерунда?
Единственное, на что грешу, так это, то, что процедура рекурсивная и в самом лотусе загон образуется, но опять же не понимаю, почему только в одной реплике... :(
 
30.05.2006
1 345
12
BIT
0
Кто-нибудь встречался с подобным ранее: простейший код вызывает ошибку, притом только в отдельных репликах базы (естественно там, где нужно, чтобы все работало ясно и четко :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
 
M

morpheus

<!--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

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

morpheus

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

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

Fossil Code

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

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

A) Не встречал случая, чтобы где-нибудь было нужно, чтобы все работало неясно и нечетко. ;)

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

Azrael

A) Не встречал случая, чтобы где-нибудь было нужно, чтобы все работало неясно и нечетко.

реплика начальника производства :blink:
IsValid провертека этой функией докмент на правильность .. возмжно документ "битый"

я теперь уже теперь все проверки вставляю: doc is Nothing, doc.IsValid, doc.IsDeleted....
 
K

Kee_Keekkenen

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

Azrael

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!