Getdocumentbyunid , если документ был удален

  • Автор темы wowa
  • Дата начала
H

hosm

имхо - предполагается, что на невалидном (т.е. недоступном для айдишки по ридерс-полям) HasItem выдаст ошибку
(хз, как на самом деле). Помню, что GetItemValue давало ошибку.
 
T

TIA

чтобы вы не говорили уверен что Doc.HasItem("form") - будет самым быстрым решением

Но будет ли это решением? Не уверен на 100%, но кажется, что HasItem не бросала эксепшен.

Кто знает сценарий, чтоб документ был IsValid но без полей, чтоб проверить?
 
A

Akupaka

Этого я не говорил. Замерить есть чем.
это я сказал :welcome: чем? вот нет чтобы сразу рассказать :)
Кто знает сценарий, чтоб документ был IsValid но без полей, чтоб проверить?
если я правильно помню, то: создаешь док, запоминаешь унид, урезаешь права конкретному юзеру на чтение, и пробуешь им достать док по униду.
 
T

TIA

если я правильно помню, то: создаешь док, запоминаешь унид, урезаешь права конкретному юзеру на чтение, и пробуешь им достать док по униду.
Это я помню. Так получается Not IsValid, без полей, но и эксепшен при обращении к полю не возникает (по HasItem тем более)

это я сказал smile.gif чем? вот нет чтобы сразу рассказать smile.gif
Дык полно. От Timer и GetThreadInfo(LSI_THREAD_TICKS) в LS до GetTickCount в kernel32
 
A

Akupaka

H

hosm

Мне почему-то кажется, что GetThreadInfo(LSI_THREAD_TICKS) как раз вызывает GetTickCount в kernel32
ну, под винду может и так :) но не забываем - есть и другие ОС, на которых может работать лотус...
Это я помню. Так получается Not IsValid, без полей, но и эксепшен при обращении к полю не возникает (по HasItem тем более)
В нашем случае почему-то зависело от версии клиента (либо от различия в версиях клиента и дизайнера).
Один и тот же док-т на одном и том же сервере под одной и той же айдишкой, у которой не было прав на чтение док-та, давал док без полей, но в одном клиенте невалидный (что, имхо, правильно), в другом - IsValid = True.
Полностью не смогли выяснить причину глюка (т.е. это глюк клиента 8.5 или глюк из-за разницы версий клиента и сервера).
 
T

TIA

минимальная единица - 1 сек
Ну во первых, повтор эксперимента 1000 раз позволит оценить длительность каждой операции с точностью до тысячной секунды.
А во-вторых, то что Timer возвращает результат в секундах, вовсе не значит, что результат не может быть дробным :)
 
A

Akupaka

Ну во первых, повтор эксперимента 1000 раз позволит оценить длительность каждой операции с точностью до тысячной секунды
разве что, если найти тысячу таких доков и для них последовательно проверить... и то, сомнительная точность.
а вот "во-вторых" не понял )
 
T

TIA

разве что, если найти тысячу таких доков и для них последовательно проверить... и то, сомнительная точность.
а вот "во-вторых" не понял )

Зачем!? В нашем случае, это выполнить Hasitem 1000 раз, потом GetItemValue 1000 раз и сравнить. Можно и на одном доке.

а вот "во-вторых" не понял )

Timer возвращает дробное число, т.е. дробное число секунд, т.е. точность выше чем секунда.
 
A

Akupaka

Timer возвращает дробное число, т.е. дробное число секунд, т.е. точность выше чем секунда.
меня сбило с толку описание в справке. ты прав.

и в первом случае тоже прав :)
хотя тестировал я на нормальном документе

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Initialize()
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim tm1 As Single
Dim tm2 As Single
Dim tm3 As Single
Dim tm4 As Single
Dim i As Integer
Dim sv As Variant
Dim svs As String
Dim sb As Boolean
Set db = s.Currentdatabase
Set doc = db.Createdocument()
Call doc.Replaceitemvalue("Form", "SomeForm")
tm1 = Timer
For i = 1 To 32000
Call doc.Hasitem("Form")
next
tm1 = Timer - tm1

tm2 = Timer
For i = 1 To 32000
sv = doc.Getitemvalue("Form")
Next
tm2 = Timer - tm2

tm3 = Timer
For i = 1 To 32000
svs = doc.Getitemvalue("Form")(0)
Next
tm3 = Timer - tm3

tm4 = Timer
For i = 1 To 32000
sb = IsArray(doc.Items)
Next
tm4 = Timer - tm4

MsgBox Format(tm1, "Fixed") & " : " & Format(tm2, "Fixed") & ":" & Format(tm3, "Fixed") & ":" & Format(tm4, "Fixed")
End Sub
 
H

hosm

и в первом случае тоже прав
:) ну что, я реабилитирована за "впереди планеты" или еще проверишь в 8.5 на очередном ненормальном доке? (коллеге сегодня не до этого). А я напишу коммент в БЗ: "проверено тем-то в такой-то тестовой среде"? ;)
вообще-то молодец, что сомневаешься :)
 
T

TIA

В нашем случае, это выполнить Hasitem 1000 раз, потом GetItemValue 1000 раз и сравнить. Можно и на одном доке.
Брр, нить рассуждения потерял. Сравнивать надо было GetItemValue и IsArray(Doc.Items), а не с HasItem. HasItem конечно же быстрее GetItemValue. Но есть сомнения что HasItem сработает на "кривом" документе.

Добавлено:
ну что, я реабилитирована за "впереди планеты" или еще проверишь в 8.5 на очередном ненормальном доке? (коллеге сегодня не до этого). А я напишу коммент в БЗ: "проверено тем-то в такой-то тестовой среде"?

Не понял, к чему это сказано?
 
A

Akupaka

Да не ты. Это я потерял. Сам себя процитировал, сам себя и поправил.
я в курсе, я грю, что я не потерял и протестил то, что надо было

Какие? В ветке не нашёл ничего похожего.
допытливый )) разговоры из аси сюда не попали :)
это было к тому, что ОКЕН в БЗ кинула твое сообщение, что будет быстрее использовать обращение к полю, нежели isarray(doc.Items), а я ей возразил, что без проверки замечание запулила, словами "впереди планеты всей" :)

кстати, исходя из тестов, считаю, что твое замечание не имеет практического смысла, если не ведется обработка тысяч документов ;) а проверку isarray(doc.Items) использовать проще, т.к. не нужен обработчик
 
Мы в соцсетях:

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