Thunderbird/lightning

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Gödel2607
*
Beiträge: 15
Registriert: Fr, 22.06.2007 11:12
Wohnort: Mannheim

Thunderbird/lightning

Beitrag von Gödel2607 »

Hat es schon jemand versucht (und vielleicht sogar geschafft), den Kalender aus Thunderbird/lightning mittels OOO-Basic auszulesen? Wenn ja, wäre ich an dem Code sehr interessiert.

G.
Gödel2607
*
Beiträge: 15
Registriert: Fr, 22.06.2007 11:12
Wohnort: Mannheim

Re: Thunderbird/lightning

Beitrag von Gödel2607 »

Nachdem sich niemand meldet, habe ich es einfach mal selbst gemacht. Hier sind die ersten Ergebnisse, falls es jemanden interessiert:

Code: Alles auswählen

REM  *****  BASIC  *****
' Diese Routinen sollen von OOO-Basic aus auf den Lightning-Kalender zugreifen
' Vorausgesetzt wird eine Datei <light_test1.odb>, die als Datenbank bei OOO angemeldet ist
' und auf die Lightning-Datenbank storage.sdb zugreift.
' Dies habe ich mit dem Treiber <SQLite ODBC Driver> realisiert, der als Open Source unter
' http://www.ch-werner.de/sqliteodbc/sqliteodbc.exe zu erhalten ist.
' Bitte nicht wundern, wenn etwas im Code versteckt ist, was hier nicht benötigt wird. Das ganze gehört
' zu einem größeren Projekt. Ich habe auch etwas Code recycelt und noch nicht alles Unnötige heraus geworfen,
' weil ich noch nicht weiß, wie es weiter geht.
' Verwendete Software: Windows 2000 mit SP4, OOO 3.0 RC3
' Günter Urbanczyk 04.10.08

option explicit
public bDbOk as boolean

Sub Main
	testDb3("2.10.2008")
	testDb2()
	testDb()
End Sub

sub testDb
	' Findet einen Termin mit der Bezeichnung "Test"
	Dim sQuery as string, oErgSet as object
	sQuery="select title, event_start, event_end from cal_events where title = 'Test'"
	oErgSet=ExecuteSQL(sQuery)
	if not isNull(oErgSet) and oErgSet.Next then
		MsgBox oErgSet.getString(1) + chr(13) + dateFromUnix(oErgSet.getlong(2)) + chr(13) + dateFromUnix(oErgSet.getlong(3))
	end if
end sub

sub testDb2
	' Findet einen Termin am 04.10.2008
	Dim sQuery as string, oErgSet as object
	dim lBeg, lEnd as long
		
	lBeg = DateToUnix("04.10.2008")
	lEnd = DateToUnix("05.10.2008")
	sQuery="select title, event_start, event_end from cal_events where event_start >= " + lBeg + "000000 and event_start < " + lEnd +"000000" 
	'print sQuery
	oErgSet=ExecuteSQL(sQuery)
	if not isNull(oErgSet) and oErgSet.Next then
		MsgBox oErgSet.getString(1) + chr(13) + dateFromUnix(oErgSet.getlong(2)) + chr(13) + dateFromUnix(oErgSet.getlong(3))
	end if
end sub

sub testDb3(dDate as date)
	' Findet alle Termine am übergebenen Datum
	Dim sQuery as string, oErgSet as object
	dim lBeg, lEnd as long
	dim sMsg, sZeit1, sZeit2 as string
	
	lBeg = DateToUnix(dDate)
	lEnd = DateToUnix(DateAdd("d",1,dDate))
	sQuery="select title, event_start, event_end from cal_events where event_start >= " + lBeg + "000000 and event_start < " + lEnd +"000000 order by event_start" 
	'print sQuery
	oErgSet=ExecuteSQL(sQuery)
	do while not isNull(oErgSet) and oErgSet.Next
		sZeit1 = mid(dateFromUnix(oErgSet.getlong(2)),12,5)
		sZeit2 = mid(dateFromUnix(oErgSet.getlong(3)),12,5)
		sMsg = sMsg + "" + sZeit1 + " bis " + sZeit2 + "   " + oErgSet.getString(1) + chr(13)
	loop
	MsgBox sMsg, 0, "Termine vom " + dDate
end sub



function ExecuteSQL(sQuery as string) as object 	'++++++++++++++++++++++++ Funkioniert +++++++++++++++++++++++++++++++
'Führt SQL-Statement bei Datenbank <light_test1> aus
'und gibt ErgebnisSet zurück
	dim DatabaseContext as object
	dim oDatenquelle as object, oHandler as object
	dim oDatVerb as object, oStatement as object, oErgSet as object
	
	on error goto Fehler
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	if DatabaseContext.hasByName("light_test1") then
		bDbOk = true
		oDatenquelle = DatabaseContext.getByName("light_test1") 'Kanzlei-Datenbank <test>
