Im Rahmen meiner Arbeit mit Excel habe ich gleich wieder das nächste Problem.
Und zwar möchte ich, um Sucharbeit zu sparen, EMail-Adressen aus dem Notes-Adressbuch auslesen und direkt in Excel eintragen lassen.
Ich habe bislang leider nicht herausgefunden (was gleichzeitig meine Fragen sind),
- welcher Typ / Welche Klasse das Adressbuch ist
- wie ich ein Element / Kontakt im Adressbuch aufrufe
- GetItemValue oder FieldGetText oder was ganz anderes zum Vergleich mit dem Referenzwert aus Excel zu Vergleich korrekt ist
- ob ich uidoc (NOTESUIDOCUMENT) an dieser Stelle überhaupt brauche
- ob mir sonst noch was fehlt
Folgendes Skript dient derzeit als Grundlage:
Private Function getMailInAdressbook(Kunde As String, Ansprechpartner As String) As String
Dim s As NOTESSESSION
Dim db As NOTESDATABASE
Dim workspace As New NOTESUIWORKSPACE
Dim uidoc As NOTESUIDOCUMENT
'Set uidoc = workspace.CURRENTDOCUMENT
Set db = s.GETDATABASE("server", "adressbuch.nsf")
For Each _kontakt_ as _datentyp_ In _adressbuch_
If Kunde = uidoc.FIELDGETTEXT("CompanyName") _
And (LeftStr(Ansprechpartner, " ") = uidoc.GETITEMVALUE("Firstname")) _
And (MidStr(Ansprechpartner, " ") = uidoc.FIELDGETTEXT("Lastname")) Then
getMailInAdressbook = uidoc.FIELDGETTEXT("mailaddress")
End If
Exit For
Next _kontakt_
End Function
Ich wäre überglücklich, wenn ihr mir hier noch einmal helfen könnt.
wirklich dramatisch ist, glaube ich, noch die Einleitung der Schleife For each und die das If-Konstrukt
Viele Grüße
Das ist der falsche Ansatz. Du möchtest nicht jedesmal alle Kontakte durchsuchen, sondern den Server die Arbeit machen lassen.
Private Function getMailInAdressbook(Kunde As String, Ansprechpartner As String) As String
Dim s As NOTESSESSION
Dim db As NOTESDATABASE
Dim dc as NOTESDOCUMENTCOLLECTION
Dim doc as NOTESDOCUMENT
Dim strQuery as String
'- Diese Zeile baut Dir ein Query zusammen, das sieht dann so aus: CompanyName = "eingegebener Kunde" & FirstName = "Theo" & LastName = "Test"
strQuery = {CompanyName = "} & Kunde & {" & FirstName = "} & LeftStr(Ansprechpartner, " ") & {" & LastName = "} & MidStr(Ansprechpartner, " ") & {"}
Set db = s.GETDATABASE("server", "adressbuch.nsf")
Set dc = db.Search( strQuery, Nothing, 0 )
Set doc = dc.GetFirstDocument()
If not doc is Nothing then
getMailInAdressbook = doc.GetitemValue( "MailAddress" )(0)
End If
End Function
Hallo Tode,
leider funktioniert das Skript nicht.
Ich habe das SQL-Statement zwar schon korrigiert, so dass es jetzt zumindest Laufen müsste,
allerdings erhalte ich die Meldung: Automatisierungsfehler - Ausnahmefehler des Servers
in der Zeile Set dc = db.Search(strQuery, Nothing, 0)
Private Function getMailInAdressbook(Kunde As String, Ansprechpartner As String) As String
Dim s As Object 'notessession erzeugte fehlermeldung: Typen unverträglich
Dim db As Object 'notesdatabase erzeugte fehlermeldung: Typen unverträglich
Dim dc As NOTESDOCUMENTCOLLECTION
Dim doc As NOTESDOCUMENT
Dim strQuery As String
'- Diese Zeile baut Dir ein Query zusammen, das sieht dann so aus: CompanyName = "Kunde GmbH" & FirstName = "Theo" & LastName = "Test"
strQuery = "CompanyName = '" & Kunde & "' and Firstname = '" & LeftStr(Ansprechpartner, " ") & "' and LastName = '" & MidStr(Ansprechpartner, " ") & "'"
Set s = CreateObject("Notes.NotesSession")
Set db = s.GETDATABASE("server", "adrbuch.nsf")
Set dc = db.Search(strQuery, Nothing, 0)
Set doc = dc.GETFIRSTDOCUMENT()
If Not doc Is Nothing Then
getMailInAdressbook = doc.GETITEMVALUE("MailAddress")(0)
End If
End Function
Gibt es bestimmte verweise, die eingebunden werden müssen oder andere Ideen, woran es noch liegen kann?
Aktuell eingebunden habe ich LN Automation classes und LN Domino objects, ODBC würd ich gern vermeiden.
Das ist keine SQL-Abfrage, denn Notes ist keine relationale Datenbank. Du darfst die Werte nicht in ' einfassen, sondern musst " verwenden. Es handelt sich bei dem Query um eine Selektionsformel. Da verwendest Du Formelsprache, die kennt kein And, sondern &
strQuery = |CompanyName = "| & Kunde & |" & Firstname = "| & LeftStr(Ansprechpartner, " ") & |" & LastName = "| & MidStr(Ansprechpartner, " ") & |"|
Anstelle von | kannst Du auch {} verwenden, ist m.E. umständlicher zu schreiben, aber leichter zu lesen
EDIT: Torsten hat Dir die korrekte Formel geschrieben, hatte ich jetzt nicht gelesen. Warum hast Du die nicht probiert, sondern in SQL umgewandelt? ???
Statement ist umgestellt (Hatte im internet die übliche SQL-Syntax recherchiert im Zusammenhang mit notesSQL)
Jedenfalls bleibt das Ergebnis leider das gleiche. (Automatisierungsfehler)
Private Function getMailInAdressbook(Kunde As String, Ansprechpartner As String) As String
Dim s As Object
Dim db As Object
Dim dc As NOTESDOCUMENTCOLLECTION
Dim doc As NOTESDOCUMENT
Dim strQuery As String
'- Diese Zeile baut Dir ein Query zusammen, das sieht dann so aus: CompanyName = "Kunde GmbH" & FirstName = "Theo" & LastName = "Test"
'strQuery = "CompanyName = " & """ & Kunde & """ & " & FirstName = " & """ & LeftStr(Ansprechpartner, " ") & " LastName = " & """ & MidStr(Ansprechpartner, " ") & """
strQuery = "|CompanyName = " & """" & "|" & Kunde & "|" & """" & " & Firstname = " & """" & "|" & LeftStr(Ansprechpartner, " ") & "|" & """" & _
" & LastName = " & """" & "|" & MidStr(Ansprechpartner, " ") & "|" & """" & "|"
Set s = CreateObject("Notes.NotesSession")
Set db = s.GETDATABASE("server", "adrbuch.nsf")
Set dc = db.Search(strQuery, Nothing, 0)
Set doc = dc.GETFIRSTDOCUMENT()
If Not doc Is Nothing Then
getMailInAdressbook = doc.GETITEMVALUE("MailAddress")(0)
End If
End Function