Whitepaper 09/2010 - Ing. Michael J. Raber

Werbung
Whitepaper 09/2010
Seite 1
XML-Schnittstelle für System i
Aufgabenstellung
Aus einer vorgegebenen XML-Datei sollen Daten in eine AS/400-Tabelle
übertragen werden. Bei der Übertragung besteht die Möglichkeit Daten per
Mapping zu prüfen, zuzuordnen und zu verändern. Nach erfolgter Übertragung
soll ein AS/400-Programm aufgerufen werden, mit dem die Daten verarbeitet
werden.
Konzept
Um eine größtmögliche Flexibilität der Anwendung zu gewährleisten wird für
die Konfiguration eine XML-Datei verwendet. Das Mapping wird in XSL
realisiert. Dies ermöglicht in einfachen Fällen eine schnelle Umsetzung. Für
komplexe Anforderungen steht der komplette Funktionsumfang von XSL zur
Programmierung zur Verfügung. Für die Nachverarbeitung wird dann ein
AS/400-Programm aufgerufen, so daß hier jede von der AS/400 unterstützte
Programmiersprache verwendet werden kann (RPG, Java, COBOL,...).
Funktionsweise
Die Funktion der Schnittstelle beruht auf folgenden Schritten:
•
Start des Programms mit zwei Parametern: 1. XML-Datei mit den zu
verarbeitenden Eingabedaten, 2. XML-Datei mit der
Programmkonfiguration
•
Verarbeiten der XML-Daten und XSL-Transformation in SQL-Skript.
•
DatabaseConnect zur AS/400 und zeilenweise Ausführung des SQLSkripts (in der Regel INSERT INTO...)
•
Aufruf des AS/400-Programms zur weiteren Datenverarbeitung aus dem
Execute-Tag der Konfigurationsdatei
Michael J. Raber
http://www.mjraber.de
Document created with
Whitepaper 09/2010
Seite 2
XML-Schnittstelle für System i
Beispiel AS/400-Datei
Die Beispiel-Datei kann mit folgendem Befehl erstellt werden:
CREATE TABLE DEMOXML (FIELD1CHR CHAR (10 ) NOT NULL WITH DEFAULT, FIELD2DEC
DECIMAL (10 , 3) NOT NULL WITH DEFAULT, FIELD3CHR CHAR (200 ) NOT NULL WITH
DEFAULT)
Beispiel XML-Eingabedatei
<?xml version="1.0"?>
<!-- Demo XML-Datei
<!-<!-- www.mjraber.de
<!-<DEMO>
<RECORD>
<F1>Feld1</F1>
<F2>1.00</F2>
<F3>Feld3Inhalt1</F3>
</RECORD>
<RECORD>
<F1>Feld2</F1>
<F2>2.00</F2>
<F3>Feld3Inhalt2</F3>
</RECORD>
</DEMO>
-->
-->
-->
-->
Beispiel Mapping
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1" indent="no"/>
<xsl:template match="DEMO">
<xsl:apply-templates select="RECORD"/>
</xsl:template>
<xsl:template match="RECORD">
<xsl:text>insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR)
values (</xsl:text>
<xsl:text>'</xsl:text><xsl:value-of
select="F1"/><xsl:text>',</xsl:text>
<xsl:value-of select="F2"/><xsl:text>,</xsl:text>
<xsl:text>'</xsl:text><xsl:value-of
select="F3"/><xsl:text>'</xsl:text><xsl:text>)
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Resultierendes SQL-Skript
insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values
('Feld1',1.00,'Feld3Inhalt1')
insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values
('Feld2',2.00,'Feld3Inhalt2')
Michael J. Raber
http://www.mjraber.de
Document created with
Whitepaper 09/2010
Seite 3
XML-Schnittstelle für System i
Ergebnis in der AS/400-Datei
FIELD1CHR
FIELD2DEC
FIELD3CHR
000001 Feld1
1,000
Feld3Inhalt1
000002 Feld2
2,000
Feld3Inhalt2
000003 Feld1
1,000
Feld3Inhalt1
000004 Feld2
2,000
Feld3Inhalt2
Beispiel Konfiguration
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<MAXCONTROL>
<Info>Demo ConfigFile</Info>
<Mapping>xsl\Demo.xsl</Mapping>
<DBDriver>com.ibm.as400.access.AS400JDBCDriver</DBDriver>
<iSSystem>192.168.1.1</iSSystem>
<iSLibrary>MYLIB</iSLibrary>
<iSUser>MYUSER</iSUser>
<iSPassword>MYPWD</iSPassword>
<Execute>SBMJOB CMD(CALL PGM(RABER/DEMOXML) PARM('XX'))</Execute>
</MAXCONTROL>
</root>
Beispiel Aufruf
Bei Verwendung des Programms auf Windows-Basis kann folgender Aufruf in
einer BAT-Datei hinterlegt werden:
java -classpath .;.\lib\jt400.jar;.\lib\fop.jar;.\lib\xalan2.4.1.jar;.\lib\xml-apis.jar de.mjraber.maxcontrol.MAXControl %1 %2
Bei direkter Ausführung auf der AS/400 ist ein analoges Shell-Skript für die
Ausführung mittels QSH oder ein RUNJVA-Befehl erforderlich.
Michael J. Raber
http://www.mjraber.de
Document created with
Whitepaper 09/2010
Seite 4
XML-Schnittstelle für System i
Beispiel Programmausgabe
*****************************************************************************
* MAXControl Version 3 - www.mjraber.de
*
*****************************************************************************
XML-File......: xml/Demo.xml loading.
ConfigFile....: DemoCfg.xml reading.
ConfigFile....: Demo ConfigFile
ConfigFile....: TransformationXSL: xsl\Demo.xsl
SQL-Script....: xml/Demo.sql created.
ConfigFile....: DBDriver: com.ibm.as400.access.AS400JDBCDriver
ConfigFile....: DBURL: jdbc:as400://192.168.1.1/RABER;translate
binary=true;user = MYUSR;password =MYPWD
Connected to..: jdbc:as400://192.168.1.1/MYLIB;translate binary=true;user =
MYUSER;password =MYPWD
Driver........: AS/400 Toolbox for Java JDBC Driver
Version.......: 6.0
Reading SQL...: xml\Demo.sql
Running SQL...: Line 1 Statement: insert into DEMOXML (FIELD1CHR, FIELD2DEC,
FIELD3CHR) values ('Feld1',1.00,'Feld3Inhalt1')
SQL-Result....: 1
Running SQL...: Line 2 Statement: insert into DEMOXML (FIELD1CHR, FIELD2DEC,
FIELD3CHR) values ('Feld2',2.00,'Feld3Inhalt2')
SQL-Result....: 1
Running SQL...: Line 3 Statement:
Status........: Starting Processing.
Status........: Setting system properties.
ConfigFile....: iSeries System: 192.168.1.1
ConfigFile....: iSeries UserID: MYUSER
Status........: Opening Server Command.
Status........: Starting Server-Job as QZRCSRVS. Please wait...
Execute.......: SBMJOB CMD(CALL PGM(RABER/DEMOXML) PARM('XX'))
Job...........: QZRCSRVS/QUSER/734624
Status........: Server-Job finished. (SBMJOB CMD(CALL PGM(RABER/DEMOXML)
PARM('XX')))
Status........: Server Job finished.
Status........: Number of Messages: 1
Status........: Message: CPC1221: Job 734639/MYUSER/QDFTJOBD an
Jobwarteschlange QBATCH in Bibliothek QGPL übergeben.
Status........: Server Job Finished.
Michael J. Raber
http://www.mjraber.de
Document created with
Whitepaper 09/2010
Seite 5
XML-Schnittstelle für System i
Anmerkungen
•
In der Konfigurationsdatei ist das Passwort in lesbarer Form hinterlegt.
Bei Bedarf kann dies auch verschlüsselt werden. Dazu muß das
Programm geringfügig erweitert werden.
•
In der Beispiel-XSL-Datei werden lediglich INSERT-Statements generiert.
Prinzipiell sind hier aber auch alle anderen gültigen SQL-Anweisungen
möglich.
•
Im
Beispiel
wurde
ein
sehr
einfaches
XSL-Mapping
ohne
jede
Funktionalität verwendet. Es werden lediglich die XML-Tags F1, F2 und
F3 auf die Datenbankfelder gemappt. Hier sind aber alle gültigen XSLFunktionen möglich (s. Quellen)
•
Das Programm enthält keinerlei Fehlerhandling. Es ist innerhalb des
Mappings dafür zu sorgen, daß keinerlei Fehler im SQL-Skript erzeugt
werden. So sollten im Zweifelsfalls Zeichenketten mit der XSL-Funktion
substring gekürzt werden. Ebenso sollte mit Zahlenfeldern verfahren
werden. Hier steht z. B. die XSL-Funktion format-number zur Verfügung.
Auch Fehler durch doppelte Schlüssel dürfen nicht auftreten. Es ist daher
zu empfehlen die Daten zunächst in eine Arbeitsdatei zu schreiben und
dann per AS/400-Programm in die Produktionsdateien zu schreiben. Dort
können dann Plausibilitätsprüfungen und Fehlerhandling erfolgen.
Quellen XSLT-Literatur:
Doug Tidwell: XSLT, ISBN 3-89721-292-7
Sal Mangano: XSLT Cookbook, ISBN 0-596-00372-2
Michael J. Raber
http://www.mjraber.de
Document created with
Herunterladen