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

  • Автор темы Sasha*
  • Дата начала
S

Sasha*

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

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

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

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

Omh

Lotus team
04.07.2007
2 210
1
#3
Код:
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
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
Для: Sasha*
так, а обработку ошибок Вас никто не учил делать?

Код:
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
не прокатить ибо будет ошибка
 

morpheus

скриптописец
07.08.2006
3 915
1
#6
Для: Sasha*
используйте отдельную фунцию приведёую мною или Omh
 

Omh

Lotus team
04.07.2007
2 210
1
#7
Для: Morpheus
Кстати, у меня раньше было что-то похожее на твоё: ф-ия, которая возвращала NotesDocument.
Потом переделал на Boolean, т.к. таким образом экономиться пару строк в коде.
Хотя, конечно, разница не принципиальная..
 

morpheus

скриптописец
07.08.2006
3 915
1
#8
Для: Omh
Для Boolean не вижу смысла, т.к. у меня всегда будет
Код:
 Dim Doc as NotesDocumnt
Set Doc MY_GetDocByUNID(db , "UNID")
if Not MY_GetDocByUNID is Nothing Then ....
 

Omh

Lotus team
04.07.2007
2 210
1
#9
А у меня будет
Код:
Dim Doc as NotesDocument
If GetDocByUNID(db, Doc, UNID) then
'ПОНЕСЛАСЬ
End if
Т.е. строчка экономиться :)
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#10
Для: Omh
Ну так можно же
Код:
Dim Doc as NotesDocument
if Not (MY_GetDocByUNID(db , "UNID") is Nothing) then 
'ПОНЕСЛАСЬ
End if
:)
 

Omh

Lotus team
04.07.2007
2 210
1
#11
Не, так низзя.
Где доку присваивается значение ф-ии?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#14
Позволю себе добавить... :)

итак, первое - очень важное замечание, в контексте данного вопроса не очень важное, но все-же...
если вы выполняете возврат каких-либо объектов нотес (документ, коллекция) всегда нужно чтобы объект БД, если она не текущая, из которой тянется требуемый объект, был инициализирован в вызывающем коде, иначе получите в возвращенном значении "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 символа! ;)
 

Omh

Lotus team
04.07.2007
2 210
1
#15
Для: Akupaka
Это легаси.
Мне нравиться такая проверка вот и оставил :)
Хотя понимаю, что лишняя ;)
 

fedotxxl

Well-known member
09.11.2005
614
0
#16
Народ, ну вы жжете
GetDocumentByUNID всегда ошибку возвращал. В хелпе написано какую и что с ней делать

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

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#17
в продолжение последнего поста рекомендуется использовать NoteID, если конечно он имеется и это будет быстрее всего прочего получать документ..
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#18
<!--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 проблема была озвучена. Что с этим делать не понятно.
Поэтому, я как-то больше доверяю представлению с поиском по ключу.
 

Omh

Lotus team
04.07.2007
2 210
1
#19
Для: fedotxxl
Вообще, на самом деле не чуть-чуть медленнее будет, а заметно.
Т.к. тока одна только операция взятия view стоит нормально.
Зато всегда будет достоверно незакешированный документ.
Я сам иногда так делаю, точнее раньше делал.

Стабильнее, но медленее.
 
30.05.2006
1 345
11
#20
Инода возвращает нулевой документ. На форуме ibm проблема была озвучена. Что с этим делать не понятно.
Код:
on error resume next
set doc = db.GetDocumentByUNID(unid)
on error goto 0
Все.. Если есть док-т - он есть, если нет - doc is nothing