Domino 9 und frühere Versionen > ND7: Entwicklung

Per VBA Meeting in Notes Kalender eintragen und Einladungen senden

(1/5) > >>

etofi:
Hallo zusammen,

ich bin am verzweifeln. Ich möhte per VBA eine Meeting im Notes Kalender anlegen.
Das geht auch ganz gut, nur die Funktion "Status der eingeladenen Personen anzeigen" geht nicht.
Es kommt immer die Fehlermeldung "Object variable not set".

Anbei mein Code

--- Code: ---Public Function SendNotesTermin(pstrSubject As String, _
                                pstrRecipient As String, _
                                pstrMailBody As String, _
                                AppDate As Date, _
                                StartTime As Date, _
                                MinsDuration As Integer, _
                                pstrLocation As String, _
                                pstrCategories As String, _
                                AppointmentType As String) As String
                              

'Aufgabe:   Sendet Termine mit Attachment via Notes
'Rückgabe:  String mit Fehlermeldung bei auftretendem Fehler, sonst Leerstring
'
'WICHTIG:   Bei den Empfängern darf der Absender nicht enthalten sein!!


    On Error GoTo proc_error

    Dim objMaildb           As Object
    Dim objCalenDoc         As Object
    Dim strMailDbName       As String
    Dim strUserName         As String
    Dim strServerName       As String
    Dim varEmpfListe()      As Variant
    Dim datStartDatum       As Date
    Dim datStartZeit        As Date
    Dim datEndDatum         As Date
    Dim datEndZeit          As Date
    
    
    SendNotesTermin = ""
    
    'Zeitvariablen füllem
    datStartDatum = DateSerial(Year(AppDate), Month(AppDate), Day(AppDate))
    datStartZeit = TimeSerial(Hour(StartTime), Minute(StartTime), Second(StartTime))
    datEndDatum = DateSerial(Year(DateAdd("n", MinsDuration, AppDate)), Month(DateAdd("n", MinsDuration, AppDate)), Day(DateAdd("n", MinsDuration, AppDate)))
    datEndZeit = TimeSerial(Hour(DateAdd("n", MinsDuration, StartTime)), Minute(DateAdd("n", MinsDuration, StartTime)), Second(DateAdd("n", MinsDuration, StartTime)))
    
    
    'Empfänger, per Komma getrennt, in Empfängerarray eingelesen
    intEmpfCnt = 0
    lngPos1 = InStr(1, pstrRecipient, ",")
    While lngPos1 > 0
        ReDim Preserve varEmpfListe(intEmpfCnt)
        varEmpfListe(intEmpfCnt) = Left(pstrRecipient, lngPos1 - 1)
        pstrRecipient = Right(pstrRecipient, Len(pstrRecipient) - lngPos1)
        lngPos1 = InStr(1, pstrRecipient, ",")
        intEmpfCnt = intEmpfCnt + 1
    Wend
    ReDim Preserve varEmpfListe(intEmpfCnt)
    varEmpfListe(intEmpfCnt) = pstrRecipient
    
        
    'Notes befüllen
    Set objSession = CreateObject("Notes.NotesSession")
    
    strUserName = objSession.UserName
    strServerName = objSession.GETENVIRONMENTSTRING("MailServer", True)
    strMailDbName = objSession.GETENVIRONMENTSTRING("MailFile", True)
    
    Set objMaildb = objSession.GETDATABASE(strServerName, strMailDbName)
      
    If objMaildb.ISOPEN <> True Then
        On Error Resume Next
        objMaildb.OPENMAIL
    End If
      
    Set objCalenDoc = objMaildb.CREATEDOCUMENT
    
    With objCalenDoc
        
        .REPLACEITEMVALUE "Form", "Appointment"
        .REPLACEITEMVALUE "AppointmentType", AppointmentType '0=Appointment, 1=Anniversary, 2=AllDayEvent, 3=Meeting, 4=Reminder
        
        'Zeit und Datum
        .REPLACEITEMVALUE "StartDateTime", CDate(datStartDatum & " " & datStartZeit)
        .REPLACEITEMVALUE "CalendarDateTime", CDate(datStartDatum & " " & datStartZeit)
        .REPLACEITEMVALUE "EndDateTime", CDate(datEndDatum & " " & datEndZeit)
        .REPLACEITEMVALUE "StartDate", datStartDatum
        .REPLACEITEMVALUE "StartTime", datStartZeit
        .REPLACEITEMVALUE "EndDate", datEndDatum
        .REPLACEITEMVALUE "EndTime", datEndZeit
        .REPLACEITEMVALUE "$NoPurge", datEndDatum & " " & datEndZeit
                
        'Eigentümer
        .REPLACEITEMVALUE "Chair", strUserName
        .REPLACEITEMVALUE "AltChair", strUserName
        .REPLACEITEMVALUE "From", strUserName
        .REPLACEITEMVALUE "Principal", strUserName
        .REPLACEITEMVALUE "$AltPrincipal", strUserName
        
        'Was, wo und warum
        .REPLACEITEMVALUE "Categories", pstrCategories
        .REPLACEITEMVALUE "Location", pstrLocation
        .REPLACEITEMVALUE "Subject", pstrSubject
        .REPLACEITEMVALUE "Body", pstrMailBody
        
        ' Einstellung einer Erinnerung in Minuten
        .REPLACEITEMVALUE "$Alarm", 1
        .REPLACEITEMVALUE "$AlarmOffset", -15
        .REPLACEITEMVALUE "Alarms", "1"
        
        'Welches Icon soll angezeigt werden
        Select Case AppointmentType
            Case 0 'Appointment
                .REPLACEITEMVALUE "_viewicon", 160
            Case 1 'Anniversary
                .REPLACEITEMVALUE "_viewicon", 63
            Case 2 'AllDayEvent
                .REPLACEITEMVALUE "_viewicon", 9
            Case 3 'Meeting
                .REPLACEITEMVALUE "_viewicon", 158
            Case 4 'Reminder
                .REPLACEITEMVALUE "_viewicon", 10
        End Select
        
        'Notes Systemvariablen
        .REPLACEITEMVALUE "$BorderColor", "D2DCDC"
        .REPLACEITEMVALUE "$BusyName", strUserName
        .REPLACEITEMVALUE "$BusyPriority", "1"
            Dim strCSTrack(2)       As String
            Dim strUserFuerCSTrack  As String
            strUserFuerCSTrack = Replace(strUserName, "CN=", "")
            strUserFuerCSTrack = Replace(strUserFuerCSTrack, "OU=", "")
            strUserFuerCSTrack = Replace(strUserFuerCSTrack, "O=", "")
            strCSTrack(0) = "Send Request by Notes Client on " & strUserFuerCSTrack & "(" & objSession.NOTESVERSION & ") at " & Format(Now(), "dd.mm.yyyy hh:mm:ss")
            strCSTrack(1) = "Prepare Request by Notes Client on " & strUserFuerCSTrack & "(" & objSession.NOTESVERSION & ") at " & Format(Now(), "dd.mm.yyyy hh:mm:ss")
            strCSTrack(2) = "Revert Invitation by Notes Client on " & strUserFuerCSTrack & "(" & objSession.NOTESVERSION & ") at " & Format(Now(), "dd.mm.yyyy hh:mm:ss")
        .REPLACEITEMVALUE "$CSTrack", strCSTrack
        .REPLACEITEMVALUE "$CSVersion", "2"
        .REPLACEITEMVALUE "$CSWISL", Array("$S:1", "$L:1", "$B:1", "$R:1", "$E:1", "$W:1", "$O:1", "$M:1")
        .REPLACEITEMVALUE "$ExpandGroups", "3"
        .REPLACEITEMVALUE "$FromPreferredLanguage", "de"
        .REPLACEITEMVALUE "$HFFlags", "1"
        .REPLACEITEMVALUE "$LangChair", ""
        .REPLACEITEMVALUE "$SMTPKeepNotesItem", "1"
        .REPLACEITEMVALUE "$WatchedItems", Array("$S", "$L", "$B", "$R", "$E", "$W", "$O", "$M")
        .REPLACEITEMVALUE "ApptUNID", .UNIVERSALID
        .REPLACEITEMVALUE "BookFreeTime", ""
        .REPLACEITEMVALUE "ExcludeFromView", Array("S", "D")
        .REPLACEITEMVALUE "MailOptions", "0"
        .REPLACEITEMVALUE "MeetingType", "1"
        .REPLACEITEMVALUE "OrgTable", "C0"
        .REPLACEITEMVALUE "PublicAccess", "1"
        .REPLACEITEMVALUE "Resources", ""
        .REPLACEITEMVALUE "Repeats", ""
        .REPLACEITEMVALUE "RoomToReserve", ""
        .REPLACEITEMVALUE "SchedulerSwitcher", "1"
        .REPLACEITEMVALUE "StartTimeZone", "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=86$ZN=W. Europe"
        .REPLACEITEMVALUE "StorageRequiredNames", "1"
        .REPLACEITEMVALUE "UpdateSeq", 1
        .REPLACEITEMVALUE "WebDateTimeInit", "1"
      
        'Versandeinstellungen
        If AppointmentType = 3 Then 'Meeting
            .REPLACEITEMVALUE "Recipients", varEmpfListe
            .REPLACEITEMVALUE "RequiredAttendees", varEmpfListe
            .REPLACEITEMVALUE "AltRequiredNames", varEmpfListe
            .REPLACEITEMVALUE "SendTo", varEmpfListe
        End If
        '.DeliveryReport = "B"               'Übermittlung anzeigen
        '.Importance = "2"                   'Wichtigkeit hochsetzen
        .SAVEMESSAGEONSEND = False           ' bei True wird ein Exemplar in Notes in Gesendet gestellt
        .SIGNONSEND = True                   'Signieren beim Versand
        '.ReturnReceipt = "1"                'Empfang bestätigen
                    

        'Überprüfen vor dem Speichern bzw. Versand
        If .COMPUTEWITHFORM(True, False) Then
            MsgBox "Bei der Erstellung des Termins ist ein Fehler aufgetreten!"
            GoTo proc_exit
        End If
        
        'Wenn es ein Metting ist, Einladungen versenden
        If AppointmentType = 3 Then
            .SEND 0
        End If
      
       'Im Kalender speichern
       .Save 1, 0
      
       'Damit der Alarm auch funtioniert
       .PUTINFOLDER "$Alarms", True
      
    End With
    
