1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. KingGLEB

    KingGLEB Active Member

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

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

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

    Dragon108 Well-Known Member

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

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

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

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

    Dragon108 Well-Known Member

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

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

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

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

    KingGLEB Active Member

    Репутация:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    30
    Симпатии:
    0
    А другого способа нет, не прогоняя все 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 документа (если работаешь с несколькими датасоурсами), но это уже детали.
     
  8. NickProstoNick

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

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

    KingGLEB Active Member

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

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

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

    Dragon108 Well-Known Member

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

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

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


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

    KingGLEB Active Member

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

    Сделал так

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

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

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