> Inhalt: JavaScout-Fat-Client-Framework (JS-FCF) 

> Verzeichnis der Dokumente mit den Muster-Codes 

Muster-Code für ein DBA_Set (Liste mit DataBase-Access Objekten)

* Bitte beachten Sie die Hinweise und Bestimmungen bezüglich Urheberrecht, Haftungsausschluß und geschützte Marken oder Warenzeichen die für dieses Web-Dokument und möglicherweise auch für 'verlinkte' Dokumente gelten.

  • Der Betreiber dieser Web-Site (www.javascout.biz) ist nicht verantwortlich für den Inhalt von Web-Sites, die innerhalb dieses Web-Dokumentes oder anderer Dokumente von www.javascout.biz verlinkt sind.

  • Wenn dieses Web-Dokument oder andere Dokumente dieser Web-Site (www.javascout.biz) Rechte von Ihnen verletzen, oder sie glauben, dass Rechte Anderer (Dritter Personen) dadurch verletzt werden, informieren Sie bitte den Betreiber dieser Web-Site.
    Eine E-Mail können Sie ganz einfach durch anklicken des Symbols oder Textes im Frame rechts oben senden.

Dieses Dokument drucken.

 Letzte Bearbeitung dieses  Dokuments:
2012-12-27


Voraussetzungen für das Verständnis dieses Dokuments:

Grundkenntnisse in der Programmierung von Java (Klassen, Methoden, Schleifen).
Grundkenntnisse der SQL-Kommandos für relationale Datenbanksysteme.

Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:

Arbeitszeit:
Abhängig von der Komplexität der zu entwickelnden DBA-Klasse.
Ein Kopieren des Muster-Codes und 'Find/Replace' der 'Platzhalter' dauert ca. 10 Minuten.

Für das Implementieren komplexerer Abfragen hängt der Arbeitsaufwand stark von der Aufgabe und der Routine ab. Eine Schätzung des Zeitaufwandes kann in diesen Fällen nicht gegeben werden.

Dieses Dokument enthält Code-Muster für eine einfache DBA_Set (Liste mit DataBase-Access Objekten) Klasse und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.

Inhaltsverzeichnis:

Vorbedingung 
Einfacher Muster-Code für ein DBA_Set
 
Anleitung zur Adaptierung 
* Änderung des Namens des Java-Packages 
* Adaptieren des Kommentars 
* Änderung des Namens dieser Klasse und des DBA-Objektes 
* Adaptieren der Methode
selectAllByObjectID(...) 
* Implementieren der Methode(n)
selectBySelectionCriteria(...) 
Spezieller Muster-Code 
* Selektieren von Datensätzen die erst in der Zukunft gültig sind 
* Selektieren von Datensätzen die aktuell und in der Zukunft gültig sind 

Weitere Schritte und verwandte Dokumentation 

Vorbedingung:

zum Inhaltsverzeichnis

Einfacher Muster-Code für ein DBA_Set

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung.

package application_package.dba;
/*
 * Package für die Verbindung zur Datenbank. */

import java.sql.*;
/*
 * Package mit den Basisklassen für DBA und DBA-Set. */

import js_base.dba.*;
/*
 * Package mit dem Minimalen Set an Parametern. Diese enthalten das Arbeitsdatum.
 * Das Arbeitsdatum wird für verschiedene Abfragen gebrauucht. */

import js_base.structures.JSBS_MinimalParameters;
/*
 * Package mit der DBA-Klasse, dessen Objekte in der Liste dieses DBA-Set enthalten ist. */

import application_package.dba.application_dbtable_DBA;
/**
 * 
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Liste mit DataBase-Access Objects (DBA_Set)
 *  der Klasse
application_dbtable_DBA.
 *  Eine Beschreibung der Aufgabe finden Sie im Kommentar der DBA-Klasse.

 * 
 * @change-log
 * when          who                       why
 * -----------------------------------------------------------------
 * 
 */

