scireum research labs

information management made easy

Arbeiten mit Ergebnismengen in SQL, Teil 3: MINUS

Montag 10. März 2008 von mha

Mit Hilfe des MINUS Operators kann man zwei Ergebnismengen kombinieren. Dabei werden bei MINUS alle Ergebnistuppel ausgegeben, die in der ersten, nicht aber in der zweiten der kombinierten Ergebnismengen enthalten sind.
WICHTIG!
Die Felder der Ergebnismengen müssen die selben Datentypen verwenden. Die Feldnamen werden aus der ersten Ergebnismenge übernommen. Ergebnistuppel welche in der zweiten Abfrage enthalten sind, jedoch nicht in der ersten vorkommen, werden ignoriert.

Beispiel: Es gebe 2 Tabellen mit Vereinsmitgliedern, als Ergebnis soll eine Liste mit allen Mitgliedern die in beiden Vereinen aktiv sind ausgegeben werden:

Tabelle: Schachclub
Name
Peter
Tom
Andy
Johann
Gerald

Tabelle: Tennisclub
Name
Michael
Peter
Andy
Roland

Die Abfrage:

SELECT Name FROM Schachclub MINUS SELECT Name FROM Tennisclub

liefert folgendes Ergebnis:
Name
Tom
Johann
Gerald

Kategorie: Datenbanken, SQL | Keine Kommentare »

Arbeiten mit Ergebnismengen in SQL, Teil 2: INTERSECT

Montag 10. März 2008 von mha

Mit Hilfe des INTERSECT Operators kann man zwei Ergebnismengen kombinieren. Dabei werden bei INTERSECT alle Ergebnistuppel ausgegeben die in allen der kombinierten Ergebnismengen enthalten sind.
WICHTIG!
Die Felder der Ergebnismengen müssen die selben Datentypen verwenden. Die Feldnamen werden aus der ersten Ergebnismenge übernommen.

Beispiel: Es gebe 2 Tabellen mit Vereinsmitgliedern, als Ergebnis soll eine Liste mit allen Mitgliedern die in beiden Vereinen aktiv sind ausgegeben werden:

Tabelle: Schachclub
Name
Peter
Tom
Andy
Johann
Gerald

Tabelle: Tennisclub
Name
Michael
Peter
Andy
Roland

Die Abfrage:

SELECT Name FROM Schachclub INTERSECT SELECT Name FROM Tennisclub

liefert folgendes Ergebnis:
Name
Andy
Peter

Kategorie: Datenbanken, SQL | Keine Kommentare »

Arbeiten mit Ergebnismengen in SQL, Teil 1: UNION

Montag 10. März 2008 von mha

Mit Hilfe des UNION Operators kann man zwei Ergebnismengen kombinieren. Dabei werden bei UNION alle Ergebnistuppel ausgegeben die in einer der kombinierten Ergebnismengen enthalten sind.
WICHTIG!
Die Felder der Ergebnismengen müssen die selben Datentypen verwenden. Die Feldnamen werden aus der ersten Ergebnismenge übernommen.

Beispiel: Es gebe 2 Tabellen mit Vereinsmitgliedern, als Ergebnis soll eine Liste mit allen Mitgliedern beider Vereine ausgegeben werden:
Tabelle: Schachclub
Name
Peter
Tom
Andy
Johann
Gerald

Tabelle: Tennisclub
Name
Michael
Peter
Andy
Roland

Die Abfrage:
SELECT Name FROM Schachclub UNION SELECT Name FROM Tennisclub

liefert folgendes Ergebnis:
Name
Andy
Gerald
Johann
Michael
Peter
Roland
Tom

Mit UNION ALL werden alle Ergebnistuppel (auch doppelte) aller Teilmengen ausgegeben:
SELECT Name FROM Schachclub UNION ALL SELECT Name FROM Tennisclub

liefert also:
Name
Andy
Andy
Gerald
Johann
Michael
Peter
Peter
Roland
Tom

Kategorie: Datenbanken, SQL | Keine Kommentare »

Erhöhen der Softwarequalität mit Apache ANT und einem Builder für Eclipse

