Archiv des LibreOffice- und OpenOffice.org-Wiki

[ÜberSicht] [TitelIndex] [WortIndex] [SeiteFinden

(./) OOo2

Mit den unten beschriebenen Makros lassen sich die Dokumenteigenschaften von Text-, Tabellen-, Zeichnungs-, Präsentations- und Formeldokumenten mit BaseVorlagen/DokumentenVerwaltung/Doku_Verwaltung.odb synchronisieren.

Base Datenbank-Dateien kennen keine Dokumenteigenschaften und werden deshalb von den Makros ignoriert.

1. Dokudaten speichern

Dieses Makro sammelt die Dokumenteigenschaften und speichert sie in die Datenbank.

Für neue Dokumente wird ein neuer Datensatz erzeugt. Die Eingabe des Dokumententitels ist erforderlich. Die ermittelte Dokumenten-ID wird in das benutzerdefinierte Infofeld 4 eingetragen und sollte danach nie manuell verändert werden.

Bei bereits angelegten Dokumenten werden die Dokumenteigenschaften im Datensatz mit der entsprechenden Dokumenten-ID aktualisiert.

Das Makro kann immer dann aufgerufen werden, nachdem das Dokument gesichert wurde oder bevor es geschlossen wird (Extras → Anpassen → Ereignisse).

2. Dokudaten laden

Dokumenteigenschaften können auch in der Dokumentenverwaltung editiert werden.

Dieses Makro liest den Datensatz mit der Dokumenten-ID, und aktualisiert die entsprechenden Dokumenteigenschaftsfelder.

Es kann immer dann aufgerufen werden, nachdem ein bereits angelegtes Dokument geöffnet wurde (Extras → Anpassen → Ereignisse).

3. Neue Version

Beim Speichern unter einem neuen Namen behalten die Dokumenteigenschaftsfelder normalerweise ihre Werte. Das gilt auch für die Dokumenten-ID.

Zur Vermeidung von Konflikten ermittelt dieses Makro eine neue Dokumenten-ID und trägt diese in das Dokument ein. In der Dokumentenverwaltung wird die Dokuversion um 1 erhöht und zwecks Verfolgbarkeit um die alte Dokumenten-ID in Klammern ergänzt.

Dieses Makro kann immer dann aufgerufen werden, nachdem das Dokument unter einem anderen Namen gesichert wurde (Extras → Anpassen → Ereignisse).

4. Quelltext

4.1. Dokudaten speichern

SUB Dokudaten_speichern

' Aufgabe dieses Makros
' Dokumenteigenschaften zusammentragen und in Datenbank speichern

' Datenbank und Tabelle der Dokumentenverwaltung
CONST OOoBase = "Doku_Verwaltung"
CONST OOoTabelle = "Dokus"

' Namen der benutzerdefinierten Dokument-Infofelder
CONST Info1 = "Status"
CONST Info2 = "Prüfer"
CONST Info3 = "Prüfdatum"
CONST Info4 = "Doku ID (bitte nicht verändern)"

' Objekte deklarieren
DIM Dokument AS OBJECT
DIM DatabaseContext AS OBJECT
DIM Datenquelle AS OBJECT
DIM Verbindung AS OBJECT
DIM Authentifizierung AS OBJECT
DIM SQL_Anweisung AS OBJECT
DIM Abfrageergebnis AS OBJECT

' Hilfsvariablen
DIM DokuID, Titel, Thema, Keywords, Dokutyp, Autor, Erstelldatum AS STRING
DIM DokuURL, Dokuversion, Aktuelldatum, Dokustatus, Pruefer, Pruefdatum AS STRING
DIM Infofeldname AS STRING
DIM Sql AS STRING
DIM Msg AS STRING

ON ERROR GOTO Fehlerbehandlung

' Datenbankkontext erzeugen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

' Datenquelle für OOo-Registry
Datenquelle = DatabaseContext.getByName(OOoBase)

' bei Bedarf Dialog für Passwortschutz aufrufen
IF NOT Datenquelle.IsPasswordRequired THEN
  Verbindung = Datenquelle.GetConnection("","")' ("Benutzername","Passwort")
ELSE
  Authentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
  Verbindung = Datenquelle.ConnectWithCompletion(Authentifizierung)
END IF

' SQL-Kommunikationskanal für die Dokumentenverwaltung
SQL_Anweisung = Verbindung.createStatement()

' DokuID und Titel ermitteln
Dokument = thisComponent
Infofeldname = Dokument.DocumentInfo.getUserFieldName(3)
DokuID = Dokument.DocumentInfo.getUserFieldValue(3)
Titel = Dokument.DocumentInfo.Title

' Falls DokuID noch nicht vergeben, dann aus Datenbank ermitteln.
' Titel-Feld darf nicht leer sein.
If (Infofeldname <> Info4) OR (DokuID = "") THEN
  IF Titel = "" THEN
    DO
      Titel = INPUTBOX("Dokumententitel (Eingabe erforderlich)")
    LOOP UNTIL Titel <> ""
    Dokument.DocumentInfo.Title = Titel
  END IF

  ' Datensatz erzeugen
  ' SQL-Befehl "INSERT INTO Dokus (Titel, Erstellt am) VALUES (Titel, Datum)" vorbereiten
  Sql = "INSERT INTO "+CHR(34)+OOoTabelle+CHR(34)+" ("+CHR(34)+"Titel"+CHR(34)+", "
  Erstelldatum = LTRIM(STR(YEAR(DATE)))+"-"+LTRIM(STR(MONTH(DATE)))+"-"+LTRIM(STR(DAY(DATE)))
  Sql = Sql +CHR(34)+"Erstellt am"+CHR(34)+") VALUES ('"+Titel+"', '"+Erstelldatum+"')"
  ' und ausführen
  SQL_Anweisung.executeUpdate(Sql)

  ' Doku-ID abfragen
  ' SQL-Befehl "SELECT MAX(ID) FROM Dokus" vorbereiten
  Sql = "SELECT MAX("+CHR(34)+"ID"+CHR(34)+") FROM "+CHR(34)+OOoTabelle+CHR(34)
  ' und ausführen
  Abfrageergebnis = SQL_Anweisung.executeQuery(Sql)

  ' Ergebnis auswerten
  IF NOT IsNull(Abfrageergebnis) THEN
    IF Abfrageergebnis.next THEN
      DokuID = Abfrageergebnis.getString(1)
    END IF
  END IF

  ' Namen der benutzerdefinierten Infofelder überschreiben
  Dokument.DocumentInfo.setUserFieldName(0 ,Info1)
  Dokument.DocumentInfo.setUserFieldName(1 ,Info2)
  Dokument.DocumentInfo.setUserFieldName(2 ,Info3)
  Dokument.DocumentInfo.setUserFieldName(3 ,Info4)

  ' Doku-ID in Infofeld 4 eintragen
  Dokument.DocumentInfo.setUserFieldValue(3 ,DokuID)

  ' Dokuversion
  Dokuversion = "0"
END IF

' Die weiteren Dokumenteigenschaften ermitteln
Thema = Dokument.DocumentInfo.Subject
Keywords = Dokument.DocumentInfo.Keywords
IF Dokument.SupportsService("com.sun.star.text.TextDocument") THEN Dokutyp = "Textdokument"
IF Dokument.SupportsService("com.sun.star.sheet.SpreadsheetDocument") THEN Dokutyp = "Tabellendokument"
IF Dokument.SupportsService("com.sun.star.presentation.PresentationDocument") THEN
  Dokutyp = "Präsentation"
ELSE
  IF Dokument.SupportsService("com.sun.star.drawing.DrawingDocument") THEN Dokutyp = "Zeichnung"
END IF
IF Dokument.SupportsService("com.sun.star.formula.FormulaProperties") THEN Dokutyp = "Formeldokument"
Autor = Dokument.DocumentInfo.Author
DokuURL = Dokument.getURL()
Dokustatus = Dokument.DocumentInfo.getUserFieldValue(0)
Pruefer = Dokument.DocumentInfo.getUserFieldValue(1)
Pruefdatum = Dokument.DocumentInfo.getUserFieldValue(2)

' Datensatz mit Dokueigenschaften aktualisieren
' SQL-Befehl "UPDATE Dokus SET Feld1=Wert1, Feld2=Wert2, ...
'             WHERE ID=DokuID" vorbereiten
Sql = "UPDATE "+CHR(34)+OOoTabelle+CHR(34)+" SET "+CHR(34)+"Thema"+CHR(34)+" = '"+Thema+"', "
Sql = Sql+ CHR(34)+"Schlüsselwörter"+CHR(34)+" = '"+Keywords+"', "
Sql = Sql+ CHR(34)+"Dokutyp"+CHR(34)+" = '"+Dokutyp+"', "
Sql = Sql+ CHR(34)+"Ersteller"+CHR(34)+" = '"+Autor+"', "
Sql = Sql+ CHR(34)+"URL"+CHR(34)+" = '"+DokuURL+"', "
IF Dokuversion <> "" THEN Sql = Sql+ CHR(34)+"Version"+CHR(34)+" = '"+Dokuversion+"', "
Aktuelldatum = LTRIM(STR(YEAR(DATE)))+"-"+LTRIM(STR(MONTH(DATE)))+"-"+LTRIM(STR(DAY(DATE)))
Sql = Sql+ CHR(34)+"Gespeichert am"+CHR(34)+" = '"+Aktuelldatum+"', "
Sql = Sql+ CHR(34)+"Status"+CHR(34)+" = '"+Dokustatus+"', "
Sql = Sql+ CHR(34)+"Prüfer"+CHR(34)+" = '"+Pruefer+"', "
Sql = Sql+ CHR(34)+"Geprüft am"+CHR(34)+" = '"+Pruefdatum+"' "
Sql = Sql+ " WHERE "+CHR(34)+"ID"+CHR(34)+" = "+DokuID

' und ausführen
SQL_Anweisung.executeUpdate(Sql)

GOTO Ende

Fehlerbehandlung:

IF ERR=423 THEN GOTO Ende ' Datenbank nicht behandeln
Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
MsgBox Msg,16,"Fehler aufgetreten"

Ende:

END SUB

4.2. Dokudaten laden

SUB Dokudaten_laden

' Aufgabe dieses Makros
' Dokumenteigenschaften Titel, Thema, Keywords, Autor, Dokuversion, Dokustatus, Pruefer und Pruefdatum
' aus Datenbank abfragen und in die entsprechenden Dokumenteigenschaftsfelder eintragen

' Datenbank und Tabelle der Dokumentenverwaltung
CONST OOoBase = "Doku_Verwaltung"
CONST OOoTabelle = "Dokus"

' Namen der benutzerdefinierten Dokument-Infofelder
CONST Info1 = "Status"
CONST Info2 = "Prüfer"
CONST Info3 = "Prüfdatum"
CONST Info4 = "Doku ID (bitte nicht verändern)"

' Objekte deklarieren
DIM Dokument AS OBJECT
DIM DatabaseContext AS OBJECT
DIM Datenquelle AS OBJECT
DIM Verbindung AS OBJECT
DIM Authentifizierung AS OBJECT
DIM SQL_Anweisung AS OBJECT
DIM Abfrageergebnis AS OBJECT

' Hilfsvariablen
DIM DokuID, Titel, Thema, Keywords, Dokutyp, Autor, Erstelldatum AS STRING
DIM DokuURL, Dokuversion, Aktuelldatum, Dokustatus, Pruefer, Pruefdatum AS STRING
DIM Infofeldname AS STRING
DIM Sql AS STRING
DIM Msg AS STRING

ON ERROR GOTO Fehlerbehandlung

' Datenbankkontext erzeugen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

' Datenquelle für OOo-Registry
Datenquelle = DatabaseContext.getByName(OOoBase)

' bei Bedarf Dialog für Passwortschutz aufrufen
IF NOT Datenquelle.IsPasswordRequired THEN
  Verbindung = Datenquelle.GetConnection("","")' ("Benutzername","Passwort")
ELSE
  Authentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
  Verbindung = Datenquelle.ConnectWithCompletion(Authentifizierung)
END IF

' SQL-Kommunikationskanal für die Dokumentenverwaltung
SQL_Anweisung = Verbindung.createStatement()

' DokuID und Titel ermitteln
Dokument = thisComponent
Infofeldname = Dokument.DocumentInfo.getUserFieldName(3)
DokuID = Dokument.DocumentInfo.getUserFieldValue(3)

' Falls DokuID noch nicht vergeben, dann Ende.
If (Infofeldname <> Info4) OR DokuID = "" THEN GOTO Ende

' Datensatz aus Dokumentenverwaltung abfragen
' SQL-Befehl "SELECT Datenbankfelder FROM Tabellenname WHERE ID = DokuID" vorbereiten
Sql = "SELECT "+CHR(34)+"Titel"+CHR(34)+","+CHR(34)+"Thema"+CHR(34)+","+CHR(34)+"Schlüsselwörter"+CHR(34)+","
Sql = Sql+CHR(34)+"Ersteller"+CHR(34)+","+CHR(34)+"Version"+CHR(34)+","+CHR(34)+"Status"+CHR(34)+","
Sql = Sql+CHR(34)+"Prüfer"+CHR(34)+","+CHR(34)+"Geprüft am"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+CHR(34)
Sql = Sql+" WHERE "+CHR(34)+"ID"+CHR(34)+" = "+DokuID

' und ausführen
Abfrageergebnis = SQL_Anweisung.executeQuery(Sql)

' Ergebnis auswerten
IF NOT IsNull(Abfrageergebnis) THEN
  IF Abfrageergebnis.next THEN
    Dokument.DocumentInfo.Title = Abfrageergebnis.getString(1)
    Dokument.DocumentInfo.Subject = Abfrageergebnis.getString(2)
    Dokument.DocumentInfo.Keywords = Abfrageergebnis.getString(3)
    Dokument.DocumentInfo.Author = Abfrageergebnis.getString(4)
    Dokuversion = Abfrageergebnis.getString(5)
    Dokument.DocumentInfo.setUserFieldValue(0, Abfrageergebnis.getString(6))
    Dokument.DocumentInfo.setUserFieldValue(1, Abfrageergebnis.getString(7))
    Dokument.DocumentInfo.setUserFieldValue(2, Abfrageergebnis.getString(8))
  END IF
END IF

GOTO Ende

Fehlerbehandlung:

IF ERR=423 THEN GOTO Ende ' Datenbank nicht behandeln
Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
MsgBox Msg,16,"Fehler aufgetreten"

Ende:

END SUB

4.3. Neue Dokuversion

SUB Neue_Dokuversion

' Aufgabe dieses Makros
' Nach dem Speichern unter einem anderen Dateinamen neue Doku-ID vergeben

' Datenbank und Tabelle der Dokumentenverwaltung
CONST OOoBase = "Doku_Verwaltung"
CONST OOoTabelle = "Dokus"

' Namen der benutzerdefinierten Dokument-Infofelder
CONST Info1 = "Status"
CONST Info2 = "Prüfer"
CONST Info3 = "Prüfdatum"
CONST Info4 = "Doku ID (bitte nicht verändern)"

' Objekte deklarieren
DIM Dokument AS OBJECT
DIM DatabaseContext AS OBJECT
DIM Datenquelle AS OBJECT
DIM Verbindung AS OBJECT
DIM Authentifizierung AS OBJECT
DIM SQL_Anweisung AS OBJECT
DIM Abfrageergebnis AS OBJECT

' Hilfsvariablen
DIM DokuID, Titel, Thema, Keywords, Dokutyp, Autor, Erstelldatum AS STRING
DIM DokuURL, Dokuversion, Aktuelldatum, Dokustatus, Pruefer, Pruefdatum AS STRING
DIM Infofeldname AS STRING
DIM Sql AS STRING
DIM Msg AS STRING

ON ERROR GOTO Fehlerbehandlung

' Datenbankkontext erzeugen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

' Datenquelle für OOo-Registry
Datenquelle = DatabaseContext.getByName(OOoBase)

' bei Bedarf Dialog für Passwortschutz aufrufen
IF NOT Datenquelle.IsPasswordRequired THEN
  Verbindung = Datenquelle.GetConnection("","")' ("Benutzername","Passwort")
ELSE
  Authentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
  Verbindung = Datenquelle.ConnectWithCompletion(Authentifizierung)
END IF

' SQL-Kommunikationskanal für die Dokumentenverwaltung
SQL_Anweisung = Verbindung.createStatement()

' DokuID und Titel ermitteln
Dokument = thisComponent
Infofeldname = Dokument.DocumentInfo.getUserFieldName(3)
DokuID = Dokument.DocumentInfo.getUserFieldValue(3)
Titel = Dokument.DocumentInfo.Title

' Falls DokuID noch nicht vergeben, dann aus Datenbank ermitteln.
' Titel-Feld darf nicht leer sein.
If (Infofeldname <> Info4) OR (DokuID = "") THEN GOTO Ende

' Doku-Version abfragen
' SQL-Befehl "SELECT Version FROM Dokus WHERE ID=DokuID" vorbereiten
Sql = "SELECT "+CHR(34)+"Version"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+CHR(34)
Sql = Sql + " WHERE "+CHR(34)+"ID"+CHR(34)+" = '"+DokuID+"'"
' und ausführen
Abfrageergebnis = SQL_Anweisung.executeQuery(Sql)

' Ergebnis auswerten
IF NOT IsNull(Abfrageergebnis) THEN
  IF Abfrageergebnis.next THEN
    Dokuversion = Abfrageergebnis.getString(1)
  END IF
END IF
Dokuversion = STR(VAL(Dokuversion) + 1) + " (" + DokuID + ")"

' Datensatz erzeugen
' SQL-Befehl "INSERT INTO Dokus (Titel, Erstellt am) VALUES (Titel, Datum)" vorbereiten
Sql = "INSERT INTO "+CHR(34)+OOoTabelle+CHR(34)+" ("+CHR(34)+"Titel"+CHR(34)+", "
Erstelldatum = LTRIM(STR(YEAR(DATE)))+"-"+LTRIM(STR(MONTH(DATE)))+"-"+LTRIM(STR(DAY(DATE)))
Sql = Sql +CHR(34)+"Erstellt am"+CHR(34)+") VALUES ('"+Titel+"', '"+Erstelldatum+"')"
' und ausführen
SQL_Anweisung.executeUpdate(Sql)

' Doku-ID abfragen
' SQL-Befehl "SELECT MAX(ID) FROM Dokus" vorbereiten
Sql = "SELECT MAX("+CHR(34)+"ID"+CHR(34)+") FROM "+CHR(34)+OOoTabelle+CHR(34)
' und ausführen
Abfrageergebnis = SQL_Anweisung.executeQuery(Sql)

' Ergebnis auswerten
IF NOT IsNull(Abfrageergebnis) THEN
  IF Abfrageergebnis.next THEN
    DokuID = Abfrageergebnis.getString(1)
  END IF
END IF

' Doku-ID in Infofeld 4 eintragen
Dokument.DocumentInfo.setUserFieldValue(3 ,DokuID)

' Die weiteren Dokumenteigenschaften ermitteln
Thema = Dokument.DocumentInfo.Subject
Keywords = Dokument.DocumentInfo.Keywords
IF Dokument.SupportsService("com.sun.star.text.TextDocument") THEN Dokutyp = "Textdokument"
IF Dokument.SupportsService("com.sun.star.sheet.SpreadsheetDocument") THEN Dokutyp = "Tabellendokument"
IF Dokument.SupportsService("com.sun.star.presentation.PresentationDocument") THEN
  Dokutyp = "Präsentation"
ELSE
  IF Dokument.SupportsService("com.sun.star.drawing.DrawingDocument") THEN Dokutyp = "Zeichnung"
END IF
IF Dokument.SupportsService("com.sun.star.formula.FormulaProperties") THEN Dokutyp = "Formeldokument"
Autor = Dokument.DocumentInfo.Author
DokuURL = Dokument.getURL()
Dokustatus = Dokument.DocumentInfo.getUserFieldValue(0)
Pruefer = Dokument.DocumentInfo.getUserFieldValue(1)
Pruefdatum = Dokument.DocumentInfo.getUserFieldValue(2)

' Datensatz mit Dokueigenschaften aktualisieren
' SQL-Befehl "UPDATE Dokus SET Feld1=Wert1, Feld2=Wert2, ...
'             WHERE ID=DokuID" vorbereiten
Sql = "UPDATE "+CHR(34)+OOoTabelle+CHR(34)+" SET "+CHR(34)+"Thema"+CHR(34)+" = '"+Thema+"', "
Sql = Sql+ CHR(34)+"Schlüsselwörter"+CHR(34)+" = '"+Keywords+"', "
Sql = Sql+ CHR(34)+"Dokutyp"+CHR(34)+" = '"+Dokutyp+"', "
Sql = Sql+ CHR(34)+"Ersteller"+CHR(34)+" = '"+Autor+"', "
Sql = Sql+ CHR(34)+"URL"+CHR(34)+" = '"+DokuURL+"', "
Sql = Sql+ CHR(34)+"Version"+CHR(34)+" = '"+Dokuversion+"', "
Aktuelldatum = LTRIM(STR(YEAR(DATE)))+"-"+LTRIM(STR(MONTH(DATE)))+"-"+LTRIM(STR(DAY(DATE)))
Sql = Sql+ CHR(34)+"Gespeichert am"+CHR(34)+" = '"+Aktuelldatum+"', "
Sql = Sql+ CHR(34)+"Status"+CHR(34)+" = '"+Dokustatus+"', "
Sql = Sql+ CHR(34)+"Prüfer"+CHR(34)+" = '"+Pruefer+"', "
Sql = Sql+ CHR(34)+"Geprüft am"+CHR(34)+" = '"+Pruefdatum+"' "
Sql = Sql+ " WHERE "+CHR(34)+"ID"+CHR(34)+" = "+DokuID

' und ausführen
SQL_Anweisung.executeUpdate(Sql)

GOTO Ende

Fehlerbehandlung:

IF ERR=423 THEN GOTO Ende ' Datenbank nicht behandeln
Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
MsgBox Msg,16,"Fehler aufgetreten"

Ende:

END SUB

Besondere Lizenzbedingungen für Programmcode

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

5. Anwendungsgebiete

6. Siehe auch


KategorieAllgemeines KategorieMakro KategorieBase KategorieWriter KategorieCalc KategorieGrafik KategorieImpress KategorieMath


LizenzBedingungen | AnbieterKennzeichnung | DatenschutzErklärung | Stand: 2013-04-28