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

Тема в разделе "Lotus - Программирование", создана пользователем Azrael, 10 дек 2006.

Статус темы:
Закрыта.
  1. Azrael

    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?
     
  2. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Посмотри отладчиком, при каких i такое получается - может просто коллекция кончилась раньше, чем цикл? Он тогда вроде вместо ошибки Out of range просто вернет Nothing.
     
  3. Azrael

    Azrael Гость

    да не должно быть: "... To coll.Count"... потом, почему тогда только в одной реплике такая ерунда?
    Единственное, на что грешу, так это, то, что процедура рекурсивная и в самом лотусе загон образуется, но опять же не понимаю, почему только в одной реплике... :(
     
  4. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--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 -зделайте проверку на наличие Итема, и обязательно пользуйтесь деббагером, не поленитесь и проверте документ в ручную на наличие полей
     
  6. Azrael

    Azrael Гость

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Azrael
    IsValid провертека этой функией докмент на правильность .. возмжно документ "битый"

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

    Fossil Code Гость

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

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

    Azrael Гость

    реплика начальника производства :blink:
    я теперь уже теперь все проверки вставляю: doc is Nothing, doc.IsValid, doc.IsDeleted....
     
  10. Ogion7

    Ogion7 Гость

    Что лежит в stView? :blink:
     
  11. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

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

    Azrael Гость

    для Ogion7: как обычно:
    Код (Text):
    dim stView as String
    stView="имя_представления"
    set view=db.GetView(stView)
    if view is Nothing then
    ...
     
Загрузка...
Похожие Темы - Непонятная ошибка Lotus
  1. Anatoly
    Ответов:
    4
    Просмотров:
    2.850
  2. sanch
    Ответов:
    5
    Просмотров:
    3.717
  3. astana2030
    Ответов:
    4
    Просмотров:
    928
  4. beloff
    Ответов:
    15
    Просмотров:
    2.696
  5. sasha465
    Ответов:
    0
    Просмотров:
    1.044
Статус темы:
Закрыта.

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