2014-09-15 4 views
0

Hello Domino программисты!SessionAsSigner - конфликты объектов базы данных

Я работаю над приложением XPages и я столкнулся с следующей проблемой:

Я должен использовать объект sessionAsSigner, чтобы получить количество всех документов в представлении. Я использую одно вычисленное поле для отображения: количество видимых документов пользователя/всех документов и другое вычисленное поле для отображения текущего (не sessionAsSigner) имени пользователя.

Страница выглядит следующим образом:

Page design

Под UserName Вычисляется код поля я поступил следующий код:

session.createName(session.getEffectiveUserName()).getCommon() 

Под кодом DocCount вычисляемого поля я поступил следующий код:

var viewAsUser = database.getView("AllByHID"); 
var docCountUser = viewAsUser.getAllEntries().getCount(); 

var dbAsSigner = sessionAsSigner.getCurrentDatabase(); 
var viewAsSigner = dbAsSigner.getView("AllByHID"); 
var docCountSigner = viewAsSigner.getAllEntries().getCount(); 

return docCountUser.toString() + "/" + docCountSigner.toString(); 

Получил следующий результат:

enter image description here

Это правильное количество документов, текущий пользователь может видеть, но похоже, использование sessionAsSigner было полностью проигнорировано.

После некоторого "мастерить" Я сменил несколько строк кода, чтобы получить (?):

var dbAsSigner = sessionAsSigner.getCurrentDatabase(); 
var viewAsSigner = dbAsSigner.getView("AllByHID"); 
var docCountSigner = viewAsSigner.getAllEntries().getCount(); 

var viewAsUser = database.getView("AllByHID"); 
var docCountUser = viewAsUser.getAllEntries().getCount(); 

return docCountUser.toString() + "/" + docCountSigner.toString(); 

и в результате ...

enter image description here

Оба значения являются правильными, но я Интересно, почему я не могу получить их в один звонок? Я что-то упустил?

Любая помощь будет оценена по достоинству.

ответ

4

Проблема в том, что Domino знает о существующей ссылке представления и использует это вместо создания двух экземпляров (с разными правами доступа).

Вы должны переработать вид первого:

var dbAsSigner = sessionAsSigner.getCurrentDatabase(); 
var viewAsSigner = dbAsSigner.getView("AllByHID"); 
var docCountSigner = viewAsSigner.getAllEntries().getCount(); 
viewAsSigner.recycle(); 

var viewAsUser = database.getView("AllByHID"); 
var docCountUser = viewAsUser.getAllEntries().getCount(); 

return docCountUser.toString() + "/" + docCountSigner.toString(); 

Это должно работать.

+0

Означает ли это, что мне приходится перерабатывать только представление, или я должен также перерабатывать объект базы данных? – ShirouWrath

+0

Вам просто нужно переработать представление. –

+0

Хорошо, я вижу. Большое спасибо за Вашу помощь! – ShirouWrath

0

getCurrentDatabase() не следует использовать с sessionAsSigner. Он будет извлекать тот же объект базы данных, который был получен для текущего пользователя. Вместо этого используйте sessionAsSigner.getDatabase(database.getServerName(), database.getFilePath())

+0

Только что протестировано var dbAsSigner = sessionAsSigner.getDatabase (database.getServer(), database.getFilePath()); , но все еще получаю 606/606 .. – ShirouWrath

Смежные вопросы