Изменялся Ли Документ

KingGLEB

Active member
08.05.2008
30
0
#1
Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 802
21
#2
Взять документ и сравнить с данными, которые есть в in-memory документе
 

Dragon108

Well-known member
19.01.2010
265
0
#3
Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?

При сохранении брать текущий открытый док и бэкэндный по UNID и сравнить, не помогает?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 802
21
#6
у Xpages основной документ - это in-memory. Т.е. это тот датасорс, который ты указываешь на странице.
Код:
document1
От этого датасорса берется докуметн, который на сервере.
Код:
document1.getDocument()
Т.е. document1 и document1.getDocument() могут отличаться.

Значит тебе можно сравнить
JavaScript:
if(document1.getItemValueString(item) != document1.getDocument().getItemValueString(item)){
...
}
 

KingGLEB

Active member
08.05.2008
30
0
#7
А другого способа нет, не прогоняя все items?
getItemValueString не сравнит поля типа Data & Number. И как быть если поле в документ добавилось сервером? Т.е. придется прогонять все итемы и от документа у клиента и от документа на сервере, т.е. делать 2 цикла.
Хотя можно пойти другим путем, при открытии на редактирование запомнить @Modify, а при записи сравнить с @Modify на серваке. Если сошлись, то сохранять.

Во, точно.
В postOpenDocument пишем
Код:
viewScope["DateChange"] = currentDocument.getDocument().getLastModified()
В querySaveDocument
Код:
if (docMain.getDocument().getLastModified()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере.")
return false;
}
Конечно, стоит предусмотреть в названии переменной во viewScope UNID документа (если работаешь с несколькими датасоурсами), но это уже детали.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 802
21
#8
не самое удачное решение.
Нужно копировать ключевые данные в память, а перед сохранением проверять.
Проверка по getLastModified ничего не решит.
 

KingGLEB

Active member
08.05.2008
30
0
#9
getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.
 

Dragon108

Well-known member
19.01.2010
265
0
#11
getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.
А когда и куда пишете?

Data source мог еще не проинициализироваться - , но при записи в непроинициализрованный док вывалилась бы ошибка.

Если в бэкэндный док (document1.getDocument() или currentDocument().getDocument()), то не будет записываться, так как нужно сохранить док


Да и вообще, действительно, чем viewScope не устраивает?
 

KingGLEB

Active member
08.05.2008
30
0
#12
Что то не захотел у меня viewScope в postOpenDocument сохранять NotesDateTime. Вернее сохранять сохранял, но значения его потом я так и не увидел.

Сделал так

postOpenDocument
Код:
viewScope.put("DateChange", currentDocument.getLastModified().toString())
querySaveDocument
Код:
if (currentDocument.getDocument().getLastModified().toString()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере или другим пользователем.")
return false;
}
Вот так заработало как надо.

PS: вот почему как только напишешь на форум, так сразу и решение приходит?! :) А не пишешь, так в голову ничего не лезет. ;)