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

Тема в разделе "Lotus - Программирование", создана пользователем wowa, 3 авг 2012.

  1. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Добрый день.

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

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

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

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

    Код (Text):
    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
     
  2. susinmn

    susinmn Well-Known Member

    Регистрация:
    16 окт 2007
    Сообщения:
    530
    Симпатии:
    8
    В закладке Security что в *Run on behalf of* стоит? Попробуй прописать администратора или сервер.
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Документ полем Readers не закрыт?
     
  4. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Странно, но вообще ничего не стоит..... Думаете в этом проблема?

    нет
     
  5. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Может надо поставить "Allow Restricted Operations" ?
    Хотя я что-то уверен что не в этом дело
     
  6. ABarmin

    ABarmin Гость

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

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Не, не из веба
     
  8. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    docParam - что за документ? он уже есть в базе (т.е. сохранен ли он там)?
    проверьте передается ли вообще NoteID. по коду не видно, эти агенты находятся в одной базе с документом?
     
  9. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    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">
    Код (LotusScript):
    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

    Код (Text):
    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". Этой формы как таковой не существует.
    Также обнаружил что формы по умолчанию в базе нет... Может в этом какие-то проблемы?
     
  10. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    не поломан, его тупо нету.

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

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

    Тут у пользователя сохранение нормально проходит? Или уже тут ошибка?

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    А кто-то тут про ридерс-поля спрашивал выше :rolleyes: думаю, проблемы могут быть из-за этих полей:
    Код (Text):
    .Replaceitemvalue(".Readers", s.UserName).Isreaders = True       
    .Replaceitemvalue(".Authors", Split(s.UserName & "," & {[Admin]}, ",")).Isauthors = True
    Этот код выполняется на сервере или клиенте, т.е. кто в этих полях хранится как s.UserName? У того, кем подписан код, есть роль Admin (если серверный агент - возможно, проверить наличие роли у сервера)? Интересно, почему указанной роли нет в ридерс-поле? С учетом того, что ранее берется переменная окружения, возможно, стоит разрешить агенту restricted операции (уровень безопасности = 2)
     
  12. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Все , нашел проблему.

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

    Всем пасиб
     
  13. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    OKEN , пасиб, не увидил твою мессагу.... Ты прав.
     
  14. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А ответ был в третьем посте...
     
  15. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Эх, а ведь ты прав...Видимо я что-то не так понял :) Жаль,Времени убил много.
     
Загрузка...

Поделиться этой страницей