public class application_dbtable_DBA_Set extends JSBS_DBA_Set {
/*
 * de:
 * Methode zum Selektieren aller Datensätze für einen gegebenen Objekt-ID.
 * Diese Methode wird zum Anzeigen von Veränderungen (History) des BO und zum
 * Abgleichen der Daten bei einer 'MobileClient' Version verwendet.
 * Weiters wird damit beim 'deaktivieren' des BO festgestellt, welche Datensätze
 * noch über das aktuelle Datum hinaus gültig sind. */
    
public synchronized void selectAllByObjectID(Connection parmDBCon, double parmObjectID) {
/* de:
 * 'Bauen' des SQL-Kommandos in einer Zeichenkette.
 * Das SQL-Kommando wird zuerst in einer eigenen Zeichenkette aufgebaut (und nicht gleich
 * als Parameter der preparedStatement Methode) um das SQL-Kommando klar sehen zu können.
 * Das ist hilfreich wenn es notwendig ist, den Debugger einzusetzen. */
      
final String locstrSQLCommand = application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
                                      " where " application_dbtable_DBA.CONST_ObjectID + " =?" +
                                      " order by " application_dbtable_DBA.CONST_ValidFrom + " asc, " +
                                                       application_dbtable_DBA.CONST_ValidTill + " asc";
/* de: 'PreparedStatement'; eine spezielle Klasse für Operationen auf die Datenbank. */
      
PreparedStatement SQLStatement;
      try {
/* de: 'PreparedStatement' konstruieren und mit dem SQL-Kommando füllen. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* de: Füllen der Variablen im 'PreparedStatement'. */
        SQLStatement.setDouble(1, parmObjectID);
/* de: Ausführen der Datenbank-Operation für ein SELECT. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();
/* 
 * de: Übertragen der Daten vom ResultSet in den Vector mit den einzelnen DBA-Objekten.
*/
        vecRecordSet.removeAllElements();
        for (;;) {
/* de:
 * Einen Datensatz nach dem Anderen lesen;
 * for-Schleife abbrechen wenn kein weiterer Datensatz mehr im ResultSet vorhanden ist. */

          if (!SQLResultSet.next()) return;
/* de:
 * Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet übertragen.
*/
          application_dbtable_DBA locstructapplication_dbtable_DBA = new application_dbtable_DBA();
          locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);
/* de:
 * Einfügen des einzelnen DBA-Objektes in den Vector;
 * dieser ist in der geerbten Basisklasse definiert. */

          vecRecordSet.addElement(locstructapplication_dbtable_DBA);
/* de:
 * Datenbank-Operation wurde ohne Fehler ausgeführt; zurückmelden an die aufrufende Methode
 * durch eine leere Zeichenkette für die Fehlermeldung (error-message). */

          ErrorMsg = "";
        }
      }
      
catch (SQLException SQLExc) {
/* de: Während des Ausführens der DB-Operation ist ein Fehler aufgetreten; Text-Nachricht holen. */
        ErrorMsg = SQLExc.getMessage();
      }

    
}
/*
 * METHODE zum Selektieren einer durch den Parameter 'parmNumberOfRecords' festgelegten 
 * Anzahl von
Datensätzen deren Wert im Attribut 'ChangedAt' gleich oder kleiner ist als 
 * der im Parameter 'parmBeginTimestamp' übergebene Wert.
 * Die Datensätze sind absteigend nach ihrem Wert im Attribut 'ChangedAt' sortiert.
 * Es werden mit dieser Methode eine vorgegebene Anzahl von Datensätzen selektiert die gleich
 * alt oder älter sind als der im Parameter 'parmBeginTimestamp' übergebene Wert.
 * Diese Methode wird gebraucht wenn bei der Version 'MobileClient' die Daten auf einem
 * mobilen Client mit den Daten des Servers synchronisiert werden müssen.
 */
    
public synchronized void selectAllByChangedAt(Connection parmDBCon, 
    
                                              Timestamp parmBeginTimestamp, int parmNumberOfRecords ) {
/* de:
 * 'Bauen' des SQL-Kommandos in einer Zeichenkette.
 * Das SQL-Kommando wird zuerst in einer eigenen Zeichenkette aufgebaut (und nicht gleich
 * als Parameter der preparedStatement Methode) um das SQL-Kommando klar sehen zu können.
 * Das ist hilfreich wenn es notwendig ist, den Debugger einzusetzen. */
      
final String locstrSQLCommand = application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
                                      " where " application_dbtable_DBA.CONST_ChangedAt + " <=? " +
/*

 * de: Sortierkriterium mit dem die gefundenen Datensätze nach dem Alter sortiert werden.
 * en: Sorting-criteria to sort the found records by age. */

                                      " order by " application_dbtable_DBA .CONST_ChangedAt + " desc" +
/*

 * de: Anzahl der Datensätze die mit dieser Abfrage gelesen werden sollen.
 * en: Number of records that should be read with this selection. */

                                      " limit ? ";

/* de: 'PreparedStatement'; eine spezielle Klasse für Operationen auf die Datenbank. */
      
PreparedStatement SQLStatement;
      try {
/* de: 'PreparedStatement' konstruieren und mit dem SQL-Kommando füllen. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* de: Füllen der Variablen im 'PreparedStatement'. */
        SQLStatement.setTimestamp(1, parmBeginTimestamp);
        SQLStatement.setInt(2, parmNumberOfRecords);
/* de: Ausführen der Datenbank-Operation für ein SELECT. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();
/* 
 * de: Übertragen der Daten vom ResultSet in den Vector mit den einzelnen DBA-Objekten.
*/
        vecRecordSet.removeAllElements();
        for (;;) {
/* de:
 * Einen Datensatz nach dem Anderen lesen;
 * for-Schleife abbrechen wenn kein weiterer Datensatz mehr im ResultSet vorhanden ist. */

          if (!SQLResultSet.next()) return;
/* de:
 * Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet übertragen.
*/
          application_dbtable_DBA locstructapplication_dbtable_DBA = new application_dbtable_DBA();
          locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);
/* de:
 * Einfügen des einzelnen DBA-Objektes in den Vector;
 * dieser ist in der geerbten Basisklasse definiert. */

          vecRecordSet.addElement(locstructapplication_dbtable_DBA);
/* de:
 * Datenbank-Operation wurde ohne Fehler ausgeführt; zurückmelden an die aufrufende Methode
 * durch eine leere Zeichenkette für die Fehlermeldung (error-message). */

          ErrorMsg = "";
        }
      }
      
