|
Letzte
Bearbeitung dieses Dokuments: |
Voraussetzungen für das Verständnis dieses Dokuments:Grundkenntnisse in
der Programmierung von Java (Klassen, Methoden,
Schleifen). |
Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:Arbeitszeit:
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.
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
Tutorial für die Programmierung eines Heavyweight-Clients (Fat-Client) durchgearbeitet.
Datenmodell fertig ausgearbeitet.
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
parm
application_dbtable
_DBA_Set)
{
/*
* Prüfen,
ob das DBA-Set leer ist; in diesem Fall einen 'Not Found' Status
zurückliefern. */
int
intDBAVectorSize
= parm
application_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
loc
application_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'.
*/
locapplication_dbtable
_DBA
=
(
application_dbtable
_DBA)
parmapplication_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(locapplication_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
loc
application_dbtable
_DBA_Set
=
new
application_dbtable
_DBA_Set();
/*
* Datenbank-Zugriff über das DBA-Set-Objekt
ausführen.
*/
locapplication_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
(loc
application_dbtable
_DBA_Set.
ErrorMsg
.length()
< 1) {
/*
* Datensatz
existiert und wurde fehlerfrei gelesen.
* Attributs-Werte
auf die Variablen dieses BOS-Set übertragen.
*/
getDBAAttributes(locapplication_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
=
loc
application_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
loc
application_dbtable
_DBA_Set
=
new
application_dbtable
_DBA_Set();
/*
* Datenbank-Zugriff über das DBA-Set-Objekt
ausführen.
*/
locapplication_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
(loc
application_dbtable
_DBA_Set.
ErrorMsg
.length()
< 1) {
/*
* Datensatz
existiert und wurde fehlerfrei gelesen.
* Attributs-Werte
auf die Variablen dieses BOS-Set übertragen.
*/
getDBAAttributes(locapplication_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
=
loc
application_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
selectBy
SelectionCriteria
(String
parm
Variable_1
,
String parm
Variable_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
loc
application_dbtable
_DBA_Set
=
new
application_dbtable
_DBA_Set();
/*
* Datenbank-Zugriff über das DBA-Set-Objekt
ausführen.
*/
locapplication_dbtable
_DBA_Set.select
By
SelectionCriteria
(
structDBCon
,
structJSBS_MinimalParameters
,
parmVariable_1
,
parm
Variable_2
);
/*
* Über
die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen
ob
* die Datenbank-Abfrage fehlerfrei beendet wurde.
*/
if
(loc
application_dbtable
_DBA_Set.
ErrorMsg
.length()
< 1) {
/*
* Datensatz
existiert und wurde fehlerfrei gelesen.
* Attributs-Werte
auf die Variablen dieses BOS-Set übertragen.
*/
getDBAAttributes(locapplication_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
=
loc
application_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
;
}
}
}
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.
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...
.
|
|
Für
'Platzhalter', die nur einmalig im Muster-Code vorkommen ist die
'Find'-Funktion ist hilfreich zum Finden der beschriebenen
'Platzhalter'.
Ä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.*;
/**
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.
Ä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
selectBy
SelectionCriteria
(String
parm
Variable_1
,
String parm
Variable_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.
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
parm
application_dbtable
_DBA_Set)
{
/*
* Prüfen,
ob das DBA-Set leer ist; in diesem Fall einen 'Not Found' Status
zurückliefern. */
int
intDBAVectorSize
= parm
application_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.
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.
Methode
selectBy
SelectionCriteria
(
String
parm
Variable_1
,
String parm
Variable_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
selectBy
SelectionCriteria
(String
parm
Variable_1
,
String parm
Variable_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
loc
application_dbtable
_DBA_Set
=
new
application_dbtable
_DBA_Set();
/*
* Datenbank-Zugriff über das DBA-Set-Objekt
ausführen.
*/
loc
application_dbtable
_DBA_Set.select
By
SelectionCriteria
(
structDBCon
,
structJSBS_MinimalParameters
,
parm
Variable_1
,
parm
Variable_2
)
;
/*
.
. . . .
.
. . . .
}
Methode
selectBy
SelectionCriteria
(
String
parm
Variable_1
,
String parm
Variable_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
selectBy
SelectionCriteria
(String
parm
Variable_1
,
String parm
Variable_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.selectBySelectionCriteria
(
structDBCon
,
structJSBS_MinimalParameters
,
application_entity
_BO.
CONST_PARAMETER_NAME
,
parmVariable_1
,
parm
Variable_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);.
. . . .
.
. . . .
}
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
.
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.
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)
selectBy
SelectionCriteria
.
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
selectValidAndFutureBy
SelectionCriteria
(
String
parmVariable_1
,
String parm
Variable_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
loc
application_dbtable
_DBA_Set
=
new
application_dbtable
_DBA_Set();
/*
* Datenbank-Zugriff über das DBA-Set-Objekt
ausführen.
*/
locapplication_dbtable
_DBA_Set.selectValidAndFuture
By
Variables
(
structDBCon
,
structJSBS_MinimalParameters
,
parmVariable_1
,
parm
Variable_2
)
;
/*
* Über
die Länge des Textes mit einer eventuellen Fehler-Nachricht prüfen
ob
* die Datenbank-Abfrage fehlerfrei beendet wurde.
*/
if
(loc
application_dbtable
_DBA_Set.
ErrorMsg
.length()
< 1) {
/*
* Datensatz
existiert und wurde fehlerfrei gelesen.
* Attributs-Werte
auf die Variablen dieses BOS-Set übertragen.
*/
getDBAAttributes(locapplication_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
=
loc
application_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
;
}
}
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:
Per
Definition ist die DB-Tabelle 'Parameter' dazu vorgesehen,
Business-Objects zu speichern, die nur in geringer Anzahl für
eine BO-Klasse vorhanden sind.
Eine
Abfrage aller Datensätze über den Schlüssel 'ParameterName' (der
die Zuordnung zu eine BO-Klasse repräsentiert) dauert selbst auf
einem schwachen PC bei 500 gefundenen Datensätzen weniger als 1
Sekunde.
Selektionen
nach Kriterien, die nicht aus einer Kombination der 'vorderen'
Schlüssel-Attribute der Parameter-Tabelle (Value_01 bis Value_05)
bestehen, werden selten gebraucht - meiner Erfahrung nach nur zum
Prüfen auf Fremdschlüssel-Relationen beim Deaktivieren von BO.
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)
selectBy
SelectionCriteria
.
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
selectValidAndFutureBy
SelectionCriteria
(
String
parmVariable_1
,
String parm
Variable_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
loc
application_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
*/
loc
application_entity
_BO
(
application_entity
_BO
) =
vecRecordSet
.elementAt(intVectorIndex);
/*
Prüfen ob das BO den Selektionskriterien entspricht; dann wird es
nicht entfernt. */
if
(
(loc
application_entity
_BO.
Variable_1
.compareTo(parm
Variable_1
)
== 0)
&&
(locapplication_entity
_BO.
Variable_2
.compareTo(parm
Variable_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
;
}
}
Lesen
von Attributswerten von anderen Datanbank-Tabellen
- Methode
merge
Variablexy
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
merge
Variablexy
()
{
/*
* 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
struct
referenced_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
lst
ReferencingVariable
=
new
ArrayList();
ArrayList
lst
ReferencedVariable_1
=
new
ArrayList();
ArrayList
lst
ReferencedVariable_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
struct
application_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'. */
struct
application_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
(struct
application_entity
_BO
.
Referencing_Variable
);
/*
*
Methode der 'ArrayList' zum Prüfen benutzen. */
intListIndex
=
lst
ReferencingVariable
.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. */
struct
application_entity
_BO
.
Referenced_Variable_1
=
(Java_Class
)
lst
ReferencedVariable_1
.get(intListIndex)
;
struct
application_entity
_BO
.
Referenced_Variable_2
=
(Java_Class
)
lst
ReferencedVariable_2
.get(intListIndex)
;
}
else
{
/*
*
Referenz-Werte sind nicht in den 'ArrayList' und müssen jetzt von
der Datenbank gelesen werden. */
structreferenced_app_entity
_BOS.selectBy
SelectionCriteria
(
structapplication_entity
_BO
.
Referencing_Variable
);
/*
*
Einfaches Prüfen ob das referenzierte BO gefunden wurde. */
if
(struct
referenced_app_entity
_BOS.
StatusCode
==
JSBS_BO.
CONST_OK
)
{
/*
*
Gefunden: Referenzierende und referenzierte Werte in den 'ArrayList's
eintragen. */
lst
ReferencingVariable
.add(
ReferencingVariable
_ToSearch);
lst
ReferencedVariable_1
.add(struct
referenced_app_entity
_BOS.
Referenced_Variable_1
);
lst
ReferencedVariable_2
.add(struct
referenced_app_entity
_BOS.
Referenced_Variable_2
);
/*
*
Werte auch auf das bearbeitete BO übertragen. */
struct
application_entity
_BO
.
Referenced_Variable_1
=
struct
referenced_app_entity
_BOS.
Referenced_Variable_1
;
struct
application_entity
_BO
.
Referenced_Variable_2
=
struct
referenced_app_entity
_BOS.
Referenced_Variable_2
;
}
else
{
/*
*
Referenziertes BO wurde nicht gefunden. Individuell entscheiden wie
reagiert werden soll !!. */
}
}
}
}
Aufgerufen
wird diese Methode (
mergeVariable
xy
)
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
(loc
application_dbtable
_DBA_Set.
ErrorMsg
.length()
< 1) {
/*
* Datensatz
existiert und wurde fehlerfrei gelesen.
* Attributs-Werte
auf die Variablen dieses BOS-Set übertragen.
*/
getDBAAttributes(locapplication_dbtable
_DBA_Set);
/*
Methode zum Übertrage von Variablen aus einem referenzierten BO
aufrufen. */
mergeVariablexy
();
/* 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
;
Dokument |
Inhalt |
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
die BO-Klasse, mit denen eine Liste von Datensätzen selektiert
werden kann. |