como recuperar múltiplas propriedades usando @NameLookup em notas de lótus
-
21-12-2019 - |
Pergunta
Estou usando a fórmula @NameLookUp para recuperar o endereço da Internet, fornecendo uma chave de pesquisa e está funcionando bem. Mas agora quero recuperar não apenas o endereço da Internet, mas também algumas outras propriedades, como Nome e Sobrenome.Aqui está a fórmula que estou usando para o endereço de Internet @Namelookup, fornecendo a string de pesquisa.
Vector vec=m_session.evaluate("@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\")");
//nome de usuário é a variável String (critérios de pesquisa)
Alguém pode ajudar como recuperar várias propriedades (como firstName e lastName junto com InternetAddress) avaliando a fórmula apenas uma vez.Se isso não puder ser feito usando @Namelookup, existe alguma outra maneira ..?
Solução
Este é um exemplo típico de quando usar avaliar() para chamar uma Fórmula não é uma boa ideia.O que você deseja fazer é obter a classe NotesDocument e ler os valores dela.
Algo assim (isenção de responsabilidade, não sou um desenvolvedor 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");
}
Acredito que isso seria mais rápido do que várias pesquisas usandoavaliar(), e você também tem o benefício adicional de tratamento completo de erros, e tudo sendo código nativo.
Outras dicas
@NameLookup retorna apenas o valor de um item por chamada.
Supondo que seu objetivo seja ter apenas uma instrução Evaluate, você poderia encadear as chamadas e retornar uma matriz de valores em uma determinada ordem:
Vector vec=m_session.evaluate("FirstName := @NameLookup([NoUpdate];\""+ userName + "\"; \"FirstName\"); LastName:= @NameLookup([NoUpdate];\""+ userName + "\"; \"LastName\"); InternetAddress :=@NameLookup([NoUpdate];\""+ userName + "\"; \"InternetAddress\"); FirstName:LastName:InternetAddress");
Ou possivelmente:
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\")");
E então adicione essas três strings em qualquer ordem ao seu Vector.
Outra abordagem é usar a classe DirectoryNavigator.Acredito que esteja disponível desde o Notes/Domino 8.5 (talvez antes disso).DirectoryNavigator usa parte da mesma lógica central de @NameLookup, portanto, deve funcionar bem.
Aqui está um exemplo de código.Não testei esse código exato, mas adaptei-o do código de produção que faz uma pesquisa semelhante:
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);
}