💚 BITTE helfen Sie uns NOCH HEUTE mit einer SPENDE 💚
Helfen Sie das LibreOffice Forum zu erhalten!
> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
ICS-Datei aus SQL-Abfrage
-
- Beiträge: 25
- Registriert: So 19. Jan 2020, 00:04
ICS-Datei aus SQL-Abfrage
Hallo,
ich habe ein funktionierendes Makro gefunden, das aus einer Calc-Tabelle ICS-Kalendereintröge erzeugt.
Ich würde den Weg über Calc gerne sparen und direkt aus einer Base-Abfrage die iCS-Datei erzeugen.
Mit fehlt also quasi die Lösung, wie ich die Daten aus der Abfrage in das Array schreibe:
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm1 = oDrawpage.forms.getByName("Tabellenformular")
--- hier befindet sich nun ein Tabellen-Steuerelement mit der Abfrage. Es hat 6 Spalten und eine unbekannte Zahl von Zeilen ---
--- Die folgenden Zeilen stammen aus dem gefundenen Makro ---
nRow = oCellCursor.getRangeAddress().endRow
daten()=oform1.getcellrangebyposition(0,2,6 nrow).getdataarray()
Mir fehlt die Verknüpfung, wie ich Zeile für Zeile die Daten aus dem Tabellen-Steuerlement in das Array schreibe.
Hat jemand einen Tipp?
LG, Björn
ich habe ein funktionierendes Makro gefunden, das aus einer Calc-Tabelle ICS-Kalendereintröge erzeugt.
Ich würde den Weg über Calc gerne sparen und direkt aus einer Base-Abfrage die iCS-Datei erzeugen.
Mit fehlt also quasi die Lösung, wie ich die Daten aus der Abfrage in das Array schreibe:
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm1 = oDrawpage.forms.getByName("Tabellenformular")
--- hier befindet sich nun ein Tabellen-Steuerelement mit der Abfrage. Es hat 6 Spalten und eine unbekannte Zahl von Zeilen ---
--- Die folgenden Zeilen stammen aus dem gefundenen Makro ---
nRow = oCellCursor.getRangeAddress().endRow
daten()=oform1.getcellrangebyposition(0,2,6 nrow).getdataarray()
Mir fehlt die Verknüpfung, wie ich Zeile für Zeile die Daten aus dem Tabellen-Steuerlement in das Array schreibe.
Hat jemand einen Tipp?
LG, Björn
Re: ICS-Datei aus SQL-Abfrage
Hallo Björn,
oForm1.last bringt Dich zum letzten Datensatz
nRow = oForm1.getRow zeigt Dir, wie in Deinem Makro, die Anzahl der Datensätze an.
oForm1.first bringt Dich wieder zum ersten Datensatz
... und mit oForm1.next kommst Du stückchenweise durch die Datensätze.
Schau im Handbuch unter "Methoden bei Formularen und Kontrollfeldern" im Kapitel "Makros".
Gruß
Robert
oForm1.last bringt Dich zum letzten Datensatz
nRow = oForm1.getRow zeigt Dir, wie in Deinem Makro, die Anzahl der Datensätze an.
oForm1.first bringt Dich wieder zum ersten Datensatz
... und mit oForm1.next kommst Du stückchenweise durch die Datensätze.
Schau im Handbuch unter "Methoden bei Formularen und Kontrollfeldern" im Kapitel "Makros".
Gruß
Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 25
- Registriert: So 19. Jan 2020, 00:04
Re: ICS-Datei aus SQL-Abfrage
Hallo Robert,
komme leider nicht weiter.
Es scheint keine Zugriff auf die Daten zu geben:
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Tabelle")
oForm.last
nRow = getRow()
print nRow
Hier meldet das Programm "Fehler in der Funktionsreihenfolge bei der Zeile "oForm.last".
Habe vier Jahre nichts an der Programmierung gemacht. Bin irgendwie raus...
Gruß, Björn
komme leider nicht weiter.
Es scheint keine Zugriff auf die Daten zu geben:
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Tabelle")
oForm.last
nRow = getRow()
print nRow
Hier meldet das Programm "Fehler in der Funktionsreihenfolge bei der Zeile "oForm.last".
Habe vier Jahre nichts an der Programmierung gemacht. Bin irgendwie raus...
Gruß, Björn
Re: ICS-Datei aus SQL-Abfrage
Du hast also ein Formular in Base, von dem aus Du das ganze startest? Und dieses Formular hat den Namen "Tabelle" und enthält Daten? Dann weiß ich nicht, wo das bei Dir hakt. Vielleicht kannst Du einfach einmal eine Beispieldatenbank hier (nur mit Dummyinhalt) anhängen.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 25
- Registriert: So 19. Jan 2020, 00:04
Re: ICS-Datei aus SQL-Abfrage
Da die Datenbank eine komplexe MySQL-Datenbank ist, wird das Anhängen als Dummy schwierig, Hier sind ein Screenshot des Formularaufbaus.
Dies ist die Abfrage, die in dem Formular dargestellt wird:
SELECT CONCAT( ( CASE WHEN ( `ur_urlaube`.`Urlaubstage` > 0 ) THEN 'Urlaub' WHEN ( `ur_urlaube`.`Schulungstage` > 0 ) THEN 'Fortbildung' ELSE 'Abwesenheit' END ), ' ', `a_adressen_aktuell`.`NAME` ) AS `Subject`, `ur_urlaube`.`von` AS `Start Date`, CONCAT( '00:00:00' ) AS `Start Time`, `ur_urlaube`.`bis` AS `End Date`, CONCAT( '23:59:59' ) AS `End Time`, CONCAT( 'TRUE' ) AS `All Day Event` FROM `schreiter`.`ur_urlaube` AS `ur_urlaube`, `schreiter`.`a_adressen_aktuell` AS `a_adressen_aktuell`, `schreiter`.`ur_filter` AS `ur_filter` WHERE `ur_urlaube`.`Mitarbeiter_ID` = `a_adressen_aktuell`.`Schluessel` AND YEAR( `ur_urlaube`.`von` ) = YEAR( `ur_filter`.`Jahr` ) AND YEAR( `ur_urlaube`.`bis` ) = YEAR( `ur_filter`.`Jahr` ) ORDER BY `a_adressen_aktuell`.`NAME` ASC
Dies ist die Abfrage, die in dem Formular dargestellt wird:
SELECT CONCAT( ( CASE WHEN ( `ur_urlaube`.`Urlaubstage` > 0 ) THEN 'Urlaub' WHEN ( `ur_urlaube`.`Schulungstage` > 0 ) THEN 'Fortbildung' ELSE 'Abwesenheit' END ), ' ', `a_adressen_aktuell`.`NAME` ) AS `Subject`, `ur_urlaube`.`von` AS `Start Date`, CONCAT( '00:00:00' ) AS `Start Time`, `ur_urlaube`.`bis` AS `End Date`, CONCAT( '23:59:59' ) AS `End Time`, CONCAT( 'TRUE' ) AS `All Day Event` FROM `schreiter`.`ur_urlaube` AS `ur_urlaube`, `schreiter`.`a_adressen_aktuell` AS `a_adressen_aktuell`, `schreiter`.`ur_filter` AS `ur_filter` WHERE `ur_urlaube`.`Mitarbeiter_ID` = `a_adressen_aktuell`.`Schluessel` AND YEAR( `ur_urlaube`.`von` ) = YEAR( `ur_filter`.`Jahr` ) AND YEAR( `ur_urlaube`.`bis` ) = YEAR( `ur_filter`.`Jahr` ) ORDER BY `a_adressen_aktuell`.`NAME` ASC
- Dateianhänge
-
- Anmerkung 2020-01-20 181121.jpg (214.83 KiB) 3023 mal betrachtet
Re: ICS-Datei aus SQL-Abfrage
Und wann startest Du das Makro? Hat dann diese Formular auch Inhalt?
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 25
- Registriert: So 19. Jan 2020, 00:04
Re: ICS-Datei aus SQL-Abfrage
Ooops. Ich Depp war im "Entwursmodus". Bislang führe ich das Makro noch manuell aus. Es sind 63 Datensätze vorhanden.
Jetzt wirft Print nRow aber "0" aus.
Jetzt wirft Print nRow aber "0" aus.
Re: ICS-Datei aus SQL-Abfrage
Das liegt dann wohl daran, dass Du nur
getRow()
und nicht
oForm.getRow()
da stehen hast.
getRow()
und nicht
oForm.getRow()
da stehen hast.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
-
- Beiträge: 25
- Registriert: So 19. Jan 2020, 00:04
Re: ICS-Datei aus SQL-Abfrage
Tatsächlich. Danke.
Diese Zeile aus dem im Netz gefundenen Makro scheint ein array aus Calc-Tabellen-Teilen zu füllen:
daten()=oblatt.getcellrangebyposition(0,1,6,nrow).getdataarray()
Wie kann man hier durch den Ersatz der Befehle ein Befüllen aus den Datenbankabfragefeldern (sie heißen "subject", "start date", "start time", "end date", "end time", "All day event") erreichen? Wenn das ginge, muesste der dann folgende Rest des Makros ja 1-zu-1 durchlaufen, sobald ich die 0,1 und 6 entsprechend ersetzt habe:
for i=lbound(daten()) to ubound(daten())
datumA = daten(i)(0)
if datumA="" then datumA=0
zeitA = daten(i)(1)
if zeitA="" then zeitA=0
datumE = daten(i)(2)
if datumE="" then datumE=0
zeitE = daten(i)(3)
if zeitE="" then zeitE=0
kurz=converttoutf8(daten(i)(4))
beschreibung=converttoutf8(daten(i)(5))
ort=converttoutf8(daten(i)(6))
If datumA+datumE > 0 Then 'gültiger Eintrag
'Datumsangaben umwandeln
If datumE = 0 Then datumE = datumA 'eintägiger Termin
If datumA = 0 Then datumA = datumE 'eintägiger Termin
If zeitE = 0 Then zeitE = zeitA
if zeitA = 0 then zeitA=zeitE
If zeitA = 0 Then datumE = datumE + 1 'ganztägiger Termin
anfang_datum = Format(datumA, "yyyymmdd")
ende_datum = Format(datumE, "yyyymmdd")
ende_zeit = Format(zeitE, "hhmmss")
anfang_zeit = Format(zeitA, "hhmmss")
If zeitA = 0 Then 'ganzätgiger Termin
anfang = ";VALUE=DATE:" & anfang_datum
ende = ";VALUE=DATE:" & ende_datum
Else 'nicht ganztägig
anfang = ":" & anfang_datum & "T" & anfang_zeit
ende = ":" & ende_datum & "T" & ende_zeit
End If
'Schreibt den Kalendereintrag
oOutputStream.writeString("BEGIN:VEVENT" & eol)
oOutputStream.writeString("UID:" + zeitstempel + i & eol)
oOutputStream.writeString("SUMMARY:" & kurz & eol)
If ort <> "" Then oOutputStream.writeString("LOCATION:" & ort & eol)
oOutputStream.writeString("DESCRIPTION:" & beschreibung & eol)
If kategorie <> "" Then oOutputStream.writeString("CATEGORIES:" & kategorie & eol)
oOutputStream.writeString("CLASS:PRIVATE" & eol)
oOutputStream.writeString("DTSTAMP:" + zeitstempel & eol)
oOutputStream.writeString("LAST-MODIFIED:" + zeitstempel & eol)
oOutputStream.writeString("DTSTART" & anfang & eol)
if ende<>anfang then oOutputStream.writeString("DTEND" & ende & eol)
oOutputStream.writeString("TRANSP:OPAQUE" & eol)
oOutputStream.writeString("END:VEVENT" & eol)
end if
next
'Ende der Kalenderdatei
oOutputStream.writeString("END:VCALENDAR")
'Datei schließen
oOutputStream.closeOutput()
end sub
Diese Zeile aus dem im Netz gefundenen Makro scheint ein array aus Calc-Tabellen-Teilen zu füllen:
daten()=oblatt.getcellrangebyposition(0,1,6,nrow).getdataarray()
Wie kann man hier durch den Ersatz der Befehle ein Befüllen aus den Datenbankabfragefeldern (sie heißen "subject", "start date", "start time", "end date", "end time", "All day event") erreichen? Wenn das ginge, muesste der dann folgende Rest des Makros ja 1-zu-1 durchlaufen, sobald ich die 0,1 und 6 entsprechend ersetzt habe:
for i=lbound(daten()) to ubound(daten())
datumA = daten(i)(0)
if datumA="" then datumA=0
zeitA = daten(i)(1)
if zeitA="" then zeitA=0
datumE = daten(i)(2)
if datumE="" then datumE=0
zeitE = daten(i)(3)
if zeitE="" then zeitE=0
kurz=converttoutf8(daten(i)(4))
beschreibung=converttoutf8(daten(i)(5))
ort=converttoutf8(daten(i)(6))
If datumA+datumE > 0 Then 'gültiger Eintrag
'Datumsangaben umwandeln
If datumE = 0 Then datumE = datumA 'eintägiger Termin
If datumA = 0 Then datumA = datumE 'eintägiger Termin
If zeitE = 0 Then zeitE = zeitA
if zeitA = 0 then zeitA=zeitE
If zeitA = 0 Then datumE = datumE + 1 'ganztägiger Termin
anfang_datum = Format(datumA, "yyyymmdd")
ende_datum = Format(datumE, "yyyymmdd")
ende_zeit = Format(zeitE, "hhmmss")
anfang_zeit = Format(zeitA, "hhmmss")
If zeitA = 0 Then 'ganzätgiger Termin
anfang = ";VALUE=DATE:" & anfang_datum
ende = ";VALUE=DATE:" & ende_datum
Else 'nicht ganztägig
anfang = ":" & anfang_datum & "T" & anfang_zeit
ende = ":" & ende_datum & "T" & ende_zeit
End If
'Schreibt den Kalendereintrag
oOutputStream.writeString("BEGIN:VEVENT" & eol)
oOutputStream.writeString("UID:" + zeitstempel + i & eol)
oOutputStream.writeString("SUMMARY:" & kurz & eol)
If ort <> "" Then oOutputStream.writeString("LOCATION:" & ort & eol)
oOutputStream.writeString("DESCRIPTION:" & beschreibung & eol)
If kategorie <> "" Then oOutputStream.writeString("CATEGORIES:" & kategorie & eol)
oOutputStream.writeString("CLASS:PRIVATE" & eol)
oOutputStream.writeString("DTSTAMP:" + zeitstempel & eol)
oOutputStream.writeString("LAST-MODIFIED:" + zeitstempel & eol)
oOutputStream.writeString("DTSTART" & anfang & eol)
if ende<>anfang then oOutputStream.writeString("DTEND" & ende & eol)
oOutputStream.writeString("TRANSP:OPAQUE" & eol)
oOutputStream.writeString("END:VEVENT" & eol)
end if
next
'Ende der Kalenderdatei
oOutputStream.writeString("END:VCALENDAR")
'Datei schließen
oOutputStream.closeOutput()
end sub
Re: ICS-Datei aus SQL-Abfrage
Hallo,
die Logik ist bei Datenbanken etwas anders, da man mit einem aktuellen Datensatz arbeitet, nicht mit einem 2-dimensionalen Ausschnitt aus der Tabelle.
Im Calc-Makro werden erst die Tabelleninhalte in das Array Daten kopiert, dann mit diesem gearbeitet - die For-i-Schleife.
Du könntest diese durch eine Schleife über die Datensätze ersetzen und dann direkt auf die Felder des aktuellen Datensatzes zugreifen.
Gerade bei Datum und Zeit musst Du evtl noch ins passende Format konvertieren.
Mfg, Jörn
(Ich bin bisher eher den Weg gegangen das Ausgabeformat in der Abfrage zu erzeugen, weshalb ich mir obigen Teil gespart habe...)
die Logik ist bei Datenbanken etwas anders, da man mit einem aktuellen Datensatz arbeitet, nicht mit einem 2-dimensionalen Ausschnitt aus der Tabelle.
Im Calc-Makro werden erst die Tabelleninhalte in das Array Daten kopiert, dann mit diesem gearbeitet - die For-i-Schleife.
Du könntest diese durch eine Schleife über die Datensätze ersetzen und dann direkt auf die Felder des aktuellen Datensatzes zugreifen.
Gerade bei Datum und Zeit musst Du evtl noch ins passende Format konvertieren.
Mfg, Jörn
(Ich bin bisher eher den Weg gegangen das Ausgabeformat in der Abfrage zu erzeugen, weshalb ich mir obigen Teil gespart habe...)
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit
An alle, die das LibreOffice-Forum nutzen:
Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.
❤️ Vielen lieben Dank für Ihre Unterstützung ❤️