• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

Domino-Designer

Людям надо поморгать!
Lotus Team
06.12.2011
616
223
BIT
9
@maliy: (как вариант) включите на локале шедулер и разносите "клиента" в пух и прах. По сложнее: добавьте в клиента системный процесс.

ЗЫЖ Не меньшая жесть мною сейчас предложена.
 

maliy

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

1) Нужно учесть чтоб во время выполнения агента - не открыли карточку, или открыли но обработать данную ситуацию
2) Запускать агента скорее всего по событию(только не придумал какому), а то делать агент чтоб все время мониторил -не очень нравится.
По сложнее: добавьте в клиента системный процесс.
Можно чуть подробнее что имеется ввиду?
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
... не открыли карточку, или открыли но обработать данную ситуацию
...
https://codeby.net/threads/kak-sravnit-dva-richtekstovyx-polja.58594/
Запускать агента скорее всего по событию(только не придумал какому)
и
если карточка документа закрыта - необходимо в поле БД1 с БД2 перенести history
вот по этому событию "карточка документа закрыта" и запускать агент
 

Gandliar

Lotus Team
16.02.2004
556
26
BIT
40
По-моему я уже писал, - надо использовать нотес таймер. При открытии формы мониторить событие и записывать в форму значение. Дополнительно, при сохранении формы можно еще раз промониторить и записать финально.
Для того чтобы поля не конфликтовали, записывать только изменившиеся поля, код есть в топике как сравнить два ричтекстовых поля, выше ссылка.

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

Код:
%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
 

maliy

Green Team
20.03.2007
180
2
BIT
47
Вообщем уведомление пользователя сделал через JS-таймер. еще раз спасибо alexas1. все работает. Но есть один ньюанс: в кнопке которую вызываю по таймеру есть метод Set doc =ws.CurrentDocument.Document , и вот если к примеру фокус не на карточке документа, тогда выскакивает object variable not set. следовательно вопрос - как обработать данную ситуацию - то есть переключить фокус, или если фокус не на карточке не выполнять таймер или еще варианты?
 

savl

Lotus Team
28.10.2011
2 601
312
BIT
216
@maliy можно на postopen формы заполнять глобальный объект.
в globals/Declaration формы пишем: Dim currUIDoc as NotesUIDocument
Затем в postOpen: set currUIDoc = Source

после этого на форме все ws.CurrentDocument можно просто заменить на currUIDoc
Если верно сделаете, то работать будет так же.
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
если фокус не на карточке не выполнять таймер или еще варианты
пусть таймер крутится, просто обработать: If doc is Nothing Then Exit Sub
если сильно чо ещё наколбасил и может подцепить какой нибудь другой док из ws, сделать доп проверку, чо это нужный док (по иниду или ещё по какой нибудь уникальной инфе на этой форме) и Exit Sub по исключению
 

seoman2

Green Team
17.02.2010
507
1
BIT
70
А реально прицепить "JS Header" на форму, проверку ухода фокуса с документа - "blur" ?
 

maliy

Green Team
20.03.2007
180
2
BIT
47
можно на postopen формы заполнять глобальный объект.
в globals/Declaration формы пишем: Dim currUIDoc as NotesUIDocument
Затем в postOpen: set currUIDoc = Source

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

Domino-Designer

Людям надо поморгать!
Lotus Team
06.12.2011
616
223
BIT
9
@maliy, так их! Дави! :)

/me интересно, @maliy решив вопрос с N-открытыми Form-карточками перейдет к Frameset-ам?
 

maliy

Green Team
20.03.2007
180
2
BIT
47
мне не нада давить. открыли две карточки, две должны и отработать . не 10 же открыто.
перейдет к Frameset-ам?
а что с ними может быть не так?
[doublepost=1485174273,1484656885][/doublepost]Вообщем по совету тов. Domino-Designer. Сделал уведомление пользователя о истории - через внедренное представление.
Теперь настает вопрос как в открытой карточке обновить внедренное представление?
-эмуляция нажатия F9 - не нравится
-тот же JS-таймер обновляющий view -тоже не нравится
-Обновление по кнопке - не нравится, стопорный вариант.
Подскажите надежный, дельный вариант?
Суть открыта карточка, в ней на вкладке внедренное View с другой базы. В другой базе агент записал в поле данные, нужно чтоб в первой базе где открыта карточка обновилась внедренная view и пользователь увидел запись.
От JS-таймера (пока запасной вариант, работает только на текущей карточке, а если открыты две?)отказался - как то не надежный кажется вариант.
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
37
как то не надежный кажется вариант.
- вполне себе надёжный
каждый JS таймер работает независимо в своём окне, если на таймер навесить кнопу с uidoc.refresh будет рефрешить своё окно (даж если нет фокуса), канеш если нет в Queryrecalc\Postrecalc (или в самой кнопе) кода специфически зависимого от фокуса в UI, про это я уже писал - надо разруливать исключения или использовать ток бэкэндные методы (им фокус до фонаря) ну и канеш для конкретного дока
 

maliy

Green Team
20.03.2007
180
2
BIT
47
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]; - по форме.
 
Мы в соцсетях:

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