Если документа нет в базе, возвращает ошибку.

Тема в разделе "Lotus - Программирование", создана пользователем Sasha*, 23 янв 2008.

  1. Sasha*

    Sasha* Гость

    Мне нужно если документа нет в базе, то выполнить определенные действия. Документ в базе я ищу с помощью :

    Код (Text):
    db.GetDocumentByUNID(strUnid)
    Если такой документ есть в базе, то все работает как нужно.

    Если его нет, то выводит ошибку и не выполняет остальные действия.

    Подскажите, пожалуйста, как мне сделать, чтобы если этого дока нет, то делать ….
     
  2. allex

    allex Гость

    if (doc is nothing) then

    <твои действия>

    end if
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    Function GetDocByUNID(db As NotesDatabase, doc As NotesDocument, UNID As String) As Boolean
    On Error Goto Errh

    GetDocByUNID = False

    If db Is Nothing Then Exit Function
    If Trim$(UNID) = "" Then Exit Function

    On Error Resume Next
    Set doc = db.GetDocumentByUNID(UNID)
    On Error Goto Errh

    If Not doc Is Nothing Then GetDocByUNID = True

    Exit Function
    Errh:
    Call ErrHandler
    Exit Function
    End Function
     
  4. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Sasha*
    так, а обработку ошибок Вас никто не учил делать?

    Код (Text):
    Function MY_GetDocByUNID(db As NotesDatabase, sunid As String) As NotesDocument
    On Error Goto err1
    if db is Nothing Then Exit Function
    if Len( sunid ) = 0 Then Exit Function
    Set MY_GetDocByUNID = Nothing

    Set MY_GetDocByUNID = db.GetDocumentByUNID(sunid)
    If Not MY_GetDocByUNID.IsValid Then Set MY_GetDocByUNID = Nothing
    Exit Function

    err1:
    Err = 0
    Exit Function
    End Function
    Для: allex
    не прокатить ибо будет ошибка
     
  5. Sasha*

    Sasha* Гость

    Оно не успевает зайти в эту проверку. Там где я получаю этот док:

    Set doc = db.GetDocumentByUNID(strUnid) - получает ошибку и дальше не идет
     
  6. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Sasha*
    используйте отдельную фунцию приведёую мною или Omh
     
  7. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: Morpheus
    Кстати, у меня раньше было что-то похожее на твоё: ф-ия, которая возвращала NotesDocument.
    Потом переделал на Boolean, т.к. таким образом экономиться пару строк в коде.
    Хотя, конечно, разница не принципиальная..
     
  8. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Omh
    Для Boolean не вижу смысла, т.к. у меня всегда будет
    Код (Text):
     Dim Doc as NotesDocumnt
    Set Doc MY_GetDocByUNID(db , "UNID")
    if Not MY_GetDocByUNID is Nothing Then ....
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А у меня будет
    Код (Text):
    Dim Doc as NotesDocument
    If GetDocByUNID(db, Doc, UNID) then
    'ПОНЕСЛАСЬ
    End if
    Т.е. строчка экономиться :)
     
  10. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Omh
    Ну так можно же
    Код (Text):
    Dim Doc as NotesDocument
    if Not (MY_GetDocByUNID(db , "UNID") is Nothing) then
    'ПОНЕСЛАСЬ
    End if
    :)
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, так низзя.
    Где доку присваивается значение ф-ии?
     
  12. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Omh
    Ушел пить кофе. :)
     
  13. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: Medevic
    ооо.. карашо что напомнил
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Позволю себе добавить... :)

    итак, первое - очень важное замечание, в контексте данного вопроса не очень важное, но все-же...
    если вы выполняете возврат каких-либо объектов нотес (документ, коллекция) всегда нужно чтобы объект БД, если она не текущая, из которой тянется требуемый объект, был инициализирован в вызывающем коде, иначе получите в возвращенном значении "Nothing".
    например:

    function getDoc1(aParam1 as variant) as notesDocument
    dim someDb as notesDatabase

    set someDb = getSomeDb
    ...
    set getDoc1 = someDb.getSomeNotesDocument
    end function

    Sub someSub
    dim doc1 as notesDocument

    set doc1 = getDoc1(doc1Param1)
    end sub

    в результате вызова этой функции получим doc1 = nothing, хотя при проходе дебагером, в вызванной функции будет нормально полученный документ.

    исправить так:

    function getDoc1(aDoc1Db as notesDatabase, aParam1 as variant) as notesDocument
    ...
    set getDoc1 = aDoc1Db.getSomeNotesDocument
    end function

    Sub someSub
    dim someDb as notesDatabase
    dim doc1 as notesDocument

    set someDb = getSomeDb
    set doc1 = getDoc1(someDb, doc1Param1)
    end sub

    это связанно с тем, что лотус убивая объект БД чистит память под объектами, полученными из этой БД.


    А второе замечание к Omh и Morpheus:
    а зачем условия проверки переданного параметра-унида документа, если вызов getDocumentByUnid сам выполнит подобную проверку? если даже его и проверять, то проверять бы уже на длинну в 32 символа! ;)
     
  15. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: Akupaka
    Это легаси.
    Мне нравиться такая проверка вот и оставил :)
    Хотя понимаю, что лишняя ;)
     
  16. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Народ, ну вы жжете
    GetDocumentByUNID всегда ошибку возвращал. В хелпе написано какую и что с ней делать

    Для: Sasha*
    Если лень разбираться, как обработать ошибку, то сделайте представление DocumentsByUNID и не ломайте голову. Работать будет чуть-чуть медленее
     
  17. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    в продолжение последнего поста рекомендуется использовать NoteID, если конечно он имеется и это будет быстрее всего прочего получать документ..
     
  18. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-fedotxxl+23:01:2008, 20:03 -->
    <span class="vbquote">(fedotxxl @ 23:01:2008, 20:03 )</span><!--QuoteEBegin-->Народ, ну вы жжете
    GetDocumentByUNID всегда ошибку возвращал. В хелпе написано какую и что с ней делать
    [snapback]94772" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Кстати, не всегда. Я уже кажется писал об этом. Инода возвращает нулевой документ. На форуме ibm проблема была озвучена. Что с этим делать не понятно.
    Поэтому, я как-то больше доверяю представлению с поиском по ключу.
     
  19. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для: fedotxxl
    Вообще, на самом деле не чуть-чуть медленнее будет, а заметно.
    Т.к. тока одна только операция взятия view стоит нормально.
    Зато всегда будет достоверно незакешированный документ.
    Я сам иногда так делаю, точнее раньше делал.

    Стабильнее, но медленее.
     
  20. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Код (Text):
    on error resume next
    set doc = db.GetDocumentByUNID(unid)
    on error goto 0
    Все.. Если есть док-т - он есть, если нет - doc is nothing
     
Загрузка...

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