Excel VBA - LDAP заявка за Active Directory с конкатенация на низове

Опитвам се да търся атрибути за контакти от Active Directory на нашите компании за инструмент, който пиша в Excel 2016. Програмата трябва да може да извършва справки в база данни, когато потребителят предостави или имейл адрес, или пълното име (FIRSTNAME LASTNAME) - каквото и да е пожелавам да.

Това работи добре за имейл адреси и други атрибути, които са синтактично еднакви в базата данни, предоставени от потребителя. За съжаление базата данни не съхранява пълното име във формата, от който се нуждая, който е FIRSTNAME LASTNAME

Така че реших, че трябва да кажа на заявката също така да върне съвпадения за атрибутите givenname и sn, защото те представляват желаното пълно име.

За да направя това, опитах следните начини за свързване на атрибутите 'givenname' и 'sn'. Нито един от тях не работи:

  1. в клаузата WHERE на SQL добавих:

    ' OR givenname & " " & sn = '" & Trim(rng.Text) & "'
    (see code snippet below)
    
  2. В секцията SELECT на SQL тествах няколко начина за създаване на псевдоним:

    * ([givenname] || [sn]) As myfullname
    * ([givenname] + [sn]) As myfullname
    * ([givenname] & [sn]) As myfullname
    * and all of the above without square brackets and round brackets
    

Изглежда, че SQL, използван в LDAP заявките, не се поддържа напълно. Защото не мога дори да създавам псевдоними. Също така не мога да използвам квадратни скоби или функции като CONCAT() в SQL командата.

Всеки път, когато опитах един от начините, получавах vba грешка:

Възникна поне една грешка

(Превод от немски на английски)

В други реализации на SQL (не във VBA) това givenname & " " & sn работи перфектно.

Въпрос: Как мога да изпълня заявка, която проверява моя SearchString спрямо конкатенация на атрибутите givenname (собствено име) и sn (фамилно име) с интервал между тях?

' Connect to active directory
Set objDSE = GetObject("LDAP://rootDSE")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
SearchString = "Max Mustermann"

' Contact lookup using SQL-query
objCommand.CommandText = _
    "SELECT givenname, sn, mail, telephoneNumber, mobile, mailNickName, c, l, postalCode, department, company, streetAddress " & _
    "FROM 'LDAP://" & objDSE.Get("defaultNamingContext") & "' " & _
    "WHERE objectCategory='person' AND (mail = '" & SearchString t & "' OR givenname & sn = '" & SearchString & "')"
Set objRecordset = objCommand.Execute

If Not objRecordset.EOF Then
' Further processing which is not relevant to the question
' ...

person Max    schedule 21.04.2019    source източник


Отговори (1)


Най-накрая го реших по начин, който се надявах да избегна. Със сигурност не е конвенционален, нито е ефективен, но решава проблема. Написах функция, която ще преобразува SearchString във формата, който базата данни поддържа.

Ако някой има по-добър подход към това, не се колебайте да го публикувате.

person Max    schedule 21.04.2019
comment
Можете ли да редактирате отговора си, за да включите кода от новата функция? - person Greenonline; 23.04.2019