catch (SQLException SQLExc) {
/* de: Während des Ausführens der DB-Operation ist ein Fehler aufgetreten; Text-Nachricht holen. */
        ErrorMsg = SQLExc.getMessage();
      }

    
}
/* ---------------------
 * METHODE zum Lesen aller Datensätze die zum Arbeitsdatum
 * (im Parameter JSBS_MinimalParameters enthalten) gültig sind und den in
 * den Parametern übergebenen Selektionskriterien entsprechen.
 * 'Connection' ist eine Klasse aus dem package 'java.sql' und enthält die
 * Verbindung zum Datenbanksystem. */

    
public void selectBySelectionCriteria(
                   Connection parmDBCon, JSBS_MinimalParameters parmMinParm,
                   String parm
SelectionVariableName1int parmSelectionVariableName2) {
/* Aufbauen des SQL-Kommandos in einer eigenen Zeichenkette (String).
 * Gegenüber einem direkten Schreiben des des SQL-Kommandos als Parameter
 * beim 'Construct' des 'SQLStatement' hilft der eigene String beim Debuggen.
 * Dabei werden die als Konstante definierten Werte der Klasse
 * JS_ProjAssist_ProjLang_DBA verwendet. */

      
final String locstrSQLCommand =
                     
application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
/* Selectionskriterien in die Zeichenkette einfügen. */
                     
" where " application_dbtable_DBA.CONST_ClientID + " =?" +
                       
" and " application_dbtable_DBA.CONST_ValidTill + " >=?" +
                       
" and " application_dbtable_DBA.CONST_ValidFrom + " <=?" +
                       
" and " application_dbtable_DBA.CONST_AttributeName1 + " =?" +
/* Bei einem LIKE-Statement wird ebenfalls hier ein Platzhalter eingefügt.
 * eventuelle 'Wildcards' im Selektionskriterium werden beim Versorgen des Platzhalters
 * mit Werten an die Zeichenkette für die Selektion angehängt. */

                       
" and " application_dbtable_DBA.CONST_AttributeName2 + " like ?" +
/* Sortierkriterium, damit die Datensätze aufsteigend (oder absteigend) nach den
 * Selektionskriterien (und eventuell weiteren Attributen) gleich während der DB-Abfrage
 * sortiert werden. */

                     " order by "
application_dbtable_DBA.CONST_AttributeName1 + ", " +
                                    
application_dbtable_DBA.CONST_AttributeName2 + ", " +
                                    
application_dbtable_DBA.CONST_AttributeName3 + ", " +
                                    
application_dbtable_DBA.CONST_ValidFrom + " desc, " +
                                    
application_dbtable_DBA.CONST_ValidTill + " asc";
/* Das im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in das
 * Datumsformat der 'java.sql' Klassen konvertiert werden. */

      Date locdteWorkDate =
new Date(parmMinParm.calWorkDate.getTime().getTime());
/* 'PreparedStatement' ist eine Klasse aus dem 'java.sql'-package die das
 * SQL-Kommando an das Datenbanksystem überträgt. */

      PreparedStatement SQLStatement;

/* Es folgt die Ausführung des SQL-Kommandos; die dafür zuständigen Klassen
 * und Methoden arbeiten mit 'try/catch' zur Fehlerbehandlung. */

      
try {
/* Gerade vorher definiertes 'PreparedStatement' konstruieren
 * und dabei als Parameter das SQL-Kommando übergeben. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando einfügen. */

        SQLStatement.setInt(1, parmMinParm.intClientID);
        SQLStatement.setDate(2, locdteWorkDate);
        SQLStatement.setDate(3, locdteWorkDate);
        SQLStatement.setString(4, parmSelectionVariableName1);
        SQLStatement.setInt(5, parmSelectionVariableName2);
/* Spezielle Form für das Füllen eines Platzhalters innerhalb eines LIKE-Statements.
 * Grund ist, dass eventuelle 'Wildcards' innerhalb des LIKE-Statements nicht in der
 * Zeichenkette mit dem SQL-Kommando geschrieben werden können. */

        SQLStatement.setString(5, parm
SelectVariableName2 + "%");
/* SQL-Kommando an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
 * sind dann im Objekt der Klasse 'ResultSet'. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();
/* 
 * Datenbank-Abfrage ohne Fehler; Vector mit der Liste der DBA-Objekte leeren und
 * Fehler-Meldung mit leerem 'String' füllen – als Zeichen der ordnungsgemäßen Ausführung. */
        ErrorMsg = "";
        vecRecordSet.removeAllElements();
/* 
 * In einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf ein
 * JS_ProjAssist_ProjLang_DBA Objekt übertragen. */
        for (;;) {
/* 
 * Prüfen ob ein weiterer Datensatz vorhanden ist. */
          if (!SQLResultSet.next()) return;
/* 
 * Prüfen ob die Gültigkeit des bearbeiteten Datensatzes mit dem Arbeitsdatum übereinstimmt.
 * Damit werden Datensätze ausgeschlossen, deren Gültigkeit eventuell erst in der Zukunft beginnt. */
          locdteReadValidFrom = SQLResultSet.getDate(JSBS_DBA.CONST_ValidFrom);
          locdteReadValidTill = SQLResultSet.getDate(JSBS_DBA.CONST_ValidTill);
/* Methode aus der Basisklasse verwenden um die Gültigkeit zu prüfen. */
          if (isWithinDateRange(locdteWorkDate, locdteReadValidFrom, locdteReadValidTill)) {
/* 
 * Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet übertragen. */
            application_dbtable_DBA locstructapplication_dbtable_DBA =
              
new application_dbtable_DBA();
            locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);
/* 
 * Das DBA-Objekt in den Vector mit der Liste der DBA-Objekte einfügen.
 * Der Vector ist in der geerbten Basisklasse definiert. */
            vecRecordSet.addElement(locstructapplication_dbtable_DBA);
          }
        }

      }
      
