Archiv des LibreOffice- und OpenOffice.org-Wiki

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

(./) OOo2

Datenaustausch zwischen Geschäftsbrief und Adressdatenbank

GeschäftsbriefMakro.bas

Die Makros nutzen beispielhaft die Datenbankfelder Vorname, Nachname, Firma, Straße, PLZ, Ort, Land, Titel, Anrede und Grußformel der Adressdatenbank.

Vorbereitung

In der Writervorlage (Geschäftsbrief, Fax, ...) die entsprechenden Platzhalter im Adress- und Brieftextbereich durch Benutzerfelder ersetzen.
Die Beispielvorlage WriterVorlagen/GeschäftsbriefVorlage.ott enthält die oben angegebenen Benutzerfelder. Die Feldnamen entsprechen den zugeordneten Datenbankfeldern. Außerdem wurde der Feldname als Wert (BlindText) vordefiniert, damit die Benutzerfelder für das Editieren leichter auffindbar sind. Der BlindText wird vom Makro ausgeblendet, und damit wie inhaltsleer behandelt.

Adressdaten aus Adressdatenbank in Geschäftsbrief laden

Das Makro geht beispielhaft davon aus, dass die Kombination aus Firma, Vorname und Nachname wie ein Primärschlüssel einmalig ist.

Der Inhalt dieser Felder wird ausgelesen. Dann werden per SQL-Anweisung SELECT Datenbankfelder FROM Tabellenname
WHERE ("Vorname" LIKE '%...%') AND ("Name" LIKE '%...%') AND ("Firma" LIKE '%...%') die darauf passenden Adressdatensätze abgefragt und der Reihe nach in einer Dialogbox vorgeschlagen. Mit der Antwort Ja wird der vorgeschlagene Adressdatensatz in den Geschäftbrief übernommen. Leere Benutzerfelder, für die die Adressdatenbank noch keine Daten bereitstellt, erhalten wieder ihren Feldnamen als BlindText.

SUB Adressdaten_laden

' Aufgabe dieses Makros:
' Entsprechend der Kombination FIRMA|VORNAME|NACHNAME passenden Adressdatensatz
' suchen, und den Inhalt der Benutzerfelder vervollständigen

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

' Objekte deklarieren
DIM Textdokument AS OBJECT
DIM Textfelder 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 Benutzerfeld, Vorname, Nachname, Firma, Adresse AS STRING
DIM Plz, Ort, Land, Titel, Anrede, Grussformel AS STRING
DIM Sql AS STRING
DIM Msg AS STRING
DIM I AS INTEGER

ON ERROR GOTO Fehlerbehandlung

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

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

' 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 dasOOo-Adressbuch
SQL_Anweisung = Verbindung.createStatement()

' Textfelder VORNAME, NACHNAME und FIRMA auslesen
Textdokument = thisComponent
Textfelder = Textdokument.TextFieldMasters
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Vorname"
Vorname = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Nachname"
Nachname = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Firma"
Firma = Textfelder.getByName(Benutzerfeld).content

' Vordefinierten Blindtext ausblenden
IF Vorname = "Vorname" THEN Vorname = ""
IF Nachname = "Nachname" THEN Nachname = ""
IF Firma = "Firma" THEN Firma = ""

' Die nicht abgefragten Benutzerfelder:

' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Adresse"
' Adresse = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.PLZ"
' Plz = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Ort"
' Ort = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Land"
' Land = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Titel"
' Titel = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Anrede"
' Anrede = Textfelder.getByName(Benutzerfeld).content
' Benutzerfeld = "com.sun.star.text.FieldMaster.User.Grußformel"
' Grussformel = Textfelder.getByName(Benutzerfeld).content

' IF Adresse = "Adresse" THEN Adresse = ""
' IF Plz = "PLZ" THEN Plz = ""
' IF Ort = "Ort" THEN Ort = ""
' IF Land = "Land" THEN Land = ""
' IF Titel = "Titel" THEN Titel = ""
' IF Anrede = "Anrede" THEN Anrede = ""
' IF Grussformel = "Grußformel" THEN Grussformel = ""

