Announcement

Collapse
No announcement yet.

Terminabgleich Outlook - Delphi5

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Terminabgleich Outlook - Delphi5

    <b>Hallo!</b>

    Ich habe ein kleines Programm geschrieben, mit dem ich Termine aus Outlook auslesen und auch neue Termine in Outlook eintragen kann.<br>
    Wenn sich nun bei einem bereits ausgelesenen Termin Änderungen ergeben und ich diese Änderungen im Delphi-Programm vorgenommen habe, möchte ich diese Änderungen auch im entsprechenden Termin in Outlook vornehmen.<p>
    <b>Wie kann ich einen bestimmten Termin in Outlook ansprechen und ändern?</b><p>
    (Im Buch <i>COM / DCOM / COM+ mit Delphi</i> habe ich diesbezüglich nichts gefunden.)<p>
    Über einen Lösungsvorschlag wäre ich sehr dankbar!<p>
    MfG<p>
    Andreas Siegner

  • #2
    Hallo,

    das Beispiel aus dem Buch lässt sich leicht erweitert: <br>
    1. Immer dann, wenn der "richtige" Kalendereintrag in der Auflistung "vorbeikommt", speichert man die Objektreferenz in einer eigenen Interface-Variable <br>
    2. Über die im Schritt 1 gespeicherte Interface-Variable kann nun dieser Kalendereintrag geändert werden:
    <pre>
    procedure TForm1.ToolButtonListClick(Sender: TObject);
    var
    DefNamespace : NameSpace;
    Journals : MAPIFolder;
    ItemColl : Items;
    aJournal : OleVariant;
    iCnt : Integer;
    begin
    OutlookApplication1.Connect;
    DefNameSpace := OutlookApplication1.GetNamespace('MAPI');
    Journals := DefNameSpace.GetDefaultFolder(olFolderCalendar);
    ItemColl := Journals.Items;
    for iCnt := 1 to ItemColl.Count do
    begin
    aJournal := ItemColl.Item(iCnt);
    ListBox1.Items.Add(Format('%s - %s',
    [DateTimeToStr(aJournal.Start),
    aJournal.Subject]));
    // Interface-Zeiger auf den zu ändernen Eintrag "merken"
    if iCnt = 1 then
    FUpdJournal := aJournal;
    end;
    OutlookApplication1.Disconnect;
    StatusBar1.SimpleText := 'Fertig.';
    end;

    procedure TForm1.ToolButtonCloseClick(Sender: TObject);
    begin
    Close
    end;

    {
    Kalendereintrag ändern und speichern
    }

    procedure TForm1.ButtonUpdateClick(Sender: TObject);
    begin
    FUpdJournal.Subject := EditSubject.Text;
    FUpdJournal.Save;
    end;
    </pre>
    Hinter <i>FUpdJournal</i> verbirgt sich ein privates Objektfeld:
    <pre>
    ...
    FUpdJournal : OleVariant;
    ...
    </pre>
    &#10

    Comment


    • #3
      Hallo Herr Kosch!

      Danke für Ihre schnelle Antwort.<p>
      Bezüglich ihres Lösungsvorschlags habe ich noch eine Frage:<br>
      Wie finde ich den "richtigen" Kalendereintrag?<p>
      <b>Hat jeder Termin eine eindeutige Kennung? (Ja, klar, aber welche?)</b><p>
      Ich hab's mit Hilfe der EntryID probiert und es klappt auch,
      soviel ich bisher feststellen konnte.<br>
      Ich habe jedoch gelesen, dass sich die EntryID ändern kann !?<p>
      Gibt es eine bessere (richtigere) Variante?<p>
      Nochmals Danke für Ihre Hilfe!<p>
      MfG<p>
      Andreas Siegne

      Comment


      • #4
        Hallo,

        in der Schleife muss man alle in Outlook vorgefundenen Daten mit den Daten aus dem eigenen Programm vergleichen. Stimmt alles überein, hat man mit hoher Wahrscheinlichkeit den gesuchten Kalendereintrag gefunden.

        P.S: Warum speichert das eigene Programm die Daten nochmals in eigener Regie? Denn damit hat man das gleiche Replikations-Problem, das auch bei Datenbanken für zusätzlichen Aufwand sorgt.
        &#10

        Comment


        • #5
          Nochmals zur Erläuterung meines Problems:

          Ich habe einen eigenen Terminkalender erstellt (mit Delphi5)
          mit eigener Datenbank.

          Nun habe ich eine Routine eingebaut, die es ermöglicht Termine aus Outlook auszulesen und in den eigenen Terminkalender zu schreiben, d.h. in die eigene Datenbank.

          Wenn ich nun einige (oder alle) Daten eines aus Outlook übernommen Termins ändere, soll die Möglichkeit bestehen diese Änderungen auch im entsprechenden Termin (Kalendereintrag) in Outlook vornehmenzulassen. Hierzu wird die Terminkennung benötigt, die es ermöglicht einen Termin in Outlook wiederzufinden, auch wenn sich alle Daten geändert haben. Mit der EntryID scheint es zu funktionieren.

          Nochmals Danke für die Hilfe

          Comment


          • #6
            Hallo Andreas,

            Du könntest auch eine eigene UserProperty verwenden, wo Du den Primärschlüssel des Termines ablegst. Einen solchen Eintrag kannst Du mit Restrict bzw. Find wieder finden (die UserProperty muss dann auf jeden Fall für alle Einträge vorhanden sein). Auf jeden Fall ist ein bidirektionaler Abgleich nach Outlook eine Heidenarbeit und aufgrund des nicht kompletten Outlook-Objektmodells waren bei mir einige Workarounds notwendig.

            Grüsse,

            Marti

            Comment


            • #7
              Hallo,<P>
              nachdem der bidirektionale Abgleich bei "einfachen" Terminen klappt,
              tauchen weitere Probleme auf.<P>
              Wie erkenne ich, dass es sich bei einem Outlook-Termin um einen Serien-Termin handelt und wie erhalte ich die genauen Daten (wie Anzahl und Art der Wiederholungen, etc.)?<P>
              Für ein wenig Hilfe wäre ich sehr dankbar,<P>
              Andreas

              Comment

              Working...
              X