proc_exit:
    Set objMaildb = Nothing
    Set objCalenDoc = Nothing
    Exit Function
    
proc_error:
    SendNotesTermin = Err.Description
    Resume proc_exit
    
End Function

--- Ende Code ---

Welche Variable habe ich vergessen? Bin wirklich ratlos...

Grüße
Eric Trösch

Peter Klett:
Erstelle Dir ein Dokument, wie Du es haben möchtest, manuell. Vergleiche dann über die Felderliste das manuell erstellte Dokument mit dem maschinell erstellten. Wenn ein Feld fehlt, wirst Du es so am einfachsten finden.

m3:
IBM Lotus Notes and Domino Calendaring & Scheduling Schema

etofi:

--- Zitat von: Peter Klett am 18.02.11 - 17:27:20 ---Erstelle Dir ein Dokument, wie Du es haben möchtest, manuell. Vergleiche dann über die Felderliste das manuell erstellte Dokument mit dem maschinell erstellten. Wenn ein Feld fehlt, wirst Du es so am einfachsten finden.

--- Ende Zitat ---

Das habe ich bereits gemacht. Es sind mittlerweile alle Felder drin aber die Fehlermeldung bleibt.
3 Felder haben den "Feld-Flags: SUMMARY" statt "Feld-Flags: SUMMARY NAMES". Ist das tragisch?
Die einzige Variable die ich nicht habe ist die "$MessageID". Ich kann die zwar anlegen, weiß aber nicht woher ich diese ID nehmen soll. Die sieht z.B. so aus "<OF0ADEED9D.4A673CE7-ONC125783E.0049860D-C125783E.00498C03@LocalDomain>"