' Adressdatenbank abfragen
' SQL-Befehl "SELECT Datenbankfelder FROM Tabellenname
'             WHERE (Vorname LIKE '%...%')AND(Name LIKE '%...%')AND(Firma LIKE '%...%')"
' vorbereiten
Sql = "SELECT "+CHR(34)+"Vorname"+CHR(34)+","+CHR(34)+"Name"+CHR(34)+","+CHR(34)+"Firma"+CHR(34)+","
Sql = Sql+CHR(34)+"Straße"+CHR(34)+","+CHR(34)+"PLZ"+CHR(34)+","+CHR(34)+"Ort"+CHR(34)+","
Sql = Sql+CHR(34)+"Land"+CHR(34)+","+CHR(34)+"Titel"+CHR(34)+","+CHR(34)+"Anrede"+CHR(34)+","
Sql = Sql+CHR(34)+"Grußformel"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+CHR(34)
Sql = Sql+" WHERE ("+CHR(34)+"Vorname"+CHR(34)+" LIKE '%"+Vorname+"%') AND ("
Sql = Sql+CHR(34)+"Name"+CHR(34)+" LIKE '%"+Nachname+"%') AND ("
Sql = Sql+CHR(34)+"Firma"+CHR(34)+" LIKE '%"+Firma+"%')"

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

' Ergebnis auswerten
IF NOT IsNull(Abfrageergebnis) THEN
  DO
    IF Abfrageergebnis.next THEN

      ' Falls ein Datensatz existiert, dann zwischenspeichern
      Vorname = Abfrageergebnis.getString(1)
      Nachname = Abfrageergebnis.getString(2)
      Firma = Abfrageergebnis.getString(3)
      Adresse = Abfrageergebnis.getString(4)
      Plz = Abfrageergebnis.getString(5)
      Ort = Abfrageergebnis.getString(6)
      Land = Abfrageergebnis.getString(7)
      Titel = Abfrageergebnis.getString(8)
      Anrede = Abfrageergebnis.getString(9)
      Grussformel = Abfrageergebnis.getString(10)

      Msg = "Vorname: "+Vorname+CHR(13)+"Nachname: "+Nachname+CHR(13)+"Firma:    "+Firma
      I = MSGBOX(Msg,291,"Datensatz übernehmen?") ' Fragezeichen, Ja|Nein|Abbrechen
      IF (I=2) OR (I=3) THEN EXIT DO ' Abbrechen gewählt
      IF I=6 THEN ' Ja gewählt
    
        ' Leere Adressdatenfelder wieder mit Blindtext füllen
        IF Vorname = "" THEN Vorname = "Vorname"
        IF Nachname = "" THEN Nachname = "Nachname"
        IF Firma = "" THEN Firma = "Firma"
        IF Adresse = "" THEN Adresse = "Adresse"
        IF Plz = "" THEN Plz = "PLZ"
        IF Ort = "" THEN Ort = "Ort"
        IF Land = "" THEN Land = "Land"
        IF Titel = "" THEN Titel = "Titel"
        IF Anrede = "" THEN Anrede = "Anrede"
        IF Grussformel = "" THEN Grussformel = "Grußformel"

        ' Ermittelte Werte in die Benutzerfelder schreiben
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Vorname"
        Textfelder.getByName(Benutzerfeld).content = Vorname
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Nachname"
        Textfelder.getByName(Benutzerfeld).content = Nachname
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Firma"
        Textfelder.getByName(Benutzerfeld).content = Firma
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Adresse"
        Textfelder.getByName(Benutzerfeld).content = Adresse
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.PLZ"
        Textfelder.getByName(Benutzerfeld).content = Plz
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Ort"
        Textfelder.getByName(Benutzerfeld).content = Ort
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Land"
        Textfelder.getByName(Benutzerfeld).content = Land
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Titel"
        Textfelder.getByName(Benutzerfeld).content = Titel
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Anrede"
        Textfelder.getByName(Benutzerfeld).content = Anrede
        Benutzerfeld = "com.sun.star.text.FieldMaster.User.Grußformel"
        Textfelder.getByName(Benutzerfeld).content = Grussformel

        ' Auf dem Bildschirm die Anzeige der Benutzerfelder aktualisieren
        Textdokument.textfields.refresh()

        EXIT DO
      END IF
    ELSE
      ' Kein Datensatz gefunden, oder alle Vorschläge abgelehnt
      Msg = "Überprüfen Sie die eingegebenen Daten in den "+CHR(13)
      Msg = Msg + "Feldern VORNAME, NACHNAME und FIRMA"
      MSGBOX Msg,16,"Kein Datensatz gefunden."
      EXIT DO
    END IF
    
    ' Falls Nein gewählt, nächster Datensatz
  LOOP
