Archiv des LibreOffice- und OpenOffice.org-Wiki

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

(./) OOo2

Adressbuch ergänzen

Das Basicmakro SysAdr_OOoAdr kann alle Adressen aus dem System-AdressBuch ins OOo-Adressbuch kopieren bzw. aktualisieren.

Zuerst wird gleichzeitig eine Verbindung zu den beiden Adressbuchtabellen aufgebaut.
Dann werden mit der SQL-Anweisung SELECT ... FROM ... alle Einträge aus dem System-AdressBuch abgefragt.
Für jeden Eintrag im System-AdressBuch wird im OOo_Adressbuch ...

Windows-System-Adressbuch

OE_Adr_OOoAdr.bas

SUB SysAdr_OOoAdr

' Aufgabe dieses Makros:
' Adressen aus Systemadressbuch nach Office-Adressbuch kopieren

' Datenbank und Tabelle vom Systemadressbuch
CONST Systemadressen = "Adressen"
CONST SysTabelle = "OE Kontakte"

' Datenbank und Tabelle des OOo-Adressbuchs
CONST OOoAdressen = "OOo_Adressbuch"
CONST OOoTabelle = "OOo_Kontakte"

' Deklaration der Datenbankobjekte
DIM DatabaseContext AS OBJECT
DIM DataSource1 AS OBJECT
DIM Connection1 AS OBJECT
DIM InteractionHandler1 AS OBJECT
DIM Statement1 AS OBJECT
DIM ResultSet1 AS OBJECT
DIM DataSource2 AS OBJECT
DIM Connection2 AS OBJECT
DIM InteractionHandler2 AS OBJECT
DIM Statement2 AS OBJECT
DIM ResultSet2 AS OBJECT

' Temporäre Variablen
DIM SQL_Befehl AS STRING

ON ERROR GOTO Fehlerbehandlung

' Datenbankkontext erzeugen
' DataSource1 : Datenquelle für Systemadressbuch
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource1 = DatabaseContext.getByName(Systemadressen)

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

' Statement1  : SQL-Kommunikationskanal für das Systemadressbuch
Statement1 = Connection1.createStatement()

' DataSource2 = Datenquelle für OOo-Adressbuch
DataSource2 = DatabaseContext.getByName(OOoAdressen)

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

' Statement2  : SQL-Kommunikationskanal für dasOOo-Adressbuch
Statement2 = Connection2.createStatement()

' Alle Adressen vom Systemadressbuch abfragen
' SQL-Befehl "SELECT Datenbankfelder FROM Tabellenname" vorbereiten
SQL_Befehl="SELECT "+CHR(34)+"Vorname"+CHR(34)+","+CHR(34)+"Nachname"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Anzeigename"+CHR(34)+","+CHR(34)+"Spitzname"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"E-Mail"+CHR(34)+","+CHR(34)+"Telefon (gesch.)"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Telefon"+CHR(34)+","+CHR(34)+"Fax"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Pager"+CHR(34)+","+CHR(34)+"Handy"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Geschäftsadresse"+CHR(34)+","+CHR(34)+"Stadt (gesch.)"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Bundesland (gesch.)"+CHR(34)+","+CHR(34)+"PLZ (gesch.)"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Land (gesch.)"+CHR(34)+","+CHR(34)+"Titel"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Abteilung"+CHR(34)+","+CHR(34)+"Firma"+CHR(34)+","
SQL_Befehl=SQL_Befehl+CHR(34)+"Web-Seite (gesch.)"+CHR(34)+","+CHR(34)+"Bemerkungen"+CHR(34)+" FROM "+CHR(34)+SysTabelle+CHR(34)

' und ausführen
ResultSet1 = Statement1.executeQuery(SQL_Befehl)

