【问题标题】:how to retrieve multiple properties using @NameLookup in lotus notes如何在 Lotus Notes 中使用 @NameLookup 检索多个属性
【发布时间】:2014-06-03 08:45:45
【问题描述】:

我正在使用@NameLookUp 公式通过提供搜索键来检索互联网地址,它工作正常。但现在我不仅想检索互联网地址,还想检索一些其他属性,如名字和姓氏。 这是我通过提供搜索字符串来使用@Namelookup 互联网地址的公式。

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

//用户名是字符串变量(搜索条件)

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

【问题讨论】:

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


    【解决方案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() 进行多次查找更快,而且您还可以获得完整错误处理的额外好处,并且所有这些都是本机代码。

    【讨论】:

    • 不同之处在于@NameLookup 在所有Domino 目录 中搜索指定的用户名,而不仅仅是在默认names.nsf 中。如果公司只有一个 Domino Directory names.nsf,那么您的方法很有效。
    • 是的。感谢您修复我的代码,Knut。我只是从 Domino Designer 帮助中复制了大部分内容,在编辑时遗漏了一些细节。
    • view.getDocumentByKey 为我获取了一个文档。但可以有多个条目与搜索条件匹配。在这种情况下,我只会得到一个文档..
    • 通常应该只有一个同名的人。但是,如果您想获取与该键匹配的所有文档,请使用 NotesView 类的 getAllDocumentsByKey 方法获取 NotesDocument 集合,然后使用 getFirstDocument/getNextDocument 方法循环该集合。
    【解决方案2】:

    @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 中。

    【讨论】:

    • 感谢您的回复,如果问题不清楚,我很抱歉......例如..如果我为 X 进行 NameLookup,我希望 X 的电子邮件 ID、名字和姓氏作为一个条目..
    • 我想不出一个调用会在一个对象中返回多个项目值,但当然您可以构建自己的对象,多次调用 @NameLookup 并从函数中返回它,如果那样的话有帮助。
    • 感谢您的回复..我尝试了您告诉的方式,但不能保证多个 NameLookup 会以相同的顺序检索条目..
    【解决方案3】:

    另一种方法是使用 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多