END IF

GOTO Ende

Fehlerbehandlung:
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.

Adressdatensatz in Adressdatenbank aktualisieren

Hier wird der Geschäftsbrief nebenbei zum Eingabeformular für die Adressdatenbank.

Das Makro geht beispielhaft davon aus, dass die Kombination aus Firma, Vorname und Nachname wie ein Primärschlüssel einmalig ist.

Der Inhalt dieser Felder wird ausgelesen. Dann wird per SQL-Anweisung SELECT "Anzeigename" FROM "Tabellenname" WHERE ("Vorname" = '...') AND ("Name" = '...') AND ("Firma" = '...') geprüft, ob der darauf passende Adressdatensatz bereits existiert. Falls nicht wird ein neuer Primärschlüssel Firma (Nachname, Vorname) generiert und dann mit der SQL-Anweisung INSERT INTO "Tabellenname" ("Anzeigename") VALUES ('Primärschlüssel') ein neuer Adressdatensatz erzeugt. Anschließend werden mit der SQL-Anweisung UPDATE "Tabellenname" SET Feld1=Wert1, Feld2=Wert2, ... WHERE "Anzeigename" = 'Primärschlüssel' die Adressdaten aktualisiert, und die Benutzerfelder mit BlindText geleert.

SUB Adressdaten_speichern

' Aufgabe dieses Makros:
' Entsprechend der Kombination FIRMA|VORNAME|NACHNAME den passenden Adressdatensatz
' aktualisieren, ggf. einen neuen Adressdatensatz erzeugen

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

' Objekte deklarieren
DIM Textdokument AS OBJECT
DIM Textfelder 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 Benutzerfeld, Vorname, Nachname, Anzeigename, Firma AS STRING
DIM Adresse, Plz, Ort, Land, Titel, Anrede, Grussformel AS STRING
DIM Sql AS STRING
DIM Msg AS STRING
DIM I AS INTEGER

ON ERROR GOTO Fehlerbehandlung

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

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

' 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 dasOOo-Adressbuch
SQL_Anweisung = Verbindung.createStatement()

' Alle Textfelder auslesen
Textdokument = thisComponent
Textfelder = Textdokument.TextFieldMasters
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Vorname"
Vorname = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Nachname"
Nachname = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Firma"
Firma = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld ="com.sun.star.text.FieldMaster.User.Adresse"
Adresse = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.PLZ"
Plz = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Ort"
Ort = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Land"
Land = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Titel"
Titel = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Anrede"
Anrede = Textfelder.getByName(Benutzerfeld).content
Benutzerfeld = "com.sun.star.text.FieldMaster.User.Grußformel"
Grussformel = Textfelder.getByName(Benutzerfeld).content

' Vordefinierten Blindtext ausblenden
IF Vorname = "Vorname" THEN Vorname = ""
IF Nachname = "Nachname" THEN Nachname = ""
IF Firma = "Firma" THEN Firma = ""
IF Adresse = "Adresse" THEN Adresse = ""
IF Plz = "PLZ" THEN Plz = ""
IF Ort = "Ort" THEN Ort = ""
IF Land = "Land" THEN Land = ""
IF Titel = "Titel" THEN Titel = ""
IF Anrede = "Anrede" THEN Anrede = ""
IF Grussformel = "Grußformel" THEN Grussformel = ""

' Prüfen, ob Kombination aus VORNAME, NACHNAME und FIRMA bereits existiert
' SQL-Befehl "SELECT Anzeigename FROM Tabellenname
'             WHERE (Vorname = '...')AND(Name = '...')AND(Firma = '...')"
' vorbereiten
Sql = "SELECT "+CHR(34)+"Anzeigename"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+CHR(34)
Sql = Sql+" WHERE ("+CHR(34)+"Vorname"+CHR(34)+" = '"+Vorname+"') AND ("
Sql = Sql+CHR(34)+"Name"+CHR(34)+" = '"+Nachname+"') AND ("
Sql = Sql+CHR(34)+"Firma"+CHR(34)+" = '"+Firma+"')"

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

