Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Termineintrag aus Outlook auslesen (https://www.delphipraxis.net/27154-termineintrag-aus-outlook-auslesen.html)

Susanne 5. Aug 2004 08:51


Termineintrag aus Outlook auslesen
 
Hallo,

ich möchte von meinem Programm aus auf Outlook zugreifen und dort alle Termin für den heutigen Tag jeweils auslesen. An jedem Termineintrag ist eine Datei angehängt, an die müsste ich auch kommen.

Wie ich einen Eintrag in Outlook erzeugen kann weiss ich, aber wie kann ich ihn wieder auslesen?

Domo Sokrat 5. Aug 2004 12:14

Re: Termineintrag aus Outlook auslesen
 
Hallo Susanne,

ich bin mir nicht sicher, ob ich Dir bei den Sachen mit dem Anhang weiterhelfen kann, aber generell ist das Auslesen von FolderItems unter Outlook immer die gleichen Strickart. Ich hab' das Beispiel aus dem Swiss Delphi Center zum Thema "Outlook Kontakte auslesen" mal ein wenig umgestrickt. Ich hab's nicht testen können, da ich hier kein Outlook habe. Das mit dem Datum ist nur 'ne Vermutung, müsste aber stimmen:

Delphi-Quellcode:
uses ComObj;

procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderCalendar = $00000009;
var
  outlook, NameSpace, Termine, Termin: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');

  Termine := NameSpace.GetDefaultFolder(olFolderCalendar);
  for i := 1 to Termine.Items.Count do
  begin
    Termin := Termine.Items.Item(i);
    // Titel des Termins und Startdatum mit Zeit auslesen:
    ShowMessage(Termin.Subject + '<Begin: ' + DateTimeToStr (Termin.Start) + ' >');
  end;

  Outlook := UnAssigned;
end;

{ gefundene Item-Properties:
   Subject                   (alphanumerisch)
   Body                      (alphanumerisch)
   Start                     (Datum/Uhrzeit)
   Duration                  (numerisch)
   End                       (Datum/Uhrzeit)
   Location                  (alphanumerisch)
   ReminderMinutesBeforeStart (Integer)
   ReminderSet               (boole'sch)
   Categories                (alphanumerisch)
   BusyStatus                (numerisch)
        (olFree       = frei),
         olTentative  = unter Vorbehalt),
         olBusy       = gebucht),
         olOutOfOffice = abwesend))
   Categories                (alphanumerisch)
   CreationTime              (alphanumerisch)
   ReminderPlaySound         (boole'sch)
}
Ich hoffe, das hilft Dir ein wenig weiter, auch wenn ich's nicht testen konnte...

Susanne 5. Aug 2004 14:04

Re: Termineintrag aus Outlook auslesen
 
es hat geholfen, auf dem richtigen Weg war ich dann doch schon so langsam. Ich hab da noch etwa gefunden wie 'Filter setzen'

TerminItem:= Termine.Items.Restrict('[START] = ''05.08.2004''');

Aber irgendwie bekomme ich dann nur noch null ergebnisse und wenn ich das bisherige lasse, dann zeigt er mir jeden Eintrag an, auch die vom nächsten tag und ich möchte nur die vom heutigen Tag.

Domo Sokrat 5. Aug 2004 14:40

Re: Termineintrag aus Outlook auslesen
 