catch (SQLException SQLExc) {
/* Wenn ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an die
 * aufrufende Methode zurückliefern. */
        ErrorMsg = SQLExc.getMessage();
      }
    }

}

zum Inhaltsverzeichnis

Anleitung zur Adaptierung

Am leichtesten funktioniert die Anpassung des Muster-Codes an die eigenen Erfordernisse durch Kopieren des Muster-Codes und Verwendung von Edit > Find/Replace... .

Wenn vorher der zu ersetzende Text markiert wurde, wird er zu findende Text von der Suchfunktion übernommen.

Für 'Platzhalter', die nur einmalig im Muster-Code vorkommen ist die 'Find'-Funktion ist hilfreich zum Finden der beschriebenen 'Platzhalter'.

zum Inhaltsverzeichnis

Änderung des Namens des Java-Packages

package application_package.dba;
/*
. . . . . . . . . .
. . . . . . . . . .
/*
 * Package mit der DBA-Klasse, dessen Objekte in der Liste dieses DBA-Set enthalten ist. */

import application_package.dba.application_dbtable_DBA;
/**

Dieser Name kommt in der ersten Zeile und beim import der DBA-Klasse vor.
Ein zeitsparendes Vorgehen ist, beim Kopieren des Muster-Codes diese Zeile nicht zu überschreiben und dann die Zeile des Muster-Codes mit dem Platzhalter für den Namen des Java-Packages zu löschen.

zum Inhaltsverzeichnis

Adaptieren des Kommentars

'Kein Kommentar ist besser als ein falscher'.

Aus diesem Grund ist im Muster-Code auch keine Hintergrund-Information über Entwurfs-Entscheidungen für die DB-Tabelle vorhanden.
Meiner Erfahrung nach ist hilfreich, im Kommentar zu sehen, welche Variable jenen Schlüssel bilden, mit denen der Anwender ein Business Object eindeutig identifizieren kann.

zum Inhaltsverzeichnis

Änderung des Namens dieser Klasse und des DBA-Objektes

/*
 * Package mit der DBA-Klasse, dessen Objekte in der Liste dieses DBA-Set enthalten ist. */

