Termin- Erinnerung (die Zweite) - Outlook Termine einlesen

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Termin- Erinnerung (die Zweite) - Outlook Termine einlesen

Beitrag von tsa » 28.11.2008, 09:31

Hallo Freunde der Spielerei!

Hat jemand von jenen, die auch ständig gegen die Langeweile ankämpfen müssen, mal wieder Lust ein bisschen zu programmieren?
Nicht dass ich mit der ersten (Bümpis) Lösung unzufrieden bin, aber meine (GUTE) Olle trägt alle Familientermine immer im Outlook ein. Da wir dort auch alle Kontakte pflegen - könnte man auch deren Geburtstagstermine dort einpflegen...

Nu habsch ma gegooggt - das Auslesen der Termindaten aus Outlook ist ja fast noch einfacher als aus DBASE (man benötigt nicht mal eine PHP-Erweiterung. So weit hab ich's bisher gebracht:

Code: Alles auswählen

<?
    $outlook = new COM("outlook.application") or die("Konnte Outlook nicht instantiieren");
    //echo "Outlook Version {$outlook->Version}, Product-Code {$outlook->ProductCode}";
    $myNameSpace = $outlook->GetNamespace("MAPI");
    $myNameSpace->Logon('Outlook'); // Standardanmeldung für die normale .pst-File
    $myFolder = $myNameSpace->GetDefaultFolder(9); //9=Kalender
    $colItems = $myFolder->Items;
  
    $colItems->Sort("Start", False);
  
    foreach($colItems as $item) 
    {
        $data['Von']         = $item->Start;
        $data['Bis']         = $item->End;
        $data['Ort']         = $item->Location;
        $data['Betreffzeile']= $item->Subject;
        $data['Privat']      = $item->Sensitivity;
        $data['body']        = $item->Body;
        $data['LastChange']  = $item->LastModificationTime;
        //...
        
        $termine .= substr ($data['Von']."         ", 0, 19) . " - " .$data['Betreffzeile'];
        if ($data['Ort'] != "") $termine .= " [".$data['Ort']."]";
        if ($item->IsRecurring) 
        {
            $pattern = $item->GetRecurrencePattern();
            if ($pattern == 1) $pattern = "wöchentlich";
            if ($pattern == 5) $pattern = "jährlich";
            //...
            $termine .= " >>> Serientyp: " . $pattern;
        }
        $termine .= "\r\n";
    }
    
    //Pfad anpassen!!!
    $fileHandle = fopen("z:\\fs20\\Temp\\OutlookTermine.txt", "w");
    $writeback = fwrite($fileHandle, $termine);
    fclose($fileHandle);
?>
1. Problem: Outlook muß gestartet sein! - Kennt da jemand Abhilfe - oder eine andere Lösung. Bisher sorge ich halt automatisch dafür, das es läuft.
2. Die Terminserien bringen immer nur das Datum des ersten Termines zurück -> hier sind ein paar Rechenkünste gefragt (Bümpi hat ja alles mit Clipper schon mal gemacht :wink:)
3. Sortieren...
4. ...

Es gibt noch jede Menge Arbeit. Ich dachte im ersten Schritt sollten Bümpis Termine erst mal nur durch die Outlook-Termine ergänzt werden...

Gruss
Thomas

PS: Das mit der Langeweile war ein JOKE - leider bekommt man von der "Besseren Hälfte" immer zu wenig Spielzeit genehmigt...
Zuletzt geändert von tsa am 09.12.2008, 09:57, insgesamt 1-mal geändert.

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Terminerinnerung - die Zweite

Beitrag von buempi » 28.11.2008, 13:47

Hallo Thomas

Ich besitze Outlook nicht. Habe es mir vor vielen Jahren mal angeschaut und sehr rasch wieder deinstalliert. Ich mag solche eierlegenden Wollmilchsäue nicht. Die damalige Version war jedenfalls viel zu unübersichtlich und schwerfällig.

Deshalb wird es wohl auch schwierig sein, da richtig mitzumachen. Trotzdem habe ich mir ein paar Gedanken gemacht:

Starten und beenden könnte man Outlook doch über ein kleines AutoIt-Script?

Ich nehme mal an, dass die PST-Datei ziemlich komplex aufgebaut ist, und man also nicht direkt etwas daraus extrahieren kann. Aber vielleicht gibt es die Möglichkeit, den Kalender z.B. in eine TXT-Datei zu exportieren; allenfalls sogar über einen Kommandozeilenparameter? Also die "OutlookTermine.txt" von Outlook selbst schreiben lassen? Ich habe ähnliches auch schon gemacht, indem ich die Ausgabe an einen Nur-Text-Drucker in eine Datei umgeleitet habe. Allerdings, man müsste das dann auch noch automatisieren können.

Weil ich eben Outlook nicht kenne, kann ich auch nicht ganz nachvollziehen, was du damit meinst, dass die Terminserien nur das Datum des ersten Termins zurückbringen. Kommen nur die Termine des aktuellen Tages. Oder kommen auch künftige Termine, aber mit falschem Datum?

Habe übrigens in der Hilfe von MS etwas herumgeschnüffelt. Es soll eine Outlook.hol geben, in welcher die Feiertage abgespeichert sind. Könnte man damit vielleicht was anfangen, zumindest was die Geburtstage betrifft?

Wie hast du dir das Vorgehen eigentlich genau vorgestellt? Die Outlook-Termine in eine TXT-Datei schreiben, diese und die DBF-Termine in ein Array einlesen, sortieren und dann anzeigen? Wäre es da nicht einfacher, gleich alle Termine mit Outlook zu verwalten? - Ganz am Anfang des anderen Threads war ja mal von Outlook die Rede...

Viele Grüsse
Bümpi

PS: Kann man in Outlook ähnlich wie in anderes Office-Programmen auch Makros schreiben...? Das könnte man dann vielleicht über die Befehlszeile starten mit z.B. OUTLOOK /mTermineSchreiben

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Terminerinnerung - die Zweite

Beitrag von tsa » 28.11.2008, 15:14

buempi hat geschrieben:Ich besitze Outlook nicht
SCHADE - ich dacht's mir schon...

Also das Starten von Outlook mache ich schon über ein kleines Script, ich habe aber auch schon andere Programme gesehen, die ihre Daten ohne Starten von Outlook abgleichen können... Das wäre schöner! Naja.

Die Idee, Outlook selbst für die Speicherung der Daten zu veranlassen, brauchen wir nicht weiter zu verfolgen, das obige Php-Script hat ja bereits vollen Zugriff! Was die .PST betrifft, die habe ich bei mir verschlüsselt abgelegt.

Zum Thema "...das die Terminserien nur das Datum des ersten Termins zurückbringen" - so sieht die Ausgabedatei des Php-Scripts momentan aus:

Code: Alles auswählen

15.08.1978          - Geburtstag von XXXXXX XXXXXXXX >>> Serientyp: jährlich
26.02.1982          - Geburtstag von XXXX XXXXXX >>> Serientyp: jährlich
30.09.2005 10:00:00 - Beratung XXX [Raum 1.2.27] >>> Serientyp: wöchentlich
...
16.02.2008 19:00:00 - Geburtstagsparty
20.02.2008 15:00:00 - Kinderarzt XXX und XXXX
26.03.2008 10:00:00 - XXXX impfen
26.04.2008          - Katja und Sebastian kommen
...
08.12.2008 17:20:00 - Massagetermin XXXXXX
09.12.2008 15:00:00 - Puppentheater Kindergarten
10.12.2008 18:30:00 - Kosmetik
11.12.2008 17:30:00 - Weihnachtsfeier XXXXXX
13.12.2008 15:00:00 - zu Familie XXXXXXXXX
18.12.2008 15:00:00 - Laienspiel (Kindergarten)
19.12.2008 10:00:00 - Weihnachtsmann kommt in den Kindergarten
19.12.2008 19:00:00 - XXXXXX Weihnachtsfeier Firma
...
Man muß also nur noch anhand des "Serientyps" das passende nächstliegende Datum ermitteln und ersetzen - danach sortieren und FERTIG.
Die Ausgabe in eine Datei mache ich nur zum Test, kann später entfallen.
tsa hat geschrieben:Wie hast du dir das Vorgehen eigentlich genau vorgestellt? Die Outlook-Termine in eine TXT-Datei schreiben, diese und die DBF-Termine in ein Array einlesen, sortieren und dann anzeigen?
Genau so. Einfacher wäre sicherlich, gleich alles mit Outlook zu machen, aber d.h. ja man muss die Daten seiner liebgewonnenen DBASE-Datenbank gleich wieder neu reinhaken. :P

Irgend etwas braucht man dann auch noch, um Termine als BESTÄTIGT zu kennzeichnen und fortan zu ignorieren - da muß ich mir halt auch noch was einfallen lassen.

Wird schon irgendwie alles werden...
Gruss
Thomas

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Terminerinnerung - die Zweite

Beitrag von buempi » 28.11.2008, 17:13

Hallo Thomas

Mit anderen Worten: Es kommen alle Termine seit Christi Geburt, die jemals eingetragen wurden - für die Vergangenheit und die Zukunft!!! - Wenigstens offenbar in chronologischer Reihenfolge und nicht in der Reihenfolge, wie sie eingetragen wurden.

Man müsste also den Abfrage-Zeitraum definieren und dann in einer Schlaufe bei jedem Termin so lange z.B. 7 Tage, 3 Monate oder 1 Jahr hinzuaddieren, bis das Datum innerhalb des Zeitraums liegt. Diesen Termin ausgeben, weiter addieren und die Schlaufe verlassen, sobald das Ende des Zeitraums überschritten ist. Bei einem langen Zeitraum und kurzen Wiederholungs-Fristen kann so ein Termin auch mehrmals erscheinen, was sich allerdings unterdrücken liesse.

Im PHP-Maual habe ich dazu folgende Funktionen gefunden:

Code: Alles auswählen

$morgen        = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$letztermonat  = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$naechstesjahr = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);
Das könnte aber bei vielen Wiederholungs-Terminen recht zeitintensiv werden, sodass man es wohl besser nicht in einem PHP-Script eines Homeputer-Makros macht. Wenn man eh schon externe Programme starten muss, macht man es - wie auch Sanys schon mehrfach betont hat - wohl besser über die PHP.exe.