Also: In VB machen die das wie folgt (hab's mal nach Object Pascal umgesetzt - ähnelt Deinem Ansatz):

Delphi-Quellcode:
// benötigte zusätzliche Variable (Resultset für die
// Filterung
Var GefilterteTermine: OleVariant;

   // Filter setzen: ergibt [Start] = '05.08.2004'
   // (Suchstring haben die in einfache Hochkommas
   // gesetzt...)
   sFilter := '[Start] = ''05.08.2004''';

   // und dann die Filterfunktion auf das zu filternde
   // Termin-Resultset anwenden (hast Du ja entsprechend
   // umgesetzt - müsste laufen)
   GefilterteTermine := Termine.Items.Restrict(sFilter);

   // Anschließend müssten in GefilterteTermine die
   // gewünschten Dates drin stehen:
   Termin := GefilterteTermine.Items.Item(i);
Mit dem Datumsformat bin ich mir nicht so ganz sicher. Lass Dir doch zum Test mal einen Propertywert von "Start" anzeigen, um zu sehen, wie das Datum angegeben werden muss. Auf jeden Fall aber würd' ich den Filterwert mal in einfach Hochkommas setzen.

Wie schon vorher: Konnte leider nichts Testen. Ich verlass mich da mal blind auf die VB-Cracks ... :stupid:

Susanne 5. Aug 2004 15:17

Re: Termineintrag aus Outlook auslesen
 
nee, funktioniert nicht, an folgender Stelle bekomme ich dann eine Fehlermeldung, dass das Automatisierungsobject die Funktion Items nciht unterstützt.

Zitat:

Termin := GefilterteTermine.Items.Item(i);

Domo Sokrat 6. Aug 2004 08:19

Re: Termineintrag aus Outlook auslesen
 
Guten Morgen!

Ich hab's mir nochmal angesehen. Vielleicht ist hier das "Items" zu viel und es müsste statt

Delphi-Quellcode:
Termin := GefilterteTermine.Items.Item(i);
so heißen:

Delphi-Quellcode:
Termin := GefilterteTermine.Item(i);
weil das Ergebnis von "Restrict()" ein Items-Objekt zurückgibt ??? *mutmaß* GefilterteTermine ist ja ein OLEVariant und man bekommt nicht direkt mit, welcher Objekttyp "drinsteckt".

Probier's bitte mal aus. Ansonsten muss ich mir wirklich mal ein System mit Outlook vornehmen und die Sache mal ausprobieren (kann aber etwas dauern). Das Ganze Interessiert mich jetzt nämlich selber und ich hasse Trockenschwimmen!

Susanne 6. Aug 2004 09:56

Re: Termineintrag aus Outlook auslesen
 
stimmt, das items war zu viel!

jetzt versuche ich immernoch, an den blöden Anhang des Termins zu kommen. ich habe jetzt einfach nur mal versucht, herauszubekommen, wieviel Anhänge er denn findet:
Am Ende möchte ich dann den Pfad mit Dateinamen haben, ich hatte es auch schon versucht mit SaveToFile, aber da sagte er dann, dass die MEthode nicht unterstützt wird.

Code:
for i := 1 to gefilterteTermine.Count do
            begin
               Termin := GefilterteTermine.Item(i);
               //Titel des Termins und Startdatum mit Zeit auslesen:
               ShowMessage(Termin.Subject + ' '+ DateToStr(Termin.Start) );
               //Anhang extrahieren oder den Pfad + Datei
               x := Termin.Attachments;
            end;
Fehlermeldung: eVariantTypeCastError: Variante des Typs Dispatch konnte nicht in Typ Integer konvertiert werden.

Was muss ich denn nun machen?

Domo Sokrat 6. Aug 2004 11:00

Re: Termineintrag aus Outlook auslesen
 
Hallo mal wieder...

Du müsstest eigentlich für ein Attachment-Objekt wieder eine Variable vom Typ OLEVariant deklarieren und dann, so wie Du schon richtig vermutet hast, diesem das gewünschte Attachment zuweisen. Das würde dan so aussehen (Portiert aus VB):

Delphi-Quellcode:
Var Anhang: OLEVariant;
Der Zugriff auf das erste Attachment über die Angabe eines Index(!) -> gibt bestimmt Probleme, wenn der Termin keine Attachments hat, also vielleicht vorher über Termin.Attachments.Count erst die Anzahl prüfen...

Delphi-Quellcode:
Anhang := Termin.Attachments(1);
Jetzt müssten in Anhang die Daten des ersten Attachments stehen und Du müsstest so auf den FileName zugreifen können. Einen Pfadnamen gibt's hier denke ich nicht.

Delphi-Quellcode:
sFileName := Anhang.FileName;
Speichern kannst Du den Anhang (z. B. in "C:\Temp") wie folgt:

Delphi-Quellcode:
sFileName := 'C:\Temp\' + sFileName;
Anhang.SaveAsFile (sFileName);
Ich hab' noch eine wunderbare Modelldoku (von MS) gefunden:
Microsoft Outlook Objects

Hier noch ein Link (ist zwar alles VB/VBA aber die Umsetzung dürfte nicht sooo schwer sein :zwinker: ):
Outlook 2000 VBA Programmers Reference

Auf dieser Seite kannst Du auch 'mal stöbern:
www.outlookcode.com

Ich hoffe, das Alles hilft Dir weiter ...

Susanne 6. Aug 2004 11:40

Re: Termineintrag aus Outlook auslesen
 
Zitat:

Anhang := Termin.Attachments(1);
hier bekomme ich schon EoleSysError

Domo Sokrat 6. Aug 2004 12:06

Re: Termineintrag aus Outlook auslesen
 
Hi!

Probier das mal:

Delphi-Quellcode:
Anhang := Termin.Attachments.Item(1);
Wenn's klappt bin ich zufrieden :-D . Ansonsten muss ich hier meine Waffen strecken. Sorry. :(

Susanne 6. Aug 2004 12:14

Re: Termineintrag aus Outlook auslesen
 
vielen vielen Dank!!! Es klappt!!! Lass dich knutschen! :dancer:

Domo Sokrat 6. Aug 2004 12:37

Re: Termineintrag aus Outlook auslesen
 
:mrgreen:

Susanne 6. Aug 2004 14:16

Re: Termineintrag aus Outlook auslesen
 
langsam werde ich dann doch noch wahnsinnig, mein Filter will nicht mehr! Ich habe in Outlook gestern einen Termin und für heute drei Termine drin. Er findet alle vier, aber wenn der Filter drauf war, hat er null. Ich weiss nicht was ich getan habe, es funktionierte schon so wunderbar.

Code:
function TfrmWiedervorlage.TerminAbfragen(datum:String):Boolean;
   var
      i                 : Integer;
      Termine, Termin   : OleVariant;
      oItems, x         : OleVariant;
      GefilterteTermine : OleVariant;
      sFilter, sFileName : String;
   begin
      try
         Outlook:= CreateOleObject('Outlook.Application');
         NmSpace:= Outlook.GetNamespace('MAPI');
         NmSpace.Logon(EmptyParam, EmptyParam, False, True);
         Termine:= NmSpace.GetDefaultFolder(olFolderCalendar);
         oItems := Termine.Items;
         //Filter setzen: heutige Datum
         GefilterteTermine := oItems.Restrict(sFilter);
         i:= oItems.count   //hier hat er die vier Termine drin
         i:= GefilterteTermine.count; //hier sind es dann nur noch 0 ????
         for i := 1 to gefilterteTermine.Count do
            begin
               Termin := GefilterteTermine.Item(i);
               ShowMessage(Termin.Subject + ' '+ DateToStr(Termin.Start) );
               x:= Termin.Attachments.Item(1);
               sFileName:= x.FileName;
               sFileName:= 'C:\'+sFileName;
               x.SaveAsFile(sFileName);
               DateiAuslesen(sFileName);
               //Datei am Ende loeschen
               DeleteFile(pChar(sFileName));
            end;
         Result:= True;
      except
         ShowMessage('Fehler in Funktion TerminAbfragen');
         Result:= false;
      end;
      NmSpace.Logoff;
      Termin:=Unassigned;
      x:=Unassigned;
      GefilterteTermine:= Unassigned;
      Termine:= Unassigned;
      Outlook:= Unassigned;
   end;
an der Zeile: GefilterteTermine := oItems.Restrict(sFilter);
scheint es zu scheitern, denn wenn ich statt datum Subject abfrage geht er auch in die Schleife rein.

Domo Sokrat 8. Aug 2004 14:58

Re: Termineintrag aus Outlook auslesen
 
Hi Susanne!

Wo wird denn "sFilter" gesetzt? Wenn Dein Filter String nicht initialisiert/belegt wird, dann geht's glaube ich in die Hose, weil nichts gescheites drin steht...

Susanne 8. Aug 2004 17:56

Re: Termineintrag aus Outlook auslesen
 
Delphi-Quellcode:
sFilter := '[Start] ='''+ DateToStr(Date) +'''';
so habe ich den Filter gesetzt, ist irgendwie nicht mitgekommen


Delphi-Quellcode:
sFilter := '[Subject] ='''+ 'Sport' +'''';
damit z.B. zeigt er mir den Termin an, was ist also bei der anderen Zeile falsch?

Domo Sokrat 9. Aug 2004 07:08

Re: Termineintrag aus Outlook auslesen
 
Guten Morgen,

ein Stückchen weiter oben hatte ich kurz erwähnt, dass ich mir wegen des Datumsformats für "Start" im Filter-String nicht sicher bin. Es könnte sein, dass das Dein Problem ist. Lass' Dir doch einfach mal den Property-Wert von "Start" ausgeben und sieh mal nach, wie das Datum formatiert ist. Etwas anderes fällt mir momentan nicht ein. Viel Glück!

Susanne 9. Aug 2004 10:53

Re: Termineintrag aus Outlook auslesen
 
ich verstehe es einfach nicht. Es hat den ganzen morgen über geklappt (mal wieder) und jetzt wieder nicht mehr richtig. Das mit dem Datum ist richtig. Also: Montags 3 TErmine Dienstag einer

Code:
sFilter := '[START] ='''+ dateToStr(date) +'''';
damit ist im Moment das Ergebnis 1, er zeigt mir den ersten Eintrag für Montag an, es sind aber nun mal drei und er müsste mir alle drei anzeigen, wie er es ja bisher gemacht hat.

Code:
sFilter := '[START] >='''+ dateToStr(date) +'''';
damit ist das Ergebnis 4, er zeigt mir zuerst den Dienstag an (warum eigentlich?) und anschliessend alle drei am Montag.

Ich versteh es einfach nicht! IRgendwer irgendeine Idee, was hier passiert? Da hat meine Logik irgendwo einen Knick.

trifid 10. Aug 2004 23:23

Re: Termineintrag aus Outlook auslesen
 
zu deinem Zeitproblem,
vielleicht braucht [Start] kein Datum sondern ein DatumZeit
[Start] >= 1.1.2004 08:00:00 [Start] <= 1.1.2004 23:59:59
nicht getestet nur ne Vermutung

Nachdem ich das Beispiel bei mir zum Laufen gebracht habe, stellte ich fest, dass
zwar die Termine kommen, aber keine eingeplanten Daueraufträge als Termin mit angezeigt werden.
(z.B. zeige Tag um 10:15 Uhr eine Meldung an)

Danach habe ich die Zeile
Delphi-Quellcode:
Termine := NameSpace.GetDefaultFolder(olFolderCalendar); // olFolderCalendar = 9
auf
Delphi-Quellcode:
Termine := NameSpace.GetDefaultFolder(olFolderTasks ); // olFolderTasks = 13
abgeändert.
nun bekomme ich zwar die Aufgaben, aber die Zeitinformation kann nicht ermittelt werden.
Gibt es eine andere Möglichkeit die Termine und Aufgaben eines Tages gemeinsam aufzulisten?

Tyler 19. Nov 2004 12:50

Re: Termineintrag aus Outlook auslesen
 
Hallo!

Soweit ist ja alles ganz gut beschrieben, nur leider liefert die o.g. Filterklausel

[Start] = "05.08.2004"

keinerlei Ergebnisse. Das gleiche Problem hatte Susanne ja AFAIK auch. Ich habs auch mit einfachen doppelten Gänsefüsschne probiert

[Start] = ''05.08.2004''

hilft genauso wenig... keinerlei Ergebnisse. So klappt das Auslesen wunderbar, nur sind das halt ein paar Termine auf einmal :)

Jemand einen Vorschlag?

tyler

guenter.hanke 22. Sep 2005 14:40

Re: Termineintrag aus Outlook auslesen
 
Hallo Domo Sokrat,
Danke für das Programm, es funktioniert bei mir gut.
Leider aber bekomme ich nur meine eigenen Termine zu gesicht.
Wie kann ich auch die fremden Termine vom Exchange Server holen?
Die Kollegin hatte mir sogar extra schreibrechte auf Ihren Kalender gegeben, ich seh trotzdem nur meine Termine.
Hast du oder jemand anders eine Lösung?
Gruß
GÜnter Hanke

Mikro 10. Jul 2007 20:42

Re: Termineintrag aus Outlook auslesen
 
Hi,

ich bin beim stöbern auf diesen Thread gekommen und habe das gleich mal ausprobiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderCalendar = $00000009;
var
  outlook, NameSpace, Termine, Termin: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');

  Termine := NameSpace.GetDefaultFolder(olFolderCalendar);
  for i := 1 to Termine.Items.Count do
  begin
    Termin := Termine.Items.Item(i);
    // Titel des Termins und Startdatum mit Zeit auslesen:
    memo1.lines.add(DateTimeToStr (Termin.Start) + ' bis ' + DateTimeToStr (Termin.End)+ ': ' + Termin.Subject + ', ' + Termin.Location + ', ' + Termin.Body );
  end;

  Outlook := UnAssigned;
end;
Jetzt werden in meinem Memo schön die Termine mit Beschreibung etc angeziegt. Ist ne super Sache, allerdings verstehe ich einige Passagen des Quellcodes nicht. Ich will den ja nicht nur einfach kopieren, sondern auch verstehen. Wäre jmd bereit mir das zu erleutern?
Zum Beispiel stellt sich mir die Frage, warum brauche ich eine Constante und was macht die? Dann verstehe ich die nächsten Zeilen, aber schon die Zeile
Delphi-Quellcode:
NameSpace := outlook.GetNameSpace('MAPI');
hab ich wieder Probleme. Der Rest ist wieder relativ klar, allerdings verstehe ich nicht, warum ich einfach Termin.X schreiben kann um irgendwas x-beliebiges auslesen kann. Termin ist doch eindeutig zugewiesen, warum hat das noch die ganzen Unterpunkte??

Hoffe, mir kann jmd helfen, und sorry für die vll blöden Fragen...

bye

MrChey 19. Okt 2016 13:25

AW: Re: Termineintrag aus Outlook auslesen
 
Zitat:

Zitat von Mikro (Beitrag 649033)
Hi,

ich bin beim stöbern auf diesen Thread gekommen und habe das gleich mal ausprobiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  olFolderCalendar = $00000009;
var
  outlook, NameSpace, Termine, Termin: OleVariant;
  i: Integer;
begin
  outlook := CreateOleObject('Outlook.Application');
  NameSpace := outlook.GetNameSpace('MAPI');

  Termine := NameSpace.GetDefaultFolder(olFolderCalendar);
  for i := 1 to Termine.Items.Count do
  begin
    Termin := Termine.Items.Item(i);
    // Titel des Termins und Startdatum mit Zeit auslesen:
    memo1.lines.add(DateTimeToStr (Termin.Start) + ' bis ' + DateTimeToStr (Termin.End)+ ': ' + Termin.Subject + ', ' + Termin.Location + ', ' + Termin.Body );
  end;

  Outlook := UnAssigned;
end;

Hallo @all,
ich habe diesen Code auch mal ausprobiert. Funktioniert super. Wie aber kann ich auf einen anderen (fremden) freigegebenen Kalender zugreifen und Termine exportieren. :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz