Archiv des LibreOffice- und OpenOffice.org-Wiki

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

Fortlaufende Rechnungsnummer in ein Textdokument einfügen

1. Einsatzzweck dieser Makros

Rechnungen müssen mit fortlaufenden, eindeutigen Nummern erstellt werden.
Es ist deshalb ratsam dies nicht per Handeintrag, sondern automatisch per Makroaufruf erledigen zu lassen.
Ob man das Makro per Button startet oder z.B. dem Ereignis "Sichern als" zuordnet, ist Geschmacksache.

(./) SO6 OOo1.1 OO2.1

1.1. Vorarbeiten

Zum Einfügen der Rechnungsnummer habe ich 2 Varianten entwickelt:

  1. Die Nummer wird an eine Variable übergeben, die in dem Dokument bereits angelegt sein muss.
  2. Die Nummer wird an einer im Makro festgelegten Position eingefügt.

Version 1. würde ich bevorzugen. Sie erfordert zwar etwas mehr Vorarbeit, bietet dafür aber auch Vorteile.

1.1.1. Für Version 1 u. 2

Eine Textdatei (TXT) erstellen, die als einzigen Eintrag die gewünschte Start-Rechnungsnummer, z.B. 1000, enthält.
Den Speicherort und Namen der Datei, z.B. c:\RechNr.txt, merken und diese in das Makro in die Zeile Filename = "c:\RechNr.txt" eintragen.

1.1.2. Nur für Version 1

In der Rechnungsvorlage im Menü Einfügen -> Feldbefehl -> Andere (Strg+F2) den Punkt Variable setzen auswählen.
Bei Name ReNr und bei Wert 0 eintragen, als Format Text wählen.
Dann Einfügen wählen und den Dialog schließen. Die Variable mit Wert 0 wird nun im Dokument angezeigt (evtl. Strg+F9 drücken).

Um sie an einer beliebigen Stelle zu platzieren, fügt man sie am besten in einen TextRahmen ein. Dazu die 0 markieren und das Menü Einfügen -> Rahmen wählen. Die Vorgaben einfach mit OK übernehmen. Der Rahmen kann nun im Dokument beliebig platziert werden.
Vor die 0 kann man evtl. noch einen Text wie "Rechnungs-Nr." einfügen.

1.2. Vorteile Version 1

Die Rechnungsvorlage startet immer mit der Rechnungsnummer 0. Das Makro prüft die Variable und vergibt nur eine neue Rechnungsnummer, wenn der Eintrag 0 ist.
So wird verhindert, dass bei versehentlichem mehrmaligen starten des Makros eine falsche Nummer vergeben wird.
Die Position und Gestaltung des Rahmens kann beim Erzeugen der Vorlage bequem erledigt werden und ist später auch einfach zu ändern.

1.3. Makro 1

option explicit
Sub RechNummerEinfuegen1
        Dim RNummer as Integer
        Dim Zeile as String
        Dim Filename as String
        Dim FileNr as String
        Dim oDoc as Object
        oDoc = thiscomponent
        If GetVariable  (oDoc,"ReNr") <> "0" then Msgbox "Rechnungsnummer schon vergeben" : stop
        Filename = "C:\RechNr.txt"
        FileNr = Freefile
        Open Filename For Input As FileNr
        Line Input #FileNr, Zeile
        Close #FileNr
        RNummer = val(Zeile)
        RNummer = RNummer +1
        FileNr = Freefile
        Open Filename For Output As #FileNr 
        Print #FileNr, str(RNummer)
        Close #FileNr
        ChangeVariable(oDoc,"ReNr",RNummer)
End Sub

Sub ChangeVariable(oDocument as object,Variable,NewContent as String)
  Rem Sub von http://www.dannenhoefer.de mit kleinen Änderungen
  Dim Var as String
  Dim oTextfieldMasters As Object
  Dim oPropSet as Object
  Dim oDependentTextFields as Object
  Dim oXDependentTextField as Object
  Dim oTextFields as Object
  Var ="com.sun.star.text.FieldMaster.SetExpression."+Variable
  oTextfieldMasters = oDocument.getTextFieldMasters()
  oPropSet = oTextfieldMasters.getByName(Var)
  oDependentTextFields = oPropSet.DependentTextFields
  oXDependentTextField = oDependentTextFields(0)
  oXDependentTextField.setPropertyValue("Content", Newcontent)  
  oTextFields = oDocument.getTextFields()
  oTextFields.refresh()
End Sub

Function GetVariable(oDocument as object,Variable) as string
  Rem Funktion von http://www.dannenhoefer.de mit kleinen Änderungen
  Dim Var as String
  Dim oTextfieldMasters As Object
  Dim oPropSet as Object
  Dim oDependentTextFields as Object
  Dim oXDependentTextField as Object
  Dim oTextFields as Object
  Var ="com.sun.star.text.FieldMaster.SetExpression."+Variable
  oTextfieldMasters = oDocument.getTextFieldMasters()
  oPropSet = oTextfieldMasters.getByName(Var)
  oDependentTextFields = oPropSet.DependentTextFields
  oXDependentTextField = oDependentTextFields(0)
  GetVariable= oXDependentTextField.Content
End Function

1.4. Makro 2