Das mit dem BESTÄTIGEN der Termine lässt sich so leider nicht lösen. Ich habe es deshalb in meinem Clipper-Programm so gemacht, dass das Termin-Datum eben das nächste Fälligkeits-Datum ist und nicht das Datum, unter welchem der Termin urspünglich mal eingetragen wurde. Beim Bestätigen wird das Datum durch die nächste Fälligkeit überschrieben. Deshalb ist der Geburtstag vom 15.08.78 bei mir eben nicht mehr unter dem Geburtstag, sondern unter dem Tag der nächsten Fälligkeit, also dem 15.08.09 eingetragen.


Mit PHP direkt Outlook-Dateien - ähnlich wie dBase-Dateien - lesen und bearbeiten zu können, scheint nicht möglich zu sein. Deshalb bleibt wohl auch nichts anderes übrig, als Outlook zu starten.

Ich würde das Ganze etwa so konzipieren:

- Homeputer startet eine AutoIt-EXE mit Parametern für den Zeitraum und wartet 5 Sekunden

- Diese EXE macht folgendes:

-- Outlook starten

-- PHP.exe mit einem Script starten, welches folgendes macht:

--- Outlook-Termine einlesen, mit MKTIME() updaten und in eine Datei schreiben
--- DBF-Termine einlesen und in eine Datei schreiben
--- Beide Dateien einlesen, in einer Array sortieren und in eine weitere Datei schreiben

