Агент не сохраняет документ, вызванный со страницы.

  • Автор темы Автор темы MaxP
  • Дата начала Дата начала
  • Теги Теги
    agent
M

MaxP

Доброго времени суток.

Вызов:
Код:
var doc: NotesDocument=currentDocument.getDocument()
var agent: NotesAgent=database.getAgent("(RefreshDocOnServer)")
agent.runOnServer(doc.getNoteID())

Агент:
Код:
Option Public
Option Declare

Sub Initialize
    Dim agentLog As New NotesLog("Agent log")
    Call agentLog.OpenAgentLog
    On Error GoTo ErrLabel
    Dim s As New NotesSession
    Dim agent As NotesAgent
    Dim db As NotesDatabase
    Set db=s.Currentdatabase
    Set agent=s.Currentagent
    Dim doc As NotesDocument
    'Print "---------"
    'Print agent.Parameterdocid
    'Print "---------"
    Set doc=db.Getdocumentbyid(agent.Parameterdocid)
    Call doc.Computewithform(false,false)
    'Print agent.Onbehalfof
'    Call doc.Save(true,false)
    If doc.Save( true, False ) Then
       Call agentLog.LogAction("Document " & doc.UniversalID & " сохранен" )
      Else
    Call agentLog.LogAction("Document " & doc.UniversalID & " не сохранен")
    End If

    Exit sub
ErrLabel:   
    Call agentLog.LogAction("Ошибка " + CStr(Err)  & ": " & Error$  & " в строке:" + CStr(Erl))     
    Call agentLog.Close
    Exit Sub
End Sub

Ошибок нет. Док не сохраняет. Док верно получает в базе. Перепробовал настройки агента. Пробовал запуск каскада агентов.
В чем может быть дело?
 
1) Обработчик уходит на Call agentLog.LogAction("Document " & doc.UniversalID & " не сохранен")
2) дата модификации и редактор в доке не изменяются
 
Окромя как "you are not authorized to perform this operation" ничего больше не вижу.
ComputeWithForm не даст, ду хаст
 
С правами все хорошо и ошибок нет.
Придется, писать в техподдержку IBM. Думаю запросят логи...
 
Так. А если ComputeWithForm не сработает, то и смысла в агенте нет.
Дело такое: пользователь под вебом не имеет доступ (и не должен к базе) , значения из которой высчитываются в computed полях создаваемого им дока.
Вижу выход в создании копии документа в агенте и на нем ComputeWithForm и сохранении (проверим еще пройдет или нет, но какой-то глюк очевидно). Потом удаление исходного. Что скажете?
 
Попринтуйте EffectiveUserName на каждом этапе, мне очень хочется утверждать, что везде будет имя вашего web-user
 
у меня так - код на сервере:
JavaScript:
function calcOnDate(){
    //return "dummy";
    var name:string = "CalcOnDate";
    var unid:string = name+java.lang.System.currentTimeMillis();
    var dt:NotesDateTime =session.createDateTime("Today");
    print ("date:" + getComponent(DATE_FLD).value);
    dt.setLocalTime(getComponent(DATE_FLD).value);
    //http://www.openntf.org/main.nsf/project.xsp?r=project/xTalk%20Discussion%20Forums/defects/0ABCC3CFDEDB0C21862578B8007C67DF
    //var db:NotesDatabase = database;
    var db:NotesDatabase = sessionAsSigner.getDatabase(session.getServerName(),session.getCurrentDatabase().getFilePath());
    print ("db name:" +database.getTitle());
    //create profile document for parameters
    var profDoc:NotesDocument = db.getProfileDocument(name, unid);
    profDoc.replaceItemValue(DATE_FLD, dt);
    profDoc.replaceItemValue("parentUNID", lastContract().getUniversalID());
    profDoc.replaceItemValue("replyID", unid);
    profDoc.save();
    var profDocID:String = profDoc.getNoteID();
    //get agent and call it with profile doc
    var agent:NotesAgent = db.getAgent(name);
    print("Calling agent"+agent.getName()+" with "+profDocID);
    agent.run(profDocID);
    //extract returned value
    profDoc = db.getProfileDocument(name, unid);
    requestScope.rest = "-";
    requestScope.restprc = "-";
    requestScope.percent = "-";
    if (profDoc == null) {
        print("There isn't reply doc!");
    }
    else {
        if (profDoc.hasItem(PERCENT_FLD)) {
            requestScope.rest = profDoc.getItemValue(REST_FLD)[0];//.toString();
            requestScope.restprc = profDoc.getItemValue(RESTPRC_FLD)[0];
            requestScope.percent = profDoc.getItemValue(PERCENT_FLD)[0];
        }
        else {
            print("Calc failed");
        }
    }
    //remove doc
    profDoc.remove(false);
    return requestScope.percent
}
веб юзер не имеет прав для создания дока результат кода получаю в поле хэпаги
вызываемый агент - получает ИД профайлового дока, кот. потом удаляется, в комментах кода ссылка на оригинал
 
EffectiveUserName - сервер.
вкладка Security все перебрал

последнее что можно проверить, подписать агент серваком
 
Базы на одном сервере?
Если убрать ComputeWithForm, то документ сохранится?
 
На одном.
ComputeWithForm не влияет на результат.
Ради чистоты эксперимента, нужно пробовать воспроизвести данную ситуацию на чистой либо другой базе, что позже.
 
В общем выяснилось вот что. Другие доки, если подставить parentdocid другой, агент сохраняет.
Доки по нужной форме нет. Далее не копал, и вероятно не буду. Но в целом понятна суть.
 
Мы в соцсетях:

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