Moin zusammen,
ich habe jetzt die vergangenen 6 Jahre nach der Möglichkeit durchsucht, in mehrseitige Rechnungen einen Übertrag einzufügen.
Habe ich die Lösung einfach übersehen?
Für Hilfe wäre ich echt dankbar!
Moin,
nein, da hast Du nichts übersehen. Das Problem ist aber leider zur Zeit für mich unlösbar. Es besteht schon seit Anfang an... :-/
Viele Grüße
Ralf.
Wichtige Infos zum Posten im Forum.
Fehler gefunden?
Eine automatische Zwischensumme / Übertrag bei Seitenwechsel wäre wirklich sehr nützlich, insbesondere bei Langen Schlussrechnungen im Handwerk bzw. Baubereich. Es gibt dazu ja schon seit längerem einen entsprechenden Feature- Wunsch: #173
Bis hierzu aber eine technische Lösung gefunden ist, könnte man ja ggf. zumindest schon mal eine Möglichkeit zum manuellen Einfügen von Zwischensummen schaffen!?
Insofern ist dieses Tiket ja auch verwandt zu: #728 bez. Titelüberschriften & Summen, so wie #319 Textpositionen etc. Welche sich ja vermutlich alle auf Grundlage des selben Technik umsetzten ließen... Nur eben mit Ausgabe über unterschiedliche Platzhalter, so das diese in der Vorlage beliebig Formatiert werden können.
Mann müsste also m.E. folgende "Sonderpositionen" in die Artikeltabelle einfügen können:
- Titelanfang = Überschrift zu den nachfolgenden Artikeln.
- Titelende = Summe zischenstehender Artikel seit Titelanfang.
- Textposition = Textfeld für Hinweise, Erläuterungen etc.
- Seitenumbruch = erzwungener Seitenumbruch (Strg + Enter)
- Zwischensumme = Summe aller vorstehenden Positionen.
- Übertrag = Zwischensumme + Seitenumbruch + Wiederholung der Summe als Übertrag
Beste Grüße,
Matthew
Fakturama 2.1.3 auf Win10 pro x64 an MariaDB auf ner DiskStation
Hallo liebe Community,
ich bin neu hier - dies ist mein erster Post im Forum. Erstmal meinen großen Respekt und Dank an die Entwickler. Ein tolles Tool mit vielen pfiffigen Features!
Meine Recherche hat ergeben, dass das Thema Übertrag/ Zwischensumme bei mehrseitigen Rechnungen offensichtlich ein Dauerthema ist:
https://www.fakturama.info/community/allgemeines/uebertrag-vortrag-bei-mehrseitigen-rechnungen/
https://www.fakturama.info/community/allgemeines/zwischensumme-uebertrag/
https://www.fakturama.info/community/allgemeines/uebertrag-mit-in-der-rechnungsvorlage/
https://www.fakturama.info/community/fakturama-2/uebertrag-in-rechnung-einfuegen/
Ich habe mich mal an den letztgenannten Thread angehängt, da dieser am aktuellsten ist.
Siehe auch Feature-Request #173:
https://bugs.fakturama.info/view.php?id=173
Aktuell sehe ich zwei Möglichkeiten:
A) Eine Lösung in Fakturama
Idee: Fakturama erzeugt einen Dummy-Ausdruck via OpenOffice in ein Temp-Verzeichnis und wertet diesen aus:
- Seitenanzahl
- Ersteckt sich die Tabelle, die die Einzelpositionen enthält, über mehrere Seiten und wenn ja über wie viele?
Wenn ja, füge jeweils am Ende der Seite eine Zwischensumme mit dem Übertrag ein. Evtl. reserviert man dafür im OO-Template einen freien Bereich am Ende der Seite.
(Die Frage dabei ist, ob man damit eine flexible Lösung für ALLE möglichen Writer-Templates kreieren kann oder ob man sich damit zu stark einschränkt.)
B) Eine Lösung rein übers Open-/ LibreOffice-Template mit Hilfe von Makros
Das Makro tut dasselbe wie Fakturama in Variante A) und prüft, ob Tabelle sich mit den Einzelpositionen über mehrere Seiten erstreckt und erzeugt bei Bedarf dann eine Zwischensumme am Ende der Seite.
Mfg
Hallo Leute,
ich habe ich mich mal auf Variante B) fokussiert. Diese basiert auf einem LibreOffice-Basic-Makro. Der Übertrag / die Zwischensumme wird per Formel in der letzten Zeile der Seite eingefügt. Die Rechnung kann so dutzende Seiten haben. Auch eine mehrzeilige Artikelbeschreibung stellt kein Problem dar.
Hier also mein Vorschlag:
REM ** Code: LibreOffice BASIC **
REM ZwischenSumme.bas v0.9
REM Getestet mit LibreOffice v6.4.6.2
Option Explicit
REM Hier kann festgelegt werden, was als Text in der Zwischensummenzeile stehen soll, z.B.: "Übertrag: "
Const LabelFuerZwSumme As String = "Zwischensumme: "
Const OhneTextAuswahl As Boolean = False
Private oDoc As Object
Private oMeinViewCursor As Object
Private oTables As Object
Private oItemTabelle As Object
Private oTabellenZeilen As Object
Private AktuelleSeite As Integer
Private Kopfzeilen As Integer
Private ErsteDatenZeile As Integer
Private AktuelleDatenZeile As Integer
Private LetzteZeile As Integer
Private LetzteSpalte As Integer
Private LetzteSpalteAlsIndex As Integer
Private LetzteSpalteAlsBuchst As String
Private ZeileFuerVorigeZwSumme As Integer
Private ZelleFuerZwSumme As String
Private ZelleFuerVorigeZwSumme As String
Sub Main
REM Das aktuell ausgewaehlte Dokument:
oDoc = thisComponent
REM Erzeuge eine Objektinstanz des sichtbaren Cursors = View Cursor
oMeinViewCursor = oDoc.GetCurrentController.ViewCursor
REM Alle Tabellen des Dokumentes
oTables = oDoc.getTextTables
REM Eine bestimmte Tabelle anhand des Namens in eine Variable einlesen
oItemTabelle = oTables.getByName("Table_Items")
REM Pruefe, ob das Dokument mehrere Seiten enthaelt.
If IstDokumentMehrseitig Then
REM Falls Dokument mehrseitig ...
If IstTabelleMehrseitig = True Then
REM Falls die Item-Tabelle sich über mehr als eine Seite erstreckt ...
REM Anzahl Spalten:
LetzteSpalte = oItemTabelle.getColumns().getcount()
LetzteSpalteAlsIndex = LetzteSpalte -1
LetzteSpalteAlsBuchst = Chr(LetzteSpalteAlsIndex +65)
oTabellenZeilen = oItemTabelle.getRows
REM Anzahl Zeilen:
LetzteZeile = oTabellenZeilen.Count
REM Sind in der Tabelle Kopfzeilen definiert? Wieviele?
Kopfzeilen = oItemTabelle.HeaderRowCount
REM Die erste Zeile mit ersten Daten kommt unter dem Header
ErsteDatenZeile = Kopfzeilen +1
REM Starte die Ueberpruefung mit der ersten Datenzeile
AktuelleDatenZeile = ErsteDatenZeile
REM Fuehre die Schleife solange aus, bis die letzte Zeile der Tabelle erreicht ist.
Do While AktuelleDatenZeile <= LetzteZeile
REM Befindet sich die zu pruefende Datenzeile auf einer neuen Seite, dann gehe eins zurueck
REM und fuege eine Zwischensumme ein.
If ErsteDatenZeile +1 > 2 AND IstZeileAufNeuerSeite(AktuelleDatenZeile) Then ZwischenSumme_einfuegen (AktuelleDatenZeile -1)
REM Inkrementieren fuer naechste Zeile
AktuelleDatenZeile = AktuelleDatenZeile +1
Loop
EndIf
EndIf
End Sub REM Ende Main
'########################
Function IstDokumentMehrseitig As Boolean
Dim SeitenAnz As Integer
SeitenAnz = oDoc.CurrentController.PageCount
If SeitenAnz > 1 Then
REM "Mehrseitiges Dokument
IstDokumentMehrseitig = True
ElseIf SeitenAnz = 1 Then
IstDokumentMehrseitig = False
Else MsgBox "Fehler beim Auswerten der Seitenanzahl."
EndIf
End Function
Function IstTabelleMehrseitig As Boolean
Dim oErsteZelle As Object
Dim AnfangsSeite As Integer
Dim EndeSeite As Integer
REM Die erste Zelle als Objekt in eine Variable einlesen
oErsteZelle = oItemTabelle.getCellByName("A1")
REM Setze den View Cursor an den Anfang der Tabelle
oMeinViewCursor.gotoRange(oErsteZelle, OhneTextAuswahl)
REM Ermittle mit Hilfe des sichtbaren Cursors, auf welcher Seite die Tabelle anfaengt
AnfangsSeite = oMeinViewCursor.getPage()
REM Bringe nun den View Cursor ans Ende des Text-Bereiches (in diesem Falle: die Tabelle Table_Items)
oMeinViewCursor.gotoEnd(OhneTextAuswahl)
REM Ermittle, auf welcher Seite die Tabelle endet
EndeSeite = oMeinViewCursor.getPage()
REM Pruefe, ob sich die Tabelle Table_Items ueber mehrere Seiten erstreckt.
If EndeSeite > AnfangsSeite Then
IstTabelleMehrseitig = True
Else IstTabelleMehrseitig = False
EndIf
REM Erstmalige Zuweisung der Laufvariable AktuelleSeite - wichtig fuer Function IstZeileAufNeuerSeite
AktuelleSeite = AnfangsSeite
End Function
Function IstZeileAufNeuerSeite(AktuelleDatenZeile) as Boolean
Dim VorigeSeite As Integer
Dim AktuelleDatenZelle As Object
REM Auf welcher Seite war die vorige Zeile? Wert wird gesichert
VorigeSeite = AktuelleSeite
AktuelleDatenZelle = oItemTabelle.getCellByName("A" & AktuelleDatenZeile)
oMeinViewCursor.gotoRange(AktuelleDatenZelle, OhneTextAuswahl)
AktuelleSeite = oMeinViewCursor.getPage()
If AktuelleSeite > VorigeSeite Then
IstZeileAufNeuerSeite = True
Else IstZeileAufNeuerSeite = False
EndIf
End Function
Sub ZwischenSumme_einfuegen (ZeileFuerZwSumme As Integer)
Dim oEinTextCursor As Object
Dim oZeileNachZwSumme As Object
Dim SummenFormel As String
Dim VorigeSummenFormel As String
If ZeileFuerZwSumme - Kopfzeilen = 1 Then
REM Fuer den seltenen Anwendungsfall, dass die erste Datenzeile (inkl. Header) sich allein auf einer Seite befindet,
REM die naechste Datenzeile aber bereits auf der naechsten Seite, fuege keine Zwischensumme ein, sondern brich
REM die gesamte Tabelle auf die naechste Seite um.
oItemTabelle.BreakType = 4
Else
REM Fuege Zwischensumme in die Tabelle ein ...
REM Der erste Wert ist die Zeilennummer in der Tabelle.
REM Ist der Wert 0, wird am Anfang der Tabelle eingefuegt
REM Der zweite Wert gibt an, wieviele Zeilen eingefügt werden sollen.
oTabellenZeilen.insertByIndex(ZeileFuerZwSumme -1, 1)
REM Text einfügen - erste Zahl ist die Spalte, die zweite Zahl adressiert die Zeile
REM ... beginnend bei 0.
REM Fuege in die zweite Spalte das Label fuer die Zwischensumme ein
oItemTabelle.getCellbyPosition(1, ZeileFuerZwSumme -1).setString(LabelFuerZwSumme)
REM Formatierung wird geaendert (Fett, Kursiv, Ausrichtung rechts):
oEinTextCursor = oItemTabelle.createCursorByCellName("B" & CStr(ZeileFuerZwSumme))
oEinTextCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
oEinTextCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC
oEinTextCursor.ParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
ZelleFuerZwSumme = LetzteSpalteAlsBuchst & ZeileFuerZwSumme
REM Formula zusammenbauen
If ZelleFuerVorigeZwSumme = "" Then
REM Falls es sich um die erste Zwischensumme handelt (es also keine vorige Zwischensumme gab) ...
SummenFormel = "sum <" & LetzteSpalteAlsBuchst & ErsteDatenZeile & ":" & LetzteSpalteAlsBuchst & ZeileFuerZwSumme -1 & ">"
Else
REM Falls nicht, muss die vorhergehende Zwischensumme mit dazu addiert werden.
REM Beispiel sum<D8;D9:D39>
SummenFormel = "sum <" & ZelleFuerVorigeZwSumme & ";" &_
LetzteSpalteAlsBuchst & ZeileFuerVorigeZwSumme +1 & ":"& LetzteSpalteAlsBuchst & ZeileFuerZwSumme -1 & ">"
EndIf
REM Formel wird in der letzen Spalte eingefuegt.
oItemTabelle.getCellbyPosition(LetzteSpalteAlsIndex, ZeileFuerZwSumme -1).setFormula(SummenFormel)
REM Da es Tabellenzeilen mit mehreren Zeilenvorschueben existieren,
REM wird hier ein Zeilenumbruch innerhalb der TabellenZeile fuer die der Zwischensumme nachfolgende Zeile verhindert.
oZeileNachZwSumme = oTabellenZeilen.getByIndex(ZeileFuerZwSumme)
oZeileNachZwSumme.IsSplitAllowed = False
REM Sichern des Namens der Zeile, in der die Zwischensumme eingefuegt wurde.
ZeileFuerVorigeZwSumme = ZeileFuerZwSumme
REM Sichern des Namens der Zelle, in der die Formel fuer die Zwischensumme eingefuegt wurde.
REM (Diese Werte werden gebraucht, falls es weitere Iterationen gibt.)
ZelleFuerVorigeZwSumme = ZelleFuerZwSumme
REM Durch das Einfuegen der Zwischensumme verschiebt sich die letzte Zeile um 1 nach unten
LetzteZeile = LetzteZeile +1
EndIf
End Sub
Das hat bei mir gut funktioniert. Es kann natürlich sein, dass ich was übersehen habe. Zum Testen bräuchte daher mal die Community.
Viele Grüße
Holger
Also da hast Du Dir richtig Mühe gemacht - vielen Dank dafür
Ich werde versuchen das die nächsten Tage mal unter Windows zu testen.
LG
Jürgen
microangelo
Produktivsysteme:
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3c, MariaDB, Java 17, SingleUser
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3c, MariaDB, Java 17, MultiUser
RaspberryPi OS 12 (Bookworm, 64Bit), Fakturama 2.1.3c, MariaDB, Java 17, Multiuser
auf Raspberry Pi 400, 4GB RAM
Testsystem(e):
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3 (Beta), HSQLDB, Java 17
dzt. kein Windows-System zum testen verfügbar
Alpha-Test:
RaspberryPi OS (64Bit), Fakturama 2.1.3, HSQLDB, Java 11
auf Raspberry Pi 4B, 8GB RAM
Hallo Jürgen,
vielen Dank für das Angebot, unter Windows zu testen. Ich habe es bisher nur unter Xubuntu (Focal) ausprobiert.
Ich habe noch einen Fehler gefunden:
Die eingefügte Zwischensumme enthält kein Währungssymbol. Dies habe ich inzwischen behoben.
Man kann nun in der Sub-Routine Main über die Variable FormatCode ein benutzerdefiniertes Format einstellen
Wird dies nicht definiert, sucht das Makro automatisch den Währungs-Code für das in OpenOffice gesetzte Gebietsschema heraus.
Der Code oben ist also nicht mehr aktuell. Ich habe ein Template erzeugt - siehe Anhang Rechnung_mit_Uebertrag_v0_9_1.ott. Damit ist es wahrscheinlich für die meisten einfacher zu testen.
Im Moment sehe ich noch zwei Probleme:
1) Das Makro wird jedesmal ausgeführt, wenn das resultierende Dokument (ODT) geöffnet wird.
Hier müsste man evtl. ein anderes Event finden, das die Ausführung des Makros auslöst.
2) Wird aus Fakturama heraus gleichzeitig mit dem Office-Dokument eine PDF-Datei erzeugt, fließt die Zwischensumme nicht in die PDF-Datei ein.
Hier könnte man evtl. den PDF-Export aus dem Makro anstoßen, nachdem die Zwischensumme eingefügt wurde.
Viele Grüße
Holger
UPDATE:
Leider konnte ich keine OTT-Datei anhängen - offenbar ist der Dateityp nicht zugelassen.
Daher hier nochmal der aktualisierte Makro-Code:
REM ** Code: LibreOffice BASIC **
REM ZwischenSumme.bas v0.9.1
REM Getestet mit LibreOffice v6.4.6.2
Option Explicit
REM Hier kann festgelegt werden, was als Text in der Zwischensummenzeile stehen soll, z.B.: "Übertrag: "
Const LabelFuerZwSumme As String = "Zwischensumme: "
Private FormatCode As String
Private FormatNummer As Long
Const OhneTextAuswahl As Boolean = False
Private oDoc As Object
Private oMeinViewCursor As Object
Private oAlleZahlenFormate As Object
Private oTables As Object
Private oItemTabelle As Object
Private oTabellenZeilen As Object
Private AktuelleSeite As Integer
Private Kopfzeilen As Integer
Private ErsteDatenZeile As Integer
Private AktuelleDatenZeile As Integer
Private LetzteZeile As Integer
Private LetzteSpalte As Integer
Private LetzteSpalteAlsIndex As Integer
Private LetzteSpalteAlsBuchst As String
Private ZeileFuerVorigeZwSumme As Integer
Private ZelleFuerZwSumme As String
Private ZelleFuerVorigeZwSumme As String
Sub Main
REM Hier kann ein Custom-FormatCode für die Zwischensumme bestimmt werden.
REM Es gilt die allgemeine Syntax fuer die Kodierung von Zahlenformaten:
REM https://help.libreoffice.org/latest/en-GB/text/shared/01/05020301.html
' FormatCode = "#.##0,00 [$€-407];-#.##0,00 [$€-407]"
REM Das aktuell ausgewaehlte Dokument:
oDoc = thisComponent
REM Erzeuge eine Objektinstanz des sichtbaren Cursors = View Cursor
oMeinViewCursor = oDoc.GetCurrentController.ViewCursor
REM Alle Tabellen des Dokumentes
oTables = oDoc.getTextTables
REM Eine bestimmte Tabelle anhand des Namens in eine Variable einlesen
oItemTabelle = oTables.getByName("Table_Items")
REM Pruefe, ob das Dokument mehrere Seiten enthaelt.
If IstDokumentMehrseitig Then
REM Falls Dokument mehrseitig ...
If IstTabelleMehrseitig = True Then
REM Falls die Item-Tabelle sich über mehr als eine Seite erstreckt ...
REM Anzahl Spalten:
LetzteSpalte = oItemTabelle.getColumns().getcount()
LetzteSpalteAlsIndex = LetzteSpalte -1
LetzteSpalteAlsBuchst = Chr(LetzteSpalteAlsIndex +65)
oTabellenZeilen = oItemTabelle.getRows
REM Anzahl Zeilen:
LetzteZeile = oTabellenZeilen.Count
REM Sind in der Tabelle Kopfzeilen definiert? Wieviele?
Kopfzeilen = oItemTabelle.HeaderRowCount
REM Die erste Zeile mit ersten Daten kommt unter dem Header
ErsteDatenZeile = Kopfzeilen +1
REM Starte die Ueberpruefung mit der ersten Datenzeile
AktuelleDatenZeile = ErsteDatenZeile
'Standardgebietsschema
Dim aLocale As New com.sun.star.lang.Locale
REM Alle Zahlenformate des aktuellen Dokuments
oAlleZahlenFormate = oDoc.getNumberFormats()
REM Falls im Header des Makros kein Custom-FormatCode gesetzt wurde ...
If (FormatCode = "") Then REM ... baue einen eigenen Format-Code.
Dim StandardWaehrungsFormat As Long
REM Frage das Standard-Zahlenformat für die Währung ab; dieses richtet sich nach dem eingestellten Laenderschema.
StandardWaehrungsFormat = oAlleZahlenFormate.getStandardFormat(com.sun.star.util.NumberFormat.CURRENCY, aLocale)
FormatCode = oAlleZahlenFormate.getByKey(StandardWaehrungsFormat).FormatString
Dim PositiveZahlen As String
REM Trenne den Format-Code am Semikolon auf und nimm nur den ersten Teil ...
PositiveZahlen = split(FormatCode, chr(59))(0)
REM Setze einen neuen Format-Code zusammen, bei dem negative Zahlen NICHT in rot dargestellt werden ...
FormatCode = PositiveZahlen & ";-" & PositiveZahlen
EndIf
REM Ermittle den Nummern-Code, unter welchem der Format-Code registriert ist
FormatNummer = oAlleZahlenFormate.queryKey(FormatCode, aLocale, True)
REM Wenn noch kein Nummern-Code fuer den Format-Code existiert ...
If (FormatNummer = -1) Then
REM ... fuege den Format-Code hinzu und gib den Nummern-Code zurueck
FormatNummer = oAlleZahlenFormate.addNew(FormatCode, aLocale)
EndIf
REM Fuehre die Schleife solange aus, bis die letzte Zeile der Tabelle erreicht ist.
Do While AktuelleDatenZeile <= LetzteZeile
REM Befindet sich die zu pruefende Datenzeile auf einer neuen Seite, dann gehe eins zurueck
REM und fuege eine Zwischensumme ein.
If ErsteDatenZeile +1 > 2 AND IstZeileAufNeuerSeite(AktuelleDatenZeile) Then ZwischenSumme_einfuegen (AktuelleDatenZeile -1)
REM Inkrementieren fuer naechste Zeile
AktuelleDatenZeile = AktuelleDatenZeile +1
Loop
EndIf
EndIf
End Sub REM Ende Main
'########################
Function IstDokumentMehrseitig As Boolean
Dim SeitenAnz As Integer
SeitenAnz = oDoc.CurrentController.PageCount
If SeitenAnz > 1 Then
REM "Mehrseitiges Dokument
IstDokumentMehrseitig = True
ElseIf SeitenAnz = 1 Then
IstDokumentMehrseitig = False
Else MsgBox "Fehler beim Auswerten der Seitenanzahl."
EndIf
End Function
Function IstTabelleMehrseitig As Boolean
Dim oErsteZelle As Object
Dim AnfangsSeite As Integer
Dim EndeSeite As Integer
REM Die erste Zelle als Objekt in eine Variable einlesen
oErsteZelle = oItemTabelle.getCellByName("A1")
REM Setze den View Cursor an den Anfang der Tabelle
oMeinViewCursor.gotoRange(oErsteZelle, OhneTextAuswahl)
REM Ermittle mit Hilfe des sichtbaren Cursors, auf welcher Seite die Tabelle anfaengt
AnfangsSeite = oMeinViewCursor.getPage()
REM Bringe nun den View Cursor ans Ende des Text-Bereiches (in diesem Falle: die Tabelle Table_Items)
oMeinViewCursor.gotoEnd(OhneTextAuswahl)
REM Ermittle, auf welcher Seite die Tabelle endet
EndeSeite = oMeinViewCursor.getPage()
REM Pruefe, ob sich die Tabelle Table_Items ueber mehrere Seiten erstreckt.
If EndeSeite > AnfangsSeite Then
IstTabelleMehrseitig = True
Else IstTabelleMehrseitig = False
EndIf
REM Erstmalige Zuweisung der Laufvariable AktuelleSeite - wichtig fuer Function IstZeileAufNeuerSeite
AktuelleSeite = AnfangsSeite
End Function
Function IstZeileAufNeuerSeite(AktuelleDatenZeile) as Boolean
Dim VorigeSeite As Integer
Dim AktuelleDatenZelle As Object
REM Auf welcher Seite war die vorige Zeile? Wert wird gesichert
VorigeSeite = AktuelleSeite
AktuelleDatenZelle = oItemTabelle.getCellByName("A" & AktuelleDatenZeile)
oMeinViewCursor.gotoRange(AktuelleDatenZelle, OhneTextAuswahl)
AktuelleSeite = oMeinViewCursor.getPage()
If AktuelleSeite > VorigeSeite Then
IstZeileAufNeuerSeite = True
Else IstZeileAufNeuerSeite = False
EndIf
End Function
Sub ZwischenSumme_einfuegen (ZeileFuerZwSumme As Integer)
Dim oEinTextCursor As Object
Dim oZeileNachZwSumme As Object
Dim SummenFormel As String
Dim VorigeSummenFormel As String
If (ZeileFuerZwSumme - Kopfzeilen = 1) Then
REM Fuer den seltenen Fall, dass die erste Datenzeile (inkl. Header) sich allein auf einer Seite befindet,
REM die naechste Datenzeile aber bereits auf der naechsten Seite, fuege keine Zwischensumme ein, sondern brich
REM die gesamte Tabelle auf die naechste Seite um.
oItemTabelle.BreakType = 4
Else
REM Fuege Zwischensumme in die Tabelle ein ...
REM Der erste Wert ist die Zeilennummer in der Tabelle.
REM Ist der Wert 0, wird am Anfang der Tabelle eingefuegt
REM Der zweite Wert gibt an, wieviele Zeilen eingefügt werden sollen.
oTabellenZeilen.insertByIndex(ZeileFuerZwSumme -1, 1)
REM Text einfügen - erste Zahl ist die Spalte, die zweite Zahl adressiert die Zeile
REM ... beginnend bei 0.
REM Fuege in die zweite Spalte das Label fuer die Zwischensumme ein
oItemTabelle.getCellbyPosition(1, ZeileFuerZwSumme -1).setString(LabelFuerZwSumme)
REM Formatierung wird geaendert (Fett, Kursiv, Ausrichtung rechts):
oEinTextCursor = oItemTabelle.createCursorByCellName("B" & CStr(ZeileFuerZwSumme))
oEinTextCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
oEinTextCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC
oEinTextCursor.ParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
ZelleFuerZwSumme = LetzteSpalteAlsBuchst & ZeileFuerZwSumme
REM Formula zusammenbauen
If ZelleFuerVorigeZwSumme = "" Then
REM Falls es sich um die erste Zwischensumme handelt (es also keine vorige Zwischensumme gab) ...
SummenFormel = "sum <" & LetzteSpalteAlsBuchst & ErsteDatenZeile & ":" & LetzteSpalteAlsBuchst & ZeileFuerZwSumme -1 & ">"
Else
REM Falls nicht, muss die vorhergehende Zwischensumme mit dazu addiert werden - Beispiel sum<D8;D9:D39>
SummenFormel = "sum <" & ZelleFuerVorigeZwSumme & ";" &_
LetzteSpalteAlsBuchst & ZeileFuerVorigeZwSumme +1 & ":"& LetzteSpalteAlsBuchst & ZeileFuerZwSumme -1 & ">"
EndIf
REM Formel wird in der letzen Spalte eingefuegt.
oItemTabelle.getCellbyPosition(LetzteSpalteAlsIndex, ZeileFuerZwSumme -1).setFormula(SummenFormel)
REM Setze das Zell-Format auf das gewuenschte Waehrungsformat
oItemTabelle.getCellByPosition(LetzteSpalteAlsIndex, ZeileFuerZwSumme -1).NumberFormat = FormatNummer
REM Da es Tabellenzeilen mit mehreren Zeilenvorschueben existieren,
REM wird hier ein Zeilenumbruch innerhalb der TabellenZeile fuer die der Zwischensumme nachfolgende Zeile verhindert.
oZeileNachZwSumme = oTabellenZeilen.getByIndex(ZeileFuerZwSumme)
oZeileNachZwSumme.IsSplitAllowed = False
REM Sichern des Namens der Zeile, in der die Zwischensumme eingefuegt wurde.
ZeileFuerVorigeZwSumme = ZeileFuerZwSumme
REM Sichern des Namens der Zelle, in der die Formel fuer die Zwischensumme eingefuegt wurde.
REM (Diese Werte werden gebraucht, falls es weitere Iterationen gibt.)
ZelleFuerVorigeZwSumme = ZelleFuerZwSumme
REM Durch das Einfuegen der Zwischensumme verschiebt sich die letzte Zeile um 1 nach unten
LetzteZeile = LetzteZeile +1
EndIf
End Sub
Ich bin durch familiäre Verpflichtungen noch nicht zum testen gekommen, aber das steht weit oben auf meiner todo-Liste
LG
Jürgen
microangelo
Produktivsysteme:
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3c, MariaDB, Java 17, SingleUser
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3c, MariaDB, Java 17, MultiUser
RaspberryPi OS 12 (Bookworm, 64Bit), Fakturama 2.1.3c, MariaDB, Java 17, Multiuser
auf Raspberry Pi 400, 4GB RAM
Testsystem(e):
LinuxMint Debian Edition (LMDE) 6, Fakturama 2.1.3 (Beta), HSQLDB, Java 17
dzt. kein Windows-System zum testen verfügbar
Alpha-Test:
RaspberryPi OS (64Bit), Fakturama 2.1.3, HSQLDB, Java 11
auf Raspberry Pi 4B, 8GB RAM
Hallo Jürgen,
ich würde gern den Faden wieder aufnehmen. Konntest Du bereits testen? Evtl. gewinnen wir ja noch jemanden aus der Community dazu?
PS: Bei mir ist das Thema aus zeitlichen Gründen leider auch nach hinten gerutscht.
Viele Grüße - Holger
Hallo Holger,
ein Problem, was ich hier noch sehe, ist die PDF-Generierung. Aktuell ist es so, daß Fakturama das ODT direkt aus dem Template erzeugt, ohne Zuhilfenahme von LibreOffice. Dadurch werden auch erst mal keine Makros o.ä. ausgeführt. Im zweiten Schritt (bei der PDF-Generierung) wird LibreOffice per Kommandozeile im Hintergrund gestartet. Dort wird das zwischenzeitlich erzeugte ODT übergeben. Es müßte jetzt geprüft werden, ob bei dieser PDF-Generierung auch das Makro für die Zwischensummen mit ausgeführt wird.
Viele Grüße
Ralf.
Wichtige Infos zum Posten im Forum.
Fehler gefunden?
Womit werden denn die ODF erzeugt? So etwas wie odftoolkit?
Und wird das ODF tatsächlich auch gebraucht oder nur das final erzeugte pdf? D. h. verwendet jemand das ODF, verändert es und nutzt es parallel weiter oder dient das ODF "nur" zum Erzeugen des pdf?
Fakturama nutzt odftoolkit. Das ODF wird von manchen als Ausgabeformat verwendet. Letztendlich brauche ich das aber auch, um die PDF-Datei zu erzeugen.
Viele Grüße
Ralf.
Wichtige Infos zum Posten im Forum.
Fehler gefunden?