Job-Kalender Termine mit externen Kalendern synchronisieren

Aus GEVITAS
Zur Navigation springen Zur Suche springen

Allgemeines

Hier wird beschrieben, wie man Termine aus dem JobKalender mit einem externen System synchronisieren kann.

Dabei wird davon ausgegangen, dass der JobKalender das führende System ist. Das bedeutet:

  • Für einen Termin gibt es drei Synchronisations-Momente:
    • Termin wurde angelegt
    • Termin wurde geändert. Das kann der Zeitraum, die Ressource/Person, der Text usw. sein.
    • Termin wurde gelöscht
  • Auftrags-Termine werden ausschließlich im JobKalender angelegt, geändert oder gelöscht.

Basis der Beschreibung ist das Zusatz-Modul GooCal, das Termine aus dem JobKalender mit Google©-Kalendern synchronisiert.


Ablauf einer Synchronisation

Termin-Daten aus dem JobKalender (MAufJob) einlesen

Dazu kann dieser SQL-Script verwendet werden:

select MAufJob.LFDNR, MAufJob.AUFTRNR, MAufJob.DATUM, MAufJob.DATUMBIS, MAufJob.UHRZEITVON, MAufJob.UHRZEITBIS, MAufJob.PERSONEN,
MAufJob.text, MAufJob.ORT, MAufJob.ERFDAT, MAufJob.ERFUSER,
MAufJob.BETREFF,MAufJob.ADRKURZNAME, MAufJob.AENDDAT, MAufJob.AENDUSER,
MAufJob.TERMINART, MAufJob.ID_STRING, MAufJob.TERMSTATUS, MAufJob.TERMIN_GANZTAEGIG, MAufJob.Changed, MAufJob.TerminTyp,
MAufJob.Anzahl, MAufJob.OBERGRUPPE, MAufJob.GRUPPE, MAufJob.UNTGRUPPE, MAufJob.ARTNR, MAufJob.MENGENTERMIN,
MAufJob.ZU_MAUFJOB_LFDNR, MAufJob.BeauftragungsArt, MAufJob.JobCalChanged, MAufJob.BemerkungIntern, MAufJob.BemerkungExtern,
MAufJob.VeranstOrt, MAufJob.VeranstRaum, MAufJob.CLOUD_EVENT_ID,
MAUFKO.VERANSTNAME, MAUFKO.BEARBEITER,
Pers.PERSNR, Pers.KURZZEICHEN, Pers.VORNAME, Pers.NACHNAME, Pers.SPRACHE, Pers.SyncStatus, Pers.SyncAddress
from MAufJob MAufJob
left outer join pers Pers on Pers.KURZZEICHEN=MAufJob.PERSONEN
left outer join maufko MAUFKO on MAUFKO.AUFTRNR=MAufJob.AUFTRNR

-- Nur TerminTyp 3=Arbeitszeit-Termine:
where MAufJob.TerminTyp=3

-- Nur Personen/Ressourcen mit Kennzeichen > 0: 1=Google 2=Outlook/Exchange
-- Das wird in den Personen-Stammdaten in REFLEX so festgelegt.
and ( Pers.SyncStatus = 1 or Pers.KURZZEICHEN is null )

-- Nur wenn in den Personen-Stammdaten eine Synch-Adresse steht:
and Pers.SyncAddress > 
  