--- Zitat von: m3 am 18.02.11 - 18:46:52 ---IBM Lotus Notes and Domino Calendaring & Scheduling Schema

--- Ende Zitat ---
Leider habe ich hier auch nichts zu meinem Problem gefunden.

Irgendwie komme ich nicht weiter...
Es muß doch eine Lösung dafür geben.

etofi:
So jetzt läufts. Es lag nicht an fehlenden Variablen sondern daran:


--- Code: ---        'Überprüfen vor dem Speichern bzw. Versand
        If .COMPUTEWITHFORM(True, False) Then
            MsgBox "Bei der Erstellung des Termins ist ein Fehler aufgetreten!"
            GoTo proc_exit
        End If
--- Ende Code ---

Wenn man das weglässt funktioniert es einwandfrei.
Anbei der neue Code, falls es mal jemand braucht.


--- Code: ---Public Function SendNotesTermin(pstrSubject As String, _
                                pstrRecipient As String, _
                                pstrMailBody As String, _
                                AppDate As Date, _
                                StartTime As Date, _
                                MinsDuration As Integer, _
                                pstrLocation As String, _
                                pstrCategories As String, _
                                AppointmentType As String) As String

'Aufgabe:   Sendet Termine via Notes
'Rückgabe:  String mit Fehlermeldung bei auftretendem Fehler, sonst Leerstring
'
'pstrSubject:       Betreff
'pstrRecipient:     Empfänger mit Komma getrennt
'pstrMailBody:      Text
'AppDate:           Datum Termin
'StartTime:         Uhrzeit Termin
'MinsDuration:      Dauer in Minuten
'pstrLocation:      Ort
'pstrCategories:    Kategorie
'AppointmentType:   0=Termin, 1=Jahrestag, 2=Ganztägige Veranstaltung, 3=Meeting, 4=Erinnerung
'
'WICHTIG: Damit die Funktion "Status der eingeladenen Personen prüfen" sauber funktioniert
'         müssen die internen Aderssen im Notes Format "User/Intern/MUSTER" übergeben werden.


On Error GoTo proc_error

Dim objNotesSession         As Object
Dim objNotesDatabase        As Object
Dim objNotesDocument        As Object
Dim strServerName           As String
Dim strMailDbName           As String
Dim strUserName             As String
Dim strUserMail             As String
Dim datStart                As Date
Dim datEnde                 As Date
Dim intIconNr               As Integer
Dim intZaehler              As Integer
Dim dblAnzahlTage           As Double

SendNotesTermin = ""

'Bei ganztägige Veranstaltung auf 4 Uhr Starttag und 22 Uhr Endtage setzen
If AppointmentType = 2 Then
    datStart = CDate(AppDate & " " & "04:00")
    dblAnzahlTage = fktAufrunden(MinsDuration / 60 / 24, 0) ' Berechnung Tage
    datEnde = CDate(Format(DateAdd("d", dblAnzahlTage - 1, datStart), "dd.mm.yyyy") & " 22:00")
Else
    datStart = CDate(AppDate & " " & Format(StartTime, "hh:mm"))
    datEnde = DateAdd("n", MinsDuration, datStart)
End If

Set objNotesSession = CreateObject("Notes.NotesSession")

strUserName = objNotesSession.UserName
strUserMail = Replace(Replace(Replace(strUserName, "CN=", ""), "OU=", ""), "O=", "")
strServerName = objNotesSession.GETENVIRONMENTSTRING("MailServer", True)
strMailDbName = objNotesSession.GETENVIRONMENTSTRING("MailFile", True)

Set objNotesDatabase = objNotesSession.GETDATABASE(strServerName, strMailDbName)
Set objNotesDocument = objNotesDatabase.CREATEDOCUMENT