import application_package.dba.application_dbtable_DBA;
/*

Der Name der DBA-Klasse, der auch Teil dieser Klasse (Set / Liste mit DBA-Objekten) ist, kommt mehrmals innerhalb des Codes vor.

Am einfachsten ist, den Platzhalter application_dbtable_DBA durch den tatsächlichen Namen zu ersetzen und dazu das Verfahren, das unter Anleitung zur Adaptierung beschrieben ist, zu verwenden.

zum Inhaltsverzeichnis

Adaptieren der Methode selectAllByObjectID(...)

Wenn der Platzhalter application_dbtable_DBA bereits, wie im vorigen Abschnitt (Änderung des Namens dieser Klasse und des DBA-Objektes) empfohlen, durch 'Find/Replace' ersetzt wurde dann ist bei dieser Methode keine Änderung mehr notwendig.

zum Inhaltsverzeichnis

Adaptieren der Methode(n) selectBySelectionCriteria(...)

Methoden nach diesem Schema können mehrmals für verschiedene Kombinationen von Selektions-Kriterien vorkommen.
Haupt-Aufgabe dieser Methoden ist,
* eine Liste von Datensätzen entsprechend den vom Anwender gewünschten Such-Kriterien   oder
* eine Liste von Datensätzen, die einen bestimmten Fremd-Schlüssel-Wert enthalten
zu selektieren.

/* ---------------------
 * METHODE zum Lesen aller Datensätze die zum Arbeitsdatum
 * (im Parameter JSBS_MinimalParameters enthalten) gültig sind und den in
 * den Parametern übergebenen Selektionskriterien entsprechen.
 * 'Connection' ist eine Klasse aus dem package 'java.sql' und enthält die
 * Verbindung zum Datenbanksystem. */

    
