Cómo recuperar múltiples propiedades utilizando @namelookup en Lotus Notes
-
21-12-2019 - |
Pregunta
Estoy usando la fórmula @namelookUP para recuperar la dirección de Internet al darle una clave de búsqueda y está funcionando bien. Pero ahora quiero volver a volver a la dirección de Internet, sino también algunas otras propiedades como el primer nombre y el apellido. Aquí está la fórmula que estoy usando a la dirección de Internet @nameelookup, dando la cadena de búsqueda.
Vector vec=m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\")");
// nombre de usuario es la variable de cadena (criterios de búsqueda)
Puede cualquier persona, por favor, ayude a recuperar múltiples propiedades (como Nombre y apellido junto con InternetAddress) evalúe la fórmula solo una vez.Si no se puede hacer usando @namelookup, ¿hay alguna otra forma ...?
Solución
Este es un ejemplo típico al usar Evaluar () para llamar a una fórmula, no es una buena idea. Lo que quiere hacer es obtener la clase de NotesDocument y leer los valores de él.
Algo así (descargo de responsabilidad, no soy un desarrollador de 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");
}
Creo que esto sería más rápido que múltiples búsquedas utilizando Evaluate (), y también tiene el beneficio adicional del manejo completo de errores, y todo es un código nativo.
Otros consejos
@namelookup Solo devuelve el valor de un elemento por llamada.
Suponiendo que su objetivo es tener solo una declaración de evaluación, podría encadenar las llamadas juntas y devolver una matriz de valores en un determinado orden:
Vector vec=m_session.evaluate("FirstName := @NameLookup([NoUpdate];\""+ userName + "\"; \"FirstName\"); LastName:= @NameLookup([NoUpdate];\""+ userName + "\"; \"LastName\"); InternetAddress :=@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\"); FirstName:LastName:InternetAddress");
o posiblemente:
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\")");
y luego agregue esas tres cadenas en cualquier orden en su vector.
Otro enfoque es usar la clase de DirectoryNavigator.Creo que ha estado disponible ya que notas / Domino 8.5 (tal vez incluso antes de eso).DirectoryNavigator usa algunas de las mismas lógicas básicas que @namelookup, por lo que debe funcionar bien.
Aquí hay algún código de muestra.No he probado este código exacto, pero lo adapté del código de producción que hace una búsqueda similar:
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);
}