' Alle Adressen aus dem Systemadressbuch auswerten, dazu für jede Adresse:
IF NOT IsNull(ResultSet1) THEN
  WHILE ResultSet1.next
    ' ... prüfen, ob Anzeigename (Primärschlüssel) bereits existiert
    ' SQL-Befehl "SELECT Anzeigename FROM Tabellenname WHERE Anzeigename='aktueller Wert'"
    ' vorbereiten
    SQL_Befehl="SELECT "+CHR(34)+"Anzeigename"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+chr(34)
    SQL_Befehl=SQL_Befehl+" WHERE "+CHR(34)+"Anzeigename"+CHR(34)+" = '"+ResultSet1.getString(3) +"'"
    ' und ausführen
    ResultSet2 = Statement2.executeQuery(SQL_Befehl)

    ' ... falls KEIN Datensatz vorhanden, ergibt ResultSet2.next den Wert false, und es muss
    ' ein Datensatz mit Wert im Feld "Anzeigename" erzeugt werden.
    ' "Anzeigename" ist ein Primärschlüssel es sind keine doppelten Einträge erlaubt.
    ' ResultSet2 enthält entweder genau einen, oder gar keinen Datensatz.
    IF NOT IsNull(ResultSet2) THEN
      IF NOT ResultSet2.next THEN

        ' SQL-Befehl "INSERT INTO Tabellenname (Anzeigename) VALUES ('aktueller Wert')"
        ' vorbereiten
        SQL_Befehl="INSERT INTO "+CHR(34)+OOoTabelle+CHR(34)+" ("+CHR(34)+"Anzeigename"+CHR(34)
        SQL_Befehl=SQL_Befehl+") VALUES ('"+ResultSet1.getString(3)+"')"
        ' und ausführen
        Statement2.executeUpdate(SQL_Befehl)

      END IF
    END IF

    ' Datensatz mit Anzeigename aktualisieren
    ' SQL-Befehl "UPDATE Tabellenname SET Feld1=Wert1, Feld2=Wert2, ...
    '             WHERE Anzeigename='aktueller Wert'" vorbereiten
    SQL_Befehl = "UPDATE "+CHR(34)+OOoTabelle+CHR(34)+" SET "+CHR(34)+"Vorname"+CHR(34)+" = '"+ResultSet1.getString(1)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Name"+CHR(34)+" = '"+ResultSet1.getString(2)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Kürzel"+CHR(34)+" = '"+ResultSet1.getString(4)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Email"+CHR(34)+" = '"+ResultSet1.getString(5)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Telefon gesch."+CHR(34)+" = '"+ResultSet1.getString(6)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Telefon priv."+CHR(34)+" = '"+ResultSet1.getString(7)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"FAX"+CHR(34)+" = '"+ResultSet1.getString(8)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Telefon Funk"+CHR(34)+" = '"+ResultSet1.getString(9)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Handy"+CHR(34)+" = '"+ResultSet1.getString(10)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Straße"+CHR(34)+" = '"+ResultSet1.getString(11)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Ort"+CHR(34)+" = '"+ResultSet1.getString(12)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Bund.land"+CHR(34)+" = '"+ResultSet1.getString(13)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"PLZ"+CHR(34)+" = '"+ResultSet1.getString(14)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Land"+CHR(34)+" = '"+ResultSet1.getString(15)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Position"+CHR(34)+" = '"+ResultSet1.getString(16)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Abteilung"+CHR(34)+" = '"+ResultSet1.getString(17)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Firma"+CHR(34)+" = '"+ResultSet1.getString(18)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"URL"+CHR(34)+" = '"+ResultSet1.getString(19)+"', "
    SQL_Befehl=SQL_Befehl+CHR(34)+"Notiz"+CHR(34)+" = '"+ResultSet1.getString(20)+"'"
    SQL_Befehl=SQL_Befehl+" WHERE "+CHR(34)+"Anzeigename"+CHR(34)+" = '"+ResultSet1.getString(3)+"'"

    ' und ausführen
    Statement2.executeUpdate(SQL_Befehl)

  WEND ' nächster Datensatz aus dem Systemadressbuch
END IF

GOTO Ende

Fehlerbehandlung:
MsgBox "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW , 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.

Hinweise zur individuellen Anpassung

> ' Alle Adressen vom Systemadressbuch abfragen
Die Kontakt-Gruppen des Windows-System-Adressbuchs werden wie normale Kontakte übertragen. Um die Kontakt-Gruppen auszublenden kann man an der SELECT-Anweisung eine entsprechende WHERE-Klausel anhängen.

> ' Datensatz mit Anzeigename aktualisieren
Die UPDATE-Anweisung lässt sich bedingt zusammensetzen. Z. B. kann man mit

IF ResultSet1.getString(...) <> "" THEN SQL_Befehl = SQL_Befehl+ ...

die leeren Felder im System-AdressBuch bei der Übertragung ausblenden.

> ' SQL-Befehl "INSERT INTO Tabellenname (Anzeigename) VALUES ('aktueller Wert')" vorbereiten
Durch Hinzufügen von Datenbankfeldern und Werten in der INSERT INTO-Anweisung lassen sich Adressfelder im OOo-Adressbuch vorbelegen.

Outlook-Adressbuch

OP_Adr_OOoAdr.bas

Mit 3 Änderungen lässt sich das Makro an das Outlook®-Adressbuch anpassen:

  1. Am Anfang des Makros mit CONST SysTabelle = "OP Kontakte" den Tabellenname des Outlook-Adressbuches anpassen

  2. In der ersten SELECT-Anweisung das Feld Bemerkungen entfernen mit: SQL_Befehl=SQL_Befehl+CHR(34)+"Web-Seite (gesch.)"+CHR(34)+" FROM "+CHR(34)+SysTabelle+CHR(34)

  3. In der UPDATE-Anweisung am Schluss des Makros das Feld Notiz entfernen, in dem in der Zeile SQL_Befehl=SQL_Befehl+CHR(34)+"URL"+CHR(34)+" = '"+ResultSet1.getString(19)+"'" das Komma am Ende, und die Folgezeile (SQL_Befehl=SQL_Befehl+CHR(34)+"Notiz"+CHR(34)+" = '"+ResultSet1.getString(20)+"'") ganz gelöscht werden.

Anwendungsbeispiele

System-AdressBuchAdressbuchMakroBaseVorlagen/AdressBuch

Siehe auch


KategorieBase KategorieMakro


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