Neu:

  Keine Werbeeinblendungen für registrierte User❗

  Jede SPENDE für das LIBREOFFICE Forum zählt ❤



  🌹 Danke für Ihre Unterstützung 🙏


ICS-Datei aus SQL-Abfrage

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
bjoern.schreiter
Beiträge: 11
Registriert: So 19. Jan 2020, 00:04

ICS-Datei aus SQL-Abfrage

Beitrag von bjoern.schreiter » So 19. Jan 2020, 00:12

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

RobertG
Beiträge: 2166
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: ICS-Datei aus SQL-Abfrage

Beitrag von RobertG » So 19. Jan 2020, 08:57

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
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

bjoern.schreiter
Beiträge: 11
Registriert: So 19. Jan 2020, 00:04

Re: ICS-Datei aus SQL-Abfrage

Beitrag von bjoern.schreiter » So 19. Jan 2020, 23:14

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

RobertG
Beiträge: 2166
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: ICS-Datei aus SQL-Abfrage

Beitrag von RobertG » Mo 20. Jan 2020, 16:23

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

bjoern.schreiter
Beiträge: 11
Registriert: So 19. Jan 2020, 00:04

Re: ICS-Datei aus SQL-Abfrage

Beitrag von bjoern.schreiter » Mo 20. Jan 2020, 18:15

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
Dateianhänge
Anmerkung 2020-01-20 181121.jpg
Anmerkung 2020-01-20 181121.jpg (214.83 KiB) 1500 mal betrachtet

RobertG
Beiträge: 2166
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: ICS-Datei aus SQL-Abfrage

Beitrag von RobertG » Di 21. Jan 2020, 15:32

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

bjoern.schreiter
Beiträge: 11
Registriert: So 19. Jan 2020, 00:04

Re: ICS-Datei aus SQL-Abfrage

Beitrag von bjoern.schreiter » Di 21. Jan 2020, 17:10

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.

RobertG
Beiträge: 2166
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: ICS-Datei aus SQL-Abfrage

Beitrag von RobertG » Di 21. Jan 2020, 19:54

Das liegt dann wohl daran, dass Du nur
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

bjoern.schreiter
Beiträge: 11
Registriert: So 19. Jan 2020, 00:04

Re: ICS-Datei aus SQL-Abfrage

Beitrag von bjoern.schreiter » Di 21. Jan 2020, 23:48

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

Wanderer
Beiträge: 489
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: ICS-Datei aus SQL-Abfrage

Beitrag von Wanderer » Mi 22. Jan 2020, 08:03

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...)
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

Antworten