Von OpenOffice/LibreOfficeBasic zu Java
Mit der Hinwendung zu Linux musste auch eine mit MSAccess realisiere Auftragsbearbeitung ersetzt werden. In den Jahren 2010/2011 begann die Arbeit mit OpenOffice Base/Basic und dem Report-Builder. Versuche mit der intgrierten HSQLDB wurden aufgegeben, auf PostgreSQL umgestellt und die MSAccess Daten importiert. Die Anwendung funktionierte mit LibreOffice bis zur Version 4.3.7.2., die wir lange beibehalten mussten. Ab LibreOffice 5.x gab es Probleme mit den Tabellen-Kontrollfeldern und unsere Formulare waren nicht nutzbar. Ab Version 6.x waren einige Probleme behoben, dafür wurde die Nutzung des Report-Builders durch eine den Anwender verwirrende Meldungsleiste erschwert. Diese Probleme und fehlende Entwicklung beim Report-Builder führten zu dem Entschluss die Anwendung vollständig neu in Java zu entwickeln.
HWDB IFStart
Die Handwerker-Auftragsbearbeitung bietet Kunden- und Projektverwaltung, man kann Angebote, Rechnungen inkl. Abschlags- und Schlussrechnungen erstellen, Briefe, Memos und Mahnungen verfassen und drucken sowie E-Mails versenden. Sie ist auf Grundlage der PostgreSQL-Datenbank auf Mehrbenutzer-Betrieb im Firmennetzwerk ausgelegt.
Die HWDB wird ständig weiter entwickelt. Die Ausgabe der Dokumente mit Apache FOP in Form PDF/A war der erste Schritt in Vorbereitung der integrierten eRechnung, die in Zukunft bei öffentlichen Auftraggebern Pflicht werden soll. Mehr zur praktischen Nutzung in der ⇒⇒ ausführlichen Anleitung.
Die Struktur der HWDB
In der Netbeans-IDE kann der Java-Code erstellt und gleichzeitig intuitiv die Oberfläche mit Swing-Elementen gestaltet werden. Für die einzelnen Forms wurde der Swing-Container JInternalPane und zur Aufnahme der Elemente der Container JPanel genutzt. Die Java-Klassen für die Oberfläche beginnen mit IF, die dazugehörigen Klassen mit dem Code haben den gleichen Namen ohne IF (IFStart.java | Start.java).
Es gibt noch eine Package reports mit den Methoden zur PDF Erstellung, zum Gaeb Import u.a., die auch von der Klasse IFVorgang.java aufgerufen werden, die Klasse Vorgang.java aber zu sehr vergrößert hätte. Hier die Struktur:
- Package internale
- Package makros
- Beschreibung
- IFIntern.java
- Intern.java
- Firmendaten und Textvorgaben
- IFKunden.java
- Kunden.java
- Kundenliste für Administration
- IFLeistungen.java
- Leistungen.java
- Leistungen Texte, Preise
- IFListen.java
- Listen.java
- Vorgangsübersicht, Zahlungskontrolle
- IFStart.java
- Start.java
- Startformular mit Kundenbereich
- IFVorgang.java
- Vorgang.java
- Vorgänge bearbeiten, PDF erstellen
Beispiel eines Aufrufs in IFStart: Dem Passwort Feld jPasswd
wird das Event KeyPressed
zugewiesen. Falls if (evt.getKeyCode() == KeyEvent.VK_ENTER)
Enter gedrückt wurde ist Start.verbindeHW();
(DB-Verbindung herstellen) auszuführen. Bei einem falschen Passwort tritt die try catch Fehlerroutine von verbindeHW() in Aktion.
Java-Code Beispiel
Als Einstieg zum Verstehen des Java-Codes soll public static void kundeNeu() dienen. Das ist der Code, der bei Klick auf die Schaltfläche Speichern im Kundenbereich ausgeführt wird. Wobei kundeNeu() eigentlich nicht stimmt, denn der Code wurde so verzweigt, dass auch Änderungen per Update gespeichert werden. Als erstes werden die Felder ausgelesen, Variablen deklariert und ihnen die Zeichenketten (strings) aus den Feldern zugewiesen. Mit String nn = IFStart.nname.getText();
erhält z.B. die String-Variablen nn den Inhalt des Feldes nname zugewiesen.
Die Abbildung zeigt den Code von kundeNeu() mit zusätzlichen Kommentaren, so dass der Ablauf nachvollzogen werden kann. Erklärt werden müssen hier noch die SQL-Anweisungen, in denen + " nname = " + "'" + nn + "',"
- die Hochkommas maskiert werden müssen, damit Variablen (hier nn) als solche erkannt werden. Der übergebene SQL-Code würde dann z.B. nname = 'Müller'
lauten.
Der Aufruf der hier beschriebenen Methode Start.kundeNeu();
von IFStart aus. Verbunden mit dem Event ActionPerformed
d.h. Betätigen des Buttons jButton7.
Die Funktion maxwert
Die Funktion maxwert(sSQL) ist im Code kundeNeu() enthalten. Funktionen dienen dazu, wiederkehrende Operationen mit wenigen Zeilen Code mehrfach in Methoden einzubinden. Die Funktion beginnt mit
public static int maxwert(String sSQL)
- dabei definiert int maxwert den Namen und den Typ des Rückgabewertes. In Klammern (String sSQL) stehen die der Funktion zu übergebenden Werte.
Die SQL-Anweisung st.execute(sSQL);
führt den mit dem String sSQL übergebenen Befehl aus, bildet ein ResultSet und geht mit rs.next() zur ersten (und einzigen) Zeile des ResultSet. Ist rs nicht null, wird es mit maxwert = Integer.parseInt(max)
zum Integer-Rückgabewert.
IFVorgang mit Einfügedialog
Die Form IFVorgang dient der Eingabe von allen Daten zur Erstellung eines Vorgangs (Angebot, Rechnung). Dabei werden die Kopfdaten wie Name und Anschrift des im Startformular gewählten Kunden bei der Erstellung automatisch eingetragen. Bauvorhaben u.a. Einzelheiten müssen eingegeben und eine Leistungsgruppe festgelegt werden.
Der Dialog dient der Auswahl und dem Einfügen von Leistungen. Aus der DB-Tabelle mit Leistungstext-Vorlagen werden die herausgefiltert, die den Text im Suchfeld enthalten, im Bild z.B. Zink. Mit Enter öffnet sich der Dialog und zeigt die gefilterten LP zwecks Auswahl und Einfügen an. Der Java-Code für diesen Dialog umfasst 284 Zeilen, wovon sage und schreibe 180 Zeilen für die Erzeugung des Dialogs mit seinen Elementen nötig waren. Der Code kann hier angesehen werden: ⇒⇒ Code zum Dialog.
Der oben gezeigte Code demonstriert, wie ein komplexer Dialog selbst erzeugt und angezeigt wird. In den Java-Bibliotheken gibt es mit JOptionPane verschiedene Standard-Dialoge, die mit der Import-Anweisung eingebunden werden. In der Methode kundeNeu() wird mit showMessageDialog eine Meldung eingeblendet, wenn in dem Code zwischen try und catch ein Fehler auftritt. In dieser Meldung JOptionPane.showMessageDialog(null, "Fehler in kundeNeu(): " + e);
steht e für Exception, das ist die Fehlermeldung des Systems. Neben dem MessageDialog gibt es InputDialog, ConfirmDialog und OptionDialog. Mehr dazu im
⇒⇒ Java-Tutorial.