-- Outlook beenden

- Homeputer führt nach 5 Sek. ein PHP-Script aus, welches die Datei ins Anzeige-Objekt schreibt

Ein komplizierter Weg, aber ausser dem BESTÄTIGEN wären damit alle deine Vorgaben erfüllt.

Das mit dem Vereinigen mit der liebgewonnenen dBase-Datenbank: Hast du dir das mit der Outlook.hol mal angeschaut: http://office.microsoft.com/de-de/outlo ... 2499821031

Wenn du hauptsächlich Geburtstage dort drin hast, wäre es eine Kleinigkeit, in PHP oder Clipper eine Datei zu erstellen, die den verlangten Aufbau hat. Allerdings: BESTÄTIGEN könntest du diese Termine dann auch nicht mehr. Aber das reinhaken würde entfallen.

Nun, das Wochenende steht vor der Tür; also viel Spielzeit zur Verfügung :P

Viele Grüsse
Bümpi

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Terminerinnerung - die Zweite

Beitrag von buempi » 01.12.2008, 16:05

Hallo Thomas

Hab noch etwas weiter darüber nachgedacht. Falls man in Outlook Makros schreiben kann, könnte man doch ein "AutoExit"-Makro schreiben, welches immer beim Beenden von Outlook den Kalender in die Datei "OutlookTermine.txt" exportiert. Dann würde das Ganze funktionieren, ohne Outlook starten zu müssen...

Viele Grüsse
Bümpi

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Terminerinnerung - die Zweite

Beitrag von tsa » 03.12.2008, 10:36

Hi Bümpi,

Deine Idee ist gut. Beim Export in eine Textdatei werden innerhalb eines gewissen Zeitraumes die Terminserien sogar auf Einzeltermine mit gültigem Datum aufgelöst.

Auch Makros schreiben geht im Outlook. Ich habe mal ein wenig in der Hilfe geblättert, es gibt da Ergeignisse, mit denen man das Beenden des Programmes mitbekommt. Leider gibt es keine Möglichkeit, Makros aufzuzeichnen - denn da könnte man gewaltig Arbeit (und Einarbeitung in das doofe Visual Basic) sparen...

Aber es gibt da auch Nachteile: man spart sich zwar den Start von Outlook ein - aber man müsste ein Beenden erzwingen, falls es noch läuft. Das ist nicht viel besser. Ausserdem müssen dann die Makros für jeden Nutzer-Account separat eingerichtet werden (sprich zusätzliche Handgriffe für die Computer-Administration im Falle eines Ausfalles etc.). Und ich müsste mich EINARBEITEN!

Insgesamt neige ich nun doch dazu, alles in PHP zu erledigen. In der VB-Hilfe von Outlook habe ich noch einige MAPI-Möglichkeiten entdeckt, die sich eigentlich auch in PHP umsetzen lassen müssten. Da kann ich mir vielleicht sogar die Rechnerei sparen.

Mal schauen, was draus wird. Ein bisschen dauert's allerdings noch.

Gruss
Thomas

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Hier die Lösung: Outlook Termine einlesen

Beitrag von tsa » 09.12.2008, 11:29

Hier nun endlich eine funktionierende Lösung - läuft seit 5 Tagen zu meiner vollsten Zufriedenheit. :)

Damit Umsteiger nicht allzu viel "tauschen" müssen, hab ich mich weitestgehend an Bümpis Lösung angelehnt...

1.) Was nicht mehr benötigt wird, ist der "Knopf" TermineVerwalten das macht man jetzt komplett über Outlook. Also rausschmeissen!

2.) Der "Knopf" TermineBestaetigen ändert sich wie folgt:
- Es ist eine Variable QuittierDatum vom Typ Zahl anzulegen, Startwert 0!
- Im Makro steht dann folgendes:

Code: Alles auswählen

<?
  if ($V_TermineBestaetigen_QuittierDatum == date("Ymd"))
    $V_TermineBestaetigen_QuittierDatum = date("Ymd", time() + 3600*24);
  else
    $V_TermineBestaetigen_QuittierDatum = date("Ymd");
?>
SICHERN("TermineBestaetigen.QuittierDatum")
Makro starten TermineAbrufen
3.) Der "Knopf" TermineAbrufen (Ausführungsintervall bei Tageswechsel) bekommt folgenden Inhalt:

Code: Alles auswählen

Termine := "<<<<                               W A R T E N . . ."
LADEN("TermineBestaetigen.QuittierDatum")
**das Laden kann man eventuell auch im Makro *Init machen
WARTE ("00:00:00")
<?
  //echo date("d.m.Y H:i:s") . " -> " . $V_TermineBestaetigen_QuittierDatum;
  $Termine = "";
  $TermineAnsagen = "Heute keine Termine";
  include("Z:\\fs20\\php\\Termine.php"); //Pfad anpassen?
  if ($Termine == "") $Termine = " ";
  if ($TermineAnsagen == "") $TermineAnsagen = " ";
?>
WARTE ("00:00:00")

WENN Termine = " "
DANN
  unsichtbar(Termine)
SONST
  sichtbar(Termine)
ENDEWENN

**Fehlermeldungen werden angezeigt und in die Datei PHPFehler.txt geschrieben
WENN scriptoutput<>""
DANN
  scriptoutput := Zeit + " " + scriptoutput
  Schreibedatei("Z:\fs20\Log\PHPFehler.log", scriptoutput) **Pfad anpassen?
  Termine := Termine + "<<" + scriptoutput
ENDEWENN
ACHTUNG: Pfadangaben "Z:\fs20..." müssen bei Bedarf geändert werden!

