Übertrag in Rechnun...
 
Benachrichtigungen
Alles entfernen

Übertrag in Rechnung einfügen

12 Beiträge
6 Benutzer
1 Reactions
4,564 Aufrufe
(@RichardN)
Active Member
Beigetreten: vor 7 Jahren
Beiträge: 13
Topic starter   [#2589]

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!



   
Zitat
(@rheydenr)
Forum-Admin Registered
Beigetreten: vor 14 Jahren
Beiträge: 4911
 

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?


   
AntwortZitat
(@lastboyscout)
Reputable Member
Beigetreten: vor 10 Jahren
Beiträge: 249
 

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


   
AntwortZitat
(@linux4all)
Active Member
Beigetreten: vor 6 Jahren
Beiträge: 5
 

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



   
AntwortZitat
(@linux4all)
Active Member
Beigetreten: vor 6 Jahren
Beiträge: 5
 

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



   
AntwortZitat
Jürgen Bruckner
(@microangelo)
Mitglied
Beigetreten: vor 6 Jahren
Beiträge: 691
 

@linux4all

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


   
linux4all reacted
AntwortZitat
(@linux4all)
Active Member
Beigetreten: vor 6 Jahren
Beiträge: 5
 

@microangelo

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


   
AntwortZitat
Jürgen Bruckner
(@microangelo)
Mitglied
Beigetreten: vor 6 Jahren
Beiträge: 691
 

@linux4all

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


   
AntwortZitat
(@linux4all)
Active Member
Beigetreten: vor 6 Jahren
Beiträge: 5
 

@microangelo

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



   
AntwortZitat
(@rheydenr)
Forum-Admin Registered
Beigetreten: vor 14 Jahren
Beiträge: 4911
 

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?


   
AntwortZitat
(@spi347)
Active Member
Beigetreten: vor 2 Jahren
Beiträge: 3
 

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?



   
AntwortZitat
(@rheydenr)
Forum-Admin Registered
Beigetreten: vor 14 Jahren
Beiträge: 4911
 

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?


   
AntwortZitat
Teilen: