Excel VBA — запрос LDAP Active Directory с конкатенацией строк

#sql #excel #vba #ldap #string-concatenation

#sql #excel #vba #ldap #строка-конкатенация

Вопрос:

Я пытаюсь выполнить поиск атрибутов контактов из Active Directory наших компаний для инструмента, который я пишу в Excel 2016. Программа должна иметь возможность выполнять поиск в базе данных, когда пользователь предоставляет либо адрес электронной почты, либо полное имя ( FIRSTNAME LASTNAME ) — все, что он пожелает.

Это отлично работает для адресов электронной почты и других атрибутов, которые синтаксически совпадают в базе данных, предоставленной пользователем. К сожалению, база данных не хранит полное имя в нужном мне формате, а именно FIRSTNAME LASTNAME

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

Для этого я попробовал следующие способы объединения атрибутов ‘givenname’ и ‘sn’. Ни один из них не работал:

  1. в WHERE предложении SQL я добавил:

     ' OR givenname amp; " " amp; sn = '" amp; Trim(rng.Text) amp; "'
    (see code snippet below)
      
  2. В разделе SQL SELECT я протестировал несколько способов создания псевдонима:

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

Похоже, что SQL, используемый в запросах LDAP, поддерживается не полностью. Потому что я даже не могу создавать псевдонимы. Я также не могу использовать квадратные скобки или функции, такие как CONCAT() в команде SQL.

Каждый раз, когда я пробовал один из способов, я получал ошибку vba:

Произошла по крайней мере одна ошибка

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

В других реализациях SQL (не в VBA) это givenname amp; " " amp; sn работает отлично.

Вопрос: Как я могу выполнить запрос, который проверяет мой SearchString на соответствие конкатенации атрибутов givenname (firstname) и sn (lastname) с пробелом между ними?

 ' 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 " amp; _
    "FROM 'LDAP://" amp; objDSE.Get("defaultNamingContext") amp; "' " amp; _
    "WHERE objectCategory='person' AND (mail = '" amp; SearchString t amp; "' OR givenname amp; sn = '" amp; SearchString amp; "')"
Set objRecordset = objCommand.Execute

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

Ответ №1:

Я, наконец, решил это так, как надеялся, что смогу избежать. Это, конечно, необычно и не эффективно, но решает проблему. Я написал функцию, которая преобразует SearchString в формат, который поддерживает база данных.

Если у кого-то есть лучший подход к этому, не стесняйтесь публиковать его.

Комментарии:

1. Не могли бы вы отредактировать свой ответ, чтобы включить код из новой функции?