Реклама
Если документа нет в базе, возвращает ошибку.
Sasha*
сообщение 23:01:2008, 08:31
Сообщение #1
Вставить ник
Новенький
Иконка группы

Репутация:     0  



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

db.GetDocumentByUNID(strUnid)


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

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

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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
 
Start new topic
Ответов (1 - 29)
allex
сообщение 23:01:2008, 08:38
Сообщение #2

Репутация:     7  



if (doc is nothing) then

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

end if


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 08:40
Сообщение #3
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



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
сообщение 23:01:2008, 08:41
Сообщение #4
Вставить ник
Божественный

Иконка группы

Репутация:     65  



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


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
Sasha*
сообщение 23:01:2008, 08:43
Сообщение #5
Вставить ник
Новенький
Иконка группы

Репутация:     0  



Цитата(allex @ 23:01:2008, 10:38 ) *
if (doc is nothing) then

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

end if

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

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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Morpheus
сообщение 23:01:2008, 08:47
Сообщение #6
Вставить ник
Божественный

Иконка группы

Репутация:     65  



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


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 08:57
Сообщение #7
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Morpheus
сообщение 23:01:2008, 09:03
Сообщение #8
Вставить ник
Божественный

Иконка группы

Репутация:     65  



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


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 09:06
Сообщение #9
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



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


Т.е. строчка экономиться (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Medevic
сообщение 23:01:2008, 09:15
Сообщение #10
Вставить ник
Что это ? :)
Иконка группы

Репутация:     115  



Для: Omh
Ну так можно же
Dim Doc as NotesDocument
if Not (MY_GetDocByUNID(db , "UNID") is Nothing) then
'ПОНЕСЛАСЬ
End if

(IMG:http://forum.codeby.net/style_emoticons/default/wink.gif)
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 09:19
Сообщение #11
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Medevic
сообщение 23:01:2008, 09:25
Сообщение #12
Вставить ник
Что это ? :)
Иконка группы

Репутация:     115  



Для: Omh
Ушел пить кофе. (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)
Перейти в начало страницы
 
Цитата Цитировать сообщение
Morpheus
сообщение 23:01:2008, 09:32
Сообщение #13
Вставить ник
Божественный

Иконка группы

Репутация:     65  



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


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
Akupaka
сообщение 23:01:2008, 14:15
Сообщение #14
Вставить ник
А че я?.. О.о
Иконка группы

Репутация:     61  



Позволю себе добавить... (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)

итак, первое - очень важное замечание, в контексте данного вопроса не очень важное, но все-же...
если вы выполняете возврат каких-либо объектов нотес (документ, коллекция) всегда нужно чтобы объект БД, если она не текущая, из которой тянется требуемый объект, был инициализирован в вызывающем коде, иначе получите в возвращенном значении "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 символа! (IMG:http://forum.codeby.net/style_emoticons/default/wink.gif)


--------------------
не учите меня плохому...
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 14:31
Сообщение #15
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



Для: Akupaka
Это легаси.
Мне нравиться такая проверка вот и оставил (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)
Хотя понимаю, что лишняя (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
fedotxxl
сообщение 23:01:2008, 17:03
Сообщение #16

Репутация:     5  



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

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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Kee_Keekkenen
сообщение 23:01:2008, 19:32
Сообщение #17

Репутация:     8  



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


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Medevic
сообщение 23:01:2008, 19:40
Сообщение #18
Вставить ник
Что это ? :)
Иконка группы

Репутация:     115  



Цитата(fedotxxl @ 23:01:2008, 20:03 )
Народ, ну вы жжете
GetDocumentByUNID всегда ошибку возвращал. В хелпе написано какую и что с ней делать
]]>*]]>

Кстати, не всегда. Я уже кажется писал об этом. Инода возвращает нулевой документ. На форуме ibm проблема была озвучена. Что с этим делать не понятно.
Поэтому, я как-то больше доверяю представлению с поиском по ключу.
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 23:01:2008, 20:23
Сообщение #19
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



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

Стабильнее, но медленее.


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Constantin A Che...
сообщение 24:01:2008, 09:01
Сообщение #20
Вставить ник
Божественный
Иконка группы

Репутация:     15  



Цитата(Medevic @ 23:01:2008, 22:40 ) *
Инода возвращает нулевой документ. На форуме ibm проблема была озвучена. Что с этим делать не понятно.

on error resume next
set doc = db.GetDocumentByUNID(unid)
on error goto 0

Все.. Если есть док-т - он есть, если нет - doc is nothing


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Akupaka
сообщение 24:01:2008, 21:21
Сообщение #21
Вставить ник
А че я?.. О.о
Иконка группы

Репутация:     61  



Цитата(Medevic @ 23:01:2008, 21:40 ) *
Кстати, не всегда. Я уже кажется писал об этом. Инода возвращает нулевой документ. На форуме ibm проблема была озвучена. Что с этим делать не понятно.
Поэтому, я как-то больше доверяю представлению с поиском по ключу.


Хм... на сколько мне известно, то т.з. "пустой" документ - это документ, к которому пользователь, выполняющий метод, не имеет доступа на уровне Readers-полей.
Т.е. если в документе есть Readers-поле, со значением: "CN=Вася Пупкин/...", а текущий пользователь Петя Васечкин, то вызов метода вернет "полуинициализированный" объект NotesDocument'а (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)
В таких случаях его можно вычислить, вроде, только по итемах - если массив Items пустой... или =EMPTY, точно не помню...


--------------------
не учите меня плохому...
Перейти в начало страницы
 