4.) Die beiden Objekte Termine und TermineAnsagen - beide vom Typ Text - bleiben bestehen (bzw. werden neu angelegt, falls noch nicht vorhanden)
Termine ist zur Anzeige auf dem Bildschirm gedacht, TermineAnsagen kann je nach Belieben der Sprachausgabe zugeführt werden. (wie von Bümpi beschrieben)

5.) Das wichtigste kommt hier: die Include Datei "Termine.php", welche in den Pfad zu kopieren ist, der unter Punkt 3.) in der include-Anweisung verwendet wurde:
Termine.zip
Termine.php
(1.95 KiB) 138-mal heruntergeladen
6.) Die beiden Knöpfe (Punkt 2 und 3) sowie das Zeichen-Objekt Termine (Punkt 4) werden in der Visualisierung untergebracht.

Erläuterungen:
A) Outlook muß zum Zeitpunkt des Abrufens (oder Bestätigens) nicht zwingend gestartet sein. (Es wird dann selbständig für den Zeitraum des Auslesens der COM-Server vom Outlook kurz angestartet). Allerdings kann bei ungünstiger Konfiguration vom Outlook das Abrufen dann etwas dauern...
Schnell geht es IMMER, wenn Outlook bereits läuft.

B) Der Knopf "Bestätigen" schmeisst (im Unterschied zu Bümpis Lösung) beim ersten Drücken nur die bereits verpassten Termine aus der Ansicht. Beim zweiten Drücken werden dann auch die Termine des laufenden Tages entfernt. Durch erneuten Druck kann man sich die Termine des laufenden Tages aber wieder anzeigen lassen. :wink:

B) In der Datei Termine.php lassen sich einige Einstellungen treffen:
$Vorschau_AnzahlTage = 30 - hier wird die Anzahl der Tage für den "Termin-Ausblick" parametriert.
$Vorschau_WoechentlicheTermine_AnzahlTage = 3 - bei wöchentlichen Terminen reicht in der Regel ein "Erscheinen" des Termins erst drei Tage vorher.
Tägliche Termine werden nur am fälligen Tag angezeigt!

Aussprache_des_Alters_fuer_Microsoft_anpassen = false - Wenn man die Sprachausgabe über die Microsoft-Stimmen macht, sollte man hier true eintragen, mit Voice Reader reicht ein false.

C) Für Geburtstage wird automatisch das zugehörige Alter errechnet und ausgegeben. Wenn man das richtige Geburtsjahr nicht kennt, kann im Outlook im Feld Kategorie des TERMINES der Wert "Geburtsjahr unbekannt" eingetragen werden. Dadurch wird die Berechnung des Alters unterdrückt...

Das soll ein Anfang sein und funktioniert mit einer deutschen Outlook-Version und deutschen Ländereinstellungen (Datumsformat).
Lässt sich aber auch schmerzfrei an andere Konfigurationen anpassen - der Möglichkeiten gibts viele.

Gruss
Thomas

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Termin- Erinnerung (die Zweite) - Outlook Termine einlesen

Beitrag von tsa » 09.12.2008, 11:59

PS: hier noch der Link zum ersten Terminerinnerungs-Thread (das hier ist ja nur dessen Fortführung):
http://homematic-forum.de/forum/viewtop ... =17&t=1602

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Termin- Erinnerung (die Zweite) - Outlook Termine einlesen

Beitrag von buempi » 10.12.2008, 15:31

Hallo Thomas

Und du beklagst dich über zu wenig "Spielzeit"? Sieht toll aus. Da müsste ich mir ja fast mal Outlook zum Testen beschaffen...

Wie hast du deine Termine aus der DBF-Datei übernommen? Hattest du ein Heinzelmännchen, das sie abgetippt hat?

Viele Grüsse aus der verschneiten Schweiz
Bümpi

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Termin- Erinnerung (die Zweite) - Outlook Termine einlesen

Beitrag von tsa » 10.12.2008, 17:22

Hallo Bümpi,

hier in Sachsen schneit es auch schon den halben Tag!

Ich hab einfach die DBF mit Excel geöffnet, den Rest händisch mit Kopieren und Einfügen (92 x nur Datum) - ausserdem ein paar wenige Namen, die es im Outlook noch nicht gab. Hab 'ne Viertelstunde gebraucht, ging also noch.

Wegen der Spielzeit, die hab ich mir ungefragt einfach genommen - dafür gibt's jetzt Weihnachten Rechnerverbot!!! :x

Gruss
Thomas

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“