Агент не получает параметр

wowa

Well-Known Member
01.02.2007
845
0
#1
Добрый день.

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

Код первого агента:

Код:
........
sUNID = docParam.Universalid
sNoteId = docParam.Noteid
Delete docParam

Set agent = db.Getagent("AXLSS")
Call agent.Runonserver(sNoteId)
Код второго агента "AXLSS" на сервере

Код:
Dim s As New NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Dim docParam As NotesDocument

Set db = s.Currentdatabase
Set agent = s.Currentagent
Set docParam = db.Getdocumentbyid(agent.Parameterdocid) ' docParam is Nothing. Why???????????
Хочу объяснить ситуации.

1) Есть два пользователя. Я и Юзер.
У меня абсолютно все права на базу. Могу изменять дизайн. Агенты подписаны мной.
У юзера права админа, но дизайн менять не может.

а) Агенты работают корректно если мы запускаем их на реплике.
:D Если запускаем с базы на сервере, то у меня работает корректно, у юзера ошибка
Set docParam = db.Getdocumentbyid(agent.Parameterdocid) ' docParam is Nothing
Есть предположение что просто агенты подписаны мной


2) Накатили эти два агента на другую базу на другом сервере, и права у нас тока админские.
Изменять дизайн не можем, агенты подписаны не нами.

У нас у обоих ошибка при работе с базой на сервере.
На реплике проверить не можем из-за большого размер базы.

Скажите, из-за чего может не работать

Set docParam = db.Getdocumentbyid(agent.Parameterdocid)?

У меня предположение что что-то с ACL.

Ошибка :

Agent printing: Error 91 on line 13: Object variable not set: INITIALIZE
 

susinmn

Well-Known Member
16.10.2007
529
8
33
Саратов
#2
В закладке Security что в *Run on behalf of* стоит? Попробуй прописать администратора или сервер.
 

wowa

Well-Known Member
01.02.2007
845
0
#4

wowa

Well-Known Member
01.02.2007
845
0
#5
Может надо поставить "Allow Restricted Operations" ?
Хотя я что-то уверен что не в этом дело
 
A

ABarmin

Гость
#6
Если агент запускается из веба, то стоит поставить галку Run as web user.
 

Kizarek86

Well-Known Member
Lotus team
20.07.2007
861
6
31
Россея матушка!)
#8
docParam - что за документ? он уже есть в базе (т.е. сохранен ли он там)?
проверьте передается ли вообще NoteID. по коду не видно, эти агенты находятся в одной базе с документом?
 

wowa

Well-Known Member
01.02.2007
845
0
#9
docParam - что за документ? он уже есть в базе (т.е. сохранен ли он там)?
проверьте передается ли вообще NoteID. по коду не видно, эти агенты находятся в одной базе с документом?
DocParam сохраняется., NoteID передается... вообщем все отлично...

Но... Решил найти документ с помощью ScanEz по этому NoteID

Документ поломан "Invalid or nonexistent document"

Вопрос: почему так происходит?

Я ничего особого с ним не делал:
<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">
Код:
Dim docParam As NotesDocument
Set docParam = getUserParameterDoc(s,db)
Call docParam.Replaceitemvalue("SelectedValues", vSelectedColumns )

Set international = s.International
glThousandsSep = international.Thousandssep
glDecimalSep = international.DecimalSep
Call docParam.Replaceitemvalue("Thousandssep", glThousandsSep )
Call docParam.Replaceitemvalue("DecimalSep", glDecimalSep )
If docParam.Save( False, False ) Then
MessageBox "Document " & docParam.UniversalID & _
" successfully saved" 
Else
MessageBox "Document " & docParam.UniversalID & _
" was not saved" 
End If

sUNID = docParam.Universalid
sNoteId = docParam.Noteid
Delete docParam

Код:
Function getUserParameterDoc(s As NotesSession, db As NotesDatabase) As NotesDocument
Set getUserParameterDoc = Nothing

Dim doc As NotesDocument
Set doc = nothing

Dim THIS_ID As String
THIS_ID = {PD} & db.Title

Dim sUNID As String
sUNID = s.Getenvironmentstring( THIS_ID )
If Not sUNID = "" Then
On Error GoTo NO_DOC ' 4091 lsERR_NOTES_BAD_UNID
Set doc = db.Getdocumentbyunid( sUNID )
End If

NO_DOC:
On Error GoTo 0

If doc Is Nothing Then
Dim ncSearch As NotesDocumentCollection
Set ncSearch = db.Search({SELECT Form = "tmpROSParameter" & Owner = @UserName & !@isAvailable($Conflict)}, Nothing, 0)

If ncSearch.Count<>0 Then
' get first document
Set doc = ncSearch.Getfirstdocument()
End If
End If

If Not doc Is Nothing Then
If doc.Isvalid And Not doc.Isdeleted And Not (doc.Universalid = "") Then
' clear items
ForAll item In doc.Items
Select Case LCase(item.name)
Case ".readers", ".authors", "owner", "form"
Case "$file"
Call item.Remove()
Case Else
If Not ( Left(item.name, 1) = "$" ) Then
Call item.Remove()
End If
End Select
End ForAll
Else
Set doc = Nothing
End If
End If

If doc Is Nothing Then
' create new
Set doc = db.Createdocument()
End if

' fill new data in items
With doc
.Replaceitemvalue(".Readers", s.UserName).Isreaders = True
.Replaceitemvalue(".Authors", Split(s.UserName & "," & {[Admin]}, ",")).Isauthors = True
.Replaceitemvalue("Owner", s.UserName).Isnames = True
Call .Replaceitemvalue("Form", "tmpROSParameter")
End With

Call doc.Save( False, False )
Call s.Setenvironmentvar( THIS_ID, doc.Universalid )

Set getUserParameterDoc = doc
End Function
Почему ломается док у всех кроме меня?
docParam создается по форме "tmpROSParameter". Этой формы как таковой не существует.
Также обнаружил что формы по умолчанию в базе нет... Может в этом какие-то проблемы?
 

Kizarek86

Well-Known Member
Lotus team
20.07.2007
861
6
31
Россея матушка!)
#10
Документ поломан "Invalid or nonexistent document"
не поломан, его тупо нету.

Вообще как я понимаю это типа профильного документа, который заводится на каждого пользователя.

Опять же, в первой части кода не видно что за БД (Set docParam = getUserParameterDoc(s,db))

If docParam.Save( False, False ) Then
MessageBox "Document " & docParam.UniversalID & _
" successfully saved"
Else
MessageBox "Document " & docParam.UniversalID & _
" was not saved"
End If
Тут у пользователя сохранение нормально проходит? Или уже тут ошибка?

Опять же по Вашему коду видно что документы эти не удаляются, ищите их в базе по форме "tmpROSParameter", и сравнивайте со своим.
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#11
А кто-то тут про ридерс-поля спрашивал выше :rolleyes: думаю, проблемы могут быть из-за этих полей:
Код:
.Replaceitemvalue(".Readers", s.UserName).Isreaders = True		 
.Replaceitemvalue(".Authors", Split(s.UserName & "," & {[Admin]}, ",")).Isauthors = True
Этот код выполняется на сервере или клиенте, т.е. кто в этих полях хранится как s.UserName? У того, кем подписан код, есть роль Admin (если серверный агент - возможно, проверить наличие роли у сервера)? Интересно, почему указанной роли нет в ридерс-поле? С учетом того, что ранее берется переменная окружения, возможно, стоит разрешить агенту restricted операции (уровень безопасности = 2)
 

wowa

Well-Known Member
01.02.2007
845
0
#12
Все , нашел проблему.

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

Всем пасиб