XRechnung jetzt auch mit Serverdatenbank MariaDB/MySQL

Ich habe die XRechnungsdatenbank jetzt endlich so weit, dass auch eine Serverversion existiert. Dabei habe ich mich für die MariaDB/MySQL entschieden, weil dieser Server am weitesten verbreitet ist. Die Verbindung zu MariaDB/MySQL erfolgt über den internen Treiber.
Vorherige Versuche mit einem Firebird-Server haben sich als zu unbeständig erwiesen, so dass ich die vom Aufwand für mich geringere Firebird-Variante nicht weiter verfolgt habe.
.
Die Anfang April fertig gestellte Version gibt es weiterhin hier: XRechnung-Extension (incl. Serverversion für MariaDB/MySQL). Zwischendurch fällige Updates (weil irgendetwas immer mal auftaucht, was noch nicht ideal funktioniert), gibt es weiter auf meiner Homepage. Dabei stehen die Bearbeitungsversionen (Updates) beständig ganz rechts auf der Hompage in einem sparaten Kästchen.

Eine Sicherheitswarnung zu den elektronischen Rechnungen: Die Rechnungen sind nicht von selbst sicher. Vielmehr werden reine Textdaten (*.xml-Code) erzeugt. Kommt jemand auf dem Weg zum Rechnungsempfänger an die Mail, so kann er/sie unbemerkt z.B. die IBAN austauschen. Die Überweisung erfolgt dann vom Empfänger - nur leider auf ein ganz anderes Konto… Sicherer Mailversand scheint ein weit verbreitetes Problem zu sein. Von Verschlüsselung oder wenigsten Signierung der Anhänge ist nur wenig zu hören. Die elektronische Rechnung kann von der Struktur her diese Sicherheit nicht bieten.

Zusätzlicher Hinweis: Die interne Datenbankversion von LibreOffice, die in dieser Software verwendet wird, ist Firebird 3.0. Es scheint Distributionen unter Linux zu geben, die LibreOffice so packen, dass sie mit einer anderen Firebird-Version arbeiten. Ich habe schon Rückmeldungen bekommen, bei denen typische Fehlermeldungen für die Verwendung von Firebird 4.0 bzw. dem entsprechenden Backupsystem auftauchten. Deshalb die Bitte: Nur die Originalpakete von LibreOffice verwenden. Von anderen Paketen rate ich im Zusammenhang mit Base grundsätzlich ab.

Dass es eine SQL Version gibt, ist super. Vielen Dank dafür.

Ich habe die SQL Version ausprobiert. Die Datenbank xrechnung_V2502_021.sql ist auf dem mariadb Server, der Zugriff klappt.
Beim Aufrufen diverser Formulare von XRechnung_MariaDB_V2502_021.odb gibt es Fehlermeldungen. In der SQL Datei gibt es keine Tabellen, die mit viw_… beginnen.
(Datenbankname LibreOffice)

SQL-Status: 42S02
Fehlercode: 1146

Table 'LibreOffice.viw_Rechnung_Suche' doesn't exist

Das SQL-Kommando, welches zu diesem Fehler führte, ist:

SELECT * FROM `viw_Rechnung_Suche`



SQL-Status: 42S02
Fehlercode: 1146

Table 'LibreOffice.viw_Filter' doesn't exist

Das SQL-Kommando, welches zu diesem Fehler führte, ist:

SELECT * FROM `tbl_Kunde` WHERE ( `ID` = COALESCE ( ( SELECT `Kunde_ID` FROM `viw_Filter` ), `ID` ) )


SQL-Status: 42S02
Fehlercode: 1146

Table 'LibreOffice.viw_Lieferung_Summe' doesn't exist
Das SQL-Kommando, welches zu diesem Fehler führte, ist:

SELECT `a`.*, ( SELECT CONCAT( `Firma`, ' → E-Mail: ', `E-Mail` ) FROM `tbl_Lieferant` WHERE `ID` = `a`.`Lieferant_ID` ) AS `Lieferant`, `b`.`NochOffen` AS `aktuellNochOffen` FROM `tbl_Lieferung` AS `a`, `viw_Lieferung_Summe` AS `b` WHERE ( `a`.`ID` = `b`.`Lieferung_ID` AND LEFT( `b`.`Sort`, 1 ) = 6 AND `ID` NOT IN ( SELECT `tbl_Lieferung_ID` FROM `tbl_Lieferung_Aenderung` ) AND `a`.`LieferantZeichen` = COALESCE ( ( SELECT `Rechnungsnummer` FROM `viw_Filter` ), `a`.`LieferantZeichen` ) AND CONCAT( 'L-', `a`.`Lieferant_ID` ) = COALESCE ( ( SELECT `KundeLieferant` FROM `viw_Filter` ), CONCAT( 'L-', `a`.`Lieferant_ID` ) ) ) AND ( ( `a`.`NochOffen` <> 0 AND `b`.`NochOffen` <> 0 ) )


