xpages: ссылка на представление из другой базы данных/приложения

Я очень новичок в xpages. Давно ищу в сети ответ на свой вопрос. Кажется, ответ должен быть простым.

Я поиграл с фрагментом кода, который я получил с отличного сайта Xcellerent.net Брэда Балассайтиса, который динамически заполняет список «jumptoitems» для панели просмотра. Код запускается из события beforeRenderResponse страницы xpage.

var viewName = getComponent('viewPanel1').getData().getViewName();
var vw = database.getView(viewName);
var colNum = 1;
var cols:Vector = vw.getColumns();
for (var i=0; i < cols.length; i++) {
    if (cols[i].isSorted() && !cols[i].isHidden()) {
        colNum = i + 1;
        break;
    }
}
var letters = @DbColumn(null, viewName, colNum);
var options = @Trim(@Unique(@UpperCase(@Left(letters, 1))))
viewScope.put('jumpToOptions', options);

Это прекрасно работает, но я хочу изменить код, чтобы он ссылался на представление в другой базе данных. В сообщении Брэд говорит, что код можно «улучшить» для достижения этой цели. Но я экспериментировал и искал какое-то время и не мог добиться улучшения.

Спасибо за любую помощь. --Лиза&


person Community    schedule 20.05.2015    source источник


Ответы (2)


Во второй строке вы устанавливаете дескриптор представления с помощью viewName, которое вы извлекаете из компонента viewPanel1. Ваш вызов — database.getView(viewName). Это соответствует программной ссылке NotesDatabase.getView(). Если вы получили дескриптор другой базы данных, к которой хотите подключиться, вы можете вызвать тот же вызов .getView() для этого дескриптора.

Сначала установите соединение с другой базой данных; это делается с помощью ключевого слова session (которое представляет собой NotesSession), например:

var extDB = session.getDatabase(dbName)

Как отмечает Ховард, это ключевое слово session является сеансом текущего пользователя и будет подчиняться всем правам/назначениям/ролям ACL от имени этого пользователя. Если вам нужно повысить привилегии для программного предоставления дополнительных данных, вы можете сделать это с помощью ключевого слова sessionAsSigner (которое также является NotesSession, только с учетными данными подписавшего, себя , или вы можете подписать NSF как идентификатор сервера, чтобы дать ему еще более высокие привилегии).

Затем действуйте, как обычно, с дескриптором extDB вместо ключевого слова database (что примерно то же самое, что и session.getCurrentDatabase() ); вот так:

var vw = extDB.getView(viewName)

Вызов NotesDatabase.getView() вернет значение null, если представление с таким именем не существует в этом NSF, поэтому вы должны убедиться, что оно существует, а также программно проверить и обработать возврат значения null. .

[Изменить] Поскольку вы используете портированную @function из @DbColumn как есть, использовать подход, который предлагает Франтишек Кошут, может быть легко, но он опирается на < em>NotesSession текущего пользователя. Чтобы переопределить привилегии (отсутствие) этого пользователя и получить полную видимость всех значений документов в отдельном NSF, вам все равно нужно получить дескриптор значения columnValues для представления, как показано выше, используя ключевое слово sessionAsSigner. [/Редактировать]

person Eric McCormick    schedule 20.05.2015
comment
В дополнение к отличному ответу Эрика, если у вашего пользователя нет доступа к другой базе данных, вы можете использовать sessionAsSigner, чтобы получить доступ на основе подписавшего дизайн XPage, а не вошедшее в систему имя пользователя. - person Howard; 20.05.2015
comment
Спасибо за ваш ответ. Это было как раз то, что мне было нужно. - person ; 21.05.2015
comment
Рад это слышать @LisaGerlich. Если вы нашли его адекватным, пожалуйста, примите ответ. - person Eric McCormick; 21.05.2015

На основе вашего кода вам также необходимо указать базу данных в формуле @DbColumn.

var letters = @DbColumn([database], viewName, colNum);

Вы можете прочитать об этом здесь или здесь... В стороне из документированных форматов вы можете использовать формат API "server!!database" как одно строковое значение.

person Frantisek Kossuth    schedule 20.05.2015