[Erledigt] Aus Writer in Makro die Calc-Tabelle abfragen

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

Moderator: Moderatoren

juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

[Erledigt] Aus Writer in Makro die Calc-Tabelle abfragen

Beitrag von juetho »

Hallo,

ich habe für die Serienbrief-Funktion von Writer eine Verbindung mit einer Datenquelle aus Calc hergestellt. Wie kann ich aus Writer heraus die aktuelle Tabelle abfragen?

Hilfe und Suche bringt mir viele Angaben zu Tabellennamen und DataSource, aber das bezieht sich alles auf Base oder wird nur innerhalb eines Calc-Dokuments verwendet. Oder geht das ähnlich wie mit DatabaseContext?

Ich habe herausgefunden, dass ich aus Calc heraus ein Tabellenblatt mit thisDocument.Sheets.getByName benutzen kann. Aber wie bekomme ich von meinem "thisDocument" (nämlich dem Text) den Zugriff auf das Calc-Dokument?

Hinweis: Zur weiteren Verarbeitung im Makro benötige ich nach und nach: den Namen des aktuellen Sheets (das ich zuvor durch "Datenquelle austauschen" manuell ausgewählt habe), einzelne Werte bestimmter Zellen, eine Schleife über die Spalten 3 ff. Deswegen suche ich etwas wie (mit Anleihen bei der C#-Schreibweise), wo ich mit oSheet fortfahren kann:

Code: Alles auswählen

oCalcTable = thisDocument.DataSource as CalcDocument
oSheet = oCalcTable.GetCurrentSheet()
Danke für Ratschläge! Jürgen

/Edit: Frage erweitert: nicht nur den Tabellennamen, sondern das gesamte Arbeitsblatt in eine Variable holen. Dazu Hinweis über mein Ziel eingefügt.
Zuletzt geändert von juetho am So, 25.04.2010 10:16, insgesamt 1-mal geändert.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von juetho »

Puh, nach etwa 10 Stunden Suche im Forum, Wiki, Andrew Pitonyak, Michael Dannenhöfer bin ich zwei kleine Schritte weiter.

1. Den Namen der Datenbank, d.h. die gesamte Calc-Tabelle, erhalte ich so:

Code: Alles auswählen

Doc = ThisComponent
TextFelderEnumration = Doc.getTextFields.createEnumeration
do 
  TextField = TextFelderEnumration.nextElement()
  If TextField.supportsService("com.sun.star.text.TextField.Database") Then  
    msgbox textfield.textfieldmaster.databasename
    exit do
  end if
loop while TextFelderEnumration.hasMoreElements()
Damit weiß ich immerhin, dass der Name der Datenbank gleich ist dem Namen der Tabellendatei. Damit konnte ich den nächsten Schritt erledigen:

2. Die Namen aller Tabellen, d.h. der einzelnen Arbeitsblätter, erhalte ich so:

Code: Alles auswählen

oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDBSource = oDBContext.GetByName("Klassenlisten")    'nämlich mit dem o.g. Dateinamen ohne Extension
oConnection = oDBSource.GetConnection("","")
oTables = oConnection.Tables()
oEnum=oTables.createEnumeration()
While oEnum.hasMoreElements()
   oItem=oEnum.nextElement()
   msgbox "Tabellenname " & oItem.Name
Wend 
Es bleiben also die folgenden Fragen:
3. Wie erfahre ich, welche Tabelle als Datenquelle des Textdokuments ausgewählt ist?
4. Oder ist es einfacher, eine Tabelle in einer InputBox abzufragen und festzulegen?
5. Wie greife ich am besten auf einzelne Daten zu? Bisher wollte ich über getCellByPosition gehen; ist etwas anderes besser? Kommt in diesem Zusammenhang SQL infrage?
6. Wie steuere ich das Filtern der Daten für den Seriendruck am besten? Auch durch SQL?

Die letzte Frage sollte eigentlich erst später kommen, und ich dachte, das wäre ein anderes Thema. Aber nachdem ich jetzt festgestellt habe, dass die Calc-Tabelle bei der Serienfunktion des Writers wie eine Datenbank-Tabelle behandelt wird, passt die Frage wohl doch hierher.

Nach dem jetzigen Teilerfolg ist es denkbar, dass ich irgendwann in ein paar Tagen auch dafür die Lösungen finden werde. Aber vielleicht gibt es eine Fachleut (Mann oder Frau), die meine langen Versuche etwas abkürzen kann. Ich würde mich sehr freuen.

Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von DPunch »

Aloha

Eine relativ entscheidende Frage ist:
Was genau ist der Zweck Deiner Makros?

Ohne das zu wissen könnte man viele verschiedene Vorschläge machen, wie Du irgendwas umsetzen könntest - aber es kürzt das ganze Procedere doch sehr ab, wenn Du mal umreisst, was Dein Ziel ist.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von juetho »

Wenn du meinst. (Das Makro lief unter Word 2000 und muss jetzt auf die Struktor von OOo umgebaut werden.)

Ausgangspunkt ist eine Calc-Tabelle "Klassenlisten" (für jede Klasse ein Arbeitsblatt) mit den Spalten: Name, Vorname, Englisch, Russisch usw. (also der Liste der Fächer). Bei manchen Fächern gibt es Teilungsunterricht. In den Zellen steht 'x', wenn das Fach gemeinsam unterrichtet, oder ein Kürzel bei Teilungsunterricht (z.B. Sport: J=Jungen, M=Mädchen). Es gibt auch leere Zellen; dann nimmt die Schülerin an diesem Unterricht nicht teil.

Aufgabe 1: Für jede Klasse, jedes Fach und ggf. jede Gruppe ist ein Word-Dokument zu erstellen. (Es muss doc sein, weil die Lehrer damit arbeiten.)
Kopfzeile: Klasse 4 <Kürzel> <tab> <Fach> <tab> <Lehrer>
Serienbrief-Inhalt:
<Name>, <Vorname> Zeilenumbruch
<Vorname> hat am ... Unterricht teilgenommen. <Nächster Datensatz> <Absatzende>
Der Inhalt wird entsprechend oft auf einer Seite wiederholt; die Formulierung "hat teilgenommen" variiert. (Auch das will ich vom Makro steuern.) Die Daten werden aus dem Arbeitsblatt geholt, entweder über einen Filter (ich habe noch nichts gefunden, wie ich in einem Makro den Filter festlegen kann) oder über einen SQL-Befehl mit passendem WHERE (das ist für mich einfach).

Vorgesehener Arbeitsablauf:
  • Auswahl einer Klasse (also eines Arbeitsblatts) - darauf beziehen sich meine o.g. Fragen 3/4
  • Schleife über alle Fächer und Gruppen - darauf bezieht sich Frage 5
  • Für jedes Fach und ggf. jede Gruppe wird eine separate Auswahl getroffen - darauf bezieht sich Frage 6 -, welche Daten in den Serienbrief-Text eingefügt werden.
  • Das Ganze wird als Word-Dokument gespeichert. Wie das per Makro geregelt wird, vor allem die Serienbrief-Funktion dabei, habe ich noch nicht untersucht; deshalb gibt es dazu noch keine Frage.
Das ist eine Vorarbeit für die späteren Arbeiten, die ich hier nur der Vollständigkeit erwähne. Dazu will ich noch nichts fragen, weil ich einen Punkt nach dem anderen erledigen möchte.

Aufgabe 2: Für jede Klasse wird ein Word-Dokument erstellt. Für jeden Schüler gibt es eine Seite (oder auch mehrere) mit einem Absatz für jedes Fach; in der Kopfzeile steht der Name der Schülerin.

Aufgabe 3: Die Fachlehrer tragen in das Dokument, das in Aufgabe 1 erstellt wurde, die Beurteilung ihrer Schüler ein. (Es ist eine Waldorfschule; also gibt es keine Noten, sondern Texte.) Diese Texte müssen an die entsprechende Stelle in das Dokument nach Aufgabe 2 kopiert werden (passendes Klassendokument öffnen, suche den Schüler, suche das Fach).

Mir ist inzwischen durch den Kopf gegangen, dass es einfacher sein könnte, den Text mit einer Abfrage zu verknüpfen und die Abfrage per SELECT aus der Calc-Tabelle zu holen; auch daraus ergeben sich meine Fragen (zumal es eine Umstellung des Vorgehens gegenüber dem Word-Makro ist).

Ich hoffe, diese Angaben helfen bei Antworten. Schönes Wochenende! Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von juetho »

So, ich bin jetzt viel weiter. Es war ganz einfach, mit zwei SELECT-Befehlen die Daten zusammenzustellen und das ResultSet direkt per result.GetString in das Text-Dokument einzutragen - ganz ohne Datenfelder. (Es wäre vielleicht anders noch einfacher; aber da es eine Liste mit variabel 10 bis 30 Datensätzen pro Datei wird, erspart mir das noch das lästige Nacharbeiten mit dem Löschen leerer Zeilen.)

Bei Aufgabe 1 fehlt jetzt noch das getrennte Abspeichern als Word-Dokument; aber da erwarte ich keine Probleme, die nicht schnell durch die Suche gelöst werden.

Fazit: Meine konkrete Aufgabe ist abgeschlossen. Aber zum Verständnis der Zusammenarbeit zwischen Serienbrief-Texten und Datenquellen über Makros sind weitere Erläuterungen sehr willkommen.

Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von DPunch »

Aloha

"Alles" weitere zu Serienbriefen und Datenquellen solltest Du mit dem Stichwort >MailMerge< zusammentragen können (wenn Du da nicht selber schon drüber gestolpert bist).

Ich persönlich habe aus vielerlei Gründen den Einsatz von Seriendruck-Feldern bei OOo im Zusammenhang mit Makros irgendwann als unpraktikabel verworfen und nur noch mit Platzhaltern bzw. klar identifizierbaren Tabellen gearbeitet.
Spätestens, wenn die Calc-Datei, aus der Du Deine Daten beziehst, etwas größer wird, ist der Ablauf unglaublich langsam (also noch langsamer, als OOo-Basic an sich schon ist) - wobei "langsam" natürlich per se eine subjektive EInschätzung ist, die jeder für sich selbst treffen muss.

Das Speichern als Word-Dokument funktioniert übrigens über Parameter, die Du beim Speichern angeben kannst - oder sollte es zumindest, ich hab das selber nie probiert.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Aus Writer in einem Makro die Calc-Tabelle abfragen

Beitrag von juetho »

DPunch hat geschrieben:"Alles" weitere zu Serienbriefen und Datenquellen solltest Du mit dem Stichwort >MailMerge< zusammentragen können (wenn Du da nicht selber schon drüber gestolpert bist).
In der Tat, im Moment nur viel zu spät. Aber für die weitere Arbeit könnte es nützlich sein.
... Seriendruck-Feldern bei OOo im Zusammenhang mit Makros irgendwann als unpraktikabel ...
Spätestens, wenn die Calc-Datei, aus der Du Deine Daten beziehst, etwas größer wird, ist der Ablauf unglaublich langsam...
Gut zu wissen. Aber die Calc-Datei besteht aus etwa 12 Tabellen mit maximal 30 Datensätzen sowie 1 Tabelle mit etwa 120 Datensätzen; da geht das Erstellen von 10 Word-Dokumenten so schnell, dass man nicht mehr mitlesen kann.
Das Speichern als Word-Dokument funktioniert übrigens über Parameter...
Ich sagte schon, dass ich dabei keine Probleme erwartete. Das ging ganz einfach; das größere Problem war, das Arbeitsverzeichnis richtig zu setzen. (Ich hatte irgendwo mal etwas von work gelesen, aber dieser Begriff ist zu allgemein, als dass die Suchfunktionen hätten helfen können.)

Danke jedenfalls für diese Hinweise. Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten