Как извлекать несколько свойств с помощью @namelookup в Notus Notes
-
21-12-2019 - |
Вопрос
Я использую формулу @namelookup, чтобы получить адрес интернет, предоставив ключ поиска, и он работает нормально. Но сейчас я хочу переимено не только интернет-адрес, но и некоторые другие свойства, такие как имя и фамилия. Вот формула, которую я использую для адреса @namelookup, предоставив строку поиска.
Vector vec=m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\")");
.
// username - это строковая переменная (критерии поиска)
Может ли кто-нибудь помочь, как получить несколько свойств (например, имя и фамилия вместе с InternetAddress), оценивая формулу только один раз.Если это не может быть сделано с помощью @namelookup, есть ли другой путь ..?
Решение
Это типичный пример при использовании оценки () для вызова формулы - не хорошая идея. То, что вы хотите сделать, это получить класс NotesDocument и читать значения от него.
Что-то вроде этого (отказ от ответственности, я не разработчик Java):
// Open Domino Directory on specified server
Database db = session.getDatabase("YourServer/Domain", "names.nsf");
// Get a view with user name is sorted first column
View view = db.getView("($Users)");
// Get the person document for specified user
Document doc = view.getDocumentByKey(userName, true);
if (doc != null) {
// Get text values from Notes document
String emailAddress = doc.getItemValueString("InternetAddress");
String officePhone = doc.getItemValueString("OfficeNumber");
String officeAddress = doc.getItemValueString("OfficeStreetAddress");
}
.
Я считаю, что это будет быстрее, чем несколько поисков, использующих оценку (), и у вас также есть дополнительное преимущество полного обращения с ошибкой, а также все нативный код.
Другие советы
@namelookup возвращает только значение одного элемента на звонок.
Предполагая, что ваша цель состоит в том, чтобы иметь только одну оценку оператора, вы можете объединить звонки и вернуть массив значений в определенном порядке:
Vector vec=m_session.evaluate("FirstName := @NameLookup([NoUpdate];\""+ userName + "\"; \"FirstName\"); LastName:= @NameLookup([NoUpdate];\""+ userName + "\"; \"LastName\"); InternetAddress :=@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\"); FirstName:LastName:InternetAddress");
.
или, возможно,:
String firstName = m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"FirstName\")");
String lastName = m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"LastName\")");
String internetAddress = m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\")");
.
А затем добавьте эти три струны в любом порядке в свой вектор.
Другой подход - использовать класс DirectoryNavigator.Я считаю, что это было доступно, так как Notes / Domino 8.5 (возможно, даже до этого).DirectoryNavigator использует некоторые из той же основной логики, что и @nameelookup, поэтому он должен хорошо работать.
Вот какой-то пример код.Я не проверил этот точный код, но я адаптировал его из производственного кода, который делает аналогичный поиск:
String firstName = null;
String lastName = null;
String inetAddress = null;
Vector<String> lookupItems = new Vector<String>();
lookupItems.addElement("FirstName");
lookupItems.addElement("LastName");
lookupItems.addElement("InternetAddress");
Vector<String> vName = new Vector<String>();
vName.addElement(userName);
Directory dir = session.getDirectory();
DirectoryNavigator dirNav = dir.lookupNames("($Users)", vName, lookupItems, true);
if( dirNav != null && dirNav.getCurrentMatches() != 0 ) {
// Digest the results of the lookup
Vector<String> value = null;
value = dirNav.getFirstItemValue();
firstName = value.elementAt(0);
value = dirNav.getNextItemValue();
lastName = value.elementAt(0);
value = dirNav.getNextItemValue();
inetAddress = value.elementAt(0);
}
.