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

Тема в разделе "Lotus - Xpages", создана пользователем KingGLEB, 23 янв 2015.

  1. KingGLEB

    KingGLEB Active Member

    Регистрация:
    8 май 2008
    Сообщения:
    30
    Симпатии:
    0
    Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?
     
  2. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Взять документ и сравнить с данными, которые есть в in-memory документе
     
  3. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    код покажи
     
  5. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Да я тоже самое имел ввиду что и у вас, просто другими словами )
     
  6. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    у Xpages основной документ - это in-memory. Т.е. это тот датасорс, который ты указываешь на странице.
    Код (Text):
    document1
    От этого датасорса берется докуметн, который на сервере.
    Код (Text):
    document1.getDocument()
    Т.е. document1 и document1.getDocument() могут отличаться.

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

    KingGLEB Active Member

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

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    не самое удачное решение.
    Нужно копировать ключевые данные в память, а перед сохранением проверять.
    Проверка по getLastModified ничего не решит.
     
  9. KingGLEB

    KingGLEB Active Member

    Регистрация:
    8 май 2008
    Сообщения:
    30
    Симпатии:
    0
    getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
    Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
    Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    куда сохранять?
    viewScope должно сохранять
     
  11. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    А когда и куда пишете?

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

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


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

    KingGLEB Active Member

    Регистрация:
    8 май 2008
    Сообщения:
    30
    Симпатии:
    0
    Что то не захотел у меня viewScope в postOpenDocument сохранять NotesDateTime. Вернее сохранять сохранял, но значения его потом я так и не увидел.

    Сделал так

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

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

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