-- Auch überlappende Termine (wie in der Dispo):
and ( (MAufJob.DATUM <= 'DatumVon'
       AND
	(MAufJob.DATUMBIS >= 'DatumVon'
    )

-- Nur Termine mit diesem Status:
-- 1=Zugesagt, Bestätigt 4=Angefragt 6=Bestellung (Überhang)
and ( MAufJob.TERMSTATUS=1 or MAufJob.TERMSTATUS=4 or MAufJob.TERMSTATUS=6)
order by MAufJob.DATUM

Google-Kalender-Einträge einlesen

// Daten aus dem Google-Kalender: DM.GetCalendarItemsClientDateSet( Date {dDatumVon}, speditAnzahlTage.Value {iAnzahlTage} , iErrorCode , sErrorMessage ); if iErrorCode > 0 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* Error on DM.GetCalendarItemsClientDateSet: ' + sErrorMessage );


// --------------------------------------------------------------- // 2. Google-Einträge durchlaufen, (in DM.cdsGoogleKalenderItems) // EventID in MAufJob.CLOUD_EVENT_ID suchen. // Wenn dort nicht gespeichert: Google-Kalender-Item löschen!!! // iErrorCode = -1: Erfolgreich, sErrorMessage // iErrorCode > 0 : sErrorMessage beinhaltet Fehlertext // --------------------------------------------------------------- DM.FindCalendarItemsToDelete( chkZuLoeschendeTermineSucheInSyncTabelle.Checked, iErrorCode , sErrorMessage ); //JC//240307// chkZuLoeschendeTermineSucheInSyncTabelle.Checked if iErrorCode = -1 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + 'Delete unused items: ' + sErrorMessage ); if iErrorCode > 0 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* Error on Delete unused items: ' + sErrorMessage );


// --------------------------------------------------------------- // 3. MAufJob durchlaufen, (in DM.qryMAufJob) // Wenn kein MAufJob.CLOUD_EVENT_ID : Google-Kalender-Item einfügen!!! // iErrorCode = -1: Erfolgreich, sErrorMessage // iErrorCode > 0 : sErrorMessage beinhaltet Fehlertext // --------------------------------------------------------------- DM.FindCalendarItemsToInsert( chkSyncAdresseFest.Checked,editFesteMailAdresse.Text, iErrorCode , sErrorMessage ); if iErrorCode = -1 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + 'Inserted items: ' + sErrorMessage ); if iErrorCode > 0 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* Error on Insert new items: ' + sErrorMessage );


// --------------------------------------------------------------- // 4. MAufJob durchlaufen, (in DM.qryMAufJob) // Anhand MAufJob.CLOUD_EVENT_ID das Google-Kalender-Item einlesen, EInträge vergleichen, // wenn Unterschied (irgendwo): Item updaten! // iErrorCode = -1: Erfolgreich, sErrorMessage // iErrorCode > 0 : sErrorMessage beinhaltet Fehlertext // --------------------------------------------------------------- DM.FindCalendarItemsToUpdate( chkSyncAdresseFest.Checked,editFesteMailAdresse.Text,iErrorCode , sErrorMessage ); if iErrorCode = -1 then FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + 'Updated items: ' + sErrorMessage ); if iErrorCode > 0 then begin FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* Error on Update new items: ' + sErrorMessage );

// Kalender initialisieren: FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* Try to reconnect...' ); DM.InitCalendar( strIniFile ); //JC//220901//

FrmMainGooCalTest.memoProt.Lines.Add( FormatDateTime('dd/mm/yyyy', Date) + ' ' + FormatDateTime('hh:mm:ss:zzz', Time) + ': ' + '* 2nc try FindCalendarItemsToUpdate...' ); DM.FindCalendarItemsToUpdate( chkSyncAdresseFest.Checked,editFesteMailAdresse.Text,iErrorCode , sErrorMessage );

end;


// Daten aktualisieren: // --------------------

// Daten Aus MAufJob: DM.MakeSQL_MAufJob_Pers( DM.qryMAufJob, Date {dDatumVon}, speditAnzahlTage.Value {iAnzahlTage}, chkNurPersMitSyncStatus.Checked );

// Daten aus dem Google-Kalender: DM.GetCalendarItemsClientDateSet( Date {dDatumVon}, speditAnzahlTage.Value {iAnzahlTage}, iErrorCode, sErrorMessage );



JobKalender

Datenbank-Beschreibung zum Job-Kalender