Опитвам се да търся атрибути за контакти от Active Directory на нашите компании за инструмент, който пиша в Excel 2016. Програмата трябва да може да извършва справки в база данни, когато потребителят предостави или имейл адрес, или пълното име (FIRSTNAME LASTNAME
) - каквото и да е пожелавам да.
Това работи добре за имейл адреси и други атрибути, които са синтактично еднакви в базата данни, предоставени от потребителя. За съжаление базата данни не съхранява пълното име във формата, от който се нуждая, който е FIRSTNAME LASTNAME
Така че реших, че трябва да кажа на заявката също така да върне съвпадения за атрибутите givenname
и sn
, защото те представляват желаното пълно име.
За да направя това, опитах следните начини за свързване на атрибутите 'givenname' и 'sn'. Нито един от тях не работи:
в клаузата
WHERE
на SQL добавих:' OR givenname & " " & sn = '" & Trim(rng.Text) & "' (see code snippet below)
В секцията
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
' ...