public void selectBySelectionCriteria(
                   Connection parmDBCon, JSBS_MinimalParameters parmMinParm,

                   String parm
SelectionVariableName1int parmSelectionVariableName2) {
/* Aufbauen des SQL-Kommandos in einer eigenen Zeichenkette (String).

Nachdem das Schema dieses Muster-Codes für mehr als eine Methode (wobei die verschiedenen Methoden für verschiedene Selektions-Kriterien angepasst werden) passend ist, ist es erforderlich, den Namen der Methode passend zu wählen. 
Weiters sind die übergebenen Parameter für das Selektions-Kriterium zu adaptieren.
In diesem Muster sind zwei Variable (vom Typ 'String' und 'int') für das Selektions-Kriterium vorgesehen - diese Anzahl kann aber auch verkleinert oder vergrößert und der Datentyp verändert werden.

/* Aufbauen des SQL-Kommandos in einer eigenen Zeichenkette (String).
 * Gegenüber einem direkten Schreiben des des SQL-Kommandos als Parameter
 * beim 'Construct' des 'SQLStatement' hilft der eigene String beim Debuggen.
 * Dabei werden die als Konstante definierten Werte der Klasse
 * JS_ProjAssist_ProjLang_DBA verwendet. */

      
final String locstrSQLCommand =
                     
application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
/* Selectionskriterien in die Zeichenkette einfügen. */
                     
" where " application_dbtable_DBA.CONST_ClientID + " =?" +
                       
" and " application_dbtable_DBA.CONST_ValidTill + " >=?" +
                       
" and " application_dbtable_DBA.CONST_ValidFrom + " <=?" +
                       
" and " application_dbtable_DBA.CONST_AttributeName1 + " =?" +
/* Bei einem LIKE-Statement wird ebenfalls hier ein Platzhalter eingefügt.
 * eventuelle 'Wildcards' im Selektionskriterium werden beim Versorgen des Platzhalters
 * mit Werten an die Zeichenkette für die Selektion angehängt. */

                       
" and " application_dbtable_DBA.CONST_AttributeName2 + " like ?" +
/* Sortierkriterium, damit die Datensätze aufsteigend nach ProjectCode und
 * LanguageCode in die Liste eingefügt werden. */

                     " order by "
application_dbtable_DBA.CONST_AttributeName1 + ", " +
                                    
application_dbtable_DBA.CONST_AttributeName2 + ", " +
                                    
application_dbtable_DBA.CONST_ValidFrom + " desc, " +
                                    
application_dbtable_DBA.CONST_ValidTill + " asc";
/* Das im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in das

Der Auswahl-Teil des SQL-Kommandos muß die Variablen, die als Parameter übergeben wurden, widerspiegeln.
Weiters ist es sinnvoll, die Sortierung der Liste ebenfalls aufsteigend nach den Selektions-Kriterien vorzunehmen.

Der Platzhalter application_dbtable ist in diesem Abschnitt bereits durch den 'richtigen' Namen der Klasse ersetzt wenn das in Abschnitt Änderung des Namens dieser Klasse und des DBA-Objektes beschriebene Verfahren mit 'Find/Replace' ausgeführt wurde.

/* Gerade vorher definiertes 'PreparedStatement' konstruieren
 * und dabei als Parameter das SQL-Kommando übergeben. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando einfügen. */

        SQLStatement.setInt(1, parmMinParm.intClientID);
        SQLStatement.setDate(2, locdteWorkDate);
        SQLStatement.setDate(3, locdteWorkDate);
        SQLStatement.setString(4, parmSelectionVariableName1);
        SQLStatement.setInt(5, parmSelectionVariableName2);
/* Spezielle Form für das Füllen eines Platzhalters innerhalb eines LIKE-Statements.
 * Grund ist, dass eventuelle 'Wildcards' innerhalb des LIKE-Statements nicht in der
 * Zeichenkette mit dem SQL-Kommando geschrieben werden können. */

        SQLStatement.setString(5, parm
SelectVariableName2 + "%");
/* SQL-Kommando an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
 * sind dann im Objekt der Klasse 'ResultSet'. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();

Zuletzt ist notwendig, das Prepared Statement mit den Werten für die Selektion zu versorgen.

zum Inhaltsverzeichnis

Spezieller Muster-Code

In diesem Teil wird Muster-Code vorgestellt, der nicht in jeder Klasse für ein DBA-Set vorkommen wird und deswegen nicht in den Muster-Code der Klasse aufgenommen wurde.

zum Inhaltsverzeichnis

Selektieren von Datensätzen die erst in der Zukunft gültig sind

Die Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für den Abschnitt Adaptieren der Methode(n) selectBySelectionCriteria.
Zeilen im Code bei denen Adaptierungen vorzunehmen sind, sind fett dargestellt.

/* ---------------------
 * METHODE zum Lesen von Datensätzen deren Gültigkeit erst nach dem Arbeitsdatum
 * (im Parameter JSBS_MinimalParameters enthalten) beginnt und die den in
 * den Parametern übergebenen Selektionskriterien entsprechen.
 * 'Connection' ist eine Klasse aus dem package 'java.sql' und enthält die
 * Verbindung zum Datenbanksystem. */

    
public void selectFutureBySelectionCriteria(
                   Connection parmDBCon, JSBS_MinimalParameters parmMinParm,

                   String parm
SelectionVariableName1int parmSelectionVariableName2) {
/* Aufbauen des SQL-Kommandos in einer eigenen Zeichenkette (String).
 * Gegenüber einem direkten Schreiben des des SQL-Kommandos als Parameter
 * beim 'Construct' des 'SQLStatement' hilft der eigene String beim Debuggen.
 * Dabei werden die als Konstante definierten Werte der Klasse
 * JS_ProjAssist_ProjLang_DBA verwendet. */

      
final String locstrSQLCommand =
                     
application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
/* Selectionskriterien in die Zeichenkette einfügen. */
                     
" where " application_dbtable_DBA.CONST_ClientID + " =?" +
                       
" and " application_dbtable_DBA.CONST_ValidTill + " >?"
                       
" and " application_dbtable_DBA.CONST_ValidFrom + " >?" +
                       
" and " application_dbtable_DBA.CONST_AttributeName1 + " =?" +
                       
" and " application_dbtable_DBA.CONST_AttributeName2 + " =?" +
/* Sortierkriterium, damit die Datensätze aufsteigend nach ProjectCode und
 * LanguageCode in die Liste eingefügt werden. */

                     " order by "
application_dbtable_DBA.CONST_AttributeName1 + ", " +
                                    
application_dbtable_DBA.CONST_AttributeName2 + ", " +
                                    
application_dbtable_DBA.CONST_ValidFrom + " desc, " +
                                    
application_dbtable_DBA.CONST_ValidTill + " asc";
/* Das im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in das
 * Datumsformat der 'java.sql' Klassen konvertiert werden. */

      Date locdteWorkDate =
new Date(parmMinParm.calWorkDate.getTime().getTime());
/* 'PreparedStatement' ist eine Klasse aus dem 'java.sql'-package die das
 * SQL-Kommando an das Datenbanksystem überträgt. */

      PreparedStatement SQLStatement;

/* Es folgt die Ausführung des SQL-Kommandos; die dafür zuständigen Klassen
 * und Methoden arbeiten mit 'try/catch' zur Fehlerbehandlung. */

      
try {
/* Gerade vorher definiertes 'PreparedStatement' konstruieren
 * und dabei als Parameter das SQL-Kommando übergeben. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando einfügen. */

        SQLStatement.setInt(1, parmMinParm.intClientID);
        SQLStatement.setDate(2, locdteWorkDate);
        SQLStatement.setDate(3, locdteWorkDate);

        SQLStatement.setString(4, parmSelectionVariableName1);
        SQLStatement.setInt(5, parmSelectionVariableName2);
/* SQL-Kommando an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
 * sind dann im Objekt der Klasse 'ResultSet'. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();
/* 
 * Datenbank-Abfrage ohne Fehler; Vector mit der Liste der DBA-Objekte leeren und
 * Fehler-Meldung mit leerem 'String' füllen – als Zeichen der ordnungsgemäßen Ausführung. */
        ErrorMsg = "";
        vecRecordSet.removeAllElements();
/* 
 * In einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf ein
 * JS_ProjAssist_ProjLang_DBA Objekt übertragen. */
        for (;;) {
/* 
 * Prüfen ob ein weiterer Datensatz vorhanden ist. */
          if (!SQLResultSet.next()) return;
/* 
 * Prüfen ob der in Zukunft beginnende Datensatz überhaupt 'gültig' werden kann.
 * Damit werden zukünftig bereits 'deaktivierte' Datensätze ausgeschlossen. */
          locdteReadValidFrom = SQLResultSet.getDate(JSBS_DBA.CONST_ValidFrom);
          locdteReadValidTill = SQLResultSet.getDate(JSBS_DBA.CONST_ValidTill);
/* Methode aus der Basisklasse verwenden um die Gültigkeit zu prüfen. */
          if (locdteReadValidFrom.getTime() <= locdteReadValidTill.getTime()) {
/* 
 * Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet übertragen. */

            application_dbtable_DBA locstructapplication_dbtable_DBA =
              
new application_dbtable_DBA();
            locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);
/* 
 * Das DBA-Objekt in den Vector mit der Liste der DBA-Objekte einfügen.
 * Der Vector ist in der geerbten Basisklasse definiert. */

            vecRecordSet.addElement(locstructapplication_dbtable_DBA);
          }
        }

      }
      
catch (SQLException SQLExc) {
/* Wenn ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an die
 * aufrufende Methode zurückliefern. */
        ErrorMsg = SQLExc.getMessage();
      }
    }

