Termin in MS-Outlook mit SWT/OLE

Bakalit

Grünschnabel
Hallo zusammen

Ich habe eine Java-Applikation die mir Termine aus einer Excel Tabelle nach Outlook überträgt. Mit SWT und OLE geht das ganz flott. Nun möchte ich aber die Termine in Outlook und die Excel-Planung abgleichen und auf Änderungen prüfen. Dazu lade ich im Moment alle Termine aus dem Kalender und suche im "Betreff" nach bestimmten Schlüsselwörter um die Termine, die aus Excel kommen, vom Rest zu trennen. Das ist recht umständlich, relative fehleranfällig und unflexibel.

Nu zu meiner Fragen:
1)
Soweit ich weiss vergibt Outlook jedem Termin eine eindeutige ID. Um nicht jedes Mal den ganzen Kalender auslesen zu müssen um einen bestimmten Termin zu finden wäre das suchen nach einer bestimmten ID viel effizienter. Weiss jemand wie ich an die ID von einem Termin komme den ich gerade über SWT/OLE erzeugt habe und wie ich nur den Termin mit dieser ID aus Outlook lade?

Dann kann ich mir die ID's in einem File ablegen und nur noch darüber referenzieren und habe so die eindeutige Identifizierung ohne jeweils den ganzen Kalender laden und auswerten zu müssen.

2)
Wie in Frage 1 erwähnt möchte ich bestehende Termine in Outlook periodisch mit Planungsdaten ausserhalb Outlook vergleichen um festzustellen ob der Outlook-Termin noch aktuell ist oder ob die Planung geändert hat. Ich verwende hierzu JAVA mit SWT/OLE. Falls im Vergleich eine Diskrepanz festgestellt wird soll der Outlook-Termin aktualisiert werden. Gibt es eine Möglichkeit vorhandene Termine in Outlook zu modifizieren oder muss der Termin jeweils gelöscht und neu erstellt werden?

3)
Weiss jemand wie ich einen bestimmten Termin in Outlook mit JAVA über SWT/OLE löchen kann? Mal vorausgesetzt ich habe die eindeutige ID des Termins.

4)
Kann ich irgendwie feststellen wann ein Termin in Outlook zum letzen mal verändert/modifiziert wurde? Gibt es da so was wie ein LastModifyDate? Wenn ja wie komm ich da mit JAVA und SWT/OLE ran?


Hier mal wie ich aktuell die Termine aus Outlook lade:

Code:
 public Tour[] getAppointments() {

        mStatus = NOTOK;
        Tour[] ret = null;

        Display displayGet = new Display();
        Shell shell = new Shell(displayGet);

        shell.setText("Outlook Automation");
        shell.setLayout(new FillLayout());

        OleFrame frm = new OleFrame(shell, SWT.NONE);


        OleClientSite site = new OleClientSite(frm, SWT.NONE,
                "Outlook.Application");

        site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);

        OleAutomation auto = new OleAutomation(site);

        int[] GetNamespaceDispId = auto.getIDsOfNames(new String[]{"GetNamespace"});
        Variant mapiNamespace = auto.invoke(GetNamespaceDispId[0],
                new Variant[]{new Variant("MAPI")});

        OleAutomation mapiNamespaceAuto = mapiNamespace.getAutomation();

        int[] DefaultFolderPropertyDispId = mapiNamespaceAuto.getIDsOfNames(new String[]{"GetDefaultFolder"});


        Variant defaultFolder = mapiNamespaceAuto.invoke(
                DefaultFolderPropertyDispId[0],
                new Variant[]{new Variant(9)});

        OleAutomation defaultFolderAutomation = defaultFolder.getAutomation();


        int[] ItemsFolderPropertyDispId = defaultFolderAutomation.getIDsOfNames(new String[]{"Items"});

        Variant items = defaultFolderAutomation.invoke(ItemsFolderPropertyDispId[0]);

        OleAutomation itemsAutomation = items.getAutomation();

        int[] ItemsCountPropertyDispId = itemsAutomation.getIDsOfNames(new String[]{"Count"});

        int[] itemDispId = itemsAutomation.getIDsOfNames(new String[]{"Item"});

        Variant itemsCount = itemsAutomation.invoke(ItemsCountPropertyDispId[0]);

        ret = new Tour[itemsCount.getInt()];

        for (int i = 0, cnt = itemsCount.getInt(); i < cnt; i++) {
            Variant calendar = itemsAutomation.invoke(itemDispId[0],
                    new Variant[]{new Variant(i + 1)});
            OleAutomation calendarAutomation = calendar.getAutomation();

            System.out.println("Item checked: " + i);

            int[] CalendarSubjectPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Subject"});

            Variant calendarSubject = calendarAutomation.getProperty(CalendarSubjectPropertyDispId[0]);


            int[] CalendarStartPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Start"});

            Variant calendarStart = calendarAutomation.getProperty(CalendarStartPropertyDispId[0]);


            int[] CalendarDurationPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Duration"});

            Variant calendarDuration = calendarAutomation.getProperty(CalendarDurationPropertyDispId[0]);

            int[] CalendarReminderPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"ReminderMinutesBeforeStart"});

            Variant calendarReminder = calendarAutomation.getProperty(CalendarReminderPropertyDispId[0]);

            int[] CalendarLocationPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Location"});

            Variant calendarLocation = calendarAutomation.getProperty(CalendarLocationPropertyDispId[0]);

            int[] CalendarBodyPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Body"});

            Variant calendarBody = calendarAutomation.getProperty(CalendarBodyPropertyDispId[0]);

            int[] CalendarCategoriesPropertyDispId = calendarAutomation.getIDsOfNames(new String[]{"Categories"});

            Variant calendarCategories = calendarAutomation.getProperty(CalendarCategoriesPropertyDispId[0]);

            if (calendarSubject.getString().contains(UNIQUEIDENTIFIER) && calendarStart.getInt() >= mMsToday) {
                ret[i] = new Tour(calendarSubject.getString(), calendarStart.getDouble(), calendarDuration.getInt(),   calendarReminder.getInt(), calendarLocation.getString(), calendarBody.getString(), new Category(calendarCategories.getString()));
            }//end if


            calendarAutomation.dispose();
        }//end for

        itemsAutomation.dispose();
        defaultFolderAutomation.dispose();

        mapiNamespaceAuto.dispose();
        shell.dispose();
        auto.dispose();

        site.deactivateInPlaceClient();
        site.dispose();

        frm.dispose();

        displayGet.dispose();

        mStatus = OK;

        return ret;
    }

Schon mal besten Dank im Voraus
Grüsse
Bakalit
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

zu 1)
Mittels der Restrict Methode an der Items-Auflistung (eines Folders) kann man einen Eintrag mit einer bestimmten Id (EntryId) laden.
Siehe: http://msdn.microsoft.com/en-us/library/bb220369.aspx

zu 2)
Hier würde ich mir die Änderung eines bestehenden Termins als ein VBA Macro aufzeichnen lassen und dann in den generierten VBA Code schauen.

zu 3) an dem AppointmentItem gibt es deine Delete Methode :)

zu 4) an dem AppointmentItem gibt es ein LastModificationTimeProperty
http://msdn.microsoft.com/de-de/library/office/ff866443.aspx

Gruß Tom