• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

Sasha*

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

Код:
db.GetDocumentByUNID(strUnid)

Если такой документ есть в базе, то все работает как нужно.

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

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

allex

if (doc is nothing) then

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

end if
 
O

Omh

Код:
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
 
M

morpheus

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

morpheus

Для: Sasha*
используйте отдельную фунцию приведёую мною или Omh
 
O

Omh

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

morpheus

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

Omh

А у меня будет
Код:
Dim Doc as NotesDocument
If GetDocByUNID(db, Doc, UNID) then
'ПОНЕСЛАСЬ
End if

Т.е. строчка экономиться :)
 

Medevic

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

Omh

Не, так низзя.
Где доку присваивается значение ф-ии?
 
M

morpheus

Для: Medevic
ооо.. карашо что напомнил
 
A

Akupaka

Позволю себе добавить... :)

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

Omh

Для: Akupaka
Это легаси.
Мне нравиться такая проверка вот и оставил :)
Хотя понимаю, что лишняя ;)
 
F

fedotxxl

Народ, ну вы жжете
GetDocumentByUNID всегда ошибку возвращал. В хелпе написано какую и что с ней делать

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

Kee_Keekkenen

в продолжение последнего поста рекомендуется использовать NoteID, если конечно он имеется и это будет быстрее всего прочего получать документ..
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--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 проблема была озвучена. Что с этим делать не понятно.
Поэтому, я как-то больше доверяю представлению с поиском по ключу.
 
O

Omh

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

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

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