Logo Oracle Deutschland   Application Express Community
APEX-Kalender in Microsoft Outlook oder Mozilla Thunderbird integrieren

Die Nutzung von Kalendern in APEX-Anwendungen kommt ja recht häufig vor. Hat man eine Tabelle mit den entsprechenden Informationen und vor allem einer DATE-Spalte, so ist die Darstellung der Informationen als Kalender eine Sache von wenigen Minuten (Abbildung 1).

Kalender in APEX-Anwendungen

Abbildung 1: Kalender in APEX-Anwendungen

Nun lässt es sich in einem solchen Kalender schon sehr elegant navigieren, aber die meisten Anwender nutzen Programme wie Microsoft Outlook oder Mozilla Thunderbird mit dem Lightning-Plugin zur persönlichen Terminplanung - und schon ist die Anforderung da, die Daten aus dem APEX-Kalender dort anzuzeigen (Abbildung 2).

Die Daten aus dem APEX-Kalender: dargestellt in Thunderbird

Abbildung 2: Die Daten aus dem APEX-Kalender: dargestellt in Thunderbird

Wie das geht, erfahren Sie im folgenden in diesem Tipp. Und Sie werden sehen, dass es denkbar einfach ist. Ausgangsbasis für das Beispiel sei die Tabelle TIPP_KALENDER, die Sie mit dem SQL-Skript erstellen können.

drop table tipp_kalender
/

create table tipp_kalender(
  id              number(10),
  bezeichnung     varchar2(200),
  ort             varchar2(200),
  organisator     varchar2(200),
  org_email       varchar2(200),
  beschreibung    varchar2(4000),
  datum_beginn    date,
  datum_ende      date,
  constraint pk_tippkalender primary key (id)
)
/

insert into tipp_kalender values (1, 'Cloud Computing mit APEX', 'Düsseldorf', 'Max Mustermann', 'max.mustermann@firma.de', 'Eine Beschreibung', to_date('20110503','YYYYMMDD'), to_date('20110503','YYYYMMDD'));
insert into tipp_kalender values (2, 'Cloud Computing mit APEX', 'Hamburg', 'Max Mustermann', 'max.mustermann@firma.de', 'Eine Beschreibung', to_date('20110510','YYYYMMDD'), to_date('20110510','YYYYMMDD'));
insert into tipp_kalender values (3, 'Cloud Computing mit APEX', 'München', 'Max Mustermann', 'max.mustermann@firma.de', 'Eine Beschreibung', to_date('20110518','YYYYMMDD'), to_date('20110518','YYYYMMDD'));
insert into tipp_kalender values (4, 'DOAG SIG Development', 'Kassel', 'DOAG', 'max.mustermann@firma.de', 'DOAG Veranstaltung', to_date('20110609','YYYYMMDD'), to_date('20110609','YYYYMMDD'));
insert into tipp_kalender values (5, 'DOAG SIG Database', 'Hannover', 'DOAG', 'max.mustermann@firma.de', 'DOAG Veranstaltung', to_date('20110519','YYYYMMDD'), to_date('20110519','YYYYMMDD'));
insert into tipp_kalender values (6, 'DOAG Konferenz 2011', 'Nürnberg', 'DOAG', 'max.mustermann@firma.de', 'DOAG Veranstaltung', to_date('20111115','YYYYMMDD'), to_date('20111117','YYYYMMDD'));

commit
/

Es gibt mehrere Protokolle zum Austausch von Kalenderinformationen; für unsere Zwecke ist das iCalendar (ICS)-Format am besten geeignet: Es ist sehr einfach und die gängigen Programme wie Microsoft Outlook oder Mozilla Thunderbird verstehen es. Ein Ereignis im iCalendar-Format kann so aussehen (Quelle: Wikipedia - http://de.wikipedia.org/wiki/ICalendar).

BEGIN:VCALENDAR
VERSION:2.0
PRODID:http://www.example.com/calendarapplication/
METHOD:PUBLISH
BEGIN:VEVENT
UID:461092315540@example.com
ORGANIZER;CN="Alice Balder, Example Inc.":MAILTO:alice@example.com
SUMMARY:Eine Kurzinfo
DESCRIPTION:Beschreibung des Termines
CLASS:PUBLIC
DTSTART:20060910T220000Z
DTEND:20060919T215900Z
DTSTAMP:20060812T125900Z
END:VEVENT
END:VCALENDAR

Der Bereich VEVENT kann mehrfach vorkommen - man sieht sofort, dass sich dieses Format extrem leicht aus einer Tabelle generieren lässt. Dazu wird nichts weiter als eine PL/SQL-Prozedur benötigt.

create or replace procedure tippical is
begin
  /*
   * Schritt 1: HTTP-Headerinformationen setzen 
   */
  owa_util.mime_header('text/calendar', false);
  htp.p('Content-Disposition: inline; filename=apexcommunity-events.ics');
  owa_util.http_header_close;
  
  /*
   * Schritt 2: iCalendar-Format - Kopfdaten
   */
  htp.p('BEGIN:VCALENDAR');
  htp.p('VERSION:2.0');
  htp.p('PRODID:http://www.oracle.com/webfolder/global/de/community/tipps/kalender-integrieren/index.html');
  htp.p('METHOD:PUBLISH');
  
  /*
   * Schritt 3: Ereignisdaten per PL/SQL Schleife
   */
  for i in ( select * from tipp_kalender ) loop
    htp.p('BEGIN:VEVENT');
    htp.p('UID:EVENT_'||i.id||'_APEXCOMMUNITY@meinefirma.de');
    htp.p('ORGANIZER;CN='||i.organisator||':MAILTO:'||i.org_email);
    htp.p('SUMMARY:'||i.bezeichnung);
    htp.p('LOCATION:'||i.ort);
    htp.p('DESCRIPTION:'||replace(i.beschreibung,chr(10), '\n'));
    htp.p('CLASS:PUBLIC');
    htp.p('DTSTART:'||to_char(i.datum_beginn, 'YYYYMMDD'));
    htp.p('DTEND:'||to_char(i.datum_ende + 1, 'YYYYMMDD'));
    htp.p('DTSTAMP:'||to_char(sysdate, 'YYYYMMDD')||'T000000Z');
    htp.p('END:VEVENT');
  end loop;
  
  /*
   * Schritt 4: iCalendar-Format: Abschluß
   */
  htp.p('END:VCALENDAR');
end;
/
sho err

Vergeben Sie nun das EXECUTE-Privileg an dieser Prozedur an PUBLIC. Die Experten unter den Lesern ahnen schon, dass dies an der APEX-Session vorbeigeht - die PL/SQL-Prozedur, die dann direkt per URL aufgerufen wird, ist völlig losgelöst von einer APEX-Session. In diesem Fall, wo es um das Publizieren "öffentlicher" Informationen geht, kann das aber akzeptiert werden.

grant execute on tippical to public
/

Wenn Sie das PL/SQL Embedded Gateway verwenden, müssen Sie die direkte Verwendung der Prozedur noch freischalten. Wie das geht, ist im Tipp Einrichtung und Nutzung des PL/SQL Embedded Gateways genau beschrieben. Der folgende Code, als DBA ausgeführt, schaltet die Prozedur frei.

alter session set current_schema=APEX_040000
/

CREATE OR REPLACE function wwv_flow_epg_include_mod_local(
  procedure_name in varchar2
) return boolean
is
begin
  if upper(procedure_name) in ('{DB-Schema}.TIPPICAL') then
      return TRUE;
  else
      return FALSE;
  end if;
end wwv_flow_epg_include_mod_local;
/

Bei Verwendung des Apache Webservers brauchen Sie die Prozedur normalerweise nicht; es sei denn, in der DAD-Konfiguration ist der Parameter PlsqlRequestValidationFunction gesetzt; gehen Sie dann wie oben vor. Das gleiche gilt auch für die Verwendung des APEX Listeners.

Probieren Sie die Funktion dann ganz einfach aus, indem Sie sie mit dem Browser aufrufen. Bauen Sie die URL wie folgt zusammen: http://{host}:{port}/{dad}/{datenbankschema}.tippical - ein Beispiel könnte also sein: http://server:8080/apex/testit.tippical.

Test der PL/SQL-Prozedur und des generierten iCalendar-Formates

Abbildung 3: Test der PL/SQL-Prozedur und des generierten iCalendar-Formates

Wenn das soweit funktioniert, können Sie als nächstes den Test mit Outlook bzw. Thunderbird machen.

Das iCalendar-Format kann auch anderweitig genutzt werden. Neben dieser Nutzung zur Publizierung eines Kalenders sind natürlich andere Nutzungsvarianten denkbar. So ist es denkbar, aus einer APEX-Anwendung wird per MAIL_MAIL eine Email mit einem Anhang im iCalendar-Format generiert (APEX_MAIL.ADD_ATTACHMENT)- der Empfänger kann die Veranstaltung dann per Drag & Drop in seinen Kalender übernehmen. Alles in allem können die Anwender so wesentlich effizienter mit der APEX-Anwendung arbeiten - denn die Informationen erscheinen dort, wo die Terminplanung durchgeführt wird.

Zurück zur Community-Seite