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.
Thunderbird/lightning
Moderator: Moderatoren
Re: Thunderbird/lightning
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
Re: Thunderbird/lightning
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.
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.