SQL-Status: 42S02
Fehlercode: 1146

Table 'LibreOffice.viw_Rechnung' doesn't exist


Das SQL-Kommando, welches zu diesem Fehler führte, ist:

SELECT "a".*, "b"."Rechnungsnummer", ( SELECT CONCAT("Firma" , ' → E-Mail: ' , "E-Mail") FROM "tbl_Kunde" WHERE "ID" = "a"."Kunde_ID" ) "Kunde", "b"."Brutto", "b"."NochOffen", ( SELECT GROUP_CONCAT("Rechnungsnummer" SEPARATOR ' ↲\n')  FROM "viw_Rechnung", "tbl_rel_Rechnung" WHERE "viw_Rechnung"."Rechnung_ID" = "tbl_rel_Rechnung"."Rechnung_ID" AND "tbl_rel_Rechnung"."MainID" = "a"."ID" ) "TeilRechnungen" FROM "tbl_Rechnung" AS "a", "viw_Rechnung" AS "b" WHERE "a"."ID" = "b"."Rechnung_ID" AND NOT "a"."ReNummer_lfdJahr" IS NULL AND "b"."Rechnungsnummer" = COALESCE ( ( SELECT "Rechnungsnummer" FROM "viw_Filter" ), "b"."Rechnungsnummer" ) AND CONCAT('K-' , "a"."Kunde_ID") = COALESCE ( ( SELECT "KundeLieferant" FROM "viw_Filter" ), CONCAT('K-' , "a"."Kunde_ID") ) AND "b"."XRechnungErstellbar" = TRUE


SQL-Status: 42S02
Fehlercode: 1146

Table 'LibreOffice.viw_Lieferung_Summe_Aenderung' doesn't exist

Das SQL-Kommando, welches zu diesem Fehler führte, ist:

SELECT `a`.*, ( SELECT CONCAT( `Firma`, ' → E-Mail: ', `E-Mail` ) FROM `tbl_Lieferant` WHERE `ID` = `a`.`Lieferant_ID` ) AS `Lieferant`, `b`.`NochOffen` AS `aktuellNochOffen` FROM `tbl_Lieferung_Aenderung` AS `a`, `viw_Lieferung_Summe_Aenderung` AS `b` WHERE ( `a`.`ID` = `b`.`Lieferung_ID` AND LEFT( `b`.`Sort`, 1 ) = 6 AND `LieferantZeichen` = COALESCE ( ( SELECT `Rechnungsnummer` FROM `viw_Filter` ), `LieferantZeichen` ) AND CONCAT( 'L-', `a`.`Lieferant_ID` ) = COALESCE ( ( SELECT `KundeLieferant` FROM `viw_Filter` ), CONCAT( 'L-', `a`.`Lieferant_ID` ) ) ) AND ( ( `a`.`NochOffen` <> 0 AND `b`.`NochOffen` <> 0 ) )

Das geschieht im Eifer des Ausprobierens: Die Anleitung sollte schon gelesen werden, speziell die (wenigen) Seiten zur Serverversion MariaDB. Ich habe das in der aktuellsten Fassung noch einmal mit entsprechenden Punkten zusammengefasst:

  1. Base Datei XRechnung_MariaDB_V2502_021.odb öffnen.
  2. Im Menü Bearbeiten → Datenbank die Verbindung zur Datenbank herstellen.
  3. Über Extras → Makros → Makro ausführen muss im Modul Wartung das Makro ViewsEr-
    stellen ausgeführt werden.
  4. Über Extras → Makros → Makros bearbeiten wird im Objektkatalog die Datei XRechnung_MariaDB_V2502_021.odb aufgesucht. Dort muss im Modul Backup im Makro
    DatabaseStart der Text REM in Zeile 9 entfernt werden.
  5. Die Datenbankdatei wird abgespeichert und muss jetzt neu gestartet werden. Nur dann
    ist ein Zugriff auf die Ansichten per Makro möglich.

Und immer daran denken: Vor dem endgültigen Betrieb auf meiner Homepage nach Updates schauen. Ich habe gerade eben die Version XRechnung_MariaDB_V2502_022.odb dort hoch geladen.

Danke, ich hatte das vergessen, weil zuerst der VPN Tunnel zur Datenbank nicht funktioniert hatte.
Nun scheint es fast zu funktionieren, nur das Pulldwonmenü oben links, vermutlich die Auswahl
Rechnung, …, Ware, Kunde, Lieferant ist noch ohne Funktion.

Kann man eine zweite Firma anlegen, bei Kunden funktioniert das >+ bei Firma nicht

Zum Menü oben links: Du meinst die Möglichkeit, von einem Formular zum anderen zu springen? Wird da nichts angezeigt?
Ich nutze das Ganze mit der Schriftart “DejaVu Sans”. Da sind UTF-8 Zeichen drin. Vielleicht ist das in Deiner Konfiguration ein Problem?
Die Datenfilterung funktioniert aber, oder?

Das Ganze ist auf eine Firma angelegt. Deswegen auch die Firmeneinstellungen für die eigene Firma. Ich habe auch einen Nutzer, bei dem sind gleich 4 Firmen zu bedienen. Der hat dann schlicht die Datenbank 4 mal auf dem Server. Aber Vorsicht: Die verschiedenen Datenbanken brauchen unterschiedliche Benutzer. Ansonsten versuchen alle Formulare dummerweise die Datenbank zu nehmen, die im Alphabet zuerst vorkommt und die entsprechende Tabelle hat.

Kunden brauchst Du natürlich viele, ebenso Lieferanten, aber an mehrere Firmen habe ich schlicht nicht gedacht. Das würde den Code auch deutlich verkomplizieren, da ja für unterschiedliche Firmen gleiche Rechnungsnummern existieren dürfen.

Im Anhang eine Screenprint des Formulars frm_Kunde.

Der Filter Kunde hat auch keine Funktion.
System Linux OpenSuse - eventuell liegt es daran.
Worauf greifst du oder LibreOffice zurück? Java/Python oder dergleichen?

Firmen - Du hast schon an so vieles gedacht - gut dass es das überhaupt gibt, vor allem mit einer SQL Datenbank.

Ich habe keine doppelten Rechnungsnummern, weil ich sie im Format Firmekuerzel|Monat|jahr|Nummer habe. Da bräuchte ich nur einen anderen Absender und ein anderes Firmenkürzel.
Aber mit mehreren Datenbanken geht es natürlich auch.

Exportiere ich die Datenbank mit mysqldump und speichere sie zurück kommt:

viw_Filter' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

Ich arbeite hier unter OpenSUSE 15.6 mit den Originalpaketen von LibreOffice - nicht mit denen von SUSE. Bei Datenbanken sind die von den Distributionen gestellten Versionen leider häufig mit Fehlern behaftet - weil die Paketierer etwas schön finden, aber nicht weiter testen, weil sie es wohl selbst nicht nutzen.

Der Filter Kunde hat erst dann eine Funktion, wenn bereits Kunden drin sind in der DB. Ich kann hier den Filter problemlos setzen, so dass ein entsprechender Kunde ausgewählt wird. Erst in einer der letzten Versionen habe ich noch die Aktualisierung des Filters nach der Eingabe neuer Kunden hinzugefügt. Das bedeutet: Das Listenfeld müsste sich bei der Eingabe neuer Kunden beständig erweitern.

Die Verbindung zur MariaDB teste ich hier nur mit der direkten Verbindung von LibreOffice. Hat nichts mit Java oder Python zu tun, sondern wohl C++.

Zum Dump von Daten: Die Views haben ja eine ganz spezielle Reihenfolge, in der sie erstellt werden müssen. Einige Views greifen ja auf vorhergehende Views zu. Deswegen lasse ich die Views über Makros in der entsprechenden Reihenfolge aus Abfragen erstellen. Ich würde bei einem Dump von vornherein die Views ausschließen.
Der viw_Filter liest die Daten aus tbl_Filter, bei denen die aktuelle CONNECTION_ID() mit dem Schlüsselwert übereinstimmt. Vielleicht hat mysqldump damit Probleme?

Die Datenbank läuft auf einem Debian 10 Server. Mit Debian hatte ich noch nie Probleme.
Den habe ich gerade erst wieder aus dem Schlaf erweckt. Ich mache mal Updates auf Debian 12

mariadb  Ver 15.1 Distrib 10.3.34-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Am Screenprint sieht man dass drei Datensätze vorhanden sind

Debian Problem - Mit Debian 12 (Bookworm) funktioniert es.
Ist mein Testserver mit VPN Zugriff, der einzige, der noch kein Update hatte.

Nun eine etwas diffizile Frage:
Welche Datensätze kann ich denn von hinten in die Datenbank einpflegen, ohne Inkonsistenzen zu erzeugen.
Sie kommen von einem CMS auf dem die Bestellungen laufen. Deshalb die Datenbank auf einem Server.

Da würden die Kundendaten, und die Rechnungsdaten übertragen werden.
Die Tabellen die beschrieben werden würde mir als Antwort reichen.
Kundendaten neu natürlich nur, wenn der Kunde bisher nicht angelegt ist, ansonsten ergänzt.

Vermutlich sollten wir das Ganze per privetar Mail weiter angehen. Nur so viel:
Wenn Du mit den eingehenden Lieferungen und der Weiterleitung von eingehenden Rechnungen nichts zu tun hast, dann spielen für die die Tabellen mit “tbl_Lieferung…” und “tbl_Eingang…” sowie “tbl_Lieferant” keine Rolle. Das sind dennoch eine ganz schöne Menge an Tabellen.
Du brauchst zuerst “tbl_Kunden”. Wenn die drin sind, dann die “tbl_Rechnung”. Hier taucht auf jeden Fall der Primärschlüssel aus “tbl_Kunden” als Fremdschlüssel auf. Dann die “tbl_Ausgang”. Hier taucht der Primärschlüssel aus “tbl_Rechnung” als Fremdschlüssel auf.

… und natürlich musst Du alle möglichen Codes (für die Maßeinheit, die Rechnung usw.) einsetzen, damit die XRechnung stimmig wird.

Hallo Robert,
gute Idee - schreib mir bitte mal eine Mail an [gelöscht]
Alles was nicht für andere wichtig ist, kannst du herauslöschen. Inklusive dieser Nachricht.
Deine Extraanleitung ist wichtig, die kann man so abarbeiten.

Eigentlich Off Topic, weil es nichts mit LO zu tun hat: Wie kommen die Daten vom CMS in Roberts Datenbank?

#TODO auf dem Datenbankserver von der CMS Maria DB zur Maria DB von Robert synchronisieren.

Leuchtet ein. Danke.

Meine Idee war die Tabellen für XRechnung als View aus meiner bisherigen Datenbank zu erzeugen.

Also auf den Datenbestand read-only zugreifen, anstatt ihn zu kopieren. Hast Du die Idee schon mal angetestet? Wie ich jetzt gelernt habe, kann ein Datenbankdokument alle Datenbanken eines Marienservers vereinigen.

Das ist Fluch und Segen zugleich. Ich habe, um es einfach zu haben, den Datenbanknamen aus der gesamten MariaDB-Integration raus gehalten. Der taucht also nirgendwo in den Abfragen, Ansichten, Formularen, Berichten und Makros auf. Das funktioniert so lange gut, wie keine Datenbank eine gleichlautende Tabelle hat, auf die ich als Nutzer Zugriff habe. In dem Falle versucht das Formular bzw. der Bericht auf die Datenbank zuzugreifen, die im Alphabet vorne liegt.

Ich würde die Daten in Tabellenform nach Calc portieren und dort entsprechend anpassen. Das geht erst einmal mit den grundlegenden Tabellen wie z.B. den Kunden oder den Waren. Dafür habe ich dann auch eine Importfunktion mit drin.

Und für Updates von Firebird nach MariaDB geht die ganz einfach: Alte Datenbank als “Import_XR” in LibreOffice anmelden. Dann ein Makro ablaufen lassen und alle Daten werden in die neue Datenbank gelesen. Das musste ich schon gleich bei den ersten Updates zur Firebird-Version zusammenbauen, da der einfache User bei so viel Tabellen doch schnell den Überblick verliert.

Na ja. Es ist eine triviale Fleißarbeit, den DB-Namen nachträglich hinzuzufügen, so dass nichts anbrennen kann.