如何在Lotus notes中使用@NameLookup检索多个属性

时间:2014-06-03 08:45:46

标签: lotus-notes lotus-domino lotus domino-designer-eclipse

我正在使用@NameLookUp公式通过提供搜索关键字来检索互联网地址,并且工作正常。但现在我想要不仅检索互联网地址,还要检索FirstName和LastName等其他一些属性。 这是我通过给出搜索字符串来使用@Namelookup网址的公式。

Vector vec=m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\")");

// username是String变量(Search Criteria)

任何人都可以通过仅评估公式一次来帮助如何检索多个属性(如firstName和lastName以及InternetAddress)。如果不能使用@Namelookup完成,还有其他任何方式..?

3 个答案:

答案 0 :(得分:1)

@NameLookup仅返回每次调用一项的值。

假设您的目标是只有一个Evaluate语句,您可以将调用链接在一起并按特定顺序返回值数组:

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\")");

然后以任意顺序将这三个字符串添加到Vector中。

答案 1 :(得分:1)

这是使用evaluate()调用公式不是一个好主意的典型示例。 你想要做的是获取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");
}

我相信这会比使用evaluate()的多次查找更快,而且还有完整错误处理的额外好处,而且都是本机代码。

答案 2 :(得分:0)

另一种方法是使用DirectoryNavigator类。我相信它自Notes / Domino 8.5以来就已经可用(甚至可能在此之前)。 DirectoryNavigator使用与@NameLookup相同的核心逻辑,因此它应该表现良好。

这是一些示例代码。我没有测试过这个确切的代码,但是我从生产代码中进行了类似的查找:

    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);
    }