'		xray oDatenquelle
		'print sQuery
		if not oDatenquelle.IsPasswordRequired then
			oDatVerb = oDatenquelle.getConnection("","")
		else
			oHandler = oDatenquelle.createUnoService("com.sun.star.sdb.InteractionHandler")
			oDatVerb = oDatenquelle.ConnectWithCompletion(oHandler)
		end if
		oStatement = oDatVerb.createStatement()
		oStatement.ResultSetType=1005
		'print "<"+sQuery+">"
		oErgSet = oStatement.executeQuery(sQuery)
		'xray oErgSet
		'dbTest2(oErgSet)
		ExecuteSQL = oErgSet
	else
		bDbOk = false
'		oErgSet = NULL
		ExecuteSQL = NULL
	end if
	exit function
	Fehler:
	msgbox "Es ist ein Fehler bei <ExecuteSQL> aufgetreten"
	bDbOk = false
	ExecuteSQL = oErgSet
	on error goto 0
end function

Sub ExecuteSQL2(sQuery as string) 	'++++++++++++++++++++++++ Funkioniert +++++++++++++++++++++++++++++++
'Führt SQL-Statement bei Datenbank <light_test1> aus
'und gibt kein ErgebnisSet zurück
	dim DatabaseContext as object
	dim oDatenquelle as object, oHandler as object
	dim oDatVerb as object, oStatement as object, oErgSet as object
	
	on error goto Fehler1
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	if DatabaseContext.hasByName("light_test1") then
		bDbOk = true
		oDatenquelle = DatabaseContext.getByName("light_test1") 'Kanzlei-Datenbank <test>
		if not oDatenquelle.IsPasswordRequired then
			oDatVerb = oDatenquelle.getConnection("","")
		else
			oHandler = oDatenquelle.createUnoService("com.sun.star.sdb.InteractionHandler")
			oDatVerb = oDatenquelle.ConnectWithCompletion(oHandler)
		end if
		oStatement = oDatVerb.createStatement()
		oStatement.executeUpdate(sQuery)
	else
		bDbOk = false
	end if
	exit sub
	Fehler1:
	msgbox "Es ist ein Fehler bei <ExecuteSQL2> aufgetreten"
	bDbOk = false
	on error goto 0
end sub

function dateFromUnix(lDate as double) as string
	' Verwandelt Unix-Timestamp in einen String
	dim Datum, Zone
	
	Zone = " MEZ"
	Datum = lDate / 86400000000 + 25569 + 1/24 'MEZ
	Datum = CDate(Datum)
	if isMESZ(Datum) then
		Zone = " MESZ"
		Datum = DateAdd("h",1,Datum)
	end if
	dateFromUnix = "" + Datum '+ Zone
end function

function DateToUnix(dDate as date) as long
	' Verwandelt Datum in UNIX-Timestamp
	' funktioniert nur mit 00:00 Uhr zuverlässig
	dim lUnixTime as long
	
	lUnixTime = dDate
	DateToUnix = ((lUnixTime - 25569) - 2/24) * 86400
	
end function

function isMESZ(dDatum as date)
	' gibt true zurück, wenn Datum in der Sommerzeit (MESZ) liegt
	' MESZ: letzten Sonntag im März um 2:00 Uhr MEZ bis zum letzten Sonntag im Oktober um 3:00 Uhr MESZ ab 1995
	dim Monat, Jahr, BegMESZ, EndMESZ
	Monat = Month(dDatum)
	Jahr = Year(dDatum)
	BegMESZ = CDate(lastSunday(3,Jahr)+".03."+Jahr+ " 02:00")
	EndMESZ = CDate(lastSunday(10,Jahr)+".10."+Jahr+ " 02:00")
	'MsgBox BegMESZ + chr(13) + EndMESZ
	if dDatum < BegMESZ or dDatum > EndMESZ then 
		isMESZ = false
	else
		isMESZ = true
	end if
end function

function lastSunday(iMonat as integer, iJahr as integer) as string
	' berechnet den letzten Sonntag eines Monats
	dim dDatum as date
	
	dDatum = CDate("31."+iMonat+"."+iJahr)
	do while (WeekDay(dDatum) <> 1)
		dDatum = DateAdd("d",-1,dDatum)
	loop
	lastSunday = Day(dDatum)
end function
Fabio9
Beiträge: 3
Registriert: Mi, 12.08.2009 19:32

Re: Thunderbird/lightning

Beitrag von Fabio9 »

Hallo,

das finde ich sehr interessant!

Ich möchte gerne meinen Thunderbird-Kalender - den ich wegen der Synchronisation übers www in einer *.ics-Datei habe - von OpenOffice aus lesen bzw. bestücken. Konkret geht es darum, daß ich in einem Formular in OOO auch Zeit-/Ort-Angaben habe; diese möchte ich, wenn ich das Formular verwende, von dort aus dann auch gleich in Thunderbird eingetragen haben. - Oder ist das zuviel der guten Wünsche?

Fabio.
Antworten