' Ergebnis auswerten
IF NOT IsNull(Abfrageergebnis) THEN
  IF Abfrageergebnis.next THEN
    ' Falls Datensatz existiert, dann Primärschlüssel ANZEIGENAME ermitteln
    Anzeigename = Abfrageergebnis.getString(1)
  ELSE
    ' ansonsten ...
    ' Primärschlüssel aus FIRMA (NACHNAME, VORNAME) zusammensetzen
    Anzeigename = ""
    IF Firma<>"" THEN Anzeigename = Firma+" ("
    Anzeigename = Anzeigename + Nachname + ", " + Vorname
    IF Firma<>"" THEN Anzeigename = Anzeigename+")"
    
    ' Neuen Adressdatensatz erzeugen
    ' SQL-Befehl "INSERT INTO Tabellenname (Anzeigename) VALUES ('aktueller Wert')" vorbereiten
    Sql = "INSERT INTO "+CHR(34)+OOoTabelle+CHR(34)+" ("+CHR(34)+"Anzeigename"+CHR(34)
    Sql = Sql +") VALUES ('"+Anzeigename+"')"
    ' und ausführen
    SQL_Anweisung.executeUpdate(Sql)
  END IF
  ' Adressdatensatz aktualisieren
  ' SQL-Befehl "UPDATE Tabellenname SET Feld1=Wert1, Feld2=Wert2, ...
  '             WHERE Anzeigename='aktueller Wert'" vorbereiten
  Sql = "UPDATE "+CHR(34)+OOoTabelle+CHR(34)+" SET "
  Sql = Sql + CHR(34)+ "Vorname"+CHR(34)+" = '"+Vorname+"', "
  Sql = Sql + CHR(34)+ "Name"+CHR(34)+" = '"+Nachname+"', "
  Sql = Sql + CHR(34)+ "Firma"+CHR(34)+" = '"+Firma+"', "
  Sql = Sql + CHR(34)+ "Straße"+CHR(34)+" = '"+Adresse+"', "
  Sql = Sql + CHR(34)+ "PLZ"+CHR(34)+" = '"+Plz+"', "
  Sql = Sql + CHR(34)+ "Ort"+CHR(34)+" = '"+Ort+"', "
  Sql = Sql + CHR(34)+ "Land"+CHR(34)+" = '"+Land+"', "
  Sql = Sql + CHR(34)+ "Titel"+CHR(34)+" = '"+Titel+"', "
  Sql = Sql + CHR(34)+ "Anrede"+CHR(34)+" = '"+Anrede+"', "
  Sql = Sql + CHR(34)+ "Grußformel"+CHR(34)+" = '"+Grussformel+"'"
  Sql = Sql + " WHERE "+CHR(34)+"Anzeigename"+CHR(34)+" = '"+Anzeigename+"'"

  ' und ausführen
  SQL_Anweisung.executeUpdate(Sql)

  ' Ggf. aktualisierte Werte in die Benutzerfelder schreiben
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Vorname"
  Textfelder.getByName(Benutzerfeld).content = Vorname
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Nachname"
  Textfelder.getByName(Benutzerfeld).content = Nachname
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Firma"
  Textfelder.getByName(Benutzerfeld).content = Firma
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Adresse"
  Textfelder.getByName(Benutzerfeld).content = Adresse
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.PLZ"
  Textfelder.getByName(Benutzerfeld).content = Plz
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Ort"
  Textfelder.getByName(Benutzerfeld).content = Ort
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Land"
  Textfelder.getByName(Benutzerfeld).content = Land
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Titel"
  Textfelder.getByName(Benutzerfeld).content = Titel
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Anrede"
  Textfelder.getByName(Benutzerfeld).content = Anrede
  Benutzerfeld = "com.sun.star.text.FieldMaster.User.Grußformel"
  Textfelder.getByName(Benutzerfeld).content = Grussformel

  ' Auf dem Bildschirm die Anzeige der Benutzerfelder aktualisieren
  Textdokument.textfields.refresh()
END IF

GOTO Ende

Fehlerbehandlung:
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.

Anwendungsbeispiele

WriterVorlagen/GeschäftsbriefVorlage.ottGeschäftsbriefMakroBaseVorlagen/AdressBuch


KategorieBase KategorieMakro


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