Проблема Ui-документ, записать данные

@maliy: (как вариант) включите на локале шедулер и разносите "клиента" в пух и прах. По сложнее: добавьте в клиента системный процесс.

ЗЫЖ Не меньшая жесть мною сейчас предложена.
 
Если карточка документа открыта. На данный момент сделал JS-таймер. Спасибо alexas1(его пример таймера использовал)Раз в секунду выполняет код, который с БД2 переносит в БД1 содержимое поля history. все вроде бы корректно отрабатывает.
Далее задача, если карточка документа закрыта - необходимо в поле БД1 с БД2 перенести history. Целесообразно сделать агент - который выполнит необходимую задачу, но:

1) Нужно учесть чтоб во время выполнения агента - не открыли карточку, или открыли но обработать данную ситуацию
2) Запускать агента скорее всего по событию(только не придумал какому), а то делать агент чтоб все время мониторил -не очень нравится.
По сложнее: добавьте в клиента системный процесс.
Можно чуть подробнее что имеется ввиду?
 
... не открыли карточку, или открыли но обработать данную ситуацию
...
https://codeby.net/threads/kak-sravnit-dva-richtekstovyx-polja.58594/
Запускать агента скорее всего по событию(только не придумал какому)
и
если карточка документа закрыта - необходимо в поле БД1 с БД2 перенести history
вот по этому событию "карточка документа закрыта" и запускать агент
 
По-моему я уже писал, - надо использовать нотес таймер. При открытии формы мониторить событие и записывать в форму значение. Дополнительно, при сохранении формы можно еще раз промониторить и записать финально.
Для того чтобы поля не конфликтовали, записывать только изменившиеся поля, код есть в топике как сравнить два ричтекстовых поля, выше ссылка.

пример кода по таймеру

Код:
%REM
   Library timerLib
   Created Dec 28, 2016 by Administrator/Gandliar
   Description: Comments for Library
   
   Подключить библиотеку на форме
   Use "timerLib"
   
   Добавить код в postOpen формы
   Call timer_startTimer()
   
   Добавить на форму компьютед поле p с формулой @thisValue   
   
%END REM
Option Public
Option Declare


Dim myTimer As NotesTimer

Sub Terminate
   If Not myTimer Is Nothing Then Delete myTimer
End Sub
%REM
   Sub timer_startTimer
   Description: Comments for Sub
%END REM
Sub timer_startTimer
   Set myTimer = New NotesTimer(1)   ' Запуск каждую секунду
   On Event Alarm From myTimer Call myTimerAlarm
End Sub
%REM
   Sub myTimerAlarm
   Description: Обработка события таймера
%END REM
Sub myTimerAlarm(Source As NotesTimer)
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Set uidoc = workspace.Currentdocument
   Dim doc As NotesDocument
   Set doc = uidoc.Document
   With doc
       If CStr(.p(0))="" Then
           .p = 0
       Else
           .p = .p(0) + 1
       End If
   End with
End Sub
 
Вообщем уведомление пользователя сделал через JS-таймер. еще раз спасибо alexas1. все работает. Но есть один ньюанс: в кнопке которую вызываю по таймеру есть метод Set doc =ws.CurrentDocument.Document , и вот если к примеру фокус не на карточке документа, тогда выскакивает object variable not set. следовательно вопрос - как обработать данную ситуацию - то есть переключить фокус, или если фокус не на карточке не выполнять таймер или еще варианты?
 
@maliy можно на postopen формы заполнять глобальный объект.
в globals/Declaration формы пишем: Dim currUIDoc as NotesUIDocument
Затем в postOpen: set currUIDoc = Source

после этого на форме все ws.CurrentDocument можно просто заменить на currUIDoc
Если верно сделаете, то работать будет так же.
 
если фокус не на карточке не выполнять таймер или еще варианты
пусть таймер крутится, просто обработать: If doc is Nothing Then Exit Sub
если сильно чо ещё наколбасил и может подцепить какой нибудь другой док из ws, сделать доп проверку, чо это нужный док (по иниду или ещё по какой нибудь уникальной инфе на этой форме) и Exit Sub по исключению
 
А реально прицепить "JS Header" на форму, проверку ухода фокуса с документа - "blur" ?
 
можно на postopen формы заполнять глобальный объект.
в globals/Declaration формы пишем: Dim currUIDoc as NotesUIDocument
Затем в postOpen: set currUIDoc = Source

после этого на форме все ws.CurrentDocument можно просто заменить на currUIDoc
Если верно сделаете, то работать будет так же.
сделал так - нормально работает , но если открыты две карточки документов, то срабатывает одна потом js-таймер не отрабатывает.
 
@maliy, так их! Дави! :)

/me интересно, @maliy решив вопрос с N-открытыми Form-карточками перейдет к Frameset-ам?
 
мне не нада давить. открыли две карточки, две должны и отработать . не 10 же открыто.
перейдет к Frameset-ам?
а что с ними может быть не так?
[doublepost=1485174273,1484656885][/doublepost]Вообщем по совету тов. Domino-Designer. Сделал уведомление пользователя о истории - через внедренное представление.
Теперь настает вопрос как в открытой карточке обновить внедренное представление?
-эмуляция нажатия F9 - не нравится
-тот же JS-таймер обновляющий view -тоже не нравится
-Обновление по кнопке - не нравится, стопорный вариант.
Подскажите надежный, дельный вариант?
Суть открыта карточка, в ней на вкладке внедренное View с другой базы. В другой базе агент записал в поле данные, нужно чтоб в первой базе где открыта карточка обновилась внедренная view и пользователь увидел запись.
От JS-таймера (пока запасной вариант, работает только на текущей карточке, а если открыты две?)отказался - как то не надежный кажется вариант.
 
как то не надежный кажется вариант.
- вполне себе надёжный
каждый JS таймер работает независимо в своём окне, если на таймер навесить кнопу с uidoc.refresh будет рефрешить своё окно (даж если нет фокуса), канеш если нет в Queryrecalc\Postrecalc (или в самой кнопе) кода специфически зависимого от фокуса в UI, про это я уже писал - надо разруливать исключения или использовать ток бэкэндные методы (им фокус до фонаря) ну и канеш для конкретного дока
 
alexas1 - использовал Ваш таймер JS. Он объявлен глобально в форме. и я пробовал открыл две карточки , первая карточка отработала, сделал флаг в поле hlog если 1 - return. то есть :
var enterFields = ["hlog"];
tmp = f[enterFields[0]].value //значение поля hlog

try{
if(tmp==1)return; // если поле hlog = "1" - выйти
f.readhistory.click(); // иначе нажимаем кнопку readhistory
}
в итоге , таймер отстанавливается и на второй карточке(а должен работать).
Я так понимаю дело в этом var f = document.forms[0]; - по форме.
 
Мы в соцсетях:

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