With objNotesDocument

    '## Appointment Type - Meeting
    .REPLACEITEMVALUE "AppointmentType", AppointmentType
   
    '## General Meeting Info
    .REPLACEITEMVALUE "Form", "Appointment"
    .REPLACEITEMVALUE "Subject", pstrSubject
    .REPLACEITEMVALUE "Categories", pstrCategories
    .REPLACEITEMVALUE "Body", pstrMailBody
    .REPLACEITEMVALUE "Location", pstrLocation
    .REPLACEITEMVALUE "Room", ""
   
    '## Who sent/created/chairs the Meeting
    .REPLACEITEMVALUE "From", objNotesSession.UserName
    .REPLACEITEMVALUE "Chair", objNotesSession.UserName
   
    '## Time of meeting-related stuff
    .REPLACEITEMVALUE "STARTDATETIME", datStart
    .REPLACEITEMVALUE "StartTime", datStart
    .REPLACEITEMVALUE "StartDate", datStart
    .REPLACEITEMVALUE "EndDateTime", datEnde
    .REPLACEITEMVALUE "EndTime", datEnde
    .REPLACEITEMVALUE "EndDate", datEnde
   
    If AppointmentType = 2 Then 'Bei ganztägige Veranstaltung Je Tag Ein Arrayeintag erforderlich
       
        Dim arrCalenderDateTime() As Date
        ReDim arrCalenderDateTime(dblAnzahlTage - 1)
        For intZaehler = 0 To dblAnzahlTage - 1
             arrCalenderDateTime(intZaehler) = DateAdd("d", intZaehler, datStart)
        Next
        .REPLACEITEMVALUE "CalendarDateTime", arrCalenderDateTime
   
    Else
       
        .REPLACEITEMVALUE "CalendarDateTime", datStart
   
    End If
   
   
    '## Attendee-related data
    If AppointmentType = 3 Then 'Meeting
        Dim arrRequiredAttendeeName() As String
        arrRequiredAttendeeName = Split(pstrRecipient, ",")
        For intZaehler = 0 To UBound(arrRequiredAttendeeName)
            'Bei den Empfängern darf der Absender nicht enthalten sein!!
            If Trim(arrRequiredAttendeeName(intZaehler)) = strUserMail Then
                arrRequiredAttendeeName(intZaehler) = vbNullString
            Else
                arrRequiredAttendeeName(intZaehler) = Trim(arrRequiredAttendeeName(intZaehler))
            End If
        Next
       
        .APPENDITEMVALUE "RequiredAttendees", arrRequiredAttendeeName
        .APPENDITEMVALUE "AltRequiredNames", arrRequiredAttendeeName
   
        'Call objNotesDocument.AppendItemValue("INetRequiredNames", arrRequiredAttendeeNameAndEmail)
        'Call objNotesDocument.REPLACEITEMVALUE("StorageRequiredNames", ".")
       
        .APPENDITEMVALUE "SendTo", arrRequiredAttendeeName
        'Call objNotesDocument.APPENDITEMVALUE("NoticeType", "I")
    End If
   
    '## System variables
    .REPLACEITEMVALUE "$UpdatedBy", objNotesSession.UserName
    .REPLACEITEMVALUE "OrgTable", "C0"
    .REPLACEITEMVALUE "Principal", objNotesSession.UserName
    .REPLACEITEMVALUE "$Alarm", 1
    .REPLACEITEMVALUE "$AlarmOffset", -15
    .REPLACEITEMVALUE "Alarms", "1"
   
    Select Case AppointmentType
        Case 0 'Appointment
            intIconNr = 160
        Case 1 'Anniversary
            intIconNr = 63
        Case 2 'AllDayEvent
            intIconNr = 9
        Case 3 'Meeting
            intIconNr = 158
        Case 4 'Reminder
            intIconNr = 10
    End Select
    .REPLACEITEMVALUE "_ViewIcon", intIconNr
   
    If AppointmentType = 3 Then .SEND False 'Wenn Meeting dann Einladungen senden
    .Save True, False
   
    'Damit der Alarm auch funtioniert
    .PUTINFOLDER "$Alarms", True

End With


proc_exit:
    Set objNotesDocument = Nothing
    Set objNotesDatabase = Nothing
    Set objNotesSession = Nothing
    Exit Function
   
proc_error:
    SendNotesTermin = Err.Description
    Resume proc_exit
   
End Function

Public Function fktAufrunden(Zahl As Double, Stellen As Integer) As Double

If IsNull(Zahl) = True Then
  fktAufrunden = 0
Else
  Zahl = CDec(Zahl)
  If ((Zahl - Int(Zahl)) * 10 ^ Stellen) = 0 Then
     fktAufrunden = Int(Zahl) + (Int(((Zahl - Int(Zahl)) * 10 ^ Stellen)) / 10 ^ Stellen)
  Else
     fktAufrunden = Int(Zahl) + (Int(((Zahl - Int(Zahl)) * 10 ^ Stellen) + 1) / 10 ^ Stellen)
  End If
End If

End Function
--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln