AKAD Hochschule Stuttgart
Wirtschaftsinformatik
Projektbericht
Ersatz einer textbasierten RPG-Greenscreen-
Benutzeroberfläche durch einen Java-GUI-Frontend
von
Manfred Schiefers
Pflasteräckerstr. 44
70186 Stuttgart
Immatrikulationsnummer 360 828
Betreuender Hochschullehrer: Prof. Dr. Franz-Karl Schmatzer
Stuttgart, 31.05.2011
I
INHALTSVERZEICHNIS
1 Einleitung 1
1.1 Hintergrund 1
1.2 Ziel dieser Arbeit 2
1.3 Vorgehensweise 2
1.4 Hilfsmittel 2
2 Theoretische Grundlagen 3
2.1 Allgemeines zur 3-Tier-Architektur 3
2.2 Eigenheiten der iSeries bezüglich der Benutzeroberfläche 4
2.2.1 OS/400-Objekte 5
2.2.2 RPG 6
2.2.3 DSP-Files 7
2.2.4 MSG-Files 7
2.2.5 Tastatur 8
2.3 Erwartungen an grafische Benutzeroberflächen 9
2.4 verschiedene Arten grafischer Frontends 10
2.4.1 HTML und Browserdarstellung 10
2.4.2 Microsoft .NET Framework 11
2.4.3 Java 12
3 Ausgangssituation 13
3.1 Darstellung der bisherigen Greenscreen-Eingabemaske 13
3.2 Betrachtung aus Anwendersicht 13
3.3 grundsätzliche Maskenelemente 14
3.3.1 Funktionstasten 14
3.3.2 Variablen 14
3.3.3 Textkonstanten 15
3.3.4 Layoutelemente, Farben 15
3.4. Quellcodeanalyse 16
II
4 Festlegung des Soll-Zustands 17
4.1 Idealvorstellung 17
4.2 notwendige Kompromisse 18
5 Umsetzung: Erstellung eines neuen grafischen Prototyps in Java 19
5.1 Elemente der neuen Eingabemaske 19
5.1.1 Schriftarten, Schriftgrad, Farbgebung, Layout 19
5.1.2 Überschrift, Logo 20
5.2.3 Eingabefelder, Comboboxen 20
5.2.4 Buttons 21
5.2 Implementierung in Java (Quellcode) 21
5.3 Darstellung der neuen grafischen Eingabemaske 23
6 Schlussbetrachtungen 24
Abkürzungen III
Abbildungsverzeichnis V
Anhang VII
Literaturverzeichnis LI
weitere Quellen LIII
eidesstattliche Erklärung LV
III
ABKÜRZUNGEN
Anw. = Anweisung, Programmzeile im RPG-Sourcecode
API = Application Programming Interface
ASCII = American Standard Code for Information Interchange
AWT = Abstract Window Toolkit
CL = Control Language
CLR = Common Language Runtime
COBOL = Common Business-Oriented Language
CRTUSRPRF = create user profil
DB = data base
DBMS = data base management system
DIN = Deutsches Institut für Normung
DLL = Dynamic Link Library
DSPF = display file
EGL = Enterprise Generation Language
EN = Europäische Norm
ERP = Enterprise Resource Planning
EXSR = Execute (Invoke) Subroutine
FORTRAN = FORmula TRANslation
GUI = Grafical User Interface
HTML = Hypertext Markup Language
HTTP = HyperText Transfer-Protokoll
IBM = International Business Machines Corporation
IKS = Informations- und Kommunikationssystem(e)
ILE = Integrated Language Environment
ISO = International Organization for Standardization
LF = logical file
LOC = Lines of Code
MSGF = message file
OOP = Objektorientierte Programmierung
IV
PDM = Programm Developement Manager
PF = physical file
PRTF = printer file
RPG = Report Program Generator
SaaS = Software as a Service
SEU = Source Entry Utitity
SOA = Serviceorientierte Architektur
TCP/IP = Transmission Control Protocol / Internet Protocol
USRPRF = user profil
WDSC = WebSphere Development Studio Client
WRKOBJ = work with objects
WRKMSGF = work with message files
WRKSPLF = work with spoolfiles
V
ABBILDUNGSVERZEICHNIS
1 Prinzip: Ersatz RPG-Greenscreen-Benutzeroberfläche durch GUI VII
2 Greenscreen-Maske als Ausgangsbasis, Komplettdarstellung VIII
3 Greenscreen-Maske, Eingabe: Teilestamm-Matchcode VIII
4 Greenscreen-Maske, Teilestamm Matchcode-Auswahl IX
5 Greenscreen-Maske, Einblendung Teilestammdaten IX
6 Greenscreen-Maske, Lieferantenauswahlliste X
7 Greenscreen-Maske, Einblendung Lieferantenstammdaten X
8 Greenscreen-Maske, Aufruf Nachrichtendatei M1MSGF XI
9 Greenscreen-Maske, Beispiel Textkonstante KON0009 XI
10 Greenscreen-Maske, Übersicht alle Textkonstanten XII
11 Greenscreen-Maske, Übersicht Displayfiles XIII
12 Greenscreen-Maske, Displayfile für Hauptbildschirm XIV
13 Greenscreen-Maske, Displayfile für Lieferantenauswahl XVI
14 Greenscreen-Maske, Displayfile für Teilestammauswahl XVII
15 Greenscreen-Maske, RPG-Hauptprogramm XVIII
16 Greenscreen-Maske, RPG-Startprogramm XIX
17 Greenscreen-Maske, Copysource Abteilung / Sachbearbeiter XX
18 Greenscreen-Maske, Copysource Bestellnummernvergabe XX
19 Greenscreen-Maske, Copysource Lieferantenstammdaten XX
20 Greenscreen-Maske, Copysource Lieferantenauswahl XX
21 Greenscreen-Maske, Copysource Bestellung versenden XXI
22 Greenscreen-Maske, Copysource Teilestammdaten XXI
23 Greenscreen-Maske, Copysource Teilestammdaten-Matchcode XXI
24 Greenscreen-Maske, Copysource Zahlungs-/Lieferbedingungen XXII
25 GUI-Maske, Java-Packages XXII
26 GUI-Maske, Komplettdarstellung XXIII
27 Logo alt XXIV
28 Logo neu XXIV
29 GUI-Maske, Klasse XML_Kommunikation XXV
30 GUI-Maske, Klasse HinweisFenster XXX
VI
31 GUI-Maske, Klasse Fehlermeldung XXXI
32 GUI-Maske, Klasse BestellStart XXXII
33 GUI-Maske, Klasse BestellEingabeParameter XXXIII
34 GUI-Maske, Klasse TeileMatchcodeMaske XXXVI
35 GUI-Maske, Klasse BestellEingabeMaske XXXIX
36 GUI-Maske, leer XLVII
37 GUI-Maske, Fehlermeldung XLVII
38 GUI-Maske, Teilestamm Matchcode-Auswahl XLVIII
39 GUI-Maske, Einblendung Teilestammdaten XLVIII
40 GUI-Maske, Lieferantenauswahlliste XLIX
41 GUI-Maske, Einblendung Lieferantenstammdaten XLIX
42 GUI-Maske, Konsolenausgabe L
1
1 Einleitung
1.1 Hintergrund
AS/400, iSeries, System i oder auch i5 sind Bezeichnungen für eine Computer-Bau-
reihe von IBM. Die Zuverlässigkeit des IBM-Systems wird geschätzt und steht dabei
in Konkurrenz zu Windows-Servern [vgl. infor, 2009]. Zahlreiche Unternehmen
weltweit setzen bei betriebswirtschaftlicher Standardsoftware nach wie vor ihr Ver-
trauen in System-i-Anwendungen, die ehemals in der Programmiersprache RPG er-
stellt wurden. Über die Jahre hinweg wurden vorhandene Anwendungen immer
umfangreicher und komplexer, die ihren Ursprung vor 15 oder 20 Jahren hatten [vgl.
pks, 2008]. Mit hunderten von Mannjahren erstellter Quellcode ist nicht von heute
auf morgen austauschbar. Daher werden auch heute noch Jahrzehnte alte COBOL-,
RPG- und FORTRAN-Programme gewartet [vgl. Krüger 2009, Seite 53]. Anderer-
seits ist klar, dass auf prozeduralen Programmiersprachen basierende Geschäftsan-
wendungen auf lange Sicht keine Zukunft mehr haben. Gründe sind u.a. die fehlende
Objektorientiertheit, fehlende Plattformunabhängigkeit sowie das „Aussterben“ ge-
eigneter Programmierer zur Wartung. Das Betriebssystem OS/400 ist geeignet für
Java [vgl. com, 07/2006]. So realisierten Systemhäuser der ERP-Branche bereits eine
Umstellung auf eine drei-schichtige Java-Architektur auf der iSeries. Beispiele: die
Command AG mit Oxaion [vgl. com, 10/2002], Intentia mit Movex [vgl. com,
03/2006], QSC (Quality Software & Consulting) [vgl. qsc, 2010] usw. Da aber dieser
Umstellungsprozess lange Entwicklungszeit in Anspruch nimmt, ist für eine Über-
gangszeit auch ein Kompromiss möglich. Um dem Ruf der Anwender nach einer
grafischen Benutzeroberfläche gerecht zu werden, kommen sog. Thin-Clients zum
Einsatz. Hierbei wird die Applikation auf dem Server ausgeführt, die Clients
hingegen dienen zur reinen Darstellung [vgl. man, 2002]. Die Kommunikation er-
folgt über eine Middleware, die auf der AS/400 läuft und einen XML-Datenstrom
zwischen Applikation und Client koordiniert. Der vorhandene RPG-Quellcode des
Geschäftsanwendungskerns bleibt und muss „geringfügig“ angepasst werden. Sehr
aufwendiger gestaltet sich der Ersatz der bisherigen textbasierten Greenscreen-Be-
nutzeroberfläche durch einen grafischen Frontend (Prinzip siehe Abbildung 1, Seite
VII). Dieses Vorgehen ist Gegenstand der Untersuchung im Folgenden.
2
1.2 Ziel dieser Arbeit
Ziel ist es, die Implementierung eines Prototyps mittels Java exemplarisch an einer
grafischen Eingabemaske zu beschreiben, wobei eine textbasierte und RPG-program-
mierte Eingabemaske als Ausgangsbasis und Richtschnur dienen soll. Unterschiede
zwischen beiden Varianten sollen herausgestellt werden, sowohl bei der Bedienung
durch den Benutzer, als auch in der Programmierung. Die programmtechnische An-
bindung des grafischen Clients an den Server ist nicht Bestandteil der Ausarbeitung.
1.3 Vorgehensweise
Im Vorfeld werden zunächst themenspezifische Inhalte theoretischer Natur darge-
stellt. Dies sind zu Beginn prinzipielle Betrachtungen zur 3-Tier-Architektur. Danach
werden relevante Spezifika der AS/400-Plattform herausgestellt. Zwei weitere
Grundlagenkapitel widmen sich zum einen den Gestaltungskriterien grafischer Be-
nutzeroberflächen im Allgemeinen, zum anderen einer kurzen Darstellung dreier
konkreter grafischer Frontend-Alternativen. Der darauf folgende Praxisteil besteht
aus drei Komponenten: Erfassung der Ausgangssituation mit der Analyse wichtiger
Parameter der bisherigen Greenscreen-Eingabemaske. Darauf aufbauend erfolgt dann
die Erarbeitung des Sollzustands und letztendlich die Entwicklung der neuen grafi-
schen Eingabemaske.
1.4 Hilfsmittel
Alle zum Praxisteil genutzten Plattformen und Ressourcen stammen aus dem Privat-
bereich des Autors. RPG- und Java-Quellen wurden selbst erstellt. Als AS/400-Um-
feld steht mit Betriebssystem-Release V5R3M0 ein kostenloser Account beim ‚Re-
chenzentrum Kreuznach’ (http://www.rzkh.de/) zur privaten Nutzung zur Verfügung
(Genehmigung zur Verwendung für die vorliegenden Arbeit sowie zur Publikation
von Screenshots wurde durch den Geschäftsführer Holger Scherer ausdrücklich
erteilt.). Für den Remote-Zugang wird ‚Mocha TN5250 for Vista’ benutzt. RPG-
Sourcen basieren auf RPG IV, ILE-RPG (ILE = Integrated Language Environment).
Der Java-Teil wird bearbeitet über jre1.6.0_05. Als Editor wird hierzu eclipse 3.1
verwendet. Betriebssystem auf dem heimischen Laptop ist Windows VistaTM Home
Basic, Service Pack 2.
3
2 Theoretische Grundlagen
2.1 Allgemeines zur 3-Tier-Architektur
Zu Beginn der kommerziellen Nutzung von Datenverarbeitung waren Computer groß
und teuer, so dass nicht für jeden Anwender ein eigener Rechner zur Verfügung ste-
hen konnte. Stattdessen waren diese über „dumme“ Terminals mit einem Hauptrech-
ner verbunden [vgl. Vogel 2008, Seite 222]. Mit der Durchsetzung kostengünstiger
PCs konnte diese sog. Mainframe-Architektur abgelöst und Anwendungen dezentra-
lisiert werden. Mittels File Sharing wurden nun ganze Dateien vom Server auf die
Arbeitsplatzrechner übertragen. Da dieses Verfahren sehr netzbelastend war, zeit-
gleiche Anwenderzugriffe zu Engpässen führten, bot das Client-/Server-Modell Ab-
hilfe. Hierbei laufen Anwendungsprogramme auf dezentralen Rechnern und greifen
auf zentral abgelegte Ressourcen über ein Frage-Antwort-Schema zu [vgl. Vogel
2008, Seite 223]. Ein Nachteil hierbei ist, dass die dezentral installierten Anwen-
dungsprogramme aufwendig zu warten sind, ein einheitlicher Stand schwer zu ge-
währleisten ist. 3-Tier-Architekturen lösen dieses Problem, indem hier Anwendungs-
logik und Datenhaltung zentral gelagert sind und die Benutzeroberflächen auf den
verteilten Clients liegen. Zwischen den drei Komponenten liegen Zwischenschichten,
die die Datenübertragung organisieren [vgl. Vogel 2008, Seite 225]. Man spricht
auch von einer Dreischichtigen Architektur. Eine Präsentationsschicht sorgt für die
Interaktion mit dem Benutzer, indem sie GUI-Elemente bereitstellt und die Dialog-
kontrolle übernimmt. Die darunter liegende Anwendungsschicht dient der eigent-
lichen Verarbeitung der Funktionalitäten aus fachlicher Hinsicht. Durch Benutzer-
eingaben werden dort Prozesse ausgelöst und Berechnungen durchgeführt. Gleich-
zeitig besteht von ihr aus eine Beziehung zur wiederum darunter angeordneten
Persistenzschicht [vgl. Dunkel 2008, Seite 43]. Hier werden Daten als eine aus-
schnittsweise Abbildung der realen Welt dauerhaft (persistent) gespeichert. Eine
Sammlung solcher Daten wird als Datenbank (DB) bezeichnet. Über ein DBMS
werden diese Daten strukturiert, Datenmodelle festgelegt und die Beziehungen
untereinander geregelt [vgl. Kudraß 2007, Seite 21]. Die drei angesprochenen
Schichten können räumlich auf hardwaremäßig verschiedene Rechnersysteme
verteilt werden.
4
2.2 Eigenheiten der iSeries bezüglich der Benutzeroberfläche
Die IBM eServer iSeries-Produktfamilie gehört zu den midsize business Computer-
Systemen. Die Rede ist auch von Midrange Systemen (Mittlere Datentechnik), die
sich zwischen Mainframe- und Microcomputern ansiedeln lassen. Die iSeries baut
auf ihren Vorgänger-Generationen System/36, System/38 und AS/400 auf [vgl.
Hoskins 2003, Seite 7]. Die im vorherigen Kapitel beschriebenen drei Schichten
stehen auf einer iSeries gänzlich zur Verfügung: Standardmäßig besitzt die AS/400
eine bereits integrierte relationale DB2-Datenbank [vgl. heise, 01/2008]. Gleichfalls
dient sie als Applikationsserver [vgl. Gulbins 2002, Seite 616]. Ursprünglich war die
das multiuserfähige System über eine zweiadrige TWINAX-Verkabelung mit zahl-
reichen nichtintelligenten Benutzer-Terminals (z.B. InfoWindow II workstations)
verbunden, und stellten damit letztendlich die Präsentationsschicht dar [vgl. Hoskins
2003, Seite 77]. Seit Einführung des IBM Client Access Express besteht die Mög-
lichkeit die AS/400-Frontenddarstellung über eine 5250-Emulation auf einem „nor-
malen“ PC innerhalb eines grafischen Fensters laufen zu lassen (Terminal Emula-
tion) [vgl. Hoskins 2003, Seite 78]. Der Zugriff erfolgt dabei über die IP-Adresse der
AS/400, die innerhalb eines lokalen Windows-Netzwerkes betrieben werden kann.
Die Authentifizierung ist dabei über das Kennwort des AS/400-Userprofil (usrprf)
notwendig. Somit ist auch Remotezugang ortsungebunden über das Internet möglich.
Weiterer Vorteil ist, dass auf dem Rechner des Benutzers parallel auch andere An-
wendungen (Office, Email etc.) verfügbar sind. Dennoch mutet die Darstellung nach
wie vor spartanisch an. Immerhin bietet die 5250-Emulation erweiterte Funktionen
wie z.B. Copy-and-Paste von Texten sowie mehrere Sitzungsanmeldungen (Ses-
sions). Das textbasierte Layout besteht aus einem 80 x 25 Zeichen-Raster. Quasi als
„Lesezeichen“ kann der Cursor über eine Tastenkombination in eine Art Fadenkreuz
eingebettet werden. Die Bezeichnung ‚Greensscreen’ ist im Übrigen irreführend, da
sehr wohl verschiedene Schriftfarben zur Auswahl stehen. AS/400-seitig ist der
Hintergrund stets schwarz, über die 5250-Emulation sind allerdings individuelle
Hintergrundfarbeinstellungen möglich. Auch für den durchschnittlichen Benutzer
obligatorisch, ist eine Kommandozeile am unteren Bildschirmrand, um z.B. ge-
nerierte Ausdrucke über den Befehl WRKSPLF (work with spoolfiles) steuern zu
können.
5
2.2.1 OS/400-Objekte
Ein wichtiges Architekturkonzept der iSeries stellen Objekte dar. Dieser Objektbe-
griff darf hier jedoch nicht mit dem der ’Objektorientierten Programmierung’ ver-
wechselt werden. Bei OS/400-Objekten handelt es sich um Strukturen des Betriebs-
systems. Jedes Element, das auf der AS/400 namentlich über die Befehlszeile über
den command WRKOBJ angesprochen werden kann, ist ein Objekt. Konkret können
dies z.B. Benutzerprofile, ausführbare Programme, Dateien, Gerätebeschreibungen,
commands, Jobbeschreibungen, Output Queues usw. sein [vgl. Fottral 2002, Seite
65]. Es können neue OS/400-Objekte erstellt werden. Alle derartigen Objekte sind
kategorisiert in über 40 Objekttypen, die auf ihren Verwendungszweck hinweisen.
An den Objekttyp sind seine spezifischen Eigenschaften (Attribute) gebunden. So
sind beispielsweise bei der Erstellung eine Benutzerprofils über CRTUSRPRF auto-
matisch Attribute wie ‚Benutzername’, ’Benutzerkennwort’ und ’Startmenü’ an das
Objekt geknüpft [vgl. Fottral 2002, Seite 67]. Weit hergeholt könnte man quasi einen
Vergleich zu Windows ziehen, wenn beispielsweise eine .doc-Datei angeklickt wird
und sich dabei automatisch MS-WORD öffnet. Werden OS/400-Objekte über CL-
commands angesprochen, wissen sie somit, „von sich selbst“, wie sie strukturiert
sind. Dateien sind ebenfalls Objekte. Sie gehören dem Objekttyp *file an. Hier ist
wiederum eine weitere Untergliederung üblich. So können insgesamt 12 Varianten
des Typs *file unterschieden werden [vgl. Fottral 2002, Seite 123]. Nachfolgend nur
die vier wichtigsten: Physische Files mit dem Attribut (subtype) ’PF’ beinhalten und
organisieren Daten. Als PF-DTA stehen sie für Tabellen einer relational organisierten
Datenbank, als PF-SRC hingegen beherbergen sie den Sourcecode z.B. von Program-
men in Form von Teildateien. Im Gegensatz zu den Physischen Files stehen Logische
Dateien (LF) [vgl. Fottral 2002, Seite 124]. Sie enthalten keine Daten, sondern stel-
len verschieden Zugriffspfade für PF-DTAs zur Verfügung (Stichwort ’Schlüssel-
attribute’ für Datenbanktabellen). Bei den Printerfiles (PRTF) handelt es sich um
files, die die Struktur und das Layout von Ausdrucken definieren. Ähnlich fungieren
Displayfiles (DSPF). In ihnen ist das Design von Bildschirmdarstellungen festgelegt.
Außerdem werden Ein- und Ausgabefelder als Variablen mit ihrem Datentyp
deklariert und ihre Lage auf dem Bildschirm bestimmt. Displayfiles haben einen
maßgeblichen Anteil für die Frontendgestaltung (mehr hierzu in Kapitel 2.2.3).
6
2.2.2 RPG
RPG (Report Program Generator) ist eine Programmiersprache mit hohem Bekannt-
heitsgrad speziell in der Midrange-Computerfamilie [vgl. Malaga 2000, Kapitel 20,
Seite 1]. Ehemals wurde RPG von IBM zur Erstellung kaufmännischer Listen (sog.
Reports) entwickelt. Von daher rührt noch der Name. In der 60er/70er-Jahren des
vergangenen Jahrhunderts waren Lochkarten als Datenträger (auch für Programm-
Quellcodes) üblich. In Anlehnung an dieses Prinzip ist RPG auch in späteren Com-
piler-Versionen stark spaltenorientiert. D.h. es bestehen strenge Konventionen darü-
ber, welche Sourcecode-Komponenten wo, in horizontaler Ausrichtung zu stehen ha-
ben [vgl. Malaga 2000, Kapitel 20, Seite 4]. Seit 1994 gibt es die vierte RPG-Gene-
ration RPG IV, auch bekannt als ILE RPG. RPG-Programme können die, im vorher-
gehenden Kapitel genannten, Objekttypen *file nutzen, indem diese im Kopfbereich
des Quellcodes unter dem Designator ’F’ deklariert werden. Alle z.B. in Displayfiles
vordefinierten Variablen sind damit innerhalb des RPGs bekannt und können dort im
Quellcodebereich ’C’ (Calculation Specification) in Rechenbestimmungen verwen-
det werden. Gleiches gilt für PFs und PRTFs [vgl. Malaga 2000, Kapitel 20, Seite 5].
Häufig wieder verwendete RPG-Routinen, wie z.B. Währungsumrechnungen können
über sog. Copysourcen („Kopiestrecken“) einmalig kodiert, separat abgelegt und ins
Programm integriert werden. Beim Compiliervorgang werden diese dann fester Be-
standteil RPG-Programm-Objekts. Vom Prinzip her also ähnlich wie die Wiederver-
wendbarkeit vordefinierter Klassen, die mit Imports in Java-Programme eingebunden
werden. Um Sourcecode zu editieren steht auf der iSeries der Haupt-Quelleditor SEU
(Source Entry Utitity) zur Verfügung. Ebenso wie SEU stellt auch der Programm
Developement Manager (PDM) ein IBM-Utility für Programmierer dar [vgl. Malaga
2000, Kapitel 22, Seite 1]. Über das PDM wird eine Ordnungsstruktur hinsichtlich
der Archivierung von Quellcodes organisiert. So bilden Sammlungen von RPG-Sour-
cen Teildateien der Datei PF-SRC QRPGSRC bzw. QRPGLESRC. Quellen von Dis-
playfiles werden in der QDDSSRC abgelegt. Übergeordnete „Container“ für alle Ob-
jekte bilden Bibliotheken (libraries). Die, einem Benutzer zugeordnete Bibliotheks-
liste entscheidet während der Laufzeit, welche Programmobjekte „greifen“. Bei einer
Bildschirmdarstellung steuert das RPG-Objekt die Funktion und den Ablauf, das Dis-
playfile-Objekt hingegen bestimmt über den statischen Aufbau des Layouts.
7
2.2.3 DSP-Files
Um innerhalb eines RPG-Programms eine Bildschirmausgabe zu verwenden, muss
der gesamte Bildschirm vorab definiert werden. Die Definition einer Bildschirmdatei
(Displayfile) geschieht in ähnlicher Weise wie bei Datendateien (PFs), obgleich die
erstere eine größere Spaltenanzahl im Sourcecode aufweist. Der Zeilentyp ’A’ der
beginnenden Spalte ist bei beiden identisch. Korrespondieren die Bildschirmvaria-
blen mit denen einer Datenbankdatei, kann darauf referenziert werden. Separate De-
klaration entfällt somit. Vorteil dieser Referenzierung ist, dass Änderungen in Feld-
definitionen zentral an einer Stelle erfolgen können. Im Kopf des DSPF wird eben-
falls die Bezeichnung eines Satzformates (Namensart ’R’) festgelegt. Mit dem An-
sprechen dieses Satzformats über EXFMT innerhalb des RPG wird dann der Aufruf
des Bildschirms ausgelöst. Es sind mehrere Satzformate in einem RPG, und damit
Aufruf mehrerer verschiedener Bildschirme im Programm möglich. Unterhalb des
Satzformats erfolgt die Angabe einzelner Bildschirmvariablen zusammen mit ihren
X-/Y-Koordinaten sowie einer Kennzeichnung, ob es sich um Ein- oder Ausgabefel-
der handelt. Über einen Code wird die jeweilige Schriftfarbe festgelegt. Außerdem
finden auch Funktionstasten ihre Definition innerhalb des Displayfiles.
2.2.4 MSG-Files
Meldungen des Betriebssystems OS/400 (i5/OS) werden im Volltext ausgegeben.
Dahinter stehen sog. Nachrichtendateien, die den Text eine (Fehler-)Meldung in der
jeweiligen Systemsprache anhand eines Message-Codes ermittelbar machen. Ein
Beispiel hierfür: CPF4101 = „Datei &2 in Bibliothek &3 nicht gefunden.“ Dieses
Prinzip kann in Anwendungsprogrammen weiter verfolgt werden. Alle Textkonstan-
ten werden an zentraler Stelle einmalig verwaltet und sind im Bedarfsfall über einen
Code aufrufbar. Hieraus ergeben sich Vorteile: immer wiederkehrend verwendeter
Text in Bildschirmmasken oder Drucklayouts wie z.B. „Speichern“, „Beenden“, „Ar-
tikel-Nr.:“ oder „Bestell-Nr.:“ braucht nur einmal angelegt, geändert oder korrigiert
werden. Wird zudem in den Textcode noch ein Sprachkennzeichen integriert, kann
anhand diesem die Konstante entsprechend der eingestellten Benutzersprache ausge-
geben werden. Nachrichtendateien können über den Befehl WRKMSGF zur Verwal-
tung aufgerufen werden.
8
2.2.5 Tastatur
Wichtige Schnittstellen von Informationssystemen zum Benutzer stellen Bildschirm-
geräte und Tastaturen dar. Die Normenreihe DIN EN ISO 9241 befasst sich mit der
Anpassung von Bildschirmarbeitsplätzen an die Arbeit des Menschen. Speziell dem
Thema ’Tastatur’ widmen sich die Normen der Reihe DIN 2137 [vgl. Klein 2001,
Seite 42]. Eine tatsächlich einheitliche PC-Tastatur setzte sich allerdings erst Ende
der 80er-Jahre des letzten Jahrhunderts durch. Bis dahin verwendeten viele System-
hersteller ihre eigenen Standards (IBM, Siemens, Nixdorf usw.). Die Ursprungstas-
tatur der AS/400 glich der Größe nach einem „Waschbrett“. Längst fand sie aber
Dank der 5250-Emulation Ersatz in der heute gängigen PC- bzw. Laptop-Tastatur.
Jedoch sind aufgrund verschiedener Funktionen gewisse Relikte bei der Bedienung
nach wie vor vorhanden. Ein Beispiel hierfür stellt eine separate ’Datenfreigabetaste’
dar. Um einzelne Eingabefelder einer Bildschirmmaske frei zugegeben wir die übli-
che ENTER-Taste verwendet. Diese wird auch als ’Feld-Eingabe’ bezeichnet. Um
jedoch die komplette Bildschirmmaske freizugeben (abzuschließen), wird die Daten-
freigabetaste verwendet. Um die Taste auf einer normalen PC-Tastatur simulieren zu
können, wird über die 5250-Emulation die rechte STRG-Taste hierzu herangezogen.
Funktionstasten gibt es 24 statt 12. Die Zweitbelegung kann über die SHIFT-Taste
erreicht werden (SHIFT F12 entspricht F24). Funktionstasten haben sowohl betriebs-
systemseitig und auch in Anwendungsprogrammen oft einheitliche Bedeutungen:
F3 = beenden, F12 = zurück, F4 = löschen, F7 = Speichern, F24 = weitere Tasten.
Geläufig ist auch der Ausdruck „Bedienertaste“ (BT3 = F3) anstelle von „Funktions-
taste“. Eine [ESC]-Taste mit der hierfür vorgesehenen Funktion gibt es nicht. Diese
Aufgabe ist meist der F3-Taste zugewiesen (s.o.). Ein ähnlicher Effekt, den man un-
ter Windows mit [Strg] + [Alt] + [Entf] bewirkt, wird bei der AS/400 mit [Shift] +
[ESC] erreicht. Man nennt diese Funktion auch „Systemabbruch“. Gefolgt von „2“
wird damit die Programmlaufzeit unterbrochen (z.B. bei Endlosschleifen). Gefolgt
von „3“ können Informationen zum gegenwärtigen Interaktiven Job über eine Menü
aufgerufen werden: Programmaufrufstapel, im Zugriff befindliche Dateien, die aktu-
elle Bibliotheksliste oder auch das Jobprotokoll.
9
2.3 Erwartungen an grafische Benutzeroberflächen
Informations- und Kommunikationssysteme allgemein benötigen Schnittstellen zum
Benutzer, damit dieser mit dem System interagieren kann. Derartige Mensch-Com-
puter-Interfaces bedürfen nutzergerechter Gestaltung [vgl. Hellige 2008, Seite 7].
Unter anderem spielt die Ergonomie eine entscheidende Rolle bei der Akzeptanz
beim Endanwender, was letztendlich Auswirkung auf die Produktivität hat. Schu-
lungsaufwand und an Anwenderbetreuung sind kostenintensiv. Die Bedienung sollte
intuitiv möglich sein, was jedoch oft subjektiv empfunden wird, da individuelle Vor-
erfahrungen mit einfließen. Die weite Verbreitung von Microsoft-Office-Applikatio-
nen (auch im Privatbereich) führt allerdings dazu, dass sich Anwender am schnells-
ten an sich dort angelehnte Benutzeroberflächen einarbeiten [vgl. Schmidl 2008,
Seite 16]. Kaum noch nachvollziehbar, dass Grafikoberflächen bei ihrer ersten Vor-
stellung als Spielerei abgetan wurden [vgl. Missomelius 2006, Seite 77]. Intuition bei
GUI-Oberflächen entsteht u.a. durch ihre selbstsprechende Symbolik (Icons, Pikto-
gramme, Metaphern) und durch die Maussteuerbarkeit mittels Direktmanipulation
(z.B. Bildobjekte verschieben) bzw. Zeigebefehle (virtuelle Buttons statt Tastatur-
tasten) [vgl. Saier 2007, Seite 17]. Generell sollten sich Informations-Ein/Ausgaben
direkt an der Arbeitsaufgabe orientieren. D.h. bei Eingaben müssen Daten in einer
Maske zusammengefasst werden, die aus einer gemeinsamen externen Quelle stam-
men, auch wenn deren spätere Verarbeitung getrennt erfolgt. Ebenso lehnt sich die
Genauigkeit der Datenformatierung von Eingabefeldern an den Anwendungszweck
an (z.B. Geldbeträge mit zwei Nachkommastellen) [vgl. Herczeg 2005, Seite 125].
Was man unter dem Aspekt „Benutzbarkeit“ einer Anwendung betrachtet, kann unter
dem Begriff „usability“ zusammengefasst werden. Dabei gelten Kriterien, die auch
speziell auf grafische Benutzeroberflächen bezogen werden können: Zum einen wird
Verständlichkeit (understandability) verlangt. D.h. Symbole, Beschriftungen, Menü-
führung usw. sollten möglichst selbstsprechend mit wenig Erklärungsbedarf ausge-
führt werden. Tooltip-Texte und Onlinehilfen unterstützen die Verständlichkeit. Über
die Bedienbarkeit (operability) soll der Benutzer in der Lage versetzt werden, das
Softwareprodukt zu steuern. Der „Bediener“ muss geführt werden, z.B. mit Hinweis-
meldungen, wie „dieses Feld darf nicht leer sein“. „Verbotene“ Eingabefelder und
Buttons sind von vorne herein auf ‚disabled’ gesetzt und erscheinen ausgegraut.
10
Nicht zuletzt entscheidet auch die Attraktivität (usability compliance) über die Ak-
zeptanz des Softwareprodukts sowie über die Arbeitszufriedenheit und schlägt sich
u.a. nieder in Farbgestaltung, Hervorhebungen, Anordnung/Gruppierung von Labels
und Eingabefeldern, Schriftart und Schriftgrad [vgl. Balzert 2009, Seite 469]. Wei-
tere Kriterien bilden Erlernbarkeit und Einprägsamkeit, die sich darin auszeichnen,
wie schnell sich ein Benutzer erstmals und auch in Wiederholungsfällen zurecht-
findet [vgl. Thum 2008, Seite 17]. In der Norm ISO/IEC 9126 sind ausführliche Be-
schreibungen zahlreicher Kriterien bezüglich der Softwarequalität niedergelegt [vgl.
Balzert 2009, Seite 469].
2.4 verschiedene Arten grafischer Frontends
2.4.1 HTML und Browserdarstellung
Browser greifen über HTTP (HyperText Transfer-Protokoll) auf einen Server zu, der
ein HTML-Dokument zurücksendet, welches wiederum vom Browser interpretiert
und zur Darstellung gebracht wird. Die Kommunikation läuft über TCP/IP-Port 80.
Der eigentliche Inhalt von HTML-Dokumenten setzt sich aus Text sowie aus Anwei-
sungen zur Formatierung dieses Textes zusammen. Die Anweisungen (Tags) stehen
innerhalb spitzer Klammern. HTML-Dateien sind im ASCII-Code geschrieben. So-
mit sind sie über jeden Text-Editor bearbeitbar [vgl. Däßler 2003, Seite 259]. Haupt-
aufgabe von HTML liegt in der formatierten Darstellung von Texten einer Website.
Über Hyperlinks sind Verknüpfungen zu anderen Seiten möglich [vgl. Däßler 2003,
Seite 266]. Mit zum Sprachumfang gehören Formulare, die übliche Elemente wie
z.B. Eingabefelder, Radiobuttons, Comboboxen usw. beinhalten (mit der Syntax:
<FORM action=...></FORM>) [vgl. Däßler 2003, Seite 272]. Dynamische Seiten, ge-
eignet für die Anwenderinteraktion, werden durch Skriptsprachen unterstützt und er-
möglichen den Dialog mit einer Applikationsschicht. Was im Internet funktioniert,
ist auch für ein Intranet für den betriebswirtschaftlichen Anwendungszweck geeig-
net. Der Browsereinsatz bietet Vorteile: der administrative Aufwand ist gering und
die Distribution erfolgt quasi automatisch durch das jeweils neue Laden einer aktu-
alisierten Seite. Außerdem findet die Browserdarstellung (zumindest theoretisch) un-
abhängig vom verwendeten Betriebssystem statt [vgl. Ebel 2005, Seite 17].
11
Vorteile aus Sicht von Softwareanbietern ergeben sich daraus, dass Verantwortlich-
keiten bei fehlerhaften Darstellungen auf die Browserhersteller verlagert werden
können. Da hinsichtlich der HTML Standards existieren, stehen Browseranbieter
hierin in Konkurrenz zueinander (beispielsweise Mozilla Firefox, Google Chrome
und brandaktuell: Internet Explorer 9 von Microsoft) [vgl. heute, 03/2011]. Dennoch
bieten Browseranwendungen (noch) nicht den Komfort wie herkömmliche PC-An-
wendungen. Durch die „Beliebigkeit“ unterschiedlicher Browser bei der HTML-In-
terpretation können sich auch Inkonsistenzen ergeben [vgl. Ebel 2005, Seite 17].
2.4.2 Microsoft .NET Framework
Die .NET-Strategie wurde im Jahr 2000 von Microsoft ins Leben gerufen, um server-
seitig Marktanteile zu gewinnen [vgl. Masak 2005, Seite 208]. Das .NET-Framework
ist Bestandteil dieser Strategie, und stellt eine umfangreiche Programmierumgebung
bzw. Software-Plattform dar. Diese dient sowohl zur Entwicklung, als auch zur Aus-
führung von Programmen. Wesentliche Komponenten sind hierbei eine Laufzeitum-
gebung namens Common Language Runtime (CLR) zur Programmausführung, Pro-
grammierschnittstellen und verschiedene Services sowie eine umfangreiche Samm-
lung von Klassenbibliotheken. Das .NET-Framework ermöglicht die Entwicklung
komplexer Web- und Windowsapplikationen unter verschiedenen Programmierspra-
chen wie Visual Basic oder Visual C++. Vorgefertigte Bestandteile der Klassenbib-
liothek erleichtern die Programmierung, indem sie Lösungen für Standard-Aufgaben
bereitstellen [vgl. Kotz 2008, Seite 17]. Bei den Klassenbibliotheken handelt es sich
um kleinste weitergebbare Codeeinheiten sog. Dynamic Link Librarys mit der Datei-
endung .dll. DLLs enthalten außer einem Code, der unter der CLR ausführbar ist,
Daten zu ihrer internen Beschreibung. Mit DLLs wird das Paradigma der Wiederver-
wendbarkeit in der objektorientierten Programmierung (OOP) realisiert. [vgl. Wirtz
2008, Seite 176]. Microsoft bietet Visual Studio als integrierte Entwicklungsumge-
bung für verschiedene Programmiersprachen, wie z.B. Visual Basic oder C++ an.
Erstellung von Anwendungen für das .NET Framework wird hierbei unterstützt. Vor-
gefertigte Grafikelemente für Eingabemasken können über eine Toolbox per Copy
and Paste hinzugefügt und mit der Maus gestalterisch bearbeitet werden. Über Visual
Studio können im Anschluss hieraus lauffähige DLLs generiert werden.
12
2.4.3 Java
Die Komfortabilität bei der Erstellung von Grafikoberflächen unter Zuhilfenahme
des Microsoft .NET Framework hat den Nachteil, dass der Schwerpunkt auf Win-
dows-Anwendungen fixiert ist. Plattformunabhängigkeit hingegen bietet Java. Das
Unternehmen Sun Microsystems umschrieb diesen Umstand mit „write once, run
anywhere“ [vgl. Flanagan 2003, Seite 6]. Als weitere Vorteile von Java können ge-
nannt werden: Einfachheit (im Vergleich z.B. zu C++), Netzwerkfähigkeit (für ver-
teilte Anwendungen geeignet), Robustheit (geringe Fehleranfälligkeit, Abfangen von
Exceptions über try/catch), Sicherheit (Kapselung von Objekten), Interpretierbarkeit
(als semi-kompilierte Sprache) und Parallelisierbarkeit (unterstützt Multithreading)
[vgl. Deck 2010, Seite 24]. Speziell für die GUI-Programmierung stellt die Java-API
die Packages AWT und Swing zur Verfügung. AWT (Abstract Window Toolkit) bil-
det hierbei die Grundlage, kümmert sich insbesondere um die Ereignisverwaltung
und ist auch erforderlich, wenn Swing zum Einsatz kommt. Zwar bietet AWT eine
ganze Reihe eigener Fenster und Steuerelemente, die jedoch vom Erscheinungsbild
eher einfach gehalten sind. Um Konformität hinsichtlich des Designs auf unter-
schiedlichen Betriebssystemen sicherzustellen wurde ursprünglich mit AWT auf die
jeweiligen betriebsysteminternen Steuerelemente zurückgegriffen. Dieses Verfahren
stellte jedoch nur einen Kompromiss dar und war zudem fehleranfällig. Swing be-
schreitet einen anderen Weg, indem hier sämtliche Steuerelement komplett in Java
ausimplementiert werden. Die Anzahl verfügbarer Swing-Komponenten beträgt ein
Vielfaches gegenüber der von AWT [vgl. Louis 2007, Seite 287]. Auch unter dem
Gesichtspunkt der Ästhetik stellt sich Swing als die „schönere“ Variante dar. Die
eigentliche Codierung kann bei Java prinzipiell mit jedem Texteditor durchgeführt
werden. Nützliche Tools stellen Eclipse oder NetBeans dar, die als integrierte Ent-
wicklungsumgebungen das Editieren komfortabler machen. Z.B. werden hier syntak-
tische Fehler bereits vorab erkannt und hervorgehoben. Sogenannte GUI-Builder un-
terstützen speziell das Erstellen von grafischen Oberflächen vergleichbar mit Micro-
soft Visual Studio (s.o.). GUI-Builder sind bei vielen Entwicklungsumgebungen be-
reits enthalten. Im Fall von Eclipse gibt es aufgrund seiner Erweiterbarkeit zu diesem
Zweck Plugins. Als Beispiele hierzu können Jigloo, Window Builder Pro oder Visual
Editor genannt werden [vgl. com, 11/2004].
13
3 Ausgangssituation
Für das vorliegende Projekt wurde als Ausgangsbasis eine (fiktive) Eingabemaske
gewählt, wie sie in einem ERP-System vorkommen könnte. Es handelt sich um eine
Maske zur Erfassung von ’Direktbestellungen’. Gemeint sind hiermit Bestellungen,
die nicht auf Rahmenverträgen oder Lieferabrufen basieren. Also für Gemeinkosten-
artikel oder auch sog. C-Teile wie Schreibwaren, Büroartikel, Reinigungsmittel usw.
3.1 Darstellung der bisherigen Greenscreen-Eingabemaske
In Abbildung 2, auf Seite VIII ist die Maske mit bereits erfolgten Benutzereingaben
dargestellt. Zur eindeutigen Identifizierung erhält jede Bestellung ihre eigene Bestell-
nummer. Teilestammdaten und Lieferantenstammdaten müssen vorab in der Daten-
bank angelegt sein. Gleiches gilt für eine Auswahl von Zahlungs-/Lieferbedingungen
sowie ’anfordernde Abteilung’ und ’Sachbearbeiter’. Die restlichen Eingaben können
ohne Bezug zu Stammdaten vom Benutzer direkt erfasst werden.
3.2 Betrachtung aus Anwendersicht
Der Aufruf zur Bestellerfassung erfolgt über einen Punkt vom Einkaufsmenü aus.
Dabei wird zuerst die Bestellnummer innerhalb eines eigenen Nummernkreises auto-
matisch hoch gezählt und mitgegeben. Sie wird in der Maske links oben eingeblen-
det. Der Anwender wird bei den Eingaben weitgehend geführt: Für eine eindeutige
Zuordnung des Bestellartikels muss eine Teilenummer eingegeben werden. Kennt
man diese nicht auswendig, so ist Suche über Matchcode möglich. Dies wird hier so
gelöst, dass die ersten Buchstaben der bekannten Teilebezeichnung mit einem Frage-
zeichen voran gestellt eingegeben wird. Beispielsweise „?KO“ für „Kopierpapier“
(Abbildung 3, Seite VIII). Nach <Datenfreigabe> gelangt man in eine Folgemaske,
die eine Liste in Frage kommender Artikel zeigt (Abbildung 4, Seite IX). Die Aus-
wahl geschieht mit „ankreuzen“ gefolgt von <Datenfreigabe>. Man gelangt zurück
zur Ausgangsmaske, die nun außer der Teilenummer noch weitere Teilestammdaten
wie Teilebezeichnung und Maßeinheit zur Anzeige bringt (Abbildung 5, Seite IX).
In ähnlicher Weise wird mit Zahlungs-/Lieferbedingungen sowie ’anfordernde Ab-
teilung’ und ’Sachbearbeiter’ verfahren. In diesen Fällen gelangt man zu den jeweils
dafür vorgesehenen Auswahlbildschirmen über die Funktionstasten F5, F8 bzw. F9.
14
Abbildung 6, Seite X zeigt die Lieferantenauswahl-Liste. In Abbildung 7, Seite X
sind die nach Lieferantenauswahl automatisch ergänzten Daten Lieferantennummer,
Lieferantenname und -währung ersichtlich. Weitere Daten werden „von Hand“ ein-
gegeben. Um die Bestellerfassung zu verwerfen, kann die Erfassungsmaske über die
Funktionstaste F3 verlassen werden. Hierbei muss die bereits vergeben Bestellnum-
mer wieder automatisch zurückgesetzt werden. Zur Übernahme aller Eingabedaten
wird F7 betätigt. Im Anschluss werden verschiedene Plausiprüfungen vorgenommen.
Das kann z.B. eine Datumsprüfung sein. Im Falle des 30.02.2011 wird dann eine ent-
sprechende Fehlermeldung ausgegeben. Ansonsten erfolgt die Abspeicherung mit an-
schließender Meldung „-Bestellung wurde versendet-“ (siehe Abbildung 2, auf
Seite VIII links unten).
3.3 grundsätzliche Maskenelemente
3.3.1 Funktionstasten
Im Sinne der Durchgängigkeit wird die Belegung der Funktionstasten (wo möglich)
auf allen Bildschirmen gleich gewählt. Dabei wird sich außerdem an Konventionen
der Betriebssystem-Oberfläche angelehnt. Dies betrifft speziell die Funktionstasten
F3 zum Verlassen des gegenwärtigen Bildschirmes und die Funktionstaste F7 zur
Datenübernahme.
3.3.2 Variablen
Der Sprachgebrauch im RPG-Umfeld bezeichnet Variablen auch als „Felder“. Die
Felder des Bildschirmes orientieren sich an denen der Datenbank, was zum einen den
Datentyp und zum anderen deren Länge anbetrifft. Vorzugweise numerisch sind Be-
stellmengen und Preise festzulegen. Die Dimensionierung orientiert sich dabei an der
betrieblichen Praxis. D.h. Bestellmengen können durchaus auch Nachkommastellen
erfordern, wenn z.B. 25,75 Liter eines bestimme Reinigungsmittels benötigt werden.
Hier gilt, ebenso wie bei Geldbeträgen, dass der Anwender tatsächlich ein Komma
bei der Eingabe erwartet und keinen Dezimalpunkt. Während Bestell- und Lieferan-
tennummer einem geschlossenen Nummernkreis entstammen, ist die Teilenummer
alphanumerisch und wird bei der Teilestammanlage vom Anwender selbst festgelegt.
15
Beim Bestelldatum wird aufgesplittet in Tag, Monat und Jahr. Ablage in der Datei
erfolgt jedoch zusammengefasst in einem Feld als sog. gedrehtes Datum im Format
20110327, was spätere Selektionen (Datum von/bis) und Sortierung erleichtert. Die
aus Codetabellen entstammenden Kürzel, wie z.B. die Zahlungsbedingung Z31 wer-
den nur als solche (hier 3-stellig) in der Bestelldatei abgelegt. Der zugehörige Text
(„10 Tage 3%...“) wird immer erst bei Bedarf ermittelt und ausgegeben. Für Bemer-
kungen ist noch ein 4-zeiliger Zusatztext vorgehen. Da Memofelder in RPG nicht be-
kannt sind, sind hierfür vier getrennte eigenständige Textfelder vorgesehen.
3.3.3 Textkonstanten
Das im Kapitel 2.2.4 beschriebene Konzept der Message-Files kommt bei der Defini-
tion von Textkonstanten zum Einsatz. Dies betrifft angefangen von der Überschrift
„Direktbestellung erfassen“, ebenso Labels wie „Teile-Nr.:“, sowie die Bezeichnun-
gen der Funktionstasten. Die Abbildungen 8, 9 und 10, Seite XI ff. zeigen die zu die-
sem Zweck eingerichtete Nachrichtendatei M1MSGF, welche die Nachrichten-IDs
KON0001 bis KON0030 für Layouttexte sowie FUN0003 bis FUN0014 für Funk-
tionstasten enthält. Beispielhaft ist Textkonstante KON0009 = „Teile-Bezeichnung:“
dargestellt.
3.3.4 Layoutelemente, Farben
Das Erscheinungsbild verschiedener Bildschirmmasken sollte durchgängig und ein-
heitlich sein. Zur räumlichen Aufteilung tragen in unserem Falle weiße Trennlinien
bei, die im Kopfteil die ebenfalls weiße Überschrift und im Fußteil den Funktions-
tastenbereich vom Arbeitsbereich im Mittelteil separieren. Um der Bestellnummer
als zentralem Element gerecht zu werden, ist ihr mit der Farbe Magenta eine Sonder-
rolle zugedacht. Bei den übrigen Texten gilt folgendes Prinzip: Vorgaben, die von
Anwenderseite nicht änderbar sind, erhalten die Textfarbe grün. Gelbe Schriftfarbe
hingegen signalisiert, dass es sich um Eingabefelder handelt bzw. Auswahlen über
Listen in Folgebildschirmen ermöglicht wird. Funktionstasten in blau lehnen sich an
OS/400-Konventionen an. Fehler- oder Hinweismeldungen werden in rot eingeblen-
det. Das in der linken oberen Ecke platzierte Produktlogo zeigt dem Benutzer, in
welcher Anwendung er sich gerade befindet.
16
3.4. Quellcodeanalyse
Die Voraussetzung zur Implementierung von Bildschirmprogrammen unter RPG ist
die Existenz zugehöriger Displayfiles. Für unser Beispielprogramm sind drei DSPFs
vorgesehen (siehe Abbildung 11, auf Seite XIII). Das DSPF M1BESTFM (siehe Ab-
bildung 12, auf Seite XIV) ist für die Hauptbestellmaske zuständig. In der Anweisung
0002.00 des Quellcodes wird zunächst die Anzahl Zeilen und Spalten (24 x 80) des
Bildschirms festgelegt. Es wird nicht in Pixel, sondern mit Anzahl ASCII-Zeichen
gerechnet. Mit dem Format ‚BEST101’ (Anweisung 0007.00) erfolgt später der Auf-
ruf aus dem Hauptprogramm. Mit Overlay CA03 bis CA09 (Anw. 0010.00 ff.) wer-
den die entsprechenden Funktionstasten aktiviert. Anhand der Bildschirmüberschrift
(Anw. 0035.00) kann die Anwendung von MSGFs verdeutlicht werden: Die Text-
konstante KON0001 ist platziert auf Zeile 1 und Spalte 25. Ab dieser Spalte 25 wird
Platz für 50 Zeichen reserviert. Die Darstellung soll in WHT = weiß ausgeführt wer-
den. Als „Platzhalter“ für dieses Feld ist der Name MSGF001 festgelegt, und der
Großbuchstabe A bestimmt hierbei, dass es sich um ein alphanumerisches Feld han-
delt. Im Gegensatz dazu steht DSMENG in Anw. 0057.00. Es handelt sich um ein
bearbeitbares Eingabefeld für die Bestellmenge. Die Bearbeitbarkeit wird über den
Buchstaben B (im Gegensatz zu O) bestimmt. Die Variable wird mit 8S2 definiert.
S steht in diesem Fall für numerisch, 8 Stellen lang, hiervon 2 Nachkommastellen.
Mit +1 wird in horizontaler Richtung eine Leerstelle zum davor stehenden Feld frei-
gelassen. Die genannten Vorgehensweisen gelten entsprechend für die übrigen Bild-
schirmkomponenten auch in den DSPFs M1LIWAFM (Lieferantenauswahl) sowie
M1TEWAFM (Teilestammauswahl). Im RPG-Hauptprogramm (Abbildung 15, auf
Seite XVII) werden diese drei DSPFs in den Anw. 0011.00 bis 0013.00 deklariert und
damit beim Kompilierungsvorgang mit eingebunden. Gleiches gilt für eine ganze
Reihe von Copy-Sourcen in Anw. 0113.00 ff. Mit zu den Deklarationen gehören
auch sog. Workfelder in Anw. 0016.00 ff., die lediglich innerhalb des Programms die
Funktion von Hilfsvariablen einnehmen. Der eigentliche Algorithmus findet seinen
Anfang ab Anw. 0035.00 ff. unter „Rechenbestimmungen“. Der Startpunkt wird über
das Wort ‚ENTRY’ (Anw. 0038.00) signalisiert. An der Stelle findet das aufrufende
Programm den Eintritt, wobei gleichzeitig eine gegebenenfalls vorhandene Aufruf-
Parameterliste über ‚PARM’ übernommen wird.
17
Mit dem Statement ’EXSR’ = ‘Execute (Invoke) Subroutine’ können Unterroutinen
aufgerufen werden. Abbildung 15, auf Seite XVIII zeigt in Anw. 0042.00 den Aufruf
der Routine ’BESTVR’ zur Vergabe der neuen Bestellnummer. Alle Ereignisse, die
innerhalb der Bestellmaske von Belang sind, werden nun in einer endlos laufenden
Schleife abgefangen, die in Anw. 0046.00 beginnt und in Anw. 0101.00 endet. Ist die
Teilenummer nicht leer und steht an erster Stelle kein Fragezeichen, dann wird die
Routine ’TELESE’ zum Lesen des Teilestamms aufgerufen (Anw. 0050.00). Anson-
sten, bei vorhandenem Fragenzeichen, wird in Anw. 0055.00 mit ’TEWAHL’ in die
Teilestamm-Auswahlmaske verzweigt. In Anw. 0064.00 wird geprüft, ob die Funk-
tionstaste F3 gedrückt ist. Trifft dies zu, erfolgt das Verlassen des Programms über
’SRRETU’. In gleicher Weise werden in Folge die Funktionstasten F5, F7, F8 und
F9 abgefragt und die jeweils zugeordneten Subroutinen ausgeführt. Insoweit sind die
bisherigen aufgeführten Programmteile lauffähig und stellen die Funktionalität eines
Prototypen in RPG vollumfänglich dar. Da wir uns hier vorwiegend auf die Gesichts-
punkte der Bildschirmdarstellung konzentrieren, sind weiterführende Komponenten
der Applikation nur rudimentär realisiert. Dies betrifft zu einen das aufrufende Start-
programm (Abbildung 16, auf Seite XIX). Zum anderen sind in zahlreichen Copy-
sourcen Funktionalitäten aus dem Hauptprogramm ausgelagert (Abbildung 15, Seite
XVIII, Anw. 0113.00 ff.). Der Vollständigkeit halber sind diese dargestellt in den Ab-
bildungen 17 bis 24 ab Seite XX.
4 Festlegung des Soll-Zustands
4.1 Idealvorstellung
Erinnern wir uns an das ursprüngliche Anliegen. Ziel ist es, eine grafische Benutzer-
schnittstelle bereitzustellen, die den Anforderungen der Zeit genügt, und für die Ak-
zeptanz bei modernen Anwendern förderlich ist. Dies als Marketingkonzept, um im
Wettbewerb mit anderen Anbietern bestehen bzw. gleichziehen zu können. Durch die
weite Verbreitung von Microsoft Windows-Oberflächen sollten diese auch folgerich-
tig als Vorbild bzw. Leitlinie herangezogen werden. Der Benutzer sollte dabei mög-
lichst keinen Unterschied zwischen einer MS Office-Applikation wie ‚Outlook’ und
unserer eigenen Geschäftsanwendung wahrnehmen können. „Look and feel“ als Ziel.
18
Als Gestaltungselemente steht eine mannigfaltige Palette grafischer Elemente zur
Verfügung. Als eine der vordringlichsten Aspekte drängt sich die Möglichkeit auf,
mehrere Fenster gleichzeitig geöffnet zu haben. Hierdurch hat man Ein-/Ausgabeda-
ten etwaiger Vor- und Nachfolgemasken gleichzeitig im Überblick. Unterstützt wird
dies durch die Tatsache, dass durch die bessere Grafikauflösung kleinere Schrift-
größen darstellbar sind. So kann gleiche Information auf engerem Raum ausgegeben
werden. Die Verschiebbarkeit sowie die Umschaltbarkeit zwischen Fenstern tragen
ihr Übriges dazu bei. Konkreten Einsatz basierend auf dieser Grundlage bietet sich in
unseren Anwendungsfall für die Matchcode-Auswahlliste für die Teilenummer an.
Auswahl-Listen mit Inhalten aus einer geringeren Grundgesamtheit lassen sich am
Besten über Comboboxen realisieren. Das kann beispielsweise bei der Zuordnung
der Zahlungs- und Lieferbedingungen geschehen. Überall wo möglich, setzen wir
mausbetätigbare Buttons ein. Somit kann auf die bisherigen Funktionstasten gänzlich
verzichtet werden. Für den mehrzeiligen Zusatztext bietet sich ein Memofeld an.
4.2 notwendige Kompromisse
Natürlich sind wir zuvorderst an die darunter liegende Applikation gebunden. Diese
Geschäftsanwendung bleibt weitgehend unverändert. So müssen Übergabeformate
der Variablen für die Schnittstelle von „oben nach unten“ und auch umgekehrt einge-
halten werden. Dies ohnehin, weil bei einem Update auf das neue Release Altdaten
weiterhin verwendbar sein müssen. Eine Einschränkung stellt das gewünschte Me-
mofeld dar. Da datenbankseitig der Zusatztext der Maske nach wie vor durch vier
Einzelzeilen abgebildet wird, muss dem Umstand auch im Maskendesign Rechnung
getragen werden. Codetabellenbasierte Auswahlen wie die Zahlungsbedingung bein-
halten nach wie vor den reinen Code z.B. „Z31“ anstelle des ganzen Volltextes.
Auch beinhaltet die Strategie, dass für eine erhebliche Anzahl von Stammusern ein
bestimmter Wiedererkennungswert zum bisherigen Standard vorhanden sein sollte.
In dem Zusammenhang wäre zu überlegen, bei verschiedenen Buttons parallel die
ehemalige Funktionstastenlogik zu belegen. Strittig ist dabei, ob das Verlassen der
Maske nun über [ESC] oder weiterhin über [F3] möglich sein soll. Hierbei ergeben
sich wiederum Ansätze, derartige individuelle Anwendervorlieben mittels Custo-
mizing über „Schalter“ in Form von Steuerungswerten zu regeln.
19
5 Umsetzung: Erstellung eines neuen grafischen Prototyps in Java
Es wurde eine Entscheidung zu Gunsten von Java getroffen, da wir so einerseits
plattformunabhängig sind. Andererseits stehen uns gegenüber einer HTML-Variante
weit mehr Möglichkeiten zur Verfügung. Von der Gesamtanwendung eines fiktiven
ERP-Systems wird lediglich ein kleiner Ausschnitt zur Darstellung gebracht. Mit der
Ausführung eines Prototyps soll dem Anwender eine „fassbare“ Beispielvariante der
neuen Grafikoberfläche präsentiert werden, die alle vorhandenen Dialogabläufe im
Zusammenhang mit der bisherigen Bestellmaske zu Testzwecken verfügbar macht.
Zur thematischen Einordnung wurden verschiedene Java-Packages gebildet (Abbil-
dung 25, auf Seite XXII). Wir trennen zwischen einem ‚Einkaufspaket’ und einem
Paket speziell für die ‚Teilestammverwaltung’. Zusätzlich soll ein neutrales Paket
namens ‚Framework’ bereitgestellt werden. Diese Vorgehensweise auch um dem Pa-
radigma der Wiederverwendbarkeit bei der Objektorientierung gerecht zu werden.
Auf die Vorstellung der einzelnen Klassen sowie der Funktionalitäten kommen wir
später zurück.
5.1 Elemente der neuen Eingabemaske
Im Folgenden soll zunächst der Fokus auf den gestalterischen Aspekten liegen.
5.1.1 Schriftarten, Schriftgrad, Farbgebung, Layout
Die Schrift in der Greenscreendarstellung ist (zwangläufig) einheitlich gehalten.
Die Schriftart möchte man von der Erscheinung her als COURIER identifizieren.
Die Buchstabenhöhe ist überall gleich hoch. Somit bieten sich nicht viel stilistische
Mittel, um Akzente zu setzen. Allein eine gewisse Farbpalette und die Inversdarstel-
lung taugen für Hervorhebungen. In Java haben wir nun eine weit größere Auswahl.
Dennoch ist ein sparsamer Einsatz empfehlenswert, um das Design nicht zu über-
frachten. Sinnvoll sind auf alle Fälle Durchgängigkeit bei gleichen Darstellungsele-
menten. Abbildung 26, auf Seite XXIII zeigt die neue GUI-Maske. Hier wurden alle
Labels (z.B. „Teilenummer:“) in ARIAL, schwarz und Größe 14 ausgeführt. Varia-
bleninhalte innerhalb von Textfeldern erhalten die Schriftart COURIER. Durch die-
sen „Schreibmaschinencharakter“ wird klargelegt, hier ist etwas einzugeben. Da die
maximale Variablenlänge fix ist, wird mit der Spaltengerechtigkeit von COURIER
20
gewährleistet, dass der Gesamtschriftzug der maximalen Länge der Textfeld-Recht-
ecke entspricht. In ARIAL hingegen fallen zehn Buchstaben „llllllllll“ oder zehnmal
„OOOOOOOOOO“ eben unterschiedlich lang aus. Weiterhin differenzieren wir bei
den Variablen zwischen manuell direkt eingebbaren in schwarz und Variablen, die
sich mittelbar aus den Stammdaten ergeben in blau. Das Window als solches präsen-
tiert sich im grau-blauen Windows Vista Style. Zur Raumaufteilung wurde das Fen-
ster horizontal in drei Panels eingeteilt. Die beiden oben und unten in grau, der Mit-
telteil mit weißem Hintergrund. Im Kopfbereich die beiden maßgeblichen zentralen
Elemente: Bestellnummer in rot mit Schriftgrad 16 sowie der Lieferant. Der Mittel-
teil wiederum ist nochmals mit zwei horizontalen Trennlinien unterteilt. Dadurch
entstehen drei Bereiche mit logisch zusammenpassenden Elementen: 1) Teilen-Nr.
mit den wichtigsten Eckdaten Menge, Termin und Preis 2) Ergänzungen wie z.B. die
Zahlungsbedingungen 3) Zusatztext. Im Fuss-Panel der Buttonbereich.
5.1.2 Überschrift, Logo
Auch das Produkt-Logo wird einem „Facelifting“ unterzogen. Dieses kann nun ori-
ginalgetreu wie in den Printmedien wiedergegeben werden. Zusatzfunktion kommt
bei der GUI-Version nicht nur dem Logo, sondern auch der Überschrift zu. Beide
stehen links oben im jeweiligen Fenster. Gleichfalls dient es bei minimierten Win-
dows zur Orientierung bei der Auswahl in der Taskleiste. Dementsprechend müssen
die Bezeichnungen aufgrund des hier begrenzten Platzes möglichst kurz und präg-
nant formuliert werden. Nicht zuletzt findet das Logo auch als Icon auf dem Desktop
Verwendung. Abbildungen 27 und 28, Seite XXIV zeigen eine Gegenüberstellung.
5.2.3 Eingabefelder, Comboboxen
Beim Handling der Textfelder in GUI werden bestimmte Verhalten erwartet. Aus-
schneiden, Kopieren und Einfügen gehören dazu. Javax.swing stellt JTextField zur
Verfügung. Hiermit wird das Editieren von einzeiligen Texten ermöglicht. Durch
Klicken in ein Textfeld wird erreicht, dass dort der Fokus liegt. Ebenso soll aber
auch das Springen von Feld zu Feld mittels [Enter] möglich sein. JComboBox ver-
bindet Textfeldeigenschaften mit denen einer Aufklappliste. Die Hauptbestellmaske
enthält 15 Textfelder und fünf Comboboxen.
21
5.2.4 Buttons
Während bei unserer RPG-Variante stets eine Schleife durchlaufen wird, bei der auf
Funktionstastendruck gewartet wird, sind bei der Java-Ausführung Listener im Ein-
satz, welche auch in verschiedenen, gleichzeitig geöffneten Fenstern auf Ereignisse
reagieren. Auslöser dieser Ereignisse stellen u.a. Buttons dar. So ist beim prozedu-
ralen Aufbau des RPGs der Ablauf weitgehend vorgezeichnet. Im Java-Programm
hingegen kann nicht vorhergesehen werden, was der Anwender als nächstes macht.
Dem Umstand ist bei der Erstellung des Algorithmus Rechnung getragen werden.
Drei Buttons in unserer Hauptbestellmaske zuzüglich des [X] zum Schließen der
einzelnen Windows müssen somit „unter einen Hut“ gebracht, Plausibilitätsüberle-
gungen für jeden möglichen Event angestellt werden.
5.2 Implementierung in Java (Quellcode)
Klasse XML_Kommunikation (Abbildung 29, Seite XXV)
Um eine Schnittstelle zum Kern der Geschäftsanwendung bereitzustellen, simuliert
diese Klasse alle Funktionen, die zur Kommunikation mit der Bestellmaske erforder-
lich sind. Methoden wie zur Festlegung der nächsten Bestellnummer, Zugriff auf ver-
schiedene Stammdaten sowie zur Speicherung der Bestellung werden bereitgestellt.
Klasse HinweisFenster (Abbildung 30, Seite XXX)
Zur Mitteilung allgemeiner Hinweise z.B. „Bestellung wurde versendet“ an den
Benutzer werden über diese Klasse ausgegeben. Aufrufparameter bilden Über-
schrift, Hinweistext, Fensterabmessungen und Fensterposition.
Klasse Fehlermeldung (Abbildung 31, Seite XXXI)
Ist vom Prinzip her gleich wie das Hinweisfenster. Hinzu kommt ein OK-Button.
Zweck sind Meldungsausgaben in der Form „Geben Sie eine gültige Teilenummer
ein“. Aufruf kann z.B. in der catch-Schleife beim Werfen einer Exception erfolgen.
Klasse BestellStart (Abbildung 32, Seite XXXII)
Die eigentliche Bestellmaske würde in der Realität über einen Punkt im Einkaufs-
menü aufgerufen. Die Klasse ‚BestellStart’ simuliert diesen Vorgang. In der main-
Methode wird der Konstruktor für alle Bestellparameter aufgerufen. Zwei weitere
Methoden dienen dem Eröffnen und Schließen der Hauptbestellmaske. Der Masken-
titel wird als Textkonstante über ‚XML_Kommunikation’ abgefragt und mitgegeben.
22
Klasse BestellEingabeParameter (Abbildung 33, Seite XXXIII)
Diese Klasse enthält alle notwendigen Attribute für eine Bestellung. Instanzen hier-
von stellen somit eine ganz konkrete Bestellung dar. Das komplette Objekt wird als
Übergabeparameter an Folgeklassen weitergereicht, damit diese Kenntnis über die
innere Datenstruktur haben. Der Zugriff erfolgt dabei ausschließlich über Setter- und
Gettermethoden. Somit bleibt das Prinzip der Kapselung gewahrt. Am Ende sollen in
der Klasse XML_Kommunikation über die Methode bestellungVersenden(...) sämt-
liche Parameter für die Übergabe an den RPG-Kern typgerecht aufbereitet werden.
Klasse BestellEingabeMaske (Abbildung 35, Seite XXXIX)
Stellt die zentrale Komponente unserer „Mini-Applikation“ dar, die hier quellcode-
seitig eingehender erläutert werden soll. Zu Programmbeginn wird als erstes eine
Instanz der Klasse XML_Kommunikation erstellt. Im Anschluss erfolgt Deklaration
der Maskenelemente Panels, Buttons, Labels, Comboboxen und Textfelder. Über die
Methode xml.textKonstanteZuord("...") werden alle benötigten Textkonstanten zuge-
wiesen. Außerdem werden verschiedene lokale Variablen, Objekte für Fehler-/Hin-
weis-Meldungen und der Folgeframe TeileMatchcodeMaske deklariert. Die eigent-
liche Maske wird nun im Konstruktor BestellEingabeMaske(...) erstellt. Es folgt die
Vergabe der Bestellnummer und Hinzufügen diverser Listener. Danach kommt die
Festlegung der einzelnen Parameter sämtlicher Maskenelemente in ihren spezifi-
schen Ausprägungen: Aufteilung und Hintergrundfarben der Panels. Lage, Größe,
Farbe und Schriftgestaltung der Labels, Textfeldern und Comboboxen. Platzierung
der Buttons. Nicht zuletzt Festlegung von Größe und Position des gesamten Frames
als solchen einschließlich hinzufügen des Titel-Icons. Listener reagieren auf entspre-
chende Events. Wir unterscheiden: Listener für Buttons, Item-Listeners zur Reaktion
auf Klicks in Comboboxen, Fenster-Listener speziell zum Schließen des Windows
und Key-Listener zur Reaktion auf die Enter-Taste.
Klasse TeileMatchcodeMaske (Abbildung 34, Seite XXXVI)
Für das Auswählen der Teilenummer aus einer Liste ist ein separates Fenster vorge-
sehen. Es ist ein Textfeld zur Matchcode-Eingabe eingerichtet. Anhand der Eingabe
werden in Frage kommende Positionen in ein Array gestellt. Eine Liste mit Scroll-
Leiste dient der Wiedergabe auswählbarer Positionen. Nach Anklicken einer Position
erfolgt automatisch Rückkehr zur Hauptbestellmaske.
23
5.3 Darstellung der neuen grafischen Eingabemaske
Der GUI-Prototyp verfügt jetzt über alle geforderten Funktionen. Die Dialogabläufe
können nunmehr durchgespielt werden. Nach Aufruf enthält zunächst lediglich die
Bestellnummer einen Inhalt (Abbildung 36, Seite XLVII). Prinzipiell ist die Eingabe-
reihenfolge beliebig. Jedoch ergeben nachfolgende Eingaben erst einen Sinn, wenn
der zu bestellende Artikel festgelegt wurde. Direkteingabe der Teilenummer ist mög-
lich. Falscheingaben werden mit einer Fehlermeldung quittiert (Abbildung 37, Seite
XLVII). Alternativer Einstieg über Button in die Matchcode-Auswahl (Abbildung 38,
Seite XLVIII). Der Matchcode-Button wird dabei deaktiviert, da sonst mehrfaches,
aber sinnloses Öffnen des Matchcode-Windows möglich wäre. Erst nach Verlassen
des Matchcode-Windows wird der Button erneut aktiviert. Was passiert, wenn bei
noch geöffnetem Matchcode-Window im Hauptfenster [X] = „Window-Closing“ be-
tätigt wird? Würde an der Stelle nicht dafür Sorge getragen, so bliebe das Match-
code-Window nach wie vor offen. Tatsächlich wird es aber ebenfalls geschlossen.
Zum dem Zweck wird intern die Methode ’matchcode.setVisible(false)’ verwendet.
Bei vorhandener Teilenummer werden die Teilestammdaten eingeblendet (Abbildung
39, Seite XLVIII). Lieferantenauswahl geschieht über eine Combobox (Abbildung 40,
Seite XLIX). Auch hier nach erfolgter Auswahl Einblendung ergänzender Lieferan-
tenstammdaten (Abbildung 41, Seite XLIX). Durch die Vorgehensweise der Einblen-
dung bereits vorhandener Stammdaten werden Fehler bei eventueller erneuter Erfas-
sung von Hand sowie redundante Datenhaltung vermieden. Dies setzt sich beim (hier
zwar nicht implementierten) Bestellversand fort. Daten, wie Adresskopf, Email-
adresse, unsere Kundennummer beim Lieferanten usw. stehen als bekannte Lieferan-
tenstammdaten schon zur Verfügung. Wird in der Hauptmaske [Übernehmen] ge-
drückt, ist es zunächst notwendig, die Benutzereingaben zu überprüfen. Als Pflicht-
felder festgelegte Eingaben, wie z.B. die Bestellmenge, dürfen nicht leer gelassen
werden. Ebenso muss das Bestelldatum einer Prüfung unterzogen werden. Dieses
soll einerseits kalendarisch korrekt sein, und darf andererseits auch nicht in der Ver-
gangenheit liegen. In Bedarfsfall sind entsprechende Meldungen an den Benutzer
auszugeben. Bei korrekten Eingaben erfolgt die Übergabe durch die XML-Schnitt-
stelle. Im Prototyp symbolisch dargestellt durch Ausgabe in der Konsole (Abbildung
42, Seite L).
24
6 Schlussbetrachtungen
Wir haben nun sowohl die Greenscreen-, als auch die GUI-Version aus verschie-
denen Blickwinkeln durchleuchtet und Betrachtungen hinsichtlich Implementierung
und ihrer Benutzung angestellt. Mit der neuen Bestellmaske steht nunmehr eine Gra-
fikoberfläche zur Verfügung, die hinsichtlich ihrer Bedingung auf der Höhe der Zeit
steht, und den modernen User als Zielgruppe anspricht.
Wie sieht die realistische Einschätzung dieses Konzepts aus, und welche Schlüsse
können gezogen werden? Bereits in der Einleitung wurde festgestellt, es gibt einige
Anbieter von Geschäftanwendungen, die ihrer Legacy-AS/400-Applikation auf diese
Weise mit verbesserter Optik neue Marktfähigkeit verliehen haben. Der gewöhnliche
Anwender sieht im Alltag kaum noch einen nennenswerten Unterschied zu einer
Microsoft Windows-Anwendung.
Kritische Anmerkungen
Stellen wir die Programmquellen unserer beiden Varianten gegenüber, ist zunächst
festzustellen, dass die Java-Variante einen erheblich größeren Umfang hat als der
RPG-Code. Bei Java können Hilfsmittel zur maschinellen Codierung von Getter- und
Settermethoden eingesetzt werden. Auch leisten GUI-Builder entlastende Hilfestel-
lung. Dennoch ist der erzeugte Code letztendlich doch vorhanden und muss als sog.
Metrik ‚LOC’ (Lines of Code) in eine etwaige Aufwandsschätzung mit einfließen.
Durch die Abhängigkeit vom Anwendungskern können die Möglichkeiten der ob-
jektorientierten Programmierung nicht voll ausgeschöpft werden. Auch zeigt die
Praxis, dass sich die eingesetzte Middleware zur Kommunikation zwischen An-
wendungs- und Präsentationsschicht oft als „Flaschenhals“ erweist, der bei den Ant-
wortzeiten im Vergleich zum ehemaligen Greenscreen-Release wesentlich schlechter
da steht.
Man muss somit festhalten: Die alleinige „GUIsierung“ der Benutzeroberfläche zur
Anwendungsmodernisierung steigert die Komplexität des Gesamtsystems, die
Funktionalität der Geschäftsanwendung im Kern verbessert sich hierdurch aber
eigentlich nicht wirklich, sondern stellt lediglich einen Kompromiss dar.
25
Stellenwert der iSeries in diesem Zusammenhang
Abgesehen von COBOL ist bis dato RPG d i e Programmiersprache der AS/400.
Der Zenit von RPG als solches ist allerdings, objektiv gesehen, bereits seit ein paar
Jahren überschritten. Zur Erweiterung und Wartung bestehender Systeme stehen
vielleicht noch ein knappes Jahrzehnt lang Programmierer zur Verfügung. Misch-
lösungen (wie die hier vorliegende), bei denen RPG den Applikationskern bildet,
werden insofern auch von diesem Aspekt her nicht zukunftsträchtig sein. Hierin liegt
ein gewisses Dilemma. Denn nach wie vor hat die i5 (AS/400) als Plattform ihre
Berechtigung. Sie bietet Abwärtskompatibilität über Jahrzehnte, gilt als stabil und
ausfallsicher, ist hochperformant, einfach administrierbar und erweiterbar.
Trends
Das i5/OS V6R1 verfügt über eine 64-Bit-JVM. Java-Programme sind schon seit
längerer Zeit auch auf einer iSeries lauffähig. Bei gänzlichen Neuentwicklungen
bietet es sich also an, auch die Anwendungsschicht komplett in Java auszuführen.
Einen weiteren Ansatz bietet EGL (Enterprise Generation Language) von IBM.
EGL ist eine Programmiersprache der 4. Generation (4GL) und zugleich eine Ent-
wicklungsumgebung. Auf der Basis von EGL-Programmen lässt sich wahlweise
Java-Code als auch System-i-naher Code generieren. Die in der Entwicklungsum-
gebung enthaltenen Editoren ermöglichen außerdem das Erstellen grafischer Ober-
flächen. EGL ist eingebettet in den WebSphere Development Studio Client (WDSC).
IBM-WebSphere als Produktfamilie hat Lösungen für den Bereich „e-business“, ist
vom Betriebssystem her plattformunabhängig und damit auch auf der AS/400 ein-
setzbar. Gleichwohl zeigen aber Entwicklungen auch in ganz andere Richtungen.
Nämlich weg von unflexiblen monolithischen Blöcken und proprietären Insellö-
sungen, hin zu lose gekoppelten Komponenten (Services), die im Sinne von SOA
(Serviceorientierte Architektur), über Schnittstellen kommunizieren. Ziel ist es, bau-
kastengleich unternehmensweite und unternehmensübergreifende Durchgängigkeit
für alle Bereiche zu geschaffen. Noch eine Steigerung zeigt sich bei SaaS (Software
as a Service) als ein Teilbereich von Cloud Computing. Welche Philosophien sich
durchsetzen werden, entscheidet der Markt und letztendlich die Anwender, die das
Maß der Dinge darstellen (sollten).
VII
ANHANG
vorher ERP-System
ERP-System nachher Abbildung 1: Prinzip: Ersatz RPG-Greenscreen-Benutzeroberfläche durch GUI
Datenbank ( DB2 )
RPG-Programme für - Bestelldruck - Sachbearbeiterverwaltung - Lieferantenverwaltung usw. usw. u n d RPG-Programme für Ein-/Ausgabemasken ... - Lieferanten erfassen - Sachbearbeiter erfassen usw. usw. unter anderem auch eine Bestellerfassungsmaske Applikation einschließlich
Bildschirmdarstellung
Datenbank ( DB2 )
RPG-Programme für - Bestelldruck - Bestellung speichern - Sachbearbeiterverwaltung - Lieferantenverwaltung usw. usw. Applikation
Java-Klassen für Eingabemasken ... - Lieferanten erfassen - Sachbearbeiter erfassen usw. usw. unter anderem auch eine Bestellerfassungsmaske grafischer Client
XML
VIII
Abbildung 2: Greenscreen-Maske als Ausgangsbasis, Komplettdarstellung
Abbildung 3: Greenscreen-Maske, Eingabe: Teilestamm-Matchcode
IX
Abbildung 4: Greenscreen-Maske, Teilestamm Matchcode-Auswahl
Abbildung 5: Greenscreen-Maske, Einblendung Teilestammdaten
X
Abbildung 6: Greenscreen-Maske, Lieferantenauswahlliste
Abbildung 7: Greenscreen-Maske, Einblendung Lieferantenstammdaten
XI
Abbildung 8: Greenscreen-Maske, Aufruf Nachrichtendatei M1MSGF
Abbildung 9: Greenscreen-Maske, Beispiel Textkonstante KON0009
XII
Nachrichten ID Bewertung Nachrichtentext FUN0003 0 F3=Verlassen FUN0005 0 F5=Lieferant FUN0007 0 F7=Übernehmen FUN0008 0 F8=Zahlungs-/Lieferbedingungen FUN0009 0 F9=anford. Abteilung/Sachbearb. FUN0011 0 F11=übernehmen FUN0012 0 F12=beenden FUN0013 0 F13=vorblättern FUN0014 0 F14=zurückblättern KON0001 0 >> Direktbestellung erfassen << KON0002 0 Teile-Nr.: KON0003 0 KON0004 0 KON0005 0 KON0006 0 Lieferant: KON0007 0 ================================== KON0008 0 Bestell-Nr.: KON0009 0 Teile-Bezeichnung: KON0010 0 ---------------------------------- KON0015 0 - KON0017 0 Bestellmenge: KON0019 0 Bestelltermin: KON0020 0 Zahlungsbedingungen: KON0021 0 = KON0022 0 Lieferbedingungen: KON0024 0 Preis: KON0025 0 je KON0026 0 anfordernde Abteilung: KON0027 0 Sachbearbeiter: KON0028 0 Zusatztext: KON0029 0 >> Lieferantenauswahl << KON0030 0 >> Teilestamm Matchcode-Auswahl << LOG0001 0 manneSOFT
Abbildung 10: Greenscreen-Maske, Übersicht alle Textkonstanten
XIII
Abbildung 11: Greenscreen-Maske, Übersicht Displayfiles
XIV
Abbildung 12: Greenscreen-Maske, Displayfile für Hauptbildschirm
MANNE1/QDSPSRC/M1BESTFM 0001.00 A* 0002.00 A DSPSIZ(24 80 *DS3) 0003.00 A CHGINPDFT(HI CS UL) 0004.00 A INDARA 0005.00 A PRINT 0006.00 A*------------------------------------------------------------------------ 0007.00 A R BEST101 0008.00 A* 0009.00 A* -- FUNKTIONSTASTEN --------------------------- 0010.00 A OVERLAY 0011.00 A CA03(03) 0012.00 A CA05(05) 0013.00 A CA07(07) 0014.00 A CA08(08) 0015.00 A CA09(09) 0016.00 A MSGF019 78A O 22 2MSGID(KON0007 M1MSGF) 0017.00 A COLOR(WHT) 0018.00 A MSGF018 12A O 23 2MSGID(FUN0005 M1MSGF) 0019.00 A COLOR(BLU) 0020.00 A MSGF020 30A O +2MSGID(FUN0008 M1MSGF) 0021.00 A COLOR(BLU) 0022.00 A MSGF021 31A O +2MSGID(FUN0009 M1MSGF) 0023.00 A COLOR(BLU) 0024.00 A MSGF009 12A O 24 2MSGID(FUN0003 M1MSGF) 0025.00 A COLOR(BLU) 0026.00 A MSGF016 13A O +2MSGID(FUN0007 M1MSGF) 0027.00 A COLOR(BLU) 0028.00 A* 0029.00 A* -- LOGO -------------------------------------- 0030.00 A MSGF011 10A O 1 2MSGID(LOG0001 M1MSGF) 0031.00 A COLOR(RED) 0032.00 A MSGF007 78A O 2 2MSGID(KON0007 M1MSGF) 0033.00 A COLOR(WHT) 0034.00 A* -- ÜBERSCHRIFT ------------------------------- 0035.00 A MSGF001 50A O 1 25MSGID(KON0001 M1MSGF) 0036.00 A COLOR(WHT) 0037.00 A* -- BESTELL-NR -------------------------------- 0038.00 A MSGF012 12A O 3 2MSGID(KON0008 M1MSGF) 0039.00 A DSBEST 8S 0O +1 0040.00 A COLOR(PNK) 0041.00 A* -- LIEFERANT --------------------------------- 0042.00 A MSGF006 10A O +16MSGID(KON0006 M1MSGF) 0043.00 A DSLINR 7S 0O +1 0044.00 A COLOR(YLW) 0045.00 A MSGF015 1A O +1MSGID(KON0015 M1MSGF) 0046.00 A DSLIBZ 20A O +1 0047.00 A MSGF014 78A O 4 2MSGID(KON0010 M1MSGF) 0048.00 A COLOR(WHT) 0049.00 A* -- TEILE-NR. --------------------------------- 0050.00 A MSGF002 10A O 6 2MSGID(KON0002 M1MSGF) 0051.00 A DSTENR 15A B +1 0052.00 A* -- TEILE-BEZEICHNUNG ------------------------- 0053.00 A MSGF013 18A O +2MSGID(KON0009 M1MSGF) 0054.00 A DSTEBZ 30A O +1 0055.00 A* -- BESTELLMENGE UND MASSEINHEIT -------------- 0056.00 A MSGF017 13A O 8 2MSGID(KON0017 M1MSGF) 0057.00 A DSMENG 8S 2B +1 0058.00 A DSMABZ 8A O +1 0059.00 A* -- BESTELLTERMIN ----------------------------- 0060.00 A MSGF022 14A O +2MSGID(KON0019 M1MSGF) 0061.00 A DSBETT 2S 0B +1 0062.00 A DSBEMM 2S 0B +1 0063.00 A DSBEJJ 4S 0B +1 0064.00 A* -- PREIS ------------------------------------- 0065.00 A MSGF027 6A O 10 2MSGID(KON0024 M1MSGF) 0066.00 A DSPREI 8A B +1 0067.00 A DSWAEH 3A O +1
XV
0068.00 A MSGF028 2A O +1MSGID(KON0025 M1MSGF) 0069.00 A DSPROP 8S 0B +1 0070.00 A DSMAB2 8A O +1 0071.00 A* -- ZAHLUNGSBEDINGUNGEN ----------------------- 0072.00 A MSGF023 22A O 12 2MSGID(KON0020 M1MSGF) 0073.00 A DSZABE 3A O +1 0074.00 A COLOR(YLW) 0075.00 A MSGF024 1A O +1MSGID(KON0021 M1MSGF) 0076.00 A DSZABZ 32A O +1 0077.00 A* -- LIEFERBEDINGUNGEN ------------------------- 0078.00 A MSGF025 22A O 13 2MSGID(KON0022 M1MSGF) 0079.00 A DSLFBE 3A O +1 0080.00 A COLOR(YLW) 0081.00 A MSGF026 1A O +1MSGID(KON0021 M1MSGF) 0082.00 A DSLFBZ 32A O +1 0083.00 A* -- ANFORDERNDE ABTEILUNG --------------------- 0084.00 A MSGF029 22A O 14 2MSGID(KON0026 M1MSGF) 0085.00 A DSABTZ 3A O +1 0086.00 A COLOR(YLW) 0087.00 A MSGF030 1A O +1MSGID(KON0021 M1MSGF) 0088.00 A DSABTB 32A O +1 0089.00 A* -- ANFORDERNDER SACHBEARBEITER --------------- 0090.00 A MSGF031 22A O 15 2MSGID(KON0027 M1MSGF) 0091.00 A DSSABE 4A O +1 0092.00 A COLOR(YLW) 0093.00 A MSGF032 1A O +1MSGID(KON0021 M1MSGF) 0094.00 A DSSABZ 32A O +1 0095.00 A* -- ZUSATZTEXT -------------------------------- 0096.00 A MSGF033 11A O 17 2MSGID(KON0028 M1MSGF) 0097.00 A DSTEX1 60A B +1 0098.00 A DSTEX2 60A B 18 14 0099.00 A DSTEX3 60A B 19 14 0100.00 A DSTEX4 60A B 20 14 0101.00 A* -- MELDUNGSZEILE ----------------------------- 0102.00 A DSMSGS 60A O 21 2 0103.00 A COLOR(RED)
XVI
Abbildung 13: Greenscreen-Maske, Displayfile für Lieferantenauswahl
MANNE1/QDSPSRC/M1LIWAFM 0001.00 A* 0002.00 A DSPSIZ(24 80 *DS3) 0003.00 A CHGINPDFT(HI CS UL) 0004.00 A INDARA 0005.00 A PRINT 0006.00 A*------------------------------------------------------------------------ 0007.00 A R LIWA101 0008.00 A* 0009.00 A* -- FUNKTIONSTASTEN --------------------------- 0010.00 A OVERLAY 0011.00 A CA11(11) 0012.00 A CA12(12) 0013.00 A CA13(13) 0014.00 A CA14(14) 0015.00 A MSGF031 78A O 22 2MSGID(KON0007 M1MSGF) 0016.00 A COLOR(WHT) 0017.00 A MSGF032 14A O 23 2MSGID(FUN0011 M1MSGF) 0018.00 A COLOR(BLU) 0019.00 A MSGF033 11A O +2MSGID(FUN0012 M1MSGF) 0020.00 A COLOR(BLU) 0021.00 A MSGF037 15A O 24 2MSGID(FUN0013 M1MSGF) 0022.00 A COLOR(BLU) 0023.00 A MSGF038 19A O +2MSGID(FUN0014 M1MSGF) 0024.00 A COLOR(BLU) 0025.00 A* 0026.00 A* -- LOGO -------------------------------------- 0027.00 A MSGF034 10A O 1 2MSGID(LOG0001 M1MSGF) 0028.00 A COLOR(RED) 0029.00 A MSGF035 78A O 2 2MSGID(KON0007 M1MSGF) 0030.00 A COLOR(WHT) 0031.00 A* -- ÜBERSCHRIFT ------------------------------- 0032.00 A MSGF036 50A O 1 25MSGID(KON0029 M1MSGF) 0033.00 A COLOR(WHT) 0034.00 A* -- AUSWAHLBEREICH ---------------------------- 0035.00 A DSWA00 1A B 3 2 0036.00 A DSNA00 60A O +1 0037.00 A DSWA01 1A B 4 2 0038.00 A DSNA01 60A O +1 0039.00 A DSWA02 1A B 5 2 0040.00 A DSNA02 60A O +1 0041.00 A DSWA03 1A B 6 2 0042.00 A DSNA03 60A O +1 0043.00 A DSWA04 1A B 7 2 0044.00 A DSNA04 60A O +1 0045.00 A DSWA05 1A B 8 2 0046.00 A DSNA05 60A O +1 0047.00 A DSWA06 1A B 9 2 0048.00 A DSNA06 60A O +1 0049.00 A DSWA07 1A B 10 2 0050.00 A DSNA07 60A O +1 0051.00 A DSWA08 1A B 11 2 0052.00 A DSNA08 60A O +1 0053.00 A DSWA09 1A B 12 2 0054.00 A DSNA09 60A O +1 0055.00 A DSWA10 1A B 13 2 0056.00 A DSNA10 60A O +1 0057.00 A DSWA11 1A B 14 2 0058.00 A DSNA11 60A O +1 0059.00 A DSWA12 1A B 15 2 0060.00 A DSNA12 60A O +1 0061.00 A DSWA13 1A B 16 2 0062.00 A DSNA13 60A O +1 0063.00 A DSWA14 1A B 17 2 0064.00 A DSNA14 60A O +1 0065.00 A DSWA15 1A B 18 2
XVII
0066.00 A DSNA15 60A O +1 0067.00 A DSWA16 1A B 19 2 0068.00 A DSNA16 60A O +1 0069.00 A DSWA17 1A B 20 2 0070.00 A DSNA17 60A O +1 0071.00 A DSWA18 1A B 21 2 0072.00 A DSNA18 60A O +1 0073.00 A* 0074.00 A* -- MELDUNGSZEILE ----------------------------- 0075.00 A DSMSGS 60A O 21 2 0076.00 A COLOR(RED)
Abbildung 14: Greenscreen-Maske, Displayfile für Teilestammauswahl
MANNE1/QDSPSRC/M1TEWAFM 0001.00 A* 0002.00 A DSPSIZ(24 80 *DS3) 0003.00 A CHGINPDFT(HI CS UL) 0004.00 A INDARA 0005.00 A PRINT 0006.00 A*-------------------------------------------------------------------- 0007.00 A R TEWA101 0008.00 A* 0009.00 A* -- FUNKTIONSTASTEN --------------------------- 0010.00 A OVERLAY 0011.00 A CA11(11) 0012.00 A CA12(12) 0013.00 A CA13(13) 0014.00 A CA14(14) 0015.00 A MSGF031 78A O 22 2MSGID(KON0007 M1MSGF) 0016.00 A COLOR(WHT) 0017.00 A MSGF032 14A O 23 2MSGID(FUN0011 M1MSGF) 0018.00 A COLOR(BLU) 0019.00 A MSGF033 11A O +2MSGID(FUN0012 M1MSGF) 0020.00 A COLOR(BLU) 0021.00 A MSGF037 15A O 24 2MSGID(FUN0013 M1MSGF) 0022.00 A COLOR(BLU) 0023.00 A MSGF038 19A O +2MSGID(FUN0014 M1MSGF) 0024.00 A COLOR(BLU) 0025.00 A* 0026.00 A* -- LOGO -------------------------------------- 0027.00 A MSGF034 10A O 1 2MSGID(LOG0001 M1MSGF) 0028.00 A COLOR(RED) 0029.00 A MSGF035 78A O 2 2MSGID(KON0007 M1MSGF) 0030.00 A COLOR(WHT) 0031.00 A* -- ÜBERSCHRIFT ------------------------------- 0032.00 A MSGF036 50A O 1 25MSGID(KON0030 M1MSGF) 0033.00 A COLOR(WHT) 0034.00 A* -- AUSWAHLBEREICH ---------------------------- 0035.00 A DSWA00 1A B 3 2 0036.00 A DSTE00 60A O +1 0037.00 A DSWA01 1A B 4 2 0038.00 A DSTE01 60A O +1 0039.00 A DSWA02 1A B 5 2 0040.00 A DSTE02 60A O +1 0041.00 A DSWA03 1A B 6 2 0042.00 A DSTE03 60A O +1 0043.00 A DSWA04 1A B 7 2 0044.00 A DSTE04 60A O +1 0045.00 A* 0046.00 A* -- MELDUNGSZEILE ----------------------------- 0047.00 A DSMSGS 60A O 21 2 0048.00 A COLOR(RED) 0049.00 A*
XVIII
Abbildung 15: Greenscreen-Maske, RPG-Hauptprogramm
MANNE1/QRPGLESRC/M1BEST 0001.00 H/TITLE Erfassen Direktbestellung 0002.00 H************************************************************************** 0003.00 H* * 0004.00 H* (c) Copyright 2011 Manfred Schiefers - Stuttgart * 0005.00 H* * 0006.00 H************************************************************************** 0007.00 H* 0008.00 F************************************************************************** 0009.00 F*** DATEIBESCHREIBUNGEN *** 0010.00 F************************************************************************** 0011.00 FM1BESTFM CF E WORKSTN 0012.00 FM1LIWAFM CF E WORKSTN 0013.00 FM1TEWAFM CF E WORKSTN 0014.00 F* 0015.00 D************************************************************************** 0016.00 D*** DEKLARATIONEN *** 0017.00 D************************************************************************** 0018.00 DWKBENR S 8S 0 INZ(*ZEROS) 0019.00 DWKTEBZ S 30A INZ(*BLANKS) 0020.00 DWKLINR S 7S 0 INZ(*ZEROS) 0021.00 DWKLIBZ S 20A INZ(*BLANKS) 0022.00 DWKZABE S 3A INZ(*BLANKS) 0023.00 DWKZABZ S 32A INZ(*BLANKS) 0024.00 DWKLFBE S 3A INZ(*BLANKS) 0025.00 DWKLFBZ S 32A INZ(*BLANKS) 0026.00 DWKMABZ S 8A INZ(*BLANKS) 0027.00 DWKWAEH S 3A INZ(*BLANKS) 0028.00 DWKABTZ S 3A INZ(*BLANKS) 0029.00 DWKABTB S 32A INZ(*BLANKS) 0030.00 DWKSABE S 4A INZ(*BLANKS) 0031.00 DWKSABZ S 32A INZ(*BLANKS) 0032.00 DWKMSGS S 60A INZ(*BLANKS) 0033.00 DWKTENR S 13A INZ(*BLANKS) 0034.00 D 0035.00 C************************************************************************** 0036.00 C*** R E C H E N B E S T I M M U N G E N *** 0037.00 C************************************************************************** 0038.00 C *ENTRY PLIST 0039.00 C PARM PARAMETER 10 0040.00 C* 0041.00 C* -------- BESTELLNUMMER VERGEBEN ----------------------- 0042.00 C EXSR BESTVR 0043.00 C EVAL DSBEST = WKBENR 0044.00 C* 0045.00 C* -------- WARTESCHLEIFE -------------------------------- 0046.00 C DOW 0 = 0 0047.00 C* 0048.00 C IF DSTENR <> *BLANK 0049.00 C IF %SUBST(DSTENR:1:1) <> '?' 0050.00 C EXSR TELESE 0051.00 C EVAL DSTEBZ = WKTEBZ 0052.00 C EVAL DSMABZ = WKMABZ 0053.00 C EVAL DSMAB2 = WKMABZ 0054.00 C ELSE 0055.00 C EXSR TEWAHL 0056.00 C EVAL DSTENR = WKTENR 0057.00 C ENDIF 0058.00 C ELSE 0059.00 C EVAL DSTEBZ = *BLANK 0060.00 C EVAL DSMABZ = *BLANK 0061.00 C EVAL DSMAB2 = *BLANK 0062.00 C ENDIF 0063.00 C* 0064.00 C IF *IN03 = *ON 0065.00 C EXSR SRRETU 0066.00 C ENDIF 0067.00 C*
XIX
0068.00 C IF *IN05 = *ON 0069.00 C EXSR LIWAHL 0070.00 C EVAL DSLINR = WKLINR 0071.00 C IF DSLINR <> *ZERO 0072.00 C EXSR LILESE 0073.00 C EVAL DSLIBZ = WKLIBZ 0074.00 C EVAL DSWAEH = WKWAEH 0075.00 C ENDIF 0076.00 C ENDIF 0077.00 C* 0078.00 C IF *IN07 = *ON 0079.00 C EXSR SENDEN 0080.00 C EVAL DSMSGS = WKMSGS 0081.00 C ENDIF 0082.00 C* 0083.00 C IF *IN08 = *ON 0084.00 C EXSR ZAWAHL 0085.00 C EVAL DSZABE = WKZABE 0086.00 C EVAL DSZABZ = WKZABZ 0087.00 C EVAL DSLFBE = WKLFBE 0088.00 C EVAL DSLFBZ = WKLFBZ 0089.00 C ENDIF 0090.00 C* 0091.00 C IF *IN09 = *ON 0092.00 C EXSR SABEWA 0093.00 C EVAL DSABTZ = WKABTZ 0094.00 C EVAL DSABTB = WKABTB 0095.00 C EVAL DSSABE = WKSABE 0096.00 C EVAL DSSABZ = WKSABZ 0097.00 C ENDIF 0098.00 C* 0099.00 C EXFMT BEST101 0100.00 C* 0101.00 C ENDDO 0102.00 C EXSR SRRETU 0103.00 C* 0104.00 C************************************************************************** 0105.00 C*** SR-RETURN Rückkehr zum Aufrufprogramm *** 0106.00 C************************************************************************** 0107.00 C SRRETU BEGSR 0108.00 C EVAL *INLR = *ON 0109.00 C RETURN 0110.00 C ENDSR 0112.00 D************************************************************************** 0113.00 D*** COPY-SOURCEN *** 0114.00 D************************************************************************** 0115.00 D/COPY QCPYSRC,M1BENR 0116.00 D/COPY QCPYSRC,M1TEWA 0117.00 D/COPY QCPYSRC,M1TEIL 0118.00 D/COPY QCPYSRC,M1LIWA 0119.00 D/COPY QCPYSRC,M1LIEF 0120.00 D/COPY QCPYSRC,M1ZABE 0121.00 D/COPY QCPYSRC,M1ABTW 0122.00 D/COPY QCPYSRC,M1SEND 0124.00 C************************************************************************** 0125.00 C*** ENDE DES PROGRAMMS 0126.00 C**************************************************************************
Abbildung 16: Greenscreen-Maske, RPG-Startprogramm
MANNE1/QRPGLESRC/M1START 0001.00 DVariable S 10A 0002.00 DWKRTCD S 6A INZ(*BLANKS) 0003.00 C EVAL Variable = 'Parameter' 0004.00 C 0005.00 C CALL 'M1BEST' 0006.00 C PARM Variable 0007.00 C* 0008.00 C EVAL WKRTCD = 'OK' 0009.00 C EVAL *INLR = *ON
XX
Abbildung 17: Greenscreen-Maske, Copysource Abteilung / Sachbearbeiter
MANNE1/QCPYSRC/M1ABTW 0001.00 C************************************************************************** 0002.00 C*** SR-SABEWA Abteilung / Sachbearbeiter wählen *** 0003.00 C************************************************************************** 0004.00 C SABEWA BEGSR 0005.00 C EVAL WKABTZ = 'A52' 0006.00 C EVAL WKABTB = 'Verfahrensentwicklung' 0007.00 C EVAL WKSABE = '0342' 0008.00 C EVAL WKSABZ = 'Frau Hennig-Burgmeister' 0009.00 C ENDSR
Abbildung 18: Greenscreen-Maske, Copysource Bestellnummernvergabe
MANNE1/QCPYSRC/M1BENR 0001.00 C************************************************************************** 0002.00 C*** SR-BESTVR Bestellnummer vergeben *** 0003.00 C************************************************************************** 0004.00 C BESTVR BEGSR 0005.00 C EVAL WKBENR = 7856 0006.00 C ENDSR
Abbildung 19: Greenscreen-Maske, Copysource Lieferantenstammdaten
MANNE1/QCPYSRC/M1LIEF 0001.00 C************************************************************************** 0002.00 C*** SR-LILESE Lieferantenstammdaten lesen *** 0003.00 C************************************************************************** 0004.00 C LILESE BEGSR 0005.00 C EVAL WKLIBZ = 'KAISER+KRAFT' 0006.00 C EVAL WKWAEH = 'EUR' 0007.00 C ENDSR
Abbildung 20: Greenscreen-Maske, Copysource Lieferantenauswahl
MANNE1/QCPYSRC/M1LIWA 0001.00 C************************************************************************** 0002.00 C*** SR-LIWAHL Lieferant auswählen *** 0003.00 C************************************************************************** 0004.00 C LIWAHL BEGSR 0005.00 C* -------- BEISPIELDATEN ! ------------------------------ 0006.00 C EVAL DSNA00 = '0000047 - Bierbrauer & Nagel' 0007.00 C EVAL DSNA01 = '0000078 - bürma Werner Machauer KG' 0008.00 C EVAL DSNA02 = '0000089 - Corporate Express global' 0009.00 C EVAL DSNA03 = '0000112 - Deko-Maier e.K.' 0010.00 C EVAL DSNA04 = '0000123 - Hafners Papierlädle' 0011.00 C EVAL DSNA05 = '0000156 - KAISER+KRAFT' 0012.00 C EVAL DSNA06 = '0000268 - PBS Network GmbH' 0013.00 C EVAL DSNA07 = '0000287 - ppm-stuttgart' 0014.00 C EVAL DSNA08 = '0000300 - Staples Advantage' 0015.00 C EVAL DSNA09 = '0000305 - büro-zubehör-handel' 0016.00 C EVAL DSNA10 = '0000308 - Scharr Büro GmbH'
XXI
0017.00 C EVAL DSNA11 = '0000340 - Tobias Geibel Bürobedarf' 0018.00 C EVAL DSNA12 = '0000401 - Deko Maier' 0019.00 C EVAL DSNA13 = '0000402 - Trend Products Stuttgart' 0020.00 C EVAL DSNA14 = '0000928 - OFFICE SERVICE' 0021.00 C EVAL DSNA15 = '0001230 - Conipa Bürosysteme GmbH' 0022.00 C EVAL DSNA16 = '0001308 - Der Tinten Pott' 0023.00 C EVAL DSNA17 = '0001425 - Tintensparmarkt' 0024.00 C EVAL DSNA18 = '0001433 - AW Printmedienzubehör' 0025.00 C* -------- WARTESCHLEIFE -------------------------------- 0026.00 C DOW 0 = 0 0027.00 C IF *IN12 = *ON 0028.00 C LEAVE 0029.00 C ENDIF 0030.00 C IF *IN11 = *ON 0031.00 C EVAL WKLINR = 156 0032.00 C EVAL WKLIBZ = 'KAISER+KRAFT' 0033.00 C LEAVE 0034.00 C ENDIF 0035.00 C EXFMT LIWA101 0036.00 C ENDDO 0037.00 C ENDSR
Abbildung 21: Greenscreen-Maske, Copysource Bestellung versenden
MANNE1/QCPYSRC/M1SEND 0001.00 C************************************************************************** 0002.00 C*** SR-SENDEN Bestellung versenden *** 0003.00 C************************************************************************** 0004.00 C SENDEN BEGSR 0005.00 C EVAL WKMSGS = '- Bestellung wurde versendet -' 0006.00 C ENDSR
Abbildung 22: Greenscreen-Maske, Copysource Teilestammdaten
MANNE1/QCPYSRC/M1TEIL 0001.00 C************************************************************************** 0002.00 C*** SR-TELESE Teilestammdaten lesen *** 0003.00 C************************************************************************** 0004.00 C TELESE BEGSR 0005.00 C EVAL WKTEBZ = 'Kopierpapier DIN A4, 80 g/mm²' 0006.00 C EVAL WKMABZ = 'Blatt' 0007.00 C ENDSR
Abbildung 23: Greenscreen-Maske, Copysource Teilestammdaten-Matchcode
MANNE1/QCPYSRC/M1TEWA 0001.00 C************************************************************************** 0002.00 C*** SR-TEWAHL Teilestamm Matchcode-Auswahl *** 0003.00 C************************************************************************** 0004.00 C TEWAHL BEGSR 0005.00 C* -------- BEISPIELDATEN ! ------------------------------ 0006.00 C EVAL DSTE00 = 'S0000-2356 - ' 0007.00 C +'Kopfschellen Größe 9 ' 0008.00 C EVAL DSTE01 = 'RR12-977 - ' 0009.00 C +'Koppelschiene AKG 612 '
XXII
0010.00 C EVAL DSTE02 = 'K62-022 - ' 0011.00 C +'Kopierpapier DIN A4, 80 g/mm²' 0012.00 C EVAL DSTE03 = 'K62-023 - ' 0013.00 C +'Kopierpapier DIN A3, 80 g/mm²' 0014.00 C EVAL DSTE04 = 'ZZ96.940.01 - ' 0015.00 C +'Kopierstift BLAU ' 0016.00 C* -------- WARTESCHLEIFE -------------------------------- 0017.00 C DOW 0 = 0 0018.00 C IF *IN12 = *ON 0019.00 C LEAVE 0020.00 C ENDIF 0021.00 C IF *IN11 = *ON 0022.00 C EVAL WKTENR = 'K62-022' 0023.00 C LEAVE 0024.00 C ENDIF 0025.00 C EXFMT TEWA101 0026.00 C ENDDO 0027.00 C ENDSR
Abbildung 24: Greenscreen-Maske, Copysource Zahlungs-/Lieferbedingungen
MANNE1/QCPYSRC/M1ZABE 0001.00 C************************************************************************** 0002.00 C*** SR-ZAWAHL Zahlungs-/Lieferbedingungen wählen *** 0003.00 C************************************************************************** 0004.00 C ZAWAHL BEGSR 0005.00 C EVAL WKZABE = 'Z31' 0006.00 C EVAL WKZABZ = '10 Tage 3 %, 30 Tage netto' 0007.00 C EVAL WKLFBE = 'L01' 0008.00 C EVAL WKLFBZ = 'frei Haus, einschl. Verpackung' 0009.00 C ENDSR
Abbildung 25: GUI-Maske, Java-Packages
XXIII
Abbildung 26: GUI-Maske, Komplettdarstellung
XXIV
Abbildung 27: Logo alt
Abbildung 28: Logo neu
XXV
Abbildung 29: GUI-Maske, Klasse XML_Kommunikation package Framework; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //************************************************************************** //*** Kommunikation mit XML-Schnittstelle *** //************************************************************************** import Einkauf.BestellEingabeParameter; public class XML_Kommunikation { BestellEingabeParameter parameter; HinweisFenster meldung; // >>> B e s t e l l n u m m e r <<< public String naechsteBestellNr(){ int nBenr = 0; String sBenr =""; //*** todo: nächste Bestellnummer ermitteln // für Prototyp ... nBenr = 7856; //*** todo: nächste Bestellnummer ermitteln sBenr = Integer.toString(nBenr); return sBenr; }//naechsteBestellNr // >>> T e i l e n u m m e r <<< public String[] teilestammDateizugriff(){ String[] teileListe = new String[100]; //*** todo: Zugriff auf Datei TEILESTAMM // für Prototyp ... for ( int pos = 1; pos <= 99; pos++ ){ teileListe[pos] = ""; }//for teileListe[1] = "S0000-2356 - Kopfschellen Größe 9 kg"; teileListe[2] = "RR12-977 - Koppelschiene AKG 612 Meter"; teileListe[3] = "K62-022 - Kopierpapier DIN A4, 80 g/mm² Blatt"; teileListe[4] = "K62-023 - Kopierpapier DIN A3, 80 g/mm² Blatt"; teileListe[5] = "ZZ96.940.01 - Kopierstift BLAU Stück"; // Teilenummer (13-stellig) // Teilebezeichnung (30-stellig) // Maßeinheit (10-stellig) //*** todo: Zugriff auf Datei TEILESTAMM return teileListe; }//teilestammDateizugriff() public boolean teileNummerCheck(String pruefTenr){ boolean existiert = false; String[] datensatz = teilestammDateizugriff(); for ( int pos = 1; pos <= 99; pos++ ){ if (!datensatz[pos].equals("")){ if (pruefTenr.equals((datensatz[pos].substring(0,13)).trim())){ existiert = true; break; }//if }//if }//for return existiert; }//teileNummerCheck(String pruefTenr) public String[] teileMatchcodeAuswahlListe(String mCodeEingabe){ String teileEingabe = mCodeEingabe; //*** todo: Teilstammauswahl bereitstellen // für Prototyp ... String[] teileAuswahlListe = new String[100]; for ( int pos = 1; pos <= 99; pos++ ){ teileAuswahlListe[pos] = ""; }//for if (teileEingabe.length()>=2){ String mCodeTest = teileEingabe.substring(0,2); if (mCodeTest.equals("ko") || mCodeTest.equals("KO")){
XXVI
teileAuswahlListe = teilestammDateizugriff(); for ( int pos = 1; pos <= 99; pos++ ){ if (teileAuswahlListe[pos].equals("")) break; teileAuswahlListe[pos] = teileAuswahlListe[pos].substring(0,45); }//for }//if "KO" }//if Eingabelänge >= 2 //*** todo: Teilstammauswahl bereitstellen return teileAuswahlListe; }//teileMatchcodeAuswahlListe() public String holenTeileBezeichnung(String zuTenr){ String tebez = ""; //*** todo: Teilebezeichnung holen // für Prototyp ... String[] teileListe = new String[100]; String testtenr, testtebe; teileListe = teilestammDateizugriff(); for ( int zeile = 1; zeile <= 99; zeile++ ) { if (teileListe[zeile].equals("")) break; testtenr = (teileListe[zeile].substring(0,13)).trim(); testtebe = (teileListe[zeile].substring(16,45)).trim(); if (testtenr.equals(zuTenr)){ tebez = testtebe; break; }//if gefunden }//for //*** todo: Teilebezeichnung holen return tebez; }//holenTeileBezeichnung() public String holenTeileMasseinheit(String zuTenr){ String temass = ""; //*** todo: Maßeinheit aus Teilestamm holen // für Prototyp ... String[] teileListe = new String[100]; String testtenr, testmass; teileListe = teilestammDateizugriff(); for ( int zeile = 1; zeile <= 99; zeile++ ) { if (teileListe[zeile].equals("")) break; testtenr = (teileListe[zeile].substring(0,13)).trim(); testmass = teileListe[zeile].substring(50,(teileListe[zeile].length()))); if (testtenr.equals(zuTenr)){ temass = testmass.trim(); break; }//if gefunden }//for //*** todo: Maßeinheit aus Teilestamm holen return temass; }//holenTeileMasseinheit() // >>> L i e f e r a n t <<< public String[] lieferantenDateiZugriff(){ String[] liefListe = new String[20]; //*** todo: Zugriff auf Datei LIEFERANTENSTAMM // für Prototyp ... liefListe[1] = "0000047 - Bierbrauer & Nagel EUR"; liefListe[2] = "0000078 - bürma Werner Machauer KG CHF"; liefListe[3] = "0000089 - Corporate Express global USD"; liefListe[4] = "0000112 - Deko-Maier e.K. EUR"; liefListe[5] = "0000123 - Hafners Papierlädle EUR"; liefListe[6] = "0000156 - KAISER+KRAFT EUR"; liefListe[7] = "0000268 - PBS Network GmbH EUR"; liefListe[8] = "0000287 - ppm-stuttgart EUR"; liefListe[9] = "0000300 - Staples Advantage EUR"; liefListe[10] = "0000305 - büro-zubehör-handel EUR"; liefListe[11] = "0000308 - Scharr Büro GmbH EUR"; liefListe[12] = "0000340 - Tobias Geibel Bürobedarf EUR"; liefListe[13] = "0000401 - Deko Maier EUR"; liefListe[14] = "0000402 - Trend Products Stuttgart EUR";
XXVII
liefListe[15] = "0000928 - OFFICE SERVICE CZK"; liefListe[16] = "0001230 - Conipa Bürosysteme GmbH EUR"; liefListe[17] = "0001308 - Der Tinten Pott EUR"; liefListe[18] = "0001425 - Tintensparmarkt EUR"; liefListe[19] = "0001433 - AW Printmedienzubehör EUR"; // Lieferantennummer (7-stellig) // Lieferantenname (30-stellig) // Lieferanten-Währungscode (3-stellig) //*** todo: Zugrff auf Datei LIEFERANTENSTAMM return liefListe; }//lieferantenDateiZugriff public String[] lieferantenAuswahlListe(){ String[] datensatz = new String[20]; String[] auswahl = new String[20]; datensatz = lieferantenDateiZugriff(); for ( int i=1; i<=19; i++ ) { auswahl[i] = datensatz[i].substring(0,35); }//for return auswahl; }//lieferantenAuswahlListe() public String lieferantenWaehrung(int liefIndex){ String[] datensatz = new String[20]; String waehrung = ""; datensatz = lieferantenDateiZugriff(); waehrung = datensatz[liefIndex].substring(41,44); return waehrung; }//lieferantenWaehrung() // >>> Z a h l u n g s b e d i n g u n g e n <<< public String[] zahlungsDateiZugriff(){ String[] zahlungsListe = new String[5]; //*** todo: Zugriff auf Datei ZAHLUNGSBEDINGUNGEN // für Prototyp ... zahlungsListe[1] = "Z31 - 10 Tage 3%, 30 Tage netto"; zahlungsListe[2] = "Z07 - 7 Tage - 2 %, 20 Tage netto"; zahlungsListe[3] = "Z02 - sofort - 2 %, 14 Tage netto"; zahlungsListe[4] = "Z15 - 2 % zum 15. des 2. Folgemonats"; // Zahlungsbedingung (40-stellig) //*** todo: Zugriff auf Datei ZAHLUNGSBEDINGUNGEN return zahlungsListe; }//zahlungsDateiZugriff public String[] zahlungsAuswahlListe(){ String[] datensatz = new String[5]; String[] auswahl = new String[5]; datensatz = zahlungsDateiZugriff(); for ( int i=1; i<=4; i++ ) { auswahl[i] = datensatz[i]; }//for return auswahl; }//zahlungsAuswahlListe() // >>> L i e f e r b e d i n g u n g e n <<< public String[] lieferBedDateiZugriff(){ String[] liefListe = new String[5]; //*** todo: Zugriff auf Datei LIEFERBEDINGUNGEN // für Prototyp ... liefListe[1] = "L01 - frei Haus, einschl. Verpackung"; liefListe[2] = "L25 - frei Haus, ohne Verpackung"; liefListe[3] = "L36 - ab Werk, einschl. Verpackung"; liefListe[4] = "L55 - unfrei"; // Lieferbedingung (40-stellig) //*** todo: Zugriff auf Datei LIEFERBEDINGUNGEN return liefListe; }//lieferBedDateiZugriff public String[] lieferBedAuswahlListe(){ String[] datensatz = new String[5]; String[] auswahl = new String[5]; datensatz = lieferBedDateiZugriff(); for ( int i=1; i<=4; i++ ) {
XXVIII
auswahl[i] = datensatz[i]; }//for return auswahl; }//lieferBedAuswahlListe() // >>> A b t e i l u n g <<< public String[] abteilungDateiZugriff(){ String[] abtListe = new String[7]; //*** todo: Zugriff auf Datei ABTEILUNGEN // für Prototyp ... abtListe[1] = "A25 - Verfahrensentwicklung"; abtListe[2] = "A12 - Forschung & Entwicklung"; abtListe[3] = "A13 - Buchhaltung"; abtListe[4] = "A24 - Konstruktion"; abtListe[5] = "A60 - Vertrieb"; abtListe[6] = "A67 - Montage"; // Abteilung (40-stellig) //*** todo: Zugriff auf Datei ABTEILUNGEN return abtListe; }//abteilungDateiZugriff public String[] abteilungAuswahlListe(){ String[] datensatz = new String[7]; String[] auswahl = new String[7]; datensatz = abteilungDateiZugriff(); for ( int i=1; i<=6; i++ ) { auswahl[i] = datensatz[i]; }//for return auswahl; }//abteilungAuswahlListe() // >>> S a c h b e a r b e i t e r <<< public String[] sachbearDateiZugriff(){ String[] sachbearListe = new String[7]; //*** todo: Zugriff auf Datei SACHBEARBEITER // für Prototyp ... sachbearListe[1] = "O342 - Frau Hennig-Burgmeister"; sachbearListe[2] = "O428 - Herr Stuhler"; sachbearListe[3] = "O567 - Herr Schiefers"; sachbearListe[4] = "O991 - Frau Striebel"; sachbearListe[5] = "O212 - Herr Rauser"; sachbearListe[6] = "O127 - Frau Lehmann"; // Sachbearbeiter (40-stellig) //*** todo: Zugriff auf Datei SACHBEARBEITER return sachbearListe; }//sachbearDateiZugriff public String[] sachbearAuswahlListe(){ String[] datensatz = new String[7]; String[] auswahl = new String[7]; datensatz = sachbearDateiZugriff(); for ( int i=1; i<=6; i++ ) { auswahl[i] = datensatz[i]; }//for return auswahl; }//sachbearAuswahlListe() // >>> T e x t k o n s t a n t e n <<< public String textKonstanteZuord(String konstNr){ String konstInhalt = "??"+konstNr; //*** todo: Textkonstanten holen // für Prototyp ... if (konstNr.equals("FENR001")) konstInhalt = "erst Position anklicken, dann [ Übernehmen ]"; if (konstNr.equals("FENR002")) konstInhalt = "Geben Sie eine gültige Teilenummer ein."; if (konstNr.equals("FUN0003")) konstInhalt = "Verlassen"; if (konstNr.equals("FUN0005")) konstInhalt = "Übernehmen"; if (konstNr.equals("FUN0015")) konstInhalt = "Aktualisieren"; if (konstNr.equals("HIN0001")) konstInhalt = "HINWEIS"; if (konstNr.equals("HIN0002")) konstInhalt = "Bestellung wurde versendet."; if (konstNr.equals("KON0001")) konstInhalt = ">> Direktbestellung erfassen <<"; if (konstNr.equals("KON0002")) konstInhalt = " Teilenummer: ";
XXIX
if (konstNr.equals("KON0006")) konstInhalt = "Lieferant:"; if (konstNr.equals("KON0008")) konstInhalt = " Bestell-Nr.: "; if (konstNr.equals("KON0009")) konstInhalt = " Teile-Bezeichnung: "; if (konstNr.equals("KON0017")) konstInhalt = "Bestellmenge: "; if (konstNr.equals("KON0019")) konstInhalt = "Bestelltermin: "; if (konstNr.equals("KON0020")) konstInhalt = "Zahlungsbedingungen: "; if (konstNr.equals("KON0022")) konstInhalt = "Lieferbedingungen: "; if (konstNr.equals("KON0024")) konstInhalt = "Preis: "; if (konstNr.equals("KON0025")) konstInhalt = " je "; if (konstNr.equals("KON0026")) konstInhalt = "anfordernde Abteilung: "; if (konstNr.equals("KON0027")) konstInhalt = "Sachbearbeiter: "; if (konstNr.equals("KON0028")) konstInhalt = "Zusatztext"; if (konstNr.equals("KON0030")) konstInhalt = ">> Teilestamm Matchcode-Auswahl <<"; if (konstNr.equals("KON0031")) konstInhalt = "Matchcode"; //*** todo: Textkonstanten holen return konstInhalt; }// textKonstanteZuord() // >>> B e s t e l l u n g v e r s e n d e n <<< public void bestellungVersenden(BestellEingabeParameter parameter){ //*** todo: Übergabe Bestelldaten / für Prototyp Ausgabe in Konsole ... System.out.println("Bestellung Übergabedaten ..."); System.out.println(""); System.out.println("<BestellNr.(BENR)> -->" + parameter.getDSBENR() + "<--"); System.out.println("<LieferantentNr.(LINR)> -->" + parameter.getDSLINR() + "<--"); System.out.println("<TeileNr.(TENR)> -->" + parameter.getDSTENR() + "<--"); System.out.println("<Bestellmenge(MENG)> -->" + parameter.getDSMENG() + "<--"); System.out.println("<Bestelltermin(BDAT> -->" + parameter.getDSDJAH() + parameter.getDSDMON() + parameter.getDSDTAG() + "<--"); System.out.println("<Preis(PREI)> -->" + parameter.getDSPREI() + "<--"); System.out.println("<je Menge(JEME)> -->" + parameter.getDSJEME() + "<--"); System.out.println("<Zahlungsbedingung(ZABE)> -->" + parameter.getDSZABE() + "<--"); System.out.println("<Lieferbedingung(LFBE)> -->" + parameter.getDSLFBE() + "<--"); System.out.println("<Abteilung(ABTB)> -->" + parameter.getDSABTB() + "<--"); System.out.println("<Sachbearbeiter(SABE)> -->" + parameter.getDSSABE() + "<--"); System.out.println("<Zusatztext1(ZUS1)> -->" + parameter.getDSZUS1() + "<--"); System.out.println("<Zusatztext2(ZUS2)> -->" + parameter.getDSZUS2() + "<--"); System.out.println("<Zusatztext3(ZUS3)> -->" + parameter.getDSZUS3() + "<--"); System.out.println("<Zusatztext4(ZUS4)> -->" + parameter.getDSZUS4() + "<--"); meldung = new HinweisFenster(textKonstanteZuord("HIN0001"), textKonstanteZuord("HIN0002"),100,320,300,70); //*** todo: Übergabe Bestelldaten }//bestellungVersenden() public void hinweisFensterSchliessen(){ meldung.setVisible(false); }//hinweisFensterSchliessen() }//class XML_Kommunikation
XXX
Abbildung 30: GUI-Maske, Klasse HinweisFenster package Framework; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //*************************************************************************** //*** Hinweisfenster *** //*************************************************************************** import java.awt.Frame; import java.awt.Image; import java.awt.Panel; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JLabel; public class HinweisFenster extends Frame{ private static final long serialVersionUID = 1L; // Maskenelemente Panel centerPanel; JLabel meldung; // -- MASKE -- public HinweisFenster( String überschrift, String inhalt, int xpos, int ypos, int breit, int hoch ){ // Überschrift super(überschrift); // Panels centerPanel = new Panel(); add("Center",centerPanel); // WindowsListener hinzu MyWindowListener mwl = new MyWindowListener(); addWindowListener(mwl); // Meldung / Inhalt meldung = new JLabel(inhalt); centerPanel.add(meldung); // Framegröße setSize(breit, hoch); // Framegröße änderbar setResizable(false); // Frameposition setLocation(new Point(xpos, ypos)); // Titel-Icon Image icon; Toolkit toolkit = Toolkit.getDefaultToolkit(); icon = toolkit.getImage("logo.jpg"); setIconImage(icon); // Frame sichtbar setVisible(true); }// Maske // -- FENSTER-LISTENER -- class MyWindowListener extends WindowAdapter{ // Fensterkreuz zu public void windowClosing(WindowEvent we){ setVisible(false); }//windowClosing }//class MyWindowListener }//class HinweisFenster
XXXI
Abbildung 31: GUI-Maske, Klasse Fehlermeldung package Framework; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //*************************************************************************** //*** Fehlermeldung ausgeben *** //*************************************************************************** import java.awt.Frame; import java.awt.Image; import java.awt.Panel; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JLabel; public class Fehlermeldung extends Frame implements ActionListener{ private static final long serialVersionUID = 1L; // Maskenelemente Panel centerPanel, buttonPanel; JButton okButton; JLabel meldung; // -- MASKE -- public Fehlermeldung(String inhalt, int xpos, int ypos, int breit, int hoch){ // Überschrift super("ERROR"); // Panels centerPanel = new Panel(); buttonPanel = new Panel(); add("Center",centerPanel); add("South",buttonPanel); // WindowsListener hinzu MyWindowListener mwl = new MyWindowListener(); addWindowListener(mwl); // Buttons okButton = new JButton(" ok "); // Meldung / Inhalt meldung = new JLabel(inhalt); centerPanel.add(meldung); // OK-Knopf hinzu buttonPanel.add(okButton); okButton.setEnabled(true); // bearbeitbar ? okButton.addActionListener(this); // Framegröße setSize(breit, hoch); // Framegröße änderbar setResizable(false); // Frameposition setLocation(new Point(xpos, ypos)); // Titel-Icon Image icon; Toolkit toolkit = Toolkit.getDefaultToolkit(); icon = toolkit.getImage("logo.jpg"); setIconImage(icon); // Frame sichtbar setVisible(true); }// Maske // -- KNOPF-LISTENER -- public void actionPerformed(ActionEvent e){ Object o = e.getSource(); if ( o == okButton ){ setVisible(false); }// if beenden }//actionPerformed() // -- FENSTER-LISTENER -- class MyWindowListener extends WindowAdapter{ // Fensterkreuz zu public void windowClosing(WindowEvent we){ setVisible(false); }//windowClosing }//class MyWindowListener }//class Fehlermeldung
XXXII
Abbildung 32: GUI-Maske, Klasse BestellStart package Einkauf; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //*************************************************************************** //*** Aufruf Bestell-Eingabe-Maske *** //*************************************************************************** import java.awt.Image; import java.awt.Toolkit; import java.io.IOException; import javax.swing.JFrame; import Framework.XML_Kommunikation; public class BestellStart extends JFrame{ private static final long serialVersionUID = 1L; public static BestellEingabeMaske maske1; public static BestellEingabeParameter parameter; public static XML_Kommunikation xml = new XML_Kommunikation(); public static String kon0001 = xml.textKonstanteZuord("KON0001"); //------ MAIN - Methode ------- public static void main(String[] args ) throws IOException{ parameter = new BestellEingabeParameter( "", "", "", -1, "", "", "", "", "", "", "", "", -1, "", -1, "", -1, "", -1, "", "", "", "" ); eroeffnenBestellmaske(parameter); }//main() //------ Bestellmaske eröffnen ------ public static void eroeffnenBestellmaske(BestellEingabeParameter parameter){ parameter.setTITEL(kon0001); try{ maske1 = new BestellEingabeMaske (parameter); Image icon; Toolkit toolkit = Toolkit.getDefaultToolkit(); icon = toolkit.getImage("logo.jpg"); maske1.setIconImage(icon); maske1.setVisible(true); }//try catch (IOException e){ }//catch }//eroeffnenBestellmaske() //------ Bestellmaske schließen ------ public static void schliessenBestellmaske(){ maske1.setVisible(false); }//schliessenBestellmaske() }//class BestellStart
XXXIII
Abbildung 33: GUI-Maske, Klasse BestellEingabeParameter package Einkauf; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //************************************************************************** //*** Übergabeparameter Bestellmaskeneingaben *** //************************************************************************** public class BestellEingabeParameter { private String titel, dsbenr, dslinr, dstenr, dsmeng, dsdtag, dsdmon, dsdjah, dsprei, dsjeme, dszabe, dslfbe, dsabtb, dssabe, dszus1, dszus2, dszus3, dszus4; private int linrIndex, zabeIndex, lfbeIndex, abtbIndex, sabeIndex; public BestellEingabeParameter ( String titel, String dsbenr, String dslinr, int linrIndex, String dstenr, String dsmeng, String dsdtag, String dsdmon, String dsdjah, String dsprei, String dsjeme, String dszabe, int zabeIndex, String dslfbe, int lfbeIndex, String dsabtb, int abtbIndex, String dssabe, int sabeIndex, String dszus1, String dszus2, String dszus3, String dszus4 ){ this.titel = titel; this.dsbenr = dsbenr; this.dslinr = dslinr; this.linrIndex = linrIndex; this.dstenr = dstenr; this.dsmeng = dsmeng; this.dsdtag = dsdtag; this.dsdmon = dsdmon; this.dsdjah = dsdjah; this.dsprei = dsprei; this.dsjeme = dsjeme; this.dszabe = dszabe; this.zabeIndex = zabeIndex; this.dslfbe = dslfbe; this.lfbeIndex = lfbeIndex; this.dsabtb = dsabtb; this.abtbIndex = abtbIndex; this.lfbeIndex = lfbeIndex; this.dssabe = dssabe; this.sabeIndex = sabeIndex; this.dszus1 = dszus1; this.dszus2 = dszus2; this.dszus3 = dszus3; this.dszus4 = dszus4; }//Konstruktor BestellEingabeParameter public String getTITEL(){ return titel; }//getTITEL() public void setTITEL(String titel){ this.titel = titel; }//setTITEL() public String getDSBENR(){ return dsbenr; }//getDSBENR() public void setDSBENR(String dsbenr){ this.dsbenr = dsbenr; }//setDSBENR() public String getDSLINR(){ return dslinr; }//getDSLINR() public void setDSLINR(String dslinr){ this.dslinr = dslinr; }//setDSLINR()
XXXIV
public int getLINRINDEX(){ return linrIndex; }//getLINRINDEX() public void setLINRINDEX(int linrIndex){ this.linrIndex = linrIndex; }//setLINRINDEX() public String getDSTENR(){ return dstenr; }//getDSTENR() public void setDSTENR(String dstenr){ this.dstenr = dstenr; }//setDSTENR() public String getDSMENG(){ return dsmeng; }//getDSMENG() public void setDSMENG(String dsmeng){ this.dsmeng = dsmeng; }//setDSMENG() public String getDSDTAG(){ return dsdtag; }//getDSDTAG() public void setDSDTAG(String dsdtag){ this.dsdtag = dsdtag; }//setDSDTAG() public String getDSDMON(){ return dsdmon; }//getDSDMON() public void setDSDMON(String dsdmon){ this.dsdmon = dsdmon; }//setDSDMON() public String getDSDJAH(){ return dsdjah; }//getDSDJAH() public void setDSDJAH(String dsdjah){ this.dsdjah = dsdjah; }//setDSDJAH() public String getDSPREI(){ return dsprei; }//getDSPREI() public void setDSPREI(String dsprei){ this.dsprei = dsprei; }//setDSPREI() public String getDSJEME(){ return dsjeme; }//getDSJEME() public void setDSJEME(String dsjeme){ this.dsjeme = dsjeme; }//setDSJEME() public String getDSZABE(){ return dszabe; }//getDSZABE() public void setDSZABE(String dszabe){ this.dszabe = dszabe; }//setDSZABE() public int getZABEINDEX(){ return zabeIndex; }//getZABEINDEX() public void setZABEINDEX(int zabeIndex){ this.zabeIndex = zabeIndex; }//setZABEINDEX()
XXXV
public String getDSLFBE(){ return dslfbe; }//getDSLFBE() public void setDSLFBE(String dslfbe){ this.dslfbe = dslfbe; }//setDSLFBE() public int getLFBEINDEX(){ return lfbeIndex; }//getLFBEINDEX() public void setLFBEINDEX(int lfbeIndex){ this.lfbeIndex = lfbeIndex; }//setLFBEINDEX() public String getDSABTB(){ return dsabtb; }//getDSABTB() public void setDSABTB(String dsabtb){ this.dsabtb = dsabtb; }//setDSABTB() public int getABTBINDEX(){ return abtbIndex; }//getABTBINDEX() public void setABTBINDEX(int abtbIndex){ this.abtbIndex = abtbIndex; }//setABTBINDEX() public String getDSSABE(){ return dssabe; }//getDSSABE() public void setDSSABE(String dssabe){ this.dssabe = dssabe; }//setDSSABE() public int getSABEINDEX(){ return sabeIndex; }//getSABEINDEX() public void setSABEINDEX(int sabeIndex){ this.sabeIndex = sabeIndex; }//setSABEINDEX() public String getDSZUS1(){ return dszus1; }//getDSZUS1() public void setDSZUS1(String dszus1){ this.dszus1 = dszus1; }//setDSZUS1() public String getDSZUS2(){ return dszus2; }//getDSZUS2() public void setDSZUS2(String dszus2){ this.dszus2 = dszus2; }//setDSZUS2() public String getDSZUS3(){ return dszus3; }//getDSZUS3() public void setDSZUS3(String dszus3){ this.dszus3 = dszus3; }//setDSZUS3() public String getDSZUS4(){ return dszus4; }//getDSZUS4() public void setDSZUS4(String dszus4){ this.dszus4 = dszus4; }//setDSZUS4() }//class BestellEingabeParameter
XXXVI
Abbildung 34: GUI-Maske, Klasse TeileMatchcodeMaske package Teilestamm; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //************************************************************************** //*** Teilenummern-Auswahl über Matchcode *** //************************************************************************** import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Image; import java.awt.List; import java.awt.Panel; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextField; import Einkauf.BestellEingabeParameter; import Einkauf.BestellStart; import Framework.Fehlermeldung; import Framework.HinweisFenster; import Framework.XML_Kommunikation; public class TeileMatchcodeMaske extends Frame implements ActionListener, ItemListener { private static final long serialVersionUID = 1L; // >>> Verbindung zur Server-Schnittstelle <<< XML_Kommunikation xml = new XML_Kommunikation(); // >>> M a s k e n e l e m e n t e <<< Panel topPanel, centerPanel, buttonPanel; JButton putButton, exitButton; JLabel mCodeLabel; JTextField mCode; List teile; // >>> T e x t k o n s t a n t e n <<< String fenr001 = xml.textKonstanteZuord("FENR001"); String fun0003 = xml.textKonstanteZuord("FUN0003"); String fun0005 = xml.textKonstanteZuord("FUN0005"); String kon0031 = xml.textKonstanteZuord("KON0031")+": "; // >>> V a r i a b l e n <<< BestellEingabeParameter parameter; String mCodeEingabe = ""; // Meldungen public Fehlermeldung fehler; public String fehlerText; public HinweisFenster hinweis; public String hinweisText; //------------------------- MASKE ---------------------------- public TeileMatchcodeMaske(BestellEingabeParameter parameter) throws IOException { super(parameter.getTITEL()); this.parameter = parameter; // WindowsListener hinzu MyWindowListener mwl = new MyWindowListener(); addWindowListener(mwl);
XXXVII
// KeyListener MyKeyListener evt1 = new MyKeyListener(); // >>> P a n e l s <<< topPanel = new Panel(); topPanel.setBackground(Color.lightGray); centerPanel = new Panel(); centerPanel.setBackground(Color.WHITE); buttonPanel = new Panel(); buttonPanel.setBackground(Color.lightGray); add("North", topPanel); add("Center", centerPanel); add("South", buttonPanel); // >>> L a b e l s und T e x t f e l d e r <<< // -- Matchcodeeingabe mCodeLabel = new JLabel(kon0031); topPanel.add(mCodeLabel); mCode = new JTextField("", 14); mCode.setEnabled(true); mCode.setText(""); mCode.addKeyListener(evt1); mCode.setFont(new Font("Courier", Font.PLAIN, 14)); topPanel.add(mCode); // >>> L i s t e <<< teile = new List(10); // 10 Zeilen teile.setFont(new Font ("Courier",Font.PLAIN, 14)); teile.setBackground(Color.WHITE); teile.add(" ",1); JScrollPane scrollPane = new JScrollPane(teile); centerPanel.add(scrollPane); // >>> Main - B u t t o n s <<< exitButton = new JButton(fun0003); putButton = new JButton(fun0005); // Exitknopf hinzu buttonPanel.add(exitButton); exitButton.setEnabled(true); exitButton.addActionListener(this); // Übernahmeknopf hinzu buttonPanel.add(putButton); putButton.setEnabled(false); putButton.addActionListener(this); // >>> F r a m e g r ö ß e <<< setSize(500, 280); // >>> F r a m e p o s i t i o n <<< setLocation(new Point(270, 190)); // Framegröße änderbar setResizable(false); // Titel-Icon Image icon; Toolkit toolkit = Toolkit.getDefaultToolkit(); icon = toolkit.getImage("logo.jpg"); setIconImage(icon); // Frame sichtbar setVisible(true); }//Maske // >>> K N O P F - L I S T E N E R <<< public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if (o == putButton) { int posi = teile.getSelectedIndex(); if (posi >= 0){ String angeklicktTeil = teile.getSelectedItem().toString(); parameter.setDSTENR((angeklicktTeil.substring(0,13)).trim()); BestellStart maske1 = new BestellStart(); maske1.schliessenBestellmaske();
XXXVIII
setVisible(false); maske1.eroeffnenBestellmaske(parameter); }//if Listenposition >= 0 else{ fehler = new Fehlermeldung(fenr001,560,300,300,100); }//else, nichts angeklickt }//if übernehmen if (o == exitButton) { setVisible(false); BestellStart maske1 = new BestellStart(); maske1.schliessenBestellmaske(); setVisible(false); maske1.eroeffnenBestellmaske(parameter); }//if zurück }//actionPerformed() // >>> I T E M - L I S T E N E R <<< public void itemStateChanged(java.awt.event.ItemEvent itemEvent) { }//ItemListener() // >>> F E N S T E R - L I S T E N E R <<< class MyWindowListener extends WindowAdapter { // Fensterkreuz zu public void windowClosing(WindowEvent we) { BestellStart maske1 = new BestellStart(); maske1.schliessenBestellmaske(); setVisible(false); maske1.eroeffnenBestellmaske(parameter); setVisible(false); }//windowClosing }//class MyWindowListener // >>> K E Y - L I S T E N E R <<< class MyKeyListener implements KeyListener { // Taste gedrückt public void keyPressed(KeyEvent evt1) { int key_int = evt1.getKeyCode(); // RETURN gedrückt if (key_int == KeyEvent.VK_ENTER) { mCodeEingabe = mCode.getText(); teile.removeAll(); String[] teileMatchcodeAuswahlListe = xml.teileMatchcodeAuswahlListe(mCodeEingabe); for ( int zeile = 1; zeile <= 99; zeile++ ) { if (teileMatchcodeAuswahlListe[zeile].equals("")) break; putButton.setEnabled(true); teile.add(teileMatchcodeAuswahlListe[zeile],zeile); }//for }// if VK_ENTER }// keyPressed(KeyEvent evt1) // Taste losgelassen public void keyReleased(KeyEvent evt1) { }// keyReleased(KeyEvent evt1) public void keyTyped(KeyEvent evt1) { }// keyTyped(KeyEvent evt1) }//class KeyListener }//class TeileMatchcodeMaske
XXXIX
Abbildung 35: GUI-Maske, Klasse BestellEingabeMaske package Einkauf; //(c) Copyright 2011 Manfred Schiefers - Stuttgart //************************************************************************** //*** Direktbestellung / Eingabemaske *** //************************************************************************** import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Image; import java.awt.Panel; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JTextField; import Framework.Fehlermeldung; import Framework.HinweisFenster; import Framework.XML_Kommunikation; import Teilestamm.TeileMatchcodeMaske; public class BestellEingabeMaske extends Frame implements ActionListener, ItemListener { private static final long serialVersionUID = 1L; // >>> Verbindung zur Server-Schnittstelle <<< XML_Kommunikation xml = new XML_Kommunikation(); // >>> M a s k e n e l e m e n t e <<< Panel topPanel, centerPanel, buttonPanel; JButton putButton, exitButton, matchButton; JLabel bestellNrLabel, bestellNrInhaltLabel, lieferantLabel, teileNummerLabel, teileBezLabel, bestellMengeLabel, bestellTerminLabel, preisLabel, jeLabel, zahlungsBedingungLabel, lieferBedingungLabel, abteilungLabel, sachbearLabel, zusatzLabel, dummyLabel01, dummyLabel02, dummyLabel03, dummyLabel04, dummyLabel05, dummyLabel06, dummyLabel07, dummyLabel08, dummyLabel09, dummyLabel10; JComboBox combo01, combo02, combo03, combo04, combo05; JTextField teileNrFeld, teileBezFeld, bestellMengeFeld, teileMassFeld, datumTagFeld, datumMonatFeld, datumJahrFeld, preisFeld, waehrungsFeld, jeMengeFeld, teileMas2Feld, zusatzText1Feld, zusatzText2Feld, zusatzText3Feld, zusatzText4Feld; // >>> T e x t k o n s t a n t e n <<< String fenr002 = xml.textKonstanteZuord("FENR002"); String fun0003 = xml.textKonstanteZuord("FUN0003"); String fun0005 = xml.textKonstanteZuord("FUN0005"); String kon0002 = xml.textKonstanteZuord("KON0002"); String kon0006 = xml.textKonstanteZuord("KON0006"); String kon0008 = xml.textKonstanteZuord("KON0008"); String kon0009 = xml.textKonstanteZuord("KON0009"); String kon0017 = xml.textKonstanteZuord("KON0017"); String kon0019 = xml.textKonstanteZuord("KON0019"); String kon0020 = xml.textKonstanteZuord("KON0020"); String kon0022 = xml.textKonstanteZuord("KON0022"); String kon0024 = xml.textKonstanteZuord("KON0024"); String kon0025 = xml.textKonstanteZuord("KON0025"); String kon0026 = xml.textKonstanteZuord("KON0026"); String kon0027 = xml.textKonstanteZuord("KON0027"); String kon0028 = xml.textKonstanteZuord("KON0028");
XL
String kon0030 = xml.textKonstanteZuord("KON0030"); String kon0031 = xml.textKonstanteZuord("KON0031"); // >>> V a r i a b l e n <<< BestellEingabeParameter parameter; String[] lieferantenListe = xml.lieferantenAuswahlListe(); int linrIndex;// Combo-Position Lieferantennummer String dsliwc;// Lieferantenwährungscode String dstebe;// Teilebezeichnung String dsmass;// TeileMaßeinheit String[] zahlungsBedingungListe = xml.zahlungsAuswahlListe(); int zabeIndex;// Combo-Position Zahlungsbedingungen String[] lieferBedingungListe = xml.lieferBedAuswahlListe(); int liefIndex;// Combo-Position Lieferbedingungen String[] abteilungListe = xml.abteilungAuswahlListe(); int abtIndex;// Combo-Position Abteilungen String[] sachbearListe = xml.sachbearAuswahlListe(); int sachbearIndex;// Combo-Position Lieferbedingungen boolean bestellt = false; // Meldungen public Fehlermeldung fehler; public String fehlerText; public HinweisFenster hinweis; public String hinweisText; // >>> F o l g e f r a m e TeileMatchcodeMaske matchcode; // ------------------------- MASKE ---------------------------- public BestellEingabeMaske(BestellEingabeParameter parameter) throws IOException { super(parameter.getTITEL()); this.parameter = parameter; linrIndex = parameter.getLINRINDEX(); if (linrIndex < 0) linrIndex = 0; zabeIndex = parameter.getZABEINDEX(); if (zabeIndex < 0) zabeIndex = 0; liefIndex = parameter.getLFBEINDEX(); if (liefIndex < 0) liefIndex = 0; abtIndex = parameter.getABTBINDEX(); if (abtIndex < 0) abtIndex = 0; sachbearIndex = parameter.getSABEINDEX(); if (sachbearIndex < 0) sachbearIndex = 0; // -- Bestellnummer vergeben -- if (parameter.getDSBENR().equals("") || parameter.getDSBENR() == null) { parameter.setDSBENR(xml.naechsteBestellNr()); }// if BestellNr. leer --> neu vergeben // WindowsListener hinzu MyWindowListener mwl = new MyWindowListener(); addWindowListener(mwl); // KeyListener MyKeyListener evt1 = new MyKeyListener(); // >>> P a n e l s <<< topPanel = new Panel(); topPanel.setBackground(Color.lightGray); centerPanel = new Panel(); centerPanel.setBackground(Color.WHITE); buttonPanel = new Panel(); buttonPanel.setBackground(Color.lightGray); add("North", topPanel); add("Center", centerPanel); add("South", buttonPanel);
XLI
// >>> L a b e l s und T e x t f e l d e r <<< // -- Bestellnummer -- bestellNrLabel = new JLabel(kon0008); topPanel.add(bestellNrLabel); bestellNrInhaltLabel = new JLabel(parameter.getDSBENR()); topPanel.add(bestellNrInhaltLabel); bestellNrInhaltLabel.setForeground(Color.RED); bestellNrInhaltLabel.setFont(new Font("ARIAL", Font.BOLD, 16)); dummyLabel01 = new JLabel(" " + " "); topPanel.add(dummyLabel01); // -- Lieferant -- lieferantLabel = new JLabel(kon0006); topPanel.add(lieferantLabel); combo01 = new JComboBox(lieferantenListe); combo01.setEditable(false); combo01.setEnabled(true); combo01.setFont(new Font("Courier", Font.PLAIN, 14)); combo01.setSelectedIndex(linrIndex); topPanel.add(combo01); dummyLabel02 = new JLabel(" "); topPanel.add(dummyLabel02); // -- Teilenummer -- teileNummerLabel = new JLabel(kon0002); centerPanel.add(teileNummerLabel); teileNrFeld = new JTextField("", 14); teileNrFeld.setEnabled(true); teileNrFeld.setText(parameter.getDSTENR()); teileNrFeld.addKeyListener(evt1); teileNrFeld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(teileNrFeld); matchButton = new JButton(kon0031); centerPanel.add(matchButton); matchButton.setEnabled(true); matchButton.addActionListener(this); // -- Teilebezeichnung -- dstebe = xml.holenTeileBezeichnung(parameter.getDSTENR().trim()); teileBezLabel = new JLabel(" " + kon0009); centerPanel.add(teileBezLabel); teileBezFeld = new JTextField("", 14); teileBezFeld.setText(dstebe); teileBezFeld.addKeyListener(evt1); teileBezFeld.setFont(new Font("Courier", Font.PLAIN, 14)); teileBezFeld.setColumns(46); teileBezFeld.setDisabledTextColor(Color.BLUE); teileBezFeld.setEnabled(false); centerPanel.add(teileBezFeld); dummyLabel03 = new JLabel(" "); centerPanel.add(dummyLabel03); // -- Bestellmenge --- bestellMengeLabel = new JLabel(kon0017); centerPanel.add(bestellMengeLabel); bestellMengeFeld = new JTextField("", 14); bestellMengeFeld.setEnabled(true); bestellMengeFeld.setText(parameter.getDSMENG()); bestellMengeFeld.addKeyListener(evt1); bestellMengeFeld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(bestellMengeFeld); // -- Maßeinheit --- dsmass = xml.holenTeileMasseinheit(parameter.getDSTENR().trim()); teileMassFeld = new JTextField("", 14); teileMassFeld.setText(dsmass); teileMassFeld.addKeyListener(evt1); teileMassFeld.setFont(new Font("Courier", Font.PLAIN, 14)); teileMassFeld.setColumns(5); teileMassFeld.setDisabledTextColor(Color.BLUE); teileMassFeld.setEnabled(false); centerPanel.add(teileMassFeld);
XLII
// -- Bestelltermin -- dummyLabel04 = new JLabel(" "); centerPanel.add(dummyLabel04); bestellTerminLabel = new JLabel(kon0019); centerPanel.add(bestellTerminLabel); datumTagFeld = new JTextField("", 14); datumTagFeld.setText(parameter.getDSDTAG()); datumTagFeld.addKeyListener(evt1); datumTagFeld.setFont(new Font("Courier", Font.PLAIN, 14)); datumTagFeld.setColumns(2); datumTagFeld.setEnabled(true); centerPanel.add(datumTagFeld); datumMonatFeld = new JTextField("", 14); datumMonatFeld.setText(parameter.getDSDMON()); datumMonatFeld.addKeyListener(evt1); datumMonatFeld.setFont(new Font("Courier", Font.PLAIN, 14)); datumMonatFeld.setColumns(2); datumMonatFeld.setEnabled(true); centerPanel.add(datumMonatFeld); datumJahrFeld = new JTextField("", 14); datumJahrFeld.setText(parameter.getDSDJAH()); datumJahrFeld.addKeyListener(evt1); datumJahrFeld.setFont(new Font("Courier", Font.PLAIN, 14)); datumJahrFeld.setColumns(4); datumJahrFeld.setEnabled(true); centerPanel.add(datumJahrFeld); // -- Preis -- dummyLabel05 = new JLabel(" "); centerPanel.add(dummyLabel05); preisLabel = new JLabel(kon0024); centerPanel.add(preisLabel); preisFeld = new JTextField("", 14); preisFeld.setText(parameter.getDSPREI()); preisFeld.addKeyListener(evt1); preisFeld.setFont(new Font("Courier", Font.PLAIN, 14)); preisFeld.setColumns(8); preisFeld.setEnabled(true); centerPanel.add(preisFeld); // -- Währung --- if (linrIndex > 0) { dsliwc = xml.lieferantenWaehrung(linrIndex); }// if else { dsliwc = ""; }// else waehrungsFeld = new JTextField("", 14); waehrungsFeld.setText(dsliwc); waehrungsFeld.setFont(new Font("Courier", Font.PLAIN, 14)); waehrungsFeld.setColumns(3); waehrungsFeld.setDisabledTextColor(Color.BLUE); waehrungsFeld.setEnabled(false); centerPanel.add(waehrungsFeld); combo01.addItemListener(this); // -- je Menge -- jeLabel = new JLabel(kon0025); centerPanel.add(jeLabel); jeMengeFeld = new JTextField("", 14); jeMengeFeld.setEnabled(true); jeMengeFeld.setText(parameter.getDSJEME()); jeMengeFeld.addKeyListener(evt1); jeMengeFeld.setFont(new Font("Courier", Font.PLAIN, 14)); jeMengeFeld.setColumns(8); preisFeld.setEnabled(true); centerPanel.add(jeMengeFeld); teileMas2Feld = new JTextField("", 14); teileMas2Feld.setText(dsmass); teileMas2Feld.setFont(new Font("Courier", Font.PLAIN, 14)); teileMas2Feld.setColumns(5); teileMas2Feld.setDisabledTextColor(Color.BLUE); teileMas2Feld.setEnabled(false); centerPanel.add(teileMas2Feld);
XLIII
// -- Zahlungsbedingungen -- dummyLabel06 = new JLabel("________________________________" + "________________________________" + "________________________________" + "_____________________________ "); centerPanel.add(dummyLabel06); dummyLabel06.setForeground(Color.BLACK); zahlungsBedingungLabel = new JLabel(kon0020); centerPanel.add(zahlungsBedingungLabel); combo02 = new JComboBox(zahlungsBedingungListe); combo02.setEditable(false); combo02.setEnabled(true); combo02.setFont(new Font("Courier", Font.PLAIN, 14)); combo02.setSelectedIndex(zabeIndex); centerPanel.add(combo02); combo02.addItemListener(this); // -- Lieferbedingungen -- dummyLabel07 = new JLabel(" " + " " + " "); centerPanel.add(dummyLabel07); lieferBedingungLabel = new JLabel(kon0022); centerPanel.add(lieferBedingungLabel); combo03 = new JComboBox(lieferBedingungListe); combo03.setEditable(false); combo03.setEnabled(true); combo03.setFont(new Font("Courier", Font.PLAIN, 14)); combo03.setSelectedIndex(liefIndex); centerPanel.add(combo03); combo03.addItemListener(this); // -- anfordernde Abteilung -- dummyLabel08 = new JLabel(" " + " " + " " + " " + " "); centerPanel.add(dummyLabel08); abteilungLabel = new JLabel(kon0026); centerPanel.add(abteilungLabel); combo04 = new JComboBox(abteilungListe); combo04.setEditable(false); combo04.setEnabled(true); combo04.setFont(new Font("Courier", Font.PLAIN, 14)); combo04.setSelectedIndex(abtIndex); centerPanel.add(combo04); combo04.addItemListener(this); // -- Sachbearbeiter -- dummyLabel09 = new JLabel(" " + " " + " "); centerPanel.add(dummyLabel09); sachbearLabel = new JLabel(kon0027); centerPanel.add(sachbearLabel); combo05 = new JComboBox(sachbearListe); combo05.setEditable(false); combo05.setEnabled(true); combo05.setFont(new Font("Courier", Font.PLAIN, 14)); combo05.setSelectedIndex(sachbearIndex); centerPanel.add(combo05); combo05.addItemListener(this);
XLIV
// -- Zusatztext -- dummyLabel10 = new JLabel("_____________________________" + "_____________________________" + "_____________________________" + "_____________________________" + "_____________________________" + "_____________________________" + " "); centerPanel.add(dummyLabel10); dummyLabel10.setForeground(Color.BLACK); zusatzLabel = new JLabel(kon0028); centerPanel.add(zusatzLabel); zusatzLabel.setFont(new Font("Arial", Font.BOLD, 11)); zusatzLabel.setForeground(Color.BLUE); zusatzText1Feld = new JTextField("", 100); zusatzText1Feld.setEnabled(true); zusatzText1Feld.setText(parameter.getDSZUS1()); zusatzText1Feld.addKeyListener(evt1); zusatzText1Feld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(zusatzText1Feld); zusatzText2Feld = new JTextField("", 100); zusatzText2Feld.setEnabled(true); zusatzText2Feld.setText(parameter.getDSZUS2()); zusatzText2Feld.addKeyListener(evt1); zusatzText2Feld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(zusatzText2Feld); zusatzText3Feld = new JTextField("", 100); zusatzText3Feld.setEnabled(true); zusatzText3Feld.setText(parameter.getDSZUS3()); zusatzText3Feld.addKeyListener(evt1); zusatzText3Feld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(zusatzText3Feld); zusatzText4Feld = new JTextField("", 100); zusatzText4Feld.setEnabled(true); zusatzText4Feld.setText(parameter.getDSZUS4()); zusatzText4Feld.addKeyListener(evt1); zusatzText4Feld.setFont(new Font("Courier", Font.PLAIN, 14)); centerPanel.add(zusatzText4Feld); // >>> Main - B u t t o n s <<< exitButton = new JButton(fun0003); putButton = new JButton(fun0005); // Exitknopf hinzu buttonPanel.add(exitButton); exitButton.setEnabled(true); exitButton.addActionListener(this); // Übernahmeknopf hinzu buttonPanel.add(putButton); putButton.setEnabled(true); putButton.addActionListener(this); // >>> F r a m e g r ö ß e <<< setSize(850, 500); // >>> F r a m e p o s i t i o n <<< setLocation(new Point(60, 80)); // Framegröße änderbar setResizable(false); // Titel-Icon Image icon; Toolkit toolkit = Toolkit.getDefaultToolkit(); icon = toolkit.getImage("logo.jpg"); setIconImage(icon); // Frame sichtbar setVisible(true); }// Maske
XLV
// >>> K N O P F - L I S T E N E R <<< public void actionPerformed(ActionEvent e) { Object o = e.getSource(); parameter.setDSMENG(bestellMengeFeld.getText()); parameter.setDSDTAG(datumTagFeld.getText()); parameter.setDSDMON(datumMonatFeld.getText()); parameter.setDSDJAH(datumJahrFeld.getText()); parameter.setDSPREI(preisFeld.getText()); parameter.setDSJEME(jeMengeFeld.getText()); parameter.setDSZUS1(zusatzText1Feld.getText()); parameter.setDSZUS2(zusatzText2Feld.getText()); parameter.setDSZUS3(zusatzText3Feld.getText()); parameter.setDSZUS4(zusatzText4Feld.getText()); if (o == matchButton) { matchButton.setEnabled(false); exitButton.setEnabled(false); putButton.setEnabled(false); combo01.setEnabled(false); parameter.setTITEL(kon0030); try { matchcode = new TeileMatchcodeMaske(parameter); }// try catch (IOException e1) { }// catch finally { }// finally }// if Matchcode if (o == putButton) { bestellt = true; xml.bestellungVersenden(parameter); }// if übernehmen if (o == exitButton) { if (bestellt) xml.hinweisFensterSchliessen(); setVisible(false); }// if zurück }// actionPerformed() // >>> I T E M - L I S T E N E R <<< public void itemStateChanged(java.awt.event.ItemEvent itemEvent) { String itemWahl = itemEvent.paramString().substring(24, 25); if (itemWahl.equals("0")) { String angeklicktLieferant = combo01.getSelectedItem().toString(); linrIndex = combo01.getSelectedIndex(); parameter.setDSLINR((angeklicktLieferant.substring(1, 8)).trim()); parameter.setLINRINDEX(linrIndex); dsliwc = xml.lieferantenWaehrung(linrIndex); waehrungsFeld.setText(dsliwc); }// if itemWahl=0 if (itemWahl.equals("Z")) { String angeklicktZahlungsbedingung = combo02.getSelectedItem() .toString(); zabeIndex = combo02.getSelectedIndex(); parameter.setDSZABE(angeklicktZahlungsbedingung.trim()); parameter.setZABEINDEX(zabeIndex); }// if itemWahl=Z if (itemWahl.equals("L")) { String angeklicktLieferbedingung = combo03.getSelectedItem() .toString(); liefIndex = combo03.getSelectedIndex(); parameter.setDSLFBE(angeklicktLieferbedingung.trim()); parameter.setLFBEINDEX(liefIndex); }// if itemWahl=L if (itemWahl.equals("A")) { String angeklicktAbteilung = combo04.getSelectedItem().toString(); abtIndex = combo04.getSelectedIndex(); parameter.setDSABTB(angeklicktAbteilung.trim()); parameter.setABTBINDEX(abtIndex); }// if itemWahl=A if (itemWahl.equals("O")) { String angeklicktSachbearbeiter = combo05.getSelectedItem() .toString(); sachbearIndex = combo05.getSelectedIndex(); parameter.setDSSABE(angeklicktSachbearbeiter.trim()); parameter.setSABEINDEX(sachbearIndex); }//if itemWahl=O }//ITEM-Listener()
XLVI
// >>> F E N S T E R - L I S T E N E R <<< class MyWindowListener extends WindowAdapter { // Fensterkreuz zu public void windowClosing(WindowEvent we) { if (bestellt) xml.hinweisFensterSchliessen(); try { matchcode.setVisible(false); }// try catch (NullPointerException e) { }// catch setVisible(false); }// windowClosing }// class MyWindowListener // >>> K E Y - L I S T E N E R <<< class MyKeyListener implements KeyListener { // Taste gedrückt public void keyPressed(KeyEvent evt1) { int key_int = evt1.getKeyCode(); // RETURN gedrückt if (key_int == KeyEvent.VK_ENTER) { parameter.setDSTENR(teileNrFeld.getText().trim()); if (!(parameter.getDSTENR()).equals("")) { if (xml.teileNummerCheck(parameter.getDSTENR())) { dstebe = xml.holenTeileBezeichnung(parameter .getDSTENR()); teileBezFeld.setText(dstebe); dsmass = xml.holenTeileMasseinheit(parameter .getDSTENR()); teileMassFeld.setText(dsmass); teileMas2Feld.setText(dsmass); }// if Teilenummer ok else { fehler = new Fehlermeldung(fenr002, 80, 190, 300, 100); }// else Teilenummer falsch }// Teilenummer nicht leer else { dstebe = ""; teileBezFeld.setText(dstebe); dsmass = ""; teileMassFeld.setText(dsmass); }// Teilenummer leer }// if VK_ENTER }// keyPressed(KeyEvent evt1) // Taste losgelassen public void keyReleased(KeyEvent evt1) { }// keyReleased(KeyEvent evt1) public void keyTyped(KeyEvent evt1) { }// keyTyped(KeyEvent evt1) }// class KeyListener }// class BestellEingabeMaske
XLVII
Abbildung 36: GUI-Maske, leer
Abbildung 37: GUI-Maske, Fehlermeldung
XLVIII
Abbildung 38: GUI-Maske, Teilestamm Matchcode-Auswahl
Abbildung 39: GUI-Maske, Einblendung Teilestammdaten
XLIX
Abbildung 40: GUI-Maske, Lieferantenauswahlliste
Abbildung 41: GUI-Maske, Einblendung Lieferantenstammdaten
L
Abbildung 42: GUI-Maske, Konsolenausgabe
LI
LITERATURVERZEICHNIS
[Balzert, 2009] BALZERT, Helmut: Lehrbuch der Softwaretechnik:
Basiskonzepte und Requirements Engineering, Springer, 2009
[Däßler, 2003] DÄßLER, Rolf: Das Einsteigerseminar MySQL 4, vmi 2003
[Deck, 2010] DECK, Klaus-Georg, NEUENDORF, Herbert: Java-Grund-
kurs für Wirtschaftsinformatiker, Vieweg +Teubner, 2010
[Dunkel, 2008] DUNKEL, Jürgen, EBERHART, Andreas, FISCHER, Stefan,
KLEINER, Carsten, KOSCHEL, Arne: Systemarchitekturen
für Verteilte Anwendungen: Client-Server, Multi-Tier, SOA,
Event Driven Architectures, P2P, Grid, Web 2.0, Hanser
Verlag, 2008
[Ebel, 2005] EBEL, Nadin: WebSphere/Domino Workplace Administration,
Pearson Education, 2005
[Flanagan, 2003] FLANAGAN, David: Java in a nutshell: deutsche Ausgabe für
Java 1.4, O'Reilly Germany, 2003
[Fottral, 2002] FOTTRAL, Jerry: Mastering the AS/400: A Practical, Hands-
On Guide, System iNetwork, 2000
[Gulbins, 2002] GULBINS, Jürgen, SEYFRIED, Markus, STRACK-
ZIMMERMANN, Hans: Dokumenten-Management: vom
Imaging zum Business-Dokument, Springer, 2002
[Hellige, 2008] HELLIGE, Hans Dieter: Mensch-Computer-Interface: zur
Geschichte und Zukunft der Computerbedienung, transcript
Verlag, 2008
[Herczeg, 2005] HERCZEG, Michael: Software-Ergonomie: Grundlagen der
Mensch-Computer-Kommunikation, Oldenbourg Wissen-
schaftsverlag, 2005
[Hoskins, 2003] HOSKINS, Jim, DIMMICK, Roger: Exploring IBM eServer
iSeries and AS/400 Computers: The Instant Insider's Guide to
IBM's Popular Midrange Computers, Maximum Press, 2003
LII
[Klein, 2001] KLEIN, Martin: Einführung in die DIN-Normen, Vieweg
+ Teubner, 2001
[Kotz, 2008] KOTZ, Jürgen: Visual Basic 2008: Einstieg für Anspruchs-
volle, Pearson Education, 2008
[Krüger, 2009] KRÜGER, Guido, STARK, Thomas: Handbuch der Java-
Programmierung, Pearson Education, 2009
[Louis, 2007] LOUIS, Dirk, MÜLLER, Peter: Das Java 6 Codebook,
Pearson Education, 2007
[Kudraß, 2007] KUDRAß, Thomas: Taschenbuch Datenbanken,
Hanser Verlag, 2007
[Malaga, 2000] MALAGA, Ernie, PENCE Doug, HAWKINS Ron: Das
AS/400 Buch, I.T.P.-Fachbuch, 2000
[Masak, 2005] MASAK, Dieter: Moderne Enterprise Architekturen, Springer,
2005
[Missomelius, 2006] MISSOMELIUS, Petra: Digitale Medienkultur: Wahrneh-
mung- Konfiguration- Transformation, transcript Verlag, 2006
[Saier, 2007] SAIER, Stefanie: Web Usability- Gestaltungskriterien und
Evaluationsverfahren, GRIN Verlag, 2007
[Schmidl, 2008] SCHMIDL, R., BECKER, Ch., POPOVIC, V.: ERP-Systeme
im Mittelstand, GRIN Verlag, 2008
[Thum, 2008] THUM, Marcel: Grundlagen des Usability-Engineering, GRIN
Verlag, 2008
[Vogel, 2008] VOGEL, Oliver, ARNOLD, Ingo, CHUGTHAI, Arif, IHLER,
Edmund, KEHRER, Timo, MEHLIG, Uwe, ZDUN, Uwe:
Software-Architektur: Grundlagen - Konzepte - Praxis,
Spektrum, Akademischer Verlag, 2008
[Wirtz, 2008] WIRTZ, Klaus Werner: Objektorientierte Programmentwick-
lung mit Visual Basic .NET, Oldenbourg Wissenschaftsverlag,
2008
LIII
WEITERE QUELLEN
[com, 10/2002] Computerwoche: Oxaion löst Frida ab
http://www.computerwoche.de/heftarchiv/2002/43/1067041/
Version: 25.10.2002, Aufruf: 05.03.2011
[com, 11/2004] Computerwoche: GUI-Builder für Eclipse im Vergleich
http://www.computerwoche.de/software/software-infrastruktur/550867/
Version: 11.11.2004, Aufruf: 14.03.2011
[com, 03/2006] Computerwoche: ERP-Vergleich: Oracle hat die Nase vorn,
http://www.computerwoche.de/heftarchiv/2006/11/1208452/
Version: 08.03.2006, Aufruf: 05.03.2011
[com, 07/2006] Computerwoche: AS/400 verliert im ERP-Markt an Boden,
http://www.computerwoche.de/heftarchiv/2006/31/1215429/
Version: 27.07.2006, Aufruf: 05.03.2011
[heise, 01/2008] heise online: IBMs Midrange-Betriebssystem i5/OS V6R1 läuft auf
Power6 http://www.heise.de/ix/meldung/IBMs-Midrange-Betriebssystem-i5-OS-V6R1-laeuft-auf-Power6-185220.html
Version: 30.01.2008, Aufruf: 08.03.2011 [heute, 03/2011] heute.de: Internet Explorer 9 geht an den Start http://www.heute.de/ZDFheute/inhalt/3/0,3672,8220227,00.html Version: 13.03.2011, Aufruf: 13.03.2011
[infor, 2009] Infor Global Solutions, Pressemeldung: Infor trumpft bei der J A
Burghaus GmbH mit Industrie-Know-how und i5/OS-Kompatibilität,
http://www.infor.de/unternehmen/news/pressemeldungen/burghaus_xpert/;NO-RCT
Version: 2009, Aufruf: 05.03.2011
LIV
[man, 2002] SCHOLZ, Ingo, WETZEL, Doreen: Referat Thin-Client-Architekturen,
Berufsakademie Mannheim
http://ba-skripte.de/ba_mannheim_informationstechnik_2002/4_semester/seminar/thin_client.pdf
Version: 2002, Aufruf: 05.03.2011
[pks, 2008] PKS Software GmbH, Pressemitteilung BoxID 150424: Migration von
System i RPG-Anwendungen,
http://www.pressebox.de/pressemeldungen/pks-software-gmbh/boxid/150424
Version: 2008, Aufruf: 05.03.2011
[qsc, 2010] QSC (Quality Software & Consulting): Wallstabe & Schneider steuert
Projekte mit PM1,
http://www.qsc-systems.com/cms/index.php?1bdioi7t-q9y6-emww-evxj-u0mt6twpyv3p-
090922100124
Version: 2010, Aufruf: 05.03.2011
LV
EIDESSTATTLICHE ERKLÄRUNG
Ich versichere, dass ich diesen Projektbericht selbstständig verfasst, keine anderen
als die angegebenen Quellen und Hilfsmittel benutzt sowie alle wörtlich oder
sinngemäß übernommenen Stellen in der Arbeit gekennzeichnet habe.
__________________________ ___________________________
(Ort, Datum) (Unterschrift)