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

> Verzeichnis der Dokumente mit den Muster-Codes 

Muster-Code für ein BOS_Set (Liste mit Business-Objects, Server-Side-Klasse)

* 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:
2011-09-26

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 BOS-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 Server-Side-Klasse mit einer Liste mit BO (BOS_Set) und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.

Inhaltsverzeichnis:

Vorbedingung 

Einfacher Muster-Code für ein BOS_Set
 
Muster-Code für ein BOS_Set bei Verwendung der Datenbank-Tabelle 'Parameter'
 

Anleitung zur Adaptierung 
* Änderung des Namens der Java-Packages der Anwendung 
* Adaptieren des Kommentars 
* Änderung des Namens der Klasse 
* Methode
getDBAAttributes(...) adaptieren 
* Methode
getDBAAttributes(...) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter' 
* Methode
selectBySelectionCriteria(String parmVariable_1, String parmVariable_2) adaptieren 
* Methode
selectBySelectionCriteria(String parmVariable_1, String parmVariable_2) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter' 

Zusätzlicher Code in der EJB-Klasse (bei Client/Server Anwendungen) 


Spezieller Muster-Code 
* Selektieren von Business-Objects die erst in der Zukunft gültig sind 
* Selektieren von Business-Objects die aktuell und in der Zukunft gültig sind 
* Selektieren von Business-Objects für die die Parameter-Tabelle verwendet wird 
* Lesen von Attributswerten von anderen Datenbank-Tabellen – Methode
mergeVariablexy 

Weitere Schritte und verwandte Dokumentation 

Vorbedingung:

zum Inhaltsverzeichnis

Einfacher Muster-Code für ein BOS_Set

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

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

import java.sql.*;
/*
 * Basis-Klasse für BO mit Konstanten für Status-Codes. */

import js_base.bo.JSBS_BO;
/* Basis-Klasse mit dem Minimalen Set an Parametern. Diese enthalten das Arbeitsdatum.
 * Das Arbeitsdatum wird für verschiedene Abfragen gebraucht. */

import js_base.structures.JSBS_MinimalParameters;
/*
 * Package mit geerbten Generellen Klassen für BO und BO-Set. */

import application_package.bo.*;
/* Package mit den Klassen für das DBA- (DataBase-Access-) Objekt
 * zum Zugriff auf die DB-Tabelle. */

import application_package.dba.*;
/**
 * 
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Server-Seitige Klasse für eine Liste von Business-Objects
 *  der Klasse
application_entity_BO.
 *  Für eine Beschreibung des BO sehen Sie bitte im Kommentar
 *  der Klasse
application_entity_BO nach.
 * 
 * @change-log
 * when          who                       why
 * -----------------------------------------------------------------
 * 
 */