Цитата Цитировать сообщение
Morpheus
сообщение 24:01:2008, 21:28
Сообщение #22
Вставить ник
Божественный

Иконка группы

Репутация:     65  



Для: Akupaka
несовсем.... пустой документ это инвалид, и вычисляетсья он свойством IsValid которое у таких документов False


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
Sandr
сообщение 26:01:2008, 10:18
Сообщение #23
Вставить ник
Зачем это?
Иконка группы

Репутация:     36  



Цитата(Morpheus @ 24:01:2008, 23:28 ) *
Для: Akupaka
несовсем.... пустой документ это инвалид, и вычисляетсья он свойством IsValid которое у таких документов False


А вот и нифига...
Если искать док по getDocumentByUNID и пользователь не имеет к нему доступа, то полученный документ будет валидным (IsValid вернет тру (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) ) там надо проверять на IsEmpty(doc.items)...


--------------------
We need some pain to find a right way
Перейти в начало страницы
 
Цитата Цитировать сообщение
Akupaka
сообщение 26:01:2008, 10:29
Сообщение #24
Вставить ник
А че я?.. О.о
Иконка группы

Репутация:     61  



Цитата(Morpheus @ 24:01:2008, 23:28 ) *
Для: Akupaka
несовсем.... пустой документ это инвалид, и вычисляетсья он свойством IsValid которое у таких документов False

мы в таких случаях называем их невалидными (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) это могут быть окурки документов, к примеру... а пустые - именно валидные, но у которых не доступны остальные свойства...

Сообщение отредактировал Akupaka - 26:01:2008, 10:30


--------------------
не учите меня плохому...
Перейти в начало страницы
 
Цитата Цитировать сообщение
fedotxxl
сообщение 28:01:2008, 07:32
Сообщение #25

Репутация:     5  



Объясните теперь мне пожалуйста
Всю жизнь писал
if not nd is nothing then
и все было нормально... теперь валиды, инвалиды, пустые айтемы... что это??? Где это нужно?


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Morpheus
сообщение 28:01:2008, 07:37
Сообщение #26
Вставить ник
Божественный

Иконка группы

Репутация:     65  



Для: fedotxxl
ну представте что у вас nd - не Nothing .. Вы щасливо начинаете с ним раблотаьт и бац ... ошибка... из ниоткуда казалось бы


--------------------
Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]>
]]> ]]>
консультаций по ICQ не даю
Перейти в начало страницы
 
Цитата Цитировать сообщение
fedotxxl
сообщение 29:01:2008, 15:43
Сообщение #27

Репутация:     5  



Для: Morpheus
Никогда ещё не встречал такой ситуации...
Как правильно писать-то? Сначала проверять на существований документа, потом на существование айтемов?


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Sandr
сообщение 29:01:2008, 17:25
Сообщение #28
Вставить ник
Зачем это?
Иконка группы

Репутация:     36  



Цитата(fedotxxl @ 29:01:2008, 17:43 ) *
Для: Morpheus
Никогда ещё не встречал такой ситуации...
Как правильно писать-то? Сначала проверять на существований документа, потом на существование айтемов?


Ага сначала на существование, потом на валидность, а потом на наличие итемов...


--------------------
We need some pain to find a right way
Перейти в начало страницы
 
Цитата Цитировать сообщение
Omh
сообщение 29:01:2008, 17:40
Сообщение #29
Вставить ник
Дверь мне запили!
Иконка группы

Репутация:     61  



Для: Всех
Ну помоему, такая куча проверок, это немного черезчур.

Вроде IsEmpty(Doc.Items) будет, если у тебя нет даже прав reader'a на документ?
Или в таком случае он просто не вернётся с помощью GetDocumentByUNID?
А в каком случае Doc.IsValid будет False?

Кстати, именно тут ф-ия возвращающая Boolean начинает рулить, т.к. все проверки можно всунуть именно внутрь ф-ии и снаружи не городить всю кучу If-ов.

Так что ф-ия вида GetDocByUNID(db, doc, UNID) возвращающая boolean - то, что доктор прописал.
Попробуйте - Вам понравиться (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)


--------------------
Перейти в начало страницы
 
Цитата Цитировать сообщение
Akupaka
сообщение 30:01:2008, 11:13
Сообщение #30
Вставить ник
А че я?.. О.о
Иконка группы

Репутация:     61  



еще NotesDocument.IsDeleted (boolean) нужно проверять (IMG:http://forum.codeby.net/style_emoticons/default/wink.gif)

isValid = False, в случае, если документ является "окурком" репликации, например, т.е. еще не документ (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) или уже не документ ))


--------------------
не учите меня плохому...
Перейти в начало страницы
 
Цитата Цитировать сообщение

Ссылка на тему:
BBCode: 
HTML:      
Fast ReplyReply to this topicStart new topic

 

> Быстрый ответ
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись |  AJAX?
   

Свернуть

>

  Тема
Нет новых сообщений 1c8. Автоподстановка при сохранении документа...
В 1С7 - было - а в 1С8 - нету...
3 bigmax 119 Вчера, 18:15 vbs
Нет новых Getdocumentbyunid , если документ был удален
49 wowa 1 461 6:02:2010 - 16:15 VladSh
Перемещена Crm на базе Lotus
crm
0 p0kem0n 0 2:02:2010 - 13:13 p0kem0n
Нет новых сообщений Не работает публичное шифрование документа
СОС!
9 fedotxxl 199 1:02:2010 - 22:10 Constantin A Chervonenko
Нет новых сообщений Помогите найти ошибку!
Ставлю старую базу на сайт
2 kivik 162 30:01:2010 - 09:48 ????