zum Inhaltsverzeichnis

Selektieren von Datensätzen die aktuell und in der Zukunft gültig sind

Die Arbeiten für die Adaptierungen der Platzhalter sind gleich wie für den Abschnitt Adaptieren der Methode(n) selectBySelectionCriteria.
Zeilen im Code bei denen Adaptierungen vorzunehmen sind, sind fett dargestellt.

/* ---------------------
 * METHODE zum Lesen von Datensätzen die aktuell gültig sind und Datensätzen deren
 * Gültigkeit erst nach dem Arbeitsdatum (im Parameter JSBS_MinimalParameters enthalten)
 * beginnt und die den in den Parametern übergebenen Selektionskriterien entsprechen.
 * 'Connection' ist eine Klasse aus dem package 'java.sql' und enthält die
 * Verbindung zum Datenbanksystem. */

    
public void selectValidAndFutureBySelectionCriteria(
                   Connection parmDBCon, JSBS_MinimalParameters parmMinParm,

                   String parm
SelectionVariableName1int parmSelectionVariableName2) {
/* Aufbauen des SQL-Kommandos in einer eigenen Zeichenkette (String).
 * Gegenüber einem direkten Schreiben des des SQL-Kommandos als Parameter
 * beim 'Construct' des 'SQLStatement' hilft der eigene String beim Debuggen.
 * Dabei werden die als Konstante definierten Werte der Klasse
 * JS_ProjAssist_ProjLang_DBA verwendet. */

      
final String locstrSQLCommand =
                     
application_dbtable_DBA.CONST_SELECT_ALL_ATTRIBUTES +
/* Selectionskriterien in die Zeichenkette einfügen. */
                     
" where " application_dbtable_DBA.CONST_ClientID + " =?" +
                       
" and " application_dbtable_DBA.CONST_ValidTill + " >=?"+
                       
" and " application_dbtable_DBA.CONST_AttributeName1 + " =?" +
                       
" and " application_dbtable_DBA.CONST_AttributeName2 + " =?" +
/* Sortierkriterium, damit die Datensätze aufsteigend nach ProjectCode und
 * LanguageCode in die Liste eingefügt werden. */

                     " order by "
application_dbtable_DBA.CONST_AttributeName1 + ", " +
                                    
application_dbtable_DBA.CONST_AttributeName2 + ", " +
                                    
application_dbtable_DBA.CONST_ValidFrom + " desc, " +
                                    
application_dbtable_DBA.CONST_ValidTill + " asc";
/* Das im Parameter 'JSBS_MinimalParameters' enthaltene Arbeitsdatum muß in das
 * Datumsformat der 'java.sql' Klassen konvertiert werden. */

      Date locdteWorkDate =
new Date(parmMinParm.calWorkDate.getTime().getTime());
/* 'PreparedStatement' ist eine Klasse aus dem 'java.sql'-package die das
 * SQL-Kommando an das Datenbanksystem überträgt. */

      PreparedStatement SQLStatement;

/* Es folgt die Ausführung des SQL-Kommandos; die dafür zuständigen Klassen
 * und Methoden arbeiten mit 'try/catch' zur Fehlerbehandlung. */

      
try {
/* Gerade vorher definiertes 'PreparedStatement' konstruieren
 * und dabei als Parameter das SQL-Kommando übergeben. */
        SQLStatement = parmDBCon.prepareStatement(locstrSQLCommand);
/* Werte für die Selektion in die Zeichenkette mit dem SQL-Kommando einfügen. */

        SQLStatement.setInt(1, parmMinParm.intClientID);
        SQLStatement.setDate(2, locdteWorkDate);

        SQLStatement.setString(3, parmSelectionVariableName1);
        SQLStatement.setInt(4, parmSelectionVariableName2);
/* SQL-Kommando an die Datenbank 'absenden'; die Werte des gefundenen Datensatzes
 * sind dann im Objekt der Klasse 'ResultSet'. */
        ResultSet SQLResultSet = SQLStatement.executeQuery();
/* 
 * Datenbank-Abfrage ohne Fehler; Vector mit der Liste der DBA-Objekte leeren und
 * Fehler-Meldung mit leerem 'String' füllen – als Zeichen der ordnungsgemäßen Ausführung. */
        ErrorMsg = "";
        vecRecordSet.removeAllElements();
/* 
 * In einer Schleife jeden Datensatz aus dem SQLResultSet auslesen und auf ein
 * JS_ProjAssist_ProjLang_DBA Objekt übertragen. */
        for (;;) {
/* 
 * Prüfen ob ein weiterer Datensatz vorhanden ist. */
          if (!SQLResultSet.next()) return;
/* 
 * Prüfen ob der in Zukunft beginnende Datensatz überhaupt 'gültig' werden kann.
 * Damit werden zukünftig bereits 'deaktivierte' Datensätze ausgeschlossen. */
          locdteReadValidFrom = SQLResultSet.getDate(JSBS_DBA.CONST_ValidFrom);
          locdteReadValidTill = SQLResultSet.getDate(JSBS_DBA.CONST_ValidTill);
/* Methode aus der Basisklasse verwenden um die Gültigkeit zu prüfen. */
          if (locdteReadValidFrom.getTime() <= locdteReadValidTill.getTime()) {
/* 
 * Ein DBA-Objekt 'konstruieren' und die Werte aus dem SQLResultSet übertragen. */

            application_dbtable_DBA locstructapplication_dbtable_DBA =
              
new application_dbtable_DBA();
            locstructapplication_dbtable_DBA.getValuesFromSQLResultSet(SQLResultSet);
/* 
 * Das DBA-Objekt in den Vector mit der Liste der DBA-Objekte einfügen.
 * Der Vector ist in der geerbten Basisklasse definiert. */

            vecRecordSet.addElement(locstructapplication_dbtable_DBA);
          }
        }

      }
      
catch (SQLException SQLExc) {
/* Wenn ein Fehler aufgetreten ist dann den Fehler-Text extrahieren und an die
 * aufrufende Methode zurückliefern. */
        ErrorMsg = SQLExc.getMessage();
      }
    }

zum Inhaltsverzeichnis

Weitere Schritte und verwandte Dokumentation

Dokument

Inhalt

Tutorial: JavaScout ProjectAssist (Java_Fatclient_01) – DataBase-Access (DBA) Klasse für DB-Tabelle 'ProjLang'  

Schritt desTutorials für die Entwicklung von Heavyweight-Client Anwendungen in dem die Implementierung der DBA-Klasse vorgestellt wird.

zum Inhaltsverzeichnis