option explicit
Sub RechNummerEinfuegen2
        Dim FileNo As Integer
        Dim Zeile As String
        Dim Filename As String
        Dim Nummer as Integer
        Dim oDoc As Object
        Dim oTC As Object
        Dim oRahmen As Object
        Dim oFC As Object
        Filename = "c:\RechNr.txt"
        FileNo = Freefile
        Open Filename For Input As FileNo
        Line Input #FileNo, Zeile
        Close #FileNo
        Nummer = val(Zeile)
        Nummer = Nummer +1
        FileNo = Freefile 
        Open Filename For Output As #FileNo  
        Print #FileNo, str(Nummer) 
        Close #FileNo
        oDoc = StarDesktop.CurrentComponent
        oTC = oDoc.Text.createTextCursor()
        oRahmen = oDoc.createInstance("com.sun.star.text.TextFrame")
        oRahmen.TopMargin = 0
        oRahmen.BottomMargin = 0
        oRahmen.LeftMargin = 0
        oRahmen.RightMargin = 0
        oRahmen.BorderDistance = 0
        oRahmen.Width = 8000
        oRahmen.Height = 1000
        oDoc.Text.insertTextContent(oTC, oRahmen, False)
        oFC = oRahmen.createTextCursor()
        oFC.charWeight = com.sun.star.awt.FontWeight.BOLD
        oFC.paraAdjust = com.sun.star.style.ParagraphAdjust.CENTER
        oFC.String = "RechnungNr. " & Nummer
End Sub

Klaus Reiser 12.12.2004,6.2.2007

(./) OOo2

2. Makro 3, mit Datenbankunterstützung

2.1. Vorarbeiten

In der Rechnungsvorlage im Menü Einfügen → Feldbefehl → Andere (Strg+F2) den Punkt Benutzerfeld auswählen. Bei Name Rechnungsnummer und bei Wert den gewünschten Startwert eintragen, als Format Text wählen. Dann Einfügen wählen und den Dialog schließen. Die Variable wird nun im Dokument mit dem Startwert angezeigt (evtl. Strg+F9 drücken).

2.2. Programmablauf

Das Makro prüft zuerst, ob ein registrierter Datensatz existiert.
Falls ja, dann wird die letzte Rechnungsnummer gelesen und um 1 erhöht, ansonsten wird der Startwert aus dem Benutzerfeld oder einer Dialogbox abgefragt und in der Datenbank ein neuer Datensatz erzeugt.
Die aktualisierte Rechnungsnummer wird sowohl in die Datenbank als auch in das Benutzerfeld geschrieben.

2.3. Verwendung

!WriterVorlagen/Rechnung ↔ !FortlaufendeRechnungsnummer/Makro3 ↔ BaseVorlagen/RegistrierungsDatenbank

Allgemein
Registrierung und Koordinierung von Geschäftsvorfällen wie Angebote, Aufträge, Bestellungen, Lieferungen, Rechnungen, Mahnungen, ...

2.4. Quelltext

SUB RechNummerEinfuegen3

' Aufgabe dieses Makros:
' Letzte Rechnungsnummer aus Datenbank ermitteln, um 1 erhöhen, und den Inhalt
' von Benutzerfeld und Datensatz aktualisieren

' Name des Benutzerfeldes für die Rechnungsnummer
CONST Feldname = "Rechnungsnummer"

' Name des Datenbankschlüssels
CONST RegKey = "Writer/Rechnungsnummer"

' Datenbank und Tabelle der Registrierungsdatenbank
CONST OOoBase = "OOo_Registry"
CONST OOoTabelle = "RegBase"

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

' Registrierung abfragen
' SQL-Befehl "SELECT Value FROM RegBase WHERE Key=RegKey"
' vorbereiten
Sql = "SELECT "+CHR(34)+"Value"+CHR(34)+" FROM "+CHR(34)+OOoTabelle+CHR(34)
Sql = Sql+" WHERE "+CHR(34)+"Key"+CHR(34)+"='"+RegKey+"'"

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

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

    ' Falls Datensatz existiert, dann nächste Rechnungsnummer ermitteln
    Rechnungsnummer = Abfrageergebnis.getString(1)
    Rechnungsnummer = STR(VAL(Rechnungsnummer)+1)

  ELSE

    ' Textfeld RECHNUNGSNUMMER auslesen
    Textdokument = thisComponent
    Textfelder = Textdokument.TextFieldMasters
    Benutzerfeld = "com.sun.star.text.FieldMaster.User." + Feldname
    Rechnungsnummer = Textfelder.getByName(Benutzerfeld).content

    ' Falls Textfeld leer, dann Startwert abfragen
    IF Rechnungsnummer="" THEN
      Rechnungsnummer = INPUTBOX("Startwert für Rechnungsnummer")
    END IF

    ' Datensatz erzeugen
    ' SQL-Befehl "INSERT INTO RegBase (Key) VALUES (RegKey)" vorbereiten
    Sql = "INSERT INTO "+CHR(34)+OOoTabelle+CHR(34)+" ("+CHR(34)+"Key"+CHR(34)
    Sql = Sql +") VALUES ('"+RegKey+"')"

    ' und ausführen
    SQL_Anweisung.executeUpdate(Sql)

  END IF

  ' String numerisch formatieren
  Rechnungsnummer = STR(VAL(Rechnungsnummer))

  ' Datensatz aktualisieren
  ' SQL-Befehl "UPDATE RegBase SET Value=Rechnungsnummer
  ' WHERE Key=RegKey" vorbereiten
  Sql = "UPDATE "+CHR(34)+OOoTabelle+CHR(34)+" SET "
  Sql = Sql + CHR(34)+ "Value"+CHR(34)+" = '"+Rechnungsnummer+"'"
  Sql = Sql + " WHERE "+CHR(34)+"Key"+CHR(34)+" = '"+RegKey+"'"

  ' und ausführen
  SQL_Anweisung.executeUpdate(Sql)

  ' Textfeld aktualisieren
  Textdokument = thisComponent
  Textfelder = Textdokument.TextFieldMasters
  Benutzerfeld = "com.sun.star.text.FieldMaster.User." + Feldname
  Textfelder.getByName(Benutzerfeld).content = Rechnungsnummer
  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.


KategorieMakro KategorieWriter KategorieBase


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