public class application_entity_BOS_Set extends application_entity_BO_Set {
/*
 * VARIABLE dieser Klasse.
 * --------------------- */

/* Minimales Set von Parametern (Benutzer-Name, Arbeitsdatum,
 * Identifikation des Arbeitsplatzes); dieses Set wird vom Client-Side-BO übergeben . */

    
private JSBS_MinimalParameters structJSBS_MinimalParameters = null;
/*
 * Die folgenden Variablen dienen für die Verwaltung der Verbindung zur Datenbank.
 * --------------------- */
/* 
 * Referenz zur DB-Connection die außerhalb dieses Objektes definiert sind.
 * Dieser Wert wird als Parameter in einem passenden 'Constructor' übergeben. */

    
private Connection structDBCon = null;
/* 
 * Flag, ob dieses Objekt von einem BOC (Business Object, Client-Side-Class) oder
 * EJB (Enterprise Java Bean) konstruiert wurde.
 * Wenn das Flag den Wert 'false' hat, dann wurde dieses Objekt von einen anderen
 * BOS (Business Object, Server-Side-Class) konstruiert.
 * Dieses Flag entscheidet, ob innerhalb dieses Objektes ein 'commit' ausgeführt wird.
 * Ein 'commit' wird nur in jenem Objekt ausgeführt, das von einem BOC oder EJB konstruiert
 * wurde – nicht in einem Objekt, das von einem anderen BOS konstruiert wurde. */

    
private boolean bol_ObjectConstructedByBOC_or_EJB;
/* --------------------
 * CONSTRUCTOR-METHODEN */

/* --------------------
 * Im 'Constructor' werden Parameter beim Erstellen eines Objektes dieser Klasse
 * übergeben.
 * Damit eine BOS-Klasse (BOS: Business Object, Server-Side) auch innerhalb eines
 * EJB (Enterprise Java Bean) verwendet werden kann, muss bereits eine Connection
 * zur Datenbank als Parameter an den 'Constructor' übergeben werden.
 * Für ein 'Set' ist es nicht erforderlich, einen 'Constructor' zu implementieren mit
 * dem auch die Werte eines anderen Objektes übernommen werden können. */

/* --------------------- */
/*
 * Constructor-Methode mit Minimal-Parametern und geöffneter DB-Connection als Parameter. */

    
public application_entity_BOS_Set(
                JSBS_MinimalParameters parmMinParm,
                Connection parmDBCon)
{
/*
 * Aufruf der Unterstützungs-Methode zur Übernahme der Parameter-Werte. */

      constructionWithDBConnection(parmMinParm, parmDBCon);
/*
 * Annahme, dass dieses Objekt nicht durch ein BOC oder EJB konstruiert wurde.
 * Überlegung zu der unlogisch erscheinenden Entscheidung:
 * + Wenn dieses BOS-Objekt innerhalb eines BOC oder EJB konstruiert wird, dann ist zu
 *   erwarten, dass für die Klasse des BOC oder EJB das entsprechende Design-Pattern (Muster)
 *   verwendet wird.
 *   In diesem Muster ist als Vorgabe der entsprechende Parameter beim Aufruf des 'Constructors'
 *   enthalten und damit wird diese 'Constructor'-Methode nicht aufgerufen.
 * + Wenn dieses BOS-Objekt innerhalb eines anderen BOS konstruiert wird, ist es zeitsparend
 *   und einfacher verständlich, diese 'Constructor'-Methode aufzurufen.
 *   Mit dem folgenden Kommando wird das entsprechende Flag gesetzt und damit verhindert,
 *   dass versehentlich ein 'commit' oder 'rollback' zu früh innerhalb einer Transaktion
 *   ausgeführt wird. */

      
bol_ObjectConstructedByBOC_or_EJB = false;
    }
/*
 * Constructor-Methode mit Minimal-Parametern, geöffneter DB-Connection und
 * Flag, ob das Objekt von einem anderen BOS konstruiert wird, als Parameter. */

    
public application_entity_BOS_Set(
                JSBS_MinimalParameters parmMinParm,
                Connection parmDBCon,
                
boolean parmObjectConstructedByBOC_or_EJB) {
/*
 * Aufruf der Unterstützungs-Methode zur Übernahme der Parameter-Werte. */

      constructionWithDBConnection(parmMinParm, parmDBCon);
/*
 * Setzen des Flags aus dem Parameter-Wert. */

      
bol_ObjectConstructedByBOC_or_EJB = parmObjectConstructedByBOC_or_EJB;
    }
/* ---------------------
 * METHODEN zur UNTERSTÜTZUNG der Übernahme der Parameter der CONSTRUCTOR-Methoden.
 * In diesen Methoden werden die Parameter, die in unterschiedlichen Constructor-Methoden
 * übernommen wurden auf die Variablen dieses Objekts übertragen.
 * --------------------- */

/* 
 * METHODE zum Übernehmen einer bereits geöffneten DB-Connection (Verbindung zur Datenbank). */

    
private void constructionWithDBConnection(
                JSBS_MinimalParameters parmMinParm,
                Connection parmDBConnection)
{
/*
 * Kopieren der Werte aus dem Minimalen Set der Parameter in die Variable dieses Objekts. */

      
structJSBS_MinimalParameters = new JSBS_MinimalParameters(parmMinParm);
/*
 * Übertragen der Referenz auf die DB-Connection (Verbindung zur Datenbank)
 * in die entsprechende Variable dieses Objekts. */

      
structDBCon = parmDBConnection;
    }
/* ---------------------
 * ELEMENTARE METHODEN für gesteuerte 'commit' und 'rollback' der haupt-zugeordneten DB-Tabelle.
 * --------------------- */

/* 
 * METHODE zum Ausführen eines 'commit' auf eine Datenbank.
 * Generell wird auf ein Set von Business-Objects keine Veränderung ausgeführt und damit wäre
 * ein 'commit' nicht notwendig.
 * Durch Fehler beim Code für das Erstellen der 'Connection' zur Datenbank kann es aber passieren,
 * dass die 'Connection' nicht mit 'autocommit' geöffnet wird und dann tritt bei verschiedenen
 * DB-Systemen ein Fehler auf wenn vor dem Beenden der 'Connection' kein 'commit' oder 'rollback'
 * ausgeführt wurde.
 * Der Code in dieser Methode ist ein 'Sicherheitsnetz' um den Zugriff auf die DB auf jeden Fall
 * korrekt zu beenden. */

    
private void commitDBConnection() {
/* 
 * Wenn die DB-Connection nicht in dem Objekt, in dem dieses Objekt 'konstruiert' wurde, geöffnet wurde,
 * dann wird diese Methode sofort abgebrochen weil dann das 'commit' in einer 'darüber liegenden'
 * Methode ausgeführt wird. */

      if (! bol_ObjectConstructedByBOC_or_EJB) return;
/* 'commit' über die try/catch-Logik ausführen damit ein eventueller Fehler beim 'commit'
 * abgefangen werden kann. */

      try {
/* Ermitteln ob die Verbindung zur Datenbank im 'AutoCommit' Modus geöffnet wurde – dann ist kein
 * explizites 'commit' notwendig. */

        if (! structDBCon.getAutoCommit()) {
          
structDBCon.commit();
        }
      }
      catch (SQLException SQLExc) {
/* Fehler beim Ausführen des 'commit'; Fehler an die aufrufende Methode zurückliefern. */
        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = SQLExc.getMessage();
/* Um auf der sicheren Seite zu sein wird gleich noch ein 'rollback' ausgeführt. */
        rollbackDBConnection();
      }
    }
/* 
 * METHODE zum Ausführen eines 'rollback' auf eine Datenbank.
 * Generell wird auf ein Set von Business-Objects keine Veränderung ausgeführt und damit wäre
 * ein 'rollback' nicht notwendig.
 * Durch Fehler beim Code für das Erstellen der 'Connection' zur Datenbank kann es aber passieren,
 * dass die 'Connection' nicht mit 'autocommit' geöffnet wird und dann tritt bei verschiedenen
 * DB-Systemen ein Fehler auf wenn vor dem Beenden der 'Connection' kein 'commit' oder 'rollback'
 * ausgeführt wurde.
 * Der Code in dieser Methode ist ein 'Sicherheitsnetz' um den Zugriff auf die DB auf jeden Fall
 * korrekt zu beenden. */

    
private void rollbackDBConnection() {
/* 
 * Wenn die DB-Connection nicht in dem Objekt, in dem dieses Objekt 'konstruiert' wurde, geöffnet wurde,
 * dann wird diese Methode sofort abgebrochen weil dann das 'rollback' in einer 'darüber liegenden'
 * Methode ausgeführt wird. */

      if (! bol_ObjectConstructedByBOC_or_EJB) return;
/* 'rollback' über die try/catch-Logik ausführen damit ein eventueller Fehler abgefangen werden kann. */
      try {
/* Ermitteln ob die Verbindung zur Datenbank im 'AutoCommit' Modus geöffnet wurde – dann ist ein
 * 'rollback' sinnlos weil die 'commit'-Schritte durch das Datenbanksystem bestimmt werden. */

        if (! structDBCon.getAutoCommit()) {
          
structDBCon.rollback();
        }
      }
      catch (SQLException SQLExc) {
/* Fehler beim Ausführen des 'commit'; Fehler an die aufrufende Methode zurückliefern. */
        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = SQLExc.getMessage();
      }
    }
/* 
 * METHODE zum Übernehmen der Attribute der DBA (DataBase-Access) Objekte in der Liste
 * des DBA-Set Objekts auf die Geschäfts-spezifischen Variablen des BO und
 * Einfügen dieser BO in die Liste mit den BO in dieser Klasse. */

    
private void getDBAAttributes(
                   
application_dbtable_DBA_Set parmapplication_dbtable_DBA_Set) {
/* 
 * Prüfen, ob das DBA-Set leer ist; in diesem Fall einen 'Not Found' Status zurückliefern. */

      int intDBAVectorSize = parmapplication_dbtable_DBA_Set.vecRecordSet.size();
      if (intDBAVectorSize < 1) {
        
StatusCode = JSBS_BO.CONST_NOT_FOUND;
        
return;
      }
/* 
 * Eine Variable für das zu bearbeitende DBA-Objekt (aus der Liste) definieren.
 * Durch ein eigenes DBA-Objekt ist das Übertragen der Werte auf das BO leichter zu verstehen. */

      application_dbtable_DBA locapplication_dbtable_DBA;
/* 
 * In einer for-Schleife jedes DBA-Objekt aus dem DBA-Set auslesen, ein passendes BO 'konstruieren',
 * die Werte aus dem DBA auf das BO übertragen und das BO in die Liste dieses BOS-Set einfügen. */

      int intDBAVectorIndex;
      for (intDBAVectorIndex = 0; intDBAVectorIndex < intDBAVectorSize; intDBAVectorIndex++) {
/* Einzelnes DBA-Objekt aus dem DBA-Set 'angreifen'. */
        loc
application_dbtable_DBA = (application_dbtable_DBA)
          parm
application_dbtable_DBA_Set.vecRecordSet.elementAt(intDBAVectorIndex);
/* Neues BO erstellen und die Werte des DBA übernehmen.
 * Für das 'Übernehmen' der Werte wird die Methode des BO verwendet. */

        
application_entity_BO locBO = new application_entity_BO();
        locBO.getDBAAttributes(loc
application_dbtable_DBA);
/* BO mit übernommenen Werten in die Liste dieses BOS-Set einfügen. */
        
vecRecordSet.addElement(locBO);
      }
    }
/* ---------------------
 * METHODEN FÜR DB-ABFRAGEN ZUR INTERNEN VERWENDUNG.
 * Die folgenden Methoden führen jeweils eine Datenbank-Abfrage aus bei der per Definition
 * mehr als ein Datensatz gefunden werden kann.
 * 
 * Zweck dieser Abfragen ist die Verwendung für Zwecke, die nicht direkt durch die Bearbeitung
 * eines Geschäftsfalls bedingt sind.
 * Die folgenden Methoden dienen zum Abfragen der Änderung eines Business-Object und zur
 * Synchronisation von Daten wenn eine Client-Anwendung in der 'MobileClient' Version ausgeführt wird.
 * --------------------- */

/* 
 * Diese METHODE enthält den Muster-Code für das Selektieren aller Datensätze für einen gegebenen
 * ObjectID. 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(double parmObjectID){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
application_dbtable_DBA_Set locapplication_dbtable_DBA_Set =
        
new application_dbtable_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      loc
application_dbtable_DBA_Set.selectAllByObjectID(
              
structDBCon, parmObjectID);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locapplication_dbtable_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(loc
application_dbtable_DBA_Set);
/* Commit ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        commitDBConnection();
        
return;
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = locapplication_dbtable_DBA_Set.ErrorMsg;
/* Rollback ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        rollbackDBConnection();
        
return;
      }
    }
/* 
 * Diese METHODE enthält den Muster-Code 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(Timestamp parmBeginTimestamp, int parmNumberOfRecords ){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
application_dbtable_DBA_Set locapplication_dbtable_DBA_Set =
        
new application_dbtable_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      loc
application_dbtable_DBA_Set.selectAllByChangedAt(
              
structDBCon, parmBeginTimestamp, parmNumberOfRecords);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locapplication_dbtable_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(loc
application_dbtable_DBA_Set);
/* Commit ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        commitDBConnection();
        
return;
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = locapplication_dbtable_DBA_Set.ErrorMsg;
/* Rollback ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        rollbackDBConnection();
        
return;
      }
    }
/* *********************
 * METHODEN FÜR GESCHÄFTSBEZOGENE VERARBEITUNG.
 * Die Methoden 'select....' führen eine Datenbank-Abfrage durch.
 * In dieser Klasse sind jene 'select...'-Methoden implementiert, die per Definition
 * mehr als einen Datensatz auswählen können.
 * Methoden die maximal einen Datensatz finden können, sind in der Klasse
 * 
application_entity_BOS implementiert.
 * --------------------- */

/* 
 * METHODE zum Selektieren aller aktuell gültigen Datensätze entsprechend
 * den Selektionskriterien die als Parameter übergeben werden.
 * 'Aktuell gültig' bedeutet, dass die Gültigkeit des Datensatzes mit dem
 * im Minimalen Set von Parametern übergebenen Arbeitsdatum übereinstimmt. */

    
public synchronized void selectBySelectionCriteria(String parmVariable_1, String parmVariable_2){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
application_dbtable_DBA_Set locapplication_dbtable_DBA_Set =
        
new application_dbtable_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      loc
application_dbtable_DBA_Set.selectBySelectionCriteria(
              
structDBCon, structJSBS_MinimalParameters,
              parm
Variable_1, parmVariable_2);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locapplication_dbtable_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(loc
application_dbtable_DBA_Set);
/* Commit ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        commitDBConnection();
        
return;
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = locapplication_dbtable_DBA_Set.ErrorMsg;
/* Rollback ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        rollbackDBConnection();
        
return;
      }
    }
}

zum Inhaltsverzeichnis

Muster-Code für ein BOS_Set bei Verwendung der Datenbank-Tabelle 'Parameter'

Die Datenbank-Tabelle Parameter ist dafür vorgesehen, BO abzuspeichern für deren Klasse keine größeren Mengen erwartet werden.

Typisch dafür sind Einstellungen für das Anwendungsprogramm oder Werte für Kategorien (z.B. die Branche von Kunden).
Im JavaScout Base-System (JSBS) ist eine JSBS_Parameter_DBA_Set – Basisklasse für den Low-Level Zugriff auf Datenbank-Tabellen implementiert, die Zugriffe auf diese Tabelle ('Parameter') implementiert hat.

Die Unterschiede zum Standard-Muster-Code sind aber so gering, dass nicht der gesamte Code gelistet wird – es wird bei den betreffenden Anleitungen der jeweilige Muster-Teil, der bei Verwendung der Datenbank-Tabelle 'Parameter' passend ist, beschrieben.

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 der Java-Packages der Anwendung

package application_package.bos;
/*
. . . . .
. . . . .
/*
 * Package mit geerbten Generellen Klassen für BO und BO-Set. */

import application_package.bo.*;
/* Package mit den Klassen für das DBA- (DataBase-Access-) Objekt
 * zum Zugriff auf die DB-Tabelle. */

import application_package.dba.*;
/**

Der Name dieses Packages kommt in der ersten Zeile des Muster-Codes und - wenn den vorgeschlagenen Namenskonventionen gefolgt wurde – noch weitere 2 Mal in den Namen der Packages mit den Generellen Klassen der BO und den DBA-Klassen vor.

Bei Verwendung der DB-Tabelle 'Parameter' werden das DBA (JSBS_Parameter_DBA) und das DBA-Set (JSBS_Parameter_DBA_Set) aus den JavaScout Basisklassen verwendet:

/*
 * Geerbte Generelle Klasse des BO. */

import application_package.bo.*;
/* DBA-Klasse für den Zugriff auf die DB-Tabelle Parameter. */
import js_base.dba.*;
/**

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 das BOS_Set vorhanden.
Meiner Erfahrung nach ist es ausreichend für die Beschreibung der Variablen des BO auf die Generelle Klasse für das BO zu verweisen.
Die einzelnen Methoden der BOS_Set-Klasse sind innerhalb des Codes kommentiert.

zum Inhaltsverzeichnis

Änderung des Namens der Klasse

Bei Verwendung der DB-Tabelle 'Parameter' – und dem zugehörigen DBA (JSBS_Parameter_DBA) und DBA-Set (JSBS_Parameter_DBA_Set) aus den JavaScout Basisklassen – ist es sinnvoll, den Muster-Code durch jenen Code zu ersetzen der unter den Abschnitten Methode getDBAAttributes(...) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter' und Methode selectBySelectionCriteria(String parmVariable_1, String parmVariable_2) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter' dokumentiert ist.

 */
public class application_entity_BOS_Set extends application_entity_BO_Set {
/*

Dieser Name muss mit dem Namen der Klasse übereinstimmen, der beim Eröffnen der Klasse gewählt wurde.

Der Name der beiden Klassen kommt mehrmals im gesamten Code vor.
Deswegen empfehle ich, mit 'Find/Replace' alle Platzhalter
application_entity_BO im Muster-Code durch den gewählten Klassen-Namen für die beiden Variationen des BO zu ersetzen.

Mit 'Find/Replace' werden auch alle 'Constructor'-Methoden mit dem passenden Namen versehen.

zum Inhaltsverzeichnis

Methode getDBAAttributes(...) adaptieren

Der Platzhalter für den Namen des DBA-Objekts (application_dbtable_DBA) bzw. des Sets mit der Liste (application_dbtable_DBA_Set) kommt erstmals in dieser Methode vor.

/* 
 * METHODE zum Übernehmen der Attribute der DBA (DataBase-Access) Objekte in der Liste
 * des DBA-Set Objekts auf die Geschäfts-spezifischen Variablen des BO und
 * Einfügen dieser BO in die Liste mit den BO in dieser Klasse. */

    
private void getDBAAttributes(
                   
application_dbtable_DBA_Set parmapplication_dbtable_DBA_Set) {
/* 
 * Prüfen, ob das DBA-Set leer ist; in diesem Fall einen 'Not Found' Status zurückliefern. */

      int intDBAVectorSize = parmapplication_dbtable_DBA_Set.vecRecordSet.size();
. . . . .
. . . . .

Die Definition als Variable erfolgt weiters bei der jeweiligen Methode zum Selektieren der gesuchten BO.

Mit 'Find/Replace' werden alle Platzhalter (application_dbtable_) durch den passenden Namen der jeweiligen DBA-Klassen bzw. -Objekte ersetzt.

zum Inhaltsverzeichnis

Methode getDBAAttributes(...) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter'

Bei Verwendung der DB-Tabelle 'Parameter' – und dem zugehörigen DBA (JSBS_Parameter_DBA) und DBA-Set (JSBS_Parameter_DBA_Set) aus den JavaScout Basisklassen – ist folgender Code zu implementieren:

/* 
 * METHODE zum Übernehmen der Attribute der DBA (DataBase-Access) Objekte in der Liste
 * des DBA-Set Objekts auf die Geschäfts-spezifischen Variablen des BO und
 * Einfügen dieser BO in die Liste mit den BO in dieser Klasse. */

    
private void getDBAAttributes(
                   JSBS_Parameter_DBA_Set parmJSBS_Parameter_DBA_Set)
{
/* 
 * Prüfen, ob das DBA-Set leer ist; in diesem Fall einen 'Not Found' Status zurückliefern. */

      int intDBAVectorSize = parmJSBS_Parameter_DBA_Set.vecRecordSet.size();
      if (intDBAVectorSize < 1) {
        
StatusCode = JSBS_BO.CONST_NOT_FOUND;
        
return;
      }
/* 
 * Eine Variable für das zu bearbeitende DBA-Objekt (aus der Liste) definieren.
 * Durch ein eigenes DBA-Objekt ist das Übertragen der Werte auf das BO leichter zu verstehen. */

       JSBS_Parameter_DBA locJSBS_Parameter_DBA;
/* 
 * In einer for-Schleife jedes DBA-Objekt aus dem DBA-Set auslesen, ein passendes BO 'konstruieren',
 * die Werte aus dem DBA auf das BO übertragen und das BO in die Liste dieses BOS-Set einfügen. */

      int intDBAVectorIndex;
      for (intDBAVectorIndex = 0; intDBAVectorIndex < intDBAVectorSize; intDBAVectorIndex++) {
/* Einzelnes DBA-Objekt aus dem DBA-Set 'angreifen'. */
        locJSBS_Parameter_DBA
= (JSBS_Parameter_DBA)
          parmJSBS_Parameter_DBA_Set.
vecRecordSet.elementAt(intDBAVectorIndex);
/* Neues BO erstellen und die Werte des DBA übernehmen.
 * Für das 'Übernehmen' der Werte wird die Methode des BO verwendet. */

        
application_entity_BO locBO = new application_entity_BO();
        locBO.getDBAAttributes(locJSBS_Parameter_DBA);
/* BO mit übernommenen Werten in die Liste dieses BOS-Set einfügen. */
        
vecRecordSet.addElement(locBO);
      }

    }

In diesem Muster-Code sind bereits die Klassen und Objekte für JSBS_Parameter_DBA und das JSBS_Parameter_DBA_Set enthalten.

zum Inhaltsverzeichnis

Methode selectBySelectionCriteria(String parmVariable_1, String parmVariable_2) adaptieren

In dieser Methode ist festgelegt, nach welchen Kriterien die Abfrage der Datenbank 'gefiltert' wird.
Bei einfachen Abfragen (bei denen die Variablen eines BO auf einer Datenbank-Tabelle gehalten werden) werden die Selektionskriterien direkt an das passende DBA (DataBase-Access) -Objekt 'weiter gegeben'.

Im Muster-Code sind 2 Platzhalter für die Selektionskriterien definiert.
Diese sind durch die aktuellen Variablen für die Selektionskriterien (das können auch mehr oder weniger als 2 sein) zu ersetzen.

Diese Variablen sind dann auch beim Aufruf der zugeordneten Methode des DBA-Objektes als Parameter mitzugeben.

/* 
 * METHODE zum Selektieren aller aktuell gültigen Datensätze entsprechend
 * den Selektionskriterien die als Parameter übergeben werden.
 * 'Aktuell gültig' bedeutet, dass die Gültigkeit des Datensatzes mit dem
 * im Minimalen Set von Parametern übergebenen Arbeitsdatum übereinstimmt. */

    
public synchronized void selectBySelectionCriteria(String parmVariable_1, String parmVariable_2){
/* Lokales Flag setzen, dass in dieser Methode keine Änderungen auf der DB-Tabelle erfolgen.
. . . . .
. . . . .
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
application_dbtable_DBA_Set locapplication_dbtable_DBA_Set =
        
new application_dbtable_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      loc
application_dbtable_DBA_Set.selectBySelectionCriteria(
              
structDBCon, structJSBS_MinimalParameters,
              parm
Variable_1, parmVariable_2);
/* 
. . . . .
. . . . .
    }

zum Inhaltsverzeichnis

Methode selectBySelectionCriteria(String parmVariable_1, String parmVariable_2) adaptieren bei Verwendung der Datenbank-Tabelle 'Parameter'

Bei Verwendung der DB-Tabelle 'Parameter' – und dem zugehörigen DBA (JSBS_Parameter_DBA) und DBA-Set (JSBS_Parameter_DBA_Set) aus den JavaScout Basisklassen – ist folgender Code zu implementieren:

/* 
 * METHODE zum Selektieren aller aktuell gültigen Datensätze entsprechend
 * den Selektionskriterien die als Parameter übergeben werden.
 * 'Aktuell gültig' bedeutet, dass die Gültigkeit des Datensatzes mit dem
 * im Minimalen Set von Parametern übergebenen Arbeitsdatum übereinstimmt. */

    
public synchronized void selectBySelectionCriteria(String parmVariable_1, String parmVariable_2){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      JSBS_Parameter_DBA_Set locJSBS_Parameter_DBA_Set =
        
new JSBS_Parameter_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      locJSBS_Parameter_DBA_Set.select
BySelectionCriteria (
              
structDBCon, structJSBS_MinimalParameters,
              
application_entity_BO.CONST_PARAMETER_NAME,
              parm
Variable_1, parmVariable_2);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locJSBS_Parameter_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(locJSBS_Parameter_DBA_Set);

. . . . .
. . . . .
    }

zum Inhaltsverzeichnis

Zusätzlicher Code in der EJB-Klasse (bei Client/Server Anwendungen)

Wenn das Anwendungsprogramm als Client/Server Programm, das den EJB-Mechanismus verwendet, konzipiert ist, dann ist es notwendig, den Aufruf jeder einzelnen Methode dieser Klasse auch in der Klasse und den Interfaces für das EJB aufzunehmen.

Die Anleitung dazu finden Sie unter Muster-Codes für die Klasse eines EJB (Enterprise Java Bean) mit Datenbankzugriff > Methoden für die Datenzugriffe adaptieren - generell.

zum Inhaltsverzeichnis

Spezieller Muster-Code

In diesem Teil wird Muster-Code vorgestellt, der nicht in jeder Server-seitigen Klasse eines BO vorkommen wird und deswegen nicht in den Muster-Code der Klasse aufgenommen wurde.

zum Inhaltsverzeichnis

Selektieren von Business-Objects 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 zum aktuellen Arbeitsdatum (im Parameter
 * JSBS_MinimalParameters enthalten)
gültig sind oder deren Gültigkeit erst nach dem
 * Arbeitsdatum beginnt und die den in den Parametern übergebenen Selektionskriterien
 * entsprechen.

 * Dieser Muster-Algorithmus gilt für Business-Objects die zur Speicherung der Daten

 * die Datenbank-Tabelle 'Parameter' und die dafür angepassten DBA-Klassen aus dem

 * JavaScout-BaseSystem (JSBS) verwenden. */

    
public void selectValidAndFutureBySelectionCriteria(
                    String parm
Variable_1, String parmVariable_2){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
application_dbtable_DBA_Set locapplication_dbtable_DBA_Set =
        
new application_dbtable_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      loc
application_dbtable_DBA_Set.selectValidAndFutureByVariables(
              
structDBCon, structJSBS_MinimalParameters,
              parm
Variable_1, parmVariable_2);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locapplication_dbtable_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(loc
application_dbtable_DBA_Set);
/* Commit ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        commitDBConnection();
        
return;
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = locapplication_dbtable_DBA_Set.ErrorMsg;
/* Rollback ist nicht notwendig weil keine Veränderung auf der DB erfolgt ist – aber zum 'Ausbügeln'
 * von eventuellen früheren Programmierfehlern wird die entsprechende Methode aufgerufen.
 * Anschließend Methode beenden. */

        rollbackDBConnection();

        
return;
      }
    }

zum Inhaltsverzeichnis

Selektieren von Business-Objects für die die Parameter-Tabelle verwendet wird

Vorbemerkung - bitte lesen bevor Sie den Verfasser für völlig inkompetent oder gar verrückt halten.
Wenn Sie den folgenden Muster-Code analysieren raufen Sie sich vielleicht die Haare über die 'Performance' des Algorithmus.
Einsätze in der Praxis haben aber gezeigt, dass die verbrauchte Zeit aber keineswegs horrend ist - und zwar aus folgenden Gründen:

Darum halte ich es für vertretbar, die genaue Selektion erst im BOS_Set mit dem vorgestellten Muster-Code durchzuführen.
Die Alternative, in der Klasse JSBS_Parameter_DBA_Set Methoden zur Selektion nach jedem Attribut zu implementieren, wurde aus Gründen des Aufwandes - der noch steigen würde um alle Kombinationen von Attributen zu erfassen - nicht realisiert.

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 selectValidAndFutureBySelectionCriteria(
                    String parm
Variable_1, String parmVariable_2){
/* Variable für den Status auf OK (fehlerfrei) setzen. */
      
this.StatusCode = JSBS_BO.CONST_OK;
      
this.StatusMsg = "";
/*
 * DBA-Set-Objekt für den Zugriff auf die DB-Tabelle 'konstruieren'. */

      
JSBS_Parameter_DBA_Set locJSBS_Parameter_DBA_Set =
        
new JSBS_Parameter_DBA_Set();
/*
 * Datenbank-Zugriff über das DBA-Set-Objekt ausführen. */

      locJSBS_Parameter_DBA_Set.selectValidAndFutureByParameterName(
              
structDBCon, structJSBS_MinimalParameters,
              
application_entity_BO.CONST_PARAMETER_NAME);
/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde. */

      
if (locJSBS_Parameter_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(locJSBS_Parameter_DBA_Set);

/* Commit ist nicht notwendig - aber in der aufgerufenen Methode wird
 * wenn notwendig die DB-Connection geschlossen.
 * Anschließend Methode beenden. */

        commitDBConnection();
        
return;
/*
 * In der folgenden 'for'-Schleife werden alle BO, die nicht zu den, als Parameter
 * übergebenen, Selektionskriterien passen aus dem Vector mit der Liste der BO entfernt. */

/* Zuerst eine lokale Variable für ein BO aus der Liste definieren. */
        
application_entity_BO locapplication_entity_BO;
/* Variablen für Größe des Vectors und den Index definieren. */
        
int intVectorSize = vecRecordSet.size();
        
int intVectorIndex;
/* ***** */
        
for (intVectorIndex = intVectorSize - 1; intVectorIndex >= 0; intVectorIndex--) {
/* Einzelnes BO aus dem Vector herausholen */
          
locapplication_entity_BO (application_entity_BO ) =
             
vecRecordSet.elementAt(intVectorIndex);
/* Prüfen ob das BO den Selektionskriterien entspricht; dann wird es nicht entfernt. */
          
if (   (locapplication_entity_BO.Variable_1.compareTo(parmVariable_1) == 0)
              && (loc
application_entity_BO.Variable_2.compareTo(parmVariable_2) == 0)
              ) {}

/* Wenn das BO den Selektionskriterien nicht entspricht wird es entfernt */
          
else vecRecordSet.remove(intVectorIndex);
        }
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;
        
StatusMsg = locJSBS_Parameter_DBA_Set.ErrorMsg;
/* Rollback ist nicht notwendig - aber in der aufgerufenen Methode wird
 * wenn notwendig die DB-Connection geschlossen.
 * Anschließend Methode beenden. */

        rollbackDBConnection();
        
return;
      }
    }

zum Inhaltsverzeichnis

Lesen von Attributswerten von anderen Datanbank-Tabellen - Methode mergeVariablexy

Ein Vorteil der Verwendung von Business-Objects (BO) ist, dass BOs mehr Information enthalten können als ein Datensatz einer DB-Tabelle.
Ein Beispiel dafür ist, dass die Variablen eines BO aus den Werten von Attributen aus verschiedenen Datenbank-Tabellen versorgt werden können.
Das erlaubt, z.B. Werte in 'Klartext' in Variablen des BO verfügbar zu haben die auf der haupt-zugeordneten Datenbank-Tabelle nur als ObjectID zu dem referenzierten Datensatz einer anderen DB-Tabelle verfügbar sind.
Im folgenden Muster-Code wird gezeigt, wie die gewünschten Werte aus einer referenzierten Datenbank-Tabelle gelesen werden können.

/* ---------------------
 * METHODE zum 'Mischen' von Variablen-Werten aus einer weiteren Datenbank-Tabelle. */

    
public void mergeVariablexy() {
/*
 * Zuerst prüfen ob in der Liste mit den BO überhaupt Einträge vorhanden sind -
 * zu denen Attributs-Werte 'gemischt' werden sollen. */

      
if (vecRecordSet.size() <= 0) return;
/*
 * Server-Side BO das zum Lesen der zu 'mischenden' Variablen-Werte verwendet wird. */

      
referenced_app_entity_BOS structreferenced_app_entity_BOS =
          
new referenced_app_entity_BOS(structJSBS_MinimalParameters, structDBCon);
/*
 * Liste(n) mit dem Wert der referenziert und dem/n Wert/en, die in dieses BO von der
 * referenzierten DB-Tabelle übernommen werden soll.
 * Diese Liste wird zur Optimierung der Performanz benutzt. Mit der Liste wird vermieden,
 * auf ein referenziertes BO (und damit die DB-Tabelle) mehrmals
zuzugreifen. */
      
ArrayList lstReferencingVariable = new ArrayList();
      
ArrayList lstReferencedVariable_1 = new ArrayList();
      
ArrayList lstReferencedVariable_2 = new ArrayList();
/*
 * Wert nach dem die ArrayList 'lstReferencingVariable' durchsucht wird und ein Index
 * des gefundenen Wertes.
 * Für den zu suchenden Wert muss eine Klasse verwendet werden - ein (einfacher) Java-Typ
 * kann nicht in die ArrayList aufgenommen werden.
 * 'int' muss als 'Integer' eingefügt werden; 'double' als 'Double' usw.
  */
      
Java_Class ReferencingVariable_ToSearch;
      
int intListIndex = 0;
/* 
 * Variable für ein BO aus dem Vector. */

      application_entity_BO structapplication_entity_BO; 
/*
 * Variablen für die Größe der Liste (in dieser Klasse) mit den BO und eine Index definieren
 * und anschliessend in einer for-Schleife jedes BO der Liste bearbeiten. */

      int intVectorSize = vecRecordSet.size();
      int intVectorIndex;
      for (intVectorIndex = 0; intVectorIndex < intVectorSize; intVectorIndex++) {
/*
 * Indizierten Datensatz aus dem Set 'holen'. */
   
        structapplication_entity_BO = (application_entity_BO)  vecRecordSet.elementAt(intVectorIndex);
/*
 * Wenn notwendig einen Wert in einem einfache Java-Typ in eine Klasse umwandeln. */
 
        ReferencingVariable_ToSearch = new Java_Class(structapplication_entity_BO.Referencing_Variable);
/* 
 * Methode der 'ArrayList' zum Prüfen benutzen. */

        intListIndex = lstReferencingVariable.indexOf(ReferencingVariable_ToSearch);
/* 
 * Wenn der gesuchte Wert gefunden wurde dann ist der Index nicht negativ. */

        
if (intListIndex >= 0) {
/* 
 * Die gesuchten Referenz-Werte wurden schon einmal von der DB gelesen. */

          
structapplication_entity_BO.Referenced_Variable_1 =
            (
Java_Class) lstReferencedVariable_1.get(intListIndex);
          
structapplication_entity_BO.Referenced_Variable_2 =
            (
Java_Class) lstReferencedVariable_2.get(intListIndex);
        }

        
else {
/* 
 * Referenz-Werte sind nicht in den 'ArrayList' und müssen jetzt von der Datenbank gelesen werden. */

          struct
referenced_app_entity_BOS.selectBySelectionCriteria(
              struct
application_entity_BO.Referencing_Variable);
/* 
 * Einfaches Prüfen ob das referenzierte BO gefunden wurde. */

          
if (structreferenced_app_entity_BOS.StatusCode == JSBS_BO.CONST_OK) {
/* 
 * Gefunden: Referenzierende und referenzierte Werte in den 'ArrayList's eintragen. */

            
lstReferencingVariable.add(ReferencingVariable_ToSearch);
            
lstReferencedVariable_1.add(structreferenced_app_entity_BOS.Referenced_Variable_1);
            
lstReferencedVariable_2.add(structreferenced_app_entity_BOS.Referenced_Variable_2);
/* 
 * Werte auch auf das bearbeitete BO übertragen. */

            
structapplication_entity_BO.Referenced_Variable_1 =
                
structreferenced_app_entity_BOS.Referenced_Variable_1;
            
structapplication_entity_BO.Referenced_Variable_2 =
                
structreferenced_app_entity_BOS.Referenced_Variable_2;
          }

          
else {
/* 
 * Referenziertes BO wurde nicht gefunden. Individuell entscheiden wie reagiert werden soll !!. */

          }

        }

      }
    }

Aufgerufen wird diese Methode (mergeVariablexy) in den Methoden zum Selektieren bevor die Verbindung zur Datenbank (Connection) beendet wird.

/* 
 * Über die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen ob
 * die Datenbank-Abfrage fehlerfrei beendet wurde.. */

      
if (locapplication_dbtable_DBA_Set.ErrorMsg.length() < 1) {
/* 
 * Datensatz existiert und wurde fehlerfrei gelesen.
 * Attributs-Werte auf die Variablen dieses BOS-Set übertragen. */

        getDBAAttributes(loc
application_dbtable_DBA_Set);
/* Methode zum Übertrage von Variablen aus einem referenzierten BO aufrufen. */
        merge
Variablexy();
/* Commit ist nicht notwendig - aber in der aufgerufenen Methode wird
 * wenn notwendig die DB-Connection geschlossen.
 * Anschließend Methode beenden. */

        commitAndCloseDBConnection(bol_structDBConOpenedInThisMethod,
                                   bol_autocommit);
        
return;
      }
      
else {
/* DBA-Objekt meldet einen Fehler;
 * Status-Code setzen und Fehler-Meldung aus dem DBA-Objekt übernehmen. */

        
StatusCode = JSBS_BO.CONST_DB_SYSTEM_ERROR;

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 Generellen Klasse für das BO vorgestellt wird.

Muster-Code für ein BO_Set (Liste mit Business-Objects)  

Muster-Code für die BO-Klasse, mit denen eine Liste von Datensätzen selektiert werden kann.
Die Verwendung dieser Klasse ist notwendig, wenn durch die Selektionskriterien mehr als ein Datensatz ausgewählt werden kann.

zum Inhaltsverzeichnis