Samstag 19. Januar 2008 von aha

Der folgende Beitrag beschäftigt sich mit dem Problem des “Logging” in Java-Programmen und wie dieses elegant mit Apache ANT (http://ant.apache.org) und Eclipse (http://www.eclipse.org) gelöst werden kann.

Gerade im JEE-Umfeld möchte man vorallem während der Entwicklungs- und Test-Phase viele Programmausgaben um Fehler schneller finden zu können. Da diese Ausgaben auch beim Fehlersuchen in Produktiv-Systemen nützlich sind, lässt man diesen Code gerne in der ausgelieferten Version und bemüht sogn. Logging-Bibliotheken (z.B. http://logging.apache.org/log4j) welche die Ausgaben genau steuern. Trotzdem ist der Produktiv-Code vermischt mit Statements der Art:
if (logger.isDebug()) {
logger.debug(i + “ Requests processed);
}

Da dies den eigentlichen Code unleserlich macht, verwenden viele Unternehmen AspectJ (http://www.eclipse.org/aspectj) welches den Code beim Kompilieren oder Programmstart modifiziert und solche Debug-Ausgaben “hineinwebt”. Leider muss man hierfür eine teils komplexe Sprache lernen um die Stellen (Pointcuts) zu beschreiben und man verliert die Lokalität (den Code den man im Editor sieht ist nicht der Code der ausgeführt wird). Oft ist es aber so, dass man zum einen einen Kommentar schreibt, warum was passiert und gleichzeitig eine Log-Ausgabe, damit man die Ausführung verfolgen kann:

if ((doSomething() && isUserAuthorized()) || specialCondition()) {
//This code is executed because of ….
if (logger.isDebug()) {
logger.debug(Comment…
+
(User was authorized:
+isUserAuthrized()
+”, SpeicalCondition:
+specialCondition()
+”)
);
}
}

Die Idee ist nun, spezielle Kommentare einzuführen, die vor dem eigentlichen Kompilieren in Log-Statements umgewandelt werden:
if ((doSomething() && isUserAuthorized()) || specialCondition()) {
///Comment….
///user was authorized: {isUserAuthorized()}
///special condition: {specialCondition()}

}

Diese Kommentare beginnen mit /// und alles was zwischen { und } steht, wird als Java-Code interpretiert. Vor dem Kompilieren kann dieses Statement dann zu if (logger.isDebug()) { logger.debug(”“); } umgebaut werden. Nun wird der Code zwar immernoch “heimlich” verändert, aber man sieht die exakte Stelle und selbst die Zeilenangaben des Debuggers sind korrekt, man kann also auch den erzeugten Kommentar “debuggen”.

Mit Hilfe von ANT ist dies sehr einfach zu realisieren indem man einen eigenen Task definiert (s. Beispielquelltext) der die Umwandlung durchführt. Die angehängte build.xml definiert einen eigenen Builder für Eclipse-Projekte, der alle Dateien im Unterverzeichnis “src” umwandelt und nach “bin” kompiliert.

Die Umwandlung wird mit dem “commentlog”-Task durchgeführt wobei “toDir” das Zielverzeichnis angibt und “loggerMethod” beschreibt, wie die Ausgabe stattfinden soll. Der $ wird später durch den erzeugten String asugegeben. In dem Beispiel wird immer alles nach System.err geschrieben:

<commentlog toDir=”${PROJECT}\bin\tmp” loggerMethod=”System.err.println($);“>
<fileset dir=”src” includes=”${FILES_CLEANED}” />
</commentlog>

Um den Builder für ein Eclipse-Projekt zu aktivieren, muss man das angehängte build.xml und commentslog.jar in das Projekt kopieren. Danach öffnet man den Eigenschaften-Dialog für das Projekt (Alt+Enter), Wählt “New” und dann “Ant-Builder” aus. In dem Kartenreiter “Main” muss man nun das Buildscript und das Basisverzeichnis auswählen. Als Buildscript die angehängt build.xml auswählen und als Basisverzeichnis das Projekt selbst auswählen:

Builder hinzufügen


Builder hinzufügen

Dann im Kartenreiter “Targets” die Build-Targets auswählen. Für “After a Clean”: rebuild, für “Manual-” und “Auto Build”: build und für “During a Clean”: clean.


Builder hinzufügen

Im Kartenreiter Properties sollte man noch die folgenden Werte hinzufügen:

build.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
FILES=$build_files:a,c,f}
PROJECT=${build_project}


Builder hinzufügen

Abschließend sollte man bei “Build Options” noch die “Relevanten Dateien” auswählen, da der Builder sonst immer zweimal angestoßen wird (einmal bei der Änderung und einmal für die in bin/tmp generierte Datei). Man muss also “Specify working set of relevant resources aus” und selektiert dann nur das “src”-Verzeichnis.


Builder hinzufügen

Nun kann man beliebigen Java-Code mit “///” Komentaren versehen die zu Log-Statements umgebaut werden. Der Code sollte jedoch innerhalb einer Methode sein, sonst wird unkompilierbarer Code erzeugt. Außerdem werden nur Zeilen-Kommentare umgesetzt, d.h. vor /// darf nichts stehen. Die beiden Angehängten Java-Dateien welche die ANT-Tasks implementieren, verwenden solche Kommentare zur Demonstration:


Builder hinzufügen

Alle Quellen und eine vorkompilierte jar finden Sie hier: Beispielquelltext

Kategorie: Java EE | Keine Kommentare »

i5: java.sql.SQLException: [SQL7008] in not valid for operation.

Samstag 19. Januar 2008 von mha

Der Fehlercode SQL7008 deutet auf nicht journalisierte Dateien hin. Wenn man Transaktionen auf solchen Dateien ausführen will, wehrt sich die i5 und sagt: “not valid for operation”. Zu deutsch: “Geht nicht, wie soll ich auch ein rollback machen ohne Journal”!

Lösung: mit CRTJRNRCV einen Journalempfänger erstellen, mit CRTJRN ein Journal erstellen und dann mit STRJRNPF die betroffene Datei journalisieren (Tipp: bei STRJRNPF die Option OMTJRNE auf *OPNCLO stellen, damit läßt die i5 alle Open und Close Anweisungen im Journal weg, somit werden Selects nicht protokolliert sondern nur Datenänderungen, was die Journalgröße wesentlich einschränkt). 

Kategorie: IBM System i, Java EE | Keine Kommentare »

IBM System i JDBC Connection Pool für Sun Application Server erstellen

Samstag 19. Januar 2008 von mha

Folgender Beitrag beschreibt kurz das Einrichten eines JDBC Connection Pools zu einer iSeries (AS400) für den Sun Application Server 9.1 (Glassfish). Als erstes brauchen wir die Toolbox (JT/Open) diese enthält den JDBC Treiber und weitere Tools um auf die i5 zugreifen zu können. Der Download ist hier zu finden: https://sourceforge.net/projects/jt400. Weitere Infos zu der Toolbox gibt es unter: http://jt400.sourceforge.net/. In dem Download ist eine Datei: jt400.jar enthalten diese muß in das Verzeichnis: <sun app svr>\domains\<Domainname>\lib\ext\jt400.jar

Nun wechseln wir in die Adminoberfläche Sun Appsvr, dort auf Resources> JDBC> Connection Pools > New
Name: z.B. i5pool
Resource Type: javax.sql.ConnectionPoolDatasource
Vendor: leer lassen 
auf next klicken
Datasource Name: com.ibm.as400.access.AS400JDBCConnectionPoolDataSource
Dann unten bei Add Property klicken und folgende anlegen:serverName: hostname (z.B. i5.xyz.de)
networkProtocol: tcpip
user: user auf der i5
password: password des users
portNumber: 8471
libraries: z.B.: lib1, lib2, qgpl

Thats it!

Jetzt noch eine JDBC Resource auf den Connection Pool legen und ab gehts!

 WICHTIG!: Alle Files müssen journalisiert werden, auf die man mit Transationen zugreifen möchte, ansonsten gibts einen SQL7008 um die Ohren.

Kategorie: IBM System i | Keine Kommentare »