12
|
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 Client-Side-Klasse eines BO (Business-Object) und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.
Einfacher Muster-Code für ein BOC
Anleitung
zur Adaptierung
* Änderung
des Namens der Java-Packages der Anwendung
* Änderung
des Namens der Klasse des CommandCenters
* Adaptieren
des Kommentars
* Änderung
des Namens der Klasse und der 'Constructor'-Methoden
*
Methoden getFrom
GUI(...) und
setToGUI(...)
adaptieren
* Vorbereitende Tätigkeiten bei Entwicklung einer 'MobileClient' Version des Anwendungsprogramms
*
Generelle Tätigkeiten bei Verwendung von EJB
(Client-Server-Architektur)
*
Aufruf der Methoden store()
und deactivate()
des BOS adaptieren
*
Aufruf der Methoden store()
und deactivate()
des EJB adaptieren
*
Aufruf der Methoden select...(...)
des BOS adaptieren
*
Aufruf der Methoden select...(...)
des EJB adaptieren
Weitere Schritte und verwandte Dokumentation
Tutorial für die Programmierung eines Heavyweight-Clients (Fat-Client) durchgearbeitet.
Datenmodell fertig ausgearbeitet.
Generelle Klasse für das BO erstellt; siehe Muster-Code für ein BO (Generelle Klasse eine Business-Object).
Wenn das
Anwendungsprogramm als Client/Server-Anwendung konzipiert ist, ist
es hilfreich, zuerst das EJB und die Klasse für die Verbindung zum
JAS (Java Application Server) zu codieren.
Die Anleitung für das
Entwickeln der Klasse mit dem Standard-EJB finden Sie unter
Leitfaden
für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle
Schritte zur Entwicklung von DBA (DataBase-Access) und BO
(Business-Object) Klassen > Leitfaden - EJB.
Die
Anleitung für das Entwickeln der Klasse für die Verbindung zum JAS
finden Sie unter Leitfaden
für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle
Schritte zur Entwicklung des Start-Frames > Leitfaden –
Schritte bei einer Client/Server Version.
Welche Platzhalter
durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind
finden Sie im Abschnitt
Anleitung
zur Adaptierung.
package
application_package
.boc;
/*
* Package
und Klasse für die Herstellung der Connection zur Datenbank.
*/import
java.sql.Connection;
/*
* Package
und Klasse die beim Auftreten von Fehlern bei der Verbindung zum
JAS
* (Java Application Server) benötigt wird. */import
java.rmi.RemoteException;
/*
*
Package mit der Bibliothek der GUI-Elemente. */import
javax.swing.*;
/*
*
Basis-Klasse mit unterstützenden Methoden für die Verarbeitung von
BO. */import
js_base.bo.*;
/*
*
Package mit der Basisklasse für Start- und Task-Frame. */import
js_base.frame.*;
/*
*
Basisklasse zum Foramtieren von numerischen Werten für die Anzeige.
*/import
js_base.utilities.JSBS_Formatter;
/*
*
Klasse für das CommandCenter (Start-Frame) der Anwendung. */import
application_package
.client.
application
_CommandCenter;
/*
*
Geerbte Generelle Klasse des BO. */import
application_package
.bo.*;
/*
*
Server-Side-Klasse des BO.
* Die Methoden in dieser Klasse
führen bei einer direkten Verbindung zur Datenbank
* die
Zugriffe auf die Datenbank-Tabelle(n) aus.
*/
import
application_package
.bos.*;
/**
*
* @author
name[at]company
* @date
20xx-xx-xx
*
* @description
* Client-Side
Klasse für ein Business-Object (BO).
* Variablen
dieses BO und Anwender-bekannte-Identifikation sind in der
* (geerbten) Generellen Klasse für das BO
dokumentiert.
*
* @change-log
* when who why
* -----------------------------------------------------------------
*
*//*
*/
public
class
application_entity
_BOC
extends
application_entity
_BO
{
/* ---------------------
* VARIABLE dieser Klasse.
* ---------------------
*/
/*
* Referenz
auf das Task-Frame, das das Objekt dieser Klasse 'konstruiert'
hat.
* Über diese Referenz werden jene Parameter
abgefragt, die bestimmen, ob der zugehörige
* Server-Side
Teil des BO direkt 'konstruiert' werden soll (bei einer StandAlone /
Einzelplatz-
* Version) oder ein EJB
(Enterprise-Java_Bean) aufgerufen werden muß (bei
einer
* Client/Server-Version). */
private
JSBS_TaskFrame
frmTask
=
null
;
/*
* Referenz
auf das CommandCenter (Start-Frame) der Anwendung.
* Die
Referenz auf diese Klasse wird gebraucht, weil dort die 'Home
interface(s)'
* der EJB (Enterprise Java Beans)
implementiert sind.
* Diese(s) EJB sind speziell für die
Anwendung entwickelt.
*
Damit kann nicht über die Basisklassen auf die (auf der
Client-Seite) implementierte(n)
* 'Home interface(s)'
zugegriffen werden. */
private
application
_CommandCenter
frmCC
=
null
;
/*
* Referenz
zu der in diesem Objekt geöffnete DB-Connection.
* Dieser
Wert ist notwendig wenn das Anwendungsprogramm im Einzelplatz-Modus
(stand-alone)
* konfiguriert ist. */
private
Connection
structDBCon
=
null
;
/*
* Nummer
der in diesem Objekt geöffneten 'Connection' zur Datenbank.
*/
private
int
intDBConReference
=
0;
/*
* Objekt
für den Abgleich bei einer 'MobileClient' Version.
* In
der Klasse ist implementiert, wie die Daten eines mobilen Client mit
den Daten
* am Server abgeglichen werden wenn der
mobile Client wieder mit dem Server verbunden ist.
* Wenn
eine 'MobileClient' Version implementiert ist dann muss die folgende
Zeile
* 'auskommentiert' werden. *///
private
application_entity
_BO_Synchronizer
struct
application_entity
_BO_Synchronizer
=
null
;
/* ---------------------
* CONSTRUCTOR-METHODE *//* ---------------------
* Als Parameter des 'Constructors' sind das
aufrufende Task-Frame und
* das 'CommandCenter'
(Start-Frame) erforderlich. */
public
application_entity
_BOC(
application
_CommandCenter
parmfrmCC,
JSBS_TaskFrame parmfrmTask)
{
/*
* Die im Parameter übergebenen Referenzen auf
Start-Frame und Task-Frame
* werden in den Variablen
dieser Klasse'aufgehoben'. */
frmCC
=
parmfrmCC;
frmTask
=
parmfrmTask;
}/* ---------------------------
*/
/*
* METHODE
zum Eröffnen einer Verbindung zur Datenbank (DB-Connection).
* Über
den übergebenen Parameter (parmReadOnly) wird gesteuert ob die
DB-Connection
* im 'autocommit'-Modus geöffnet werden
soll.
* Wenn nur von der Datenbank gelesen werden soll
ist die Übergabe von 'true' als
* Parameter-Wert
sinnvoll weil dann mit 'autocommit' geöffnet wird und damit ein
* schnellerer Zugriff (bessere Performanz) erreicht
wird.
*
* Der Rückgabe-Wert
* signaliesiert
ob die Verbindung zur Datenbank (DB-Connection) erfolgreich eröffnet
wurde. */
private
boolean
getDatabaseConnection(
boolean
parmReadOnly)
{
/*
* Anfordern einer DB-Verbindung vom
DB-Connection-Manager.
* Die Referenz-Nummer wird in
der globalen Variable dieser Klasse gespeichert.
*/
intDBConReference
=
frmCC
.
structJSBS_DB_ConnectionManager
.reserveConnection(
this
,
parmReadOnly);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Fehler an aufrufende Methode signalisieren.
*/
return
false
;
}/*
* Anfordern einer DB-Verbindung war fehlerfrei;
* Referenz auf die DB-Verbindung in die Variable der
Klasse übernehmen und
* erfolgreiche Anforderung an
aufrufende Methode signalisieren. */
structDBCon
=
frmCC
.
structJSBS_DB_ConnectionManager
.getReservedConnection(
this
,
intDBConReference
);
return
true
;
}/* ---------------------
* METHODEN zum Übertragen der Werte zwischen diesem
BO und den GUI-Elementen. *//* ---------------------
* METHODE zum Übertragen der Werte aus den als
Parameter übergebenen GUI-Elementen
* in die Variablen
dieses Objektes. */
public
void
getFromGUI(JTextField
parm
GUIElement_String
,
JTextField
parmGUIElement_Integer
,
JTextField
parmGUIElement_Short
,
JTextField
parmGUIElement_BigDecimal
,
JTextArea
parmGUIElement_TextArea
,
JComboBox
parmGUIElement_ComboBox
,
JCheckBox
parmGUIElement_CheckBox
,
JRadioButton
parm
GUIElement_RadioButtonA
,
JRadioButton
parmGUIElement_RadioButtonB
,
JSBS_ImagePane
parm
GUIElement_ImagePane
)
{
/*
* Anschließend sind Muster für das Übertragen
verschiedener Datentypen von einem Eingabefeld
* auf
die Variablen des Business Object.
* Zuerst wird
geprüft ob überhaupt ein Wert übergeben wurde; dann wird die
passende Methode
* für den Transfer aufgerufen.
*/
if
(parm
GUIElement_String
!=
null
)
{
this
.
BO_Variable_of_Type_String
=
JSBS_GUIServices.getTextFromJTextField(parm
GUIElement_String
);
}/*
***** */
if
(parm
GUIElement_Integer
!=
null
)
{
this
.
BO_Variable_of_Type_Integer
=
JSBS_GUIServices.getInteger(parm
GUIElement_Integer
,
frmTask
);
}/*
***** */
if
(parm
GUIElement_Short
!=
null
)
{
this
.
BO_Variable_of_Type_Short
=
JSBS_GUIServices.getShort(parm
GUIElement_Short
,
frmTask
);
}/*
***** */
if
(parm
GUIElement_BigDecimal
!=
null
)
{
this
.
BO_Variable_of_Type_BigDecimal
=
JSBS_GUIServices.getBigDecimal(parm
GUIElement_BigDecimal
,
frmTask
);
}/*
***** */
if
(parm
GUIElement_TextArea
!=
null
)
{
this
.
BO_Variable_of_Type_String
=
JSBS_GUIServices.getTextFromJTextArea(parm
GUIElement_TextArea
);
}/*
***** */
if
(parm
GUIElement_ComboBox
!=
null
)
{
this
.
BO_Variable_of_Type_String
=
JSBS_GUIServices.getSelectedTextFromJComboBox(parm
GUIElement_ComboBox
);
}/*
Alternative zum Auslesen eines Codes.
*
Die
Zeichenkette für das Trennzeichen muss gleich jener sein, die beim
Füllen der Combobox verwendet wurde. */
if
(parm
GUIElement_ComboBox
!=
null
)
{
this
.
BO_Variable_of_Type_String
=
JSBS_GUIServices.getSelectedCodeFromJComboBox(parm
GUIElement_ComboBox
,
"
-
"
);
}/*
***** */
if
(parm
GUIElement_CheckBox
!=
null
)
{
/*
Abhängig von der Auswahl wird ein vordefinierter Wert übernommen
*/
if
(parm
GUIElement_CheckBox
.isSelected())
this
.
BO_Variable_of_any_Type
=
application_entity
_BO.
CONST_
Predefined_Value1
;
else
this
.
BO_Variable_of_any_Type
=
application_entity
_BO.
CONST_
Predefined_Value2
;
}/*
***** */
if
(parm
GUIElement_RadioButtonA
!=
null
)
{
/*
Abhängig von der Auswahl wird ein vordefinierter Wert übernommen
*/
if
(parm
GUIElement_RadioButtonA
.isSelected())
this
.
BO_Variable_of_any_Type
=
application_entity
_BO.
CONST_
Predefined_ValueA
;
}/*
***** */
if
(parm
GUIElement_RadioButtonB
!=
null
)
{
/*
Abhängig von der Auswahl wird ein vordefinierter Wert übernommen
*/
if
(parm
GUIElement_RadioButtonB
.isSelected())
this
.
BO_Variable_of_any_Type
=
application_entity
_BO.
CONST_
Predefined_ValueB
;
}/*
***** */
if
(parm
GUIElement_JSBS_ImagePane
!=
null
)
{
/*
Bei einem grafischen Image (Foto, Zeichnung) werden das Array der
Daten und das Format ausgelesen.
*/
this
.
BO_Variable_of_Type_ByteArray
=
parm
GUIElement_ImagePane
.getImageAsByteArray();
this
.
BO_Variable_of_Type_String
=
parm
GUIElement_ImagePane
.getGraphicsFormat();
}/*
***** */
}/* ---------------------
* METHODE zum Übertragen der Werte aus den Variablen
dieses BO in die GUI-Elemente,
* die als Parameter
übergeben werden. */
public
void
setToGUI(JTextField
parm
GUIElement_String
,
JTextField
parmGUIElement_Integer
,
JTextField
parmGUIElement_Short
,
JTextField
parmGUIElement_BigDecimal
,
JTextArea
parmGUIElement_TextArea
,
JComboBox
parmGUIElement_ComboBox
,
JCheckBox
parmGUIElement_CheckBox
,
JRadioButton
parmGUIElement_RadioButtonA
,
JRadioButton
parmGUIElement_RadioButtonB
,
JSBS_ImagePane
parm
GUIElement_ImagePane
)
{
/*
* Anschließend sind Muster für das Übertragen
verschiedener Datentypen von einer
* Variablen des
Business Object in das jeweilige Eingabefeld.
* Zuerst
wird geprüft ob überhaupt ein Wert übergeben wurde; dann wird die
passende Methode
* für den Transfer aufgerufen.
*/
if
(parm
GUIElement_String
!=
null
)
{
JSBS_GUIServices.setTextToJTextField(parmGUIElement_String
,
this
.
BO_Variable_of_Type_String
);
}/*
***** */
if
(parm
GUIElement_Integer
!=
null
)
{
JSBS_GUIServices.setTextToJTextField
(parmGUIElement_Integer
,
JSBS_Formatter.toFormattedString(this
.
BO_Variable_of_Type_Integer
));
}/*
***** */
if
(parm
GUIElement_Short
!=
null
)
{
JSBS_GUIServices.setTextToJTextField
(parmGUIElement_Shortr
,
JSBS_Formatter.toFormattedString(this
.
BO_Variable_of_Type_Short
));
}/*
***** */
if
(parm
GUIElement_BigDecimal
!=
null
)
{
JSBS_GUIServices.setTextToJTextField
(parmGUIElement_BigDecimal
,
JSBS_Formatter.toFormattedString(this
.
BO_Variable_of_Type_BigDecimal
,
frmTask
.
frmCC
.
structJSBS_UniversalParameters
.
strLanguageDependantDecimalPoint
.charAt(0),
DecimalPlacesAfterDecimalPoint
));
}/*
***** */
if
(parm
GUIElement_TextArea
!=
null
)
{
JSBS_GUIServices.setStringWithNewLineToJTextArea(parmGUIElement_TextArea
,
this
.
BO_Variable_of_Type_String
);
}/*
***** */
if
(
parm
GUIElement_ComboBox
!=
null
)
{
JSBS_GUIServices.setJComboBoxItem(parm
GUIElement_ComboBox
,
this
.
BO_Variable_of_Type_String
,
frmTask
.
frmCC
.
structJSBS_UniversalParameters
,
true
);
}/*
***** */
if
(
parm
GUIElement_CheckBox
!=
null
)
{
parm
GUIElement_CheckBox
.setSelected(
this
.
BO_Variable_of_Type_String
.equals(
application_entity
_BO.
CONST_
Predefined_Value1
));
}/*
***** */
if
(
parm
GUIElement_RadioButtonA
!=
null
)
{
parm
GUIElement_RadioButtonA
.setSelected(
this
.
BO_Variable_of_Type_String
.equals(
application_entity
_BO.
CONST_
Predefined_ValueA
));
}/*
***** */
if
(
parm
GUIElement_RadioButtonB
!=
null
)
{
parm
GUIElement_RadioButtonB
.setSelected(
this
.
BO_Variable_of_Type_String
.equals(
application_entity
_BO.
CONST_
Predefined_ValueB
));
}/*
***** */
if
(parm
GUIElement_JSBS_ImagePane
!=
null
)
{
/*
Für die Anzeige der Grafik ist der Bytestream und das Grafikformat
erforderlich.
*/
parm
GUIElement_ImagePane
.setImage(
this
.
BO_Variable_of_Type_ByteArray
,
this
.
BO_Variable_of_Type_String
);
}/*
***** */
}/* ---------------------
* METHODEN, die für das Synchronisieren der Daten
zwischen einem mobilen Client und dem Server.
* notwendig
sind.
*
* Der Muster-Code setzt voraus,
dass bereits die Methoden für den Zugriff auf das
(lokale)
* Datenbanksystem und auf die Daten am Server
implementiert sind.
* Ist das gesamte
Anwendungsprogramm nur für den Zugriff auf eine lokale Datenbank
entworfen,
* dann können die Methoden für den Zugriff
auf den Server gelöscht werden.
*//*
* --------------------
* METHODE
zum Aufrufen der speziellen Klasse für das Abgleichen von BO
* wenn
das Anwendungsprogramm in der Version 'MobileClient' läuft.
* Soll
eine 'MobileClient' Version nicht implementiert werden dann muss
diese Methode
* gelöscht werden. */
private
void
synchronizeBO()
{
/*
* Zuerst Prüfen ob schon ein Objekt für den
nebenläufigen Prozess (Thread) existiert.
* Bei Bedarf
ein Objekt 'konstruieren'.
* Hinweis:
* Im
Muster ist die Variablendeklaration für die Synchronizer-Klasse
auskommentiert. */
if
(
struct
application_entity
_BO_Synchronizer
==
null
)
struct
application_entity
_BO_Synchronizer
=
new
application_entity
_BO
_Synchronizer(
frmCC
,
frmTask
);
/*
* Dieses BO-Set (gesamtes Objekt) an das
Synchronizer-Objekt übergeben.
* Der asynchrone
Prozess wird in der aufgerufenen Methode gestartet.
*/
struct
application_entity
_BO_Synchronizer
.passBO(
this
);
}
/*
* --------------------
*
METHODE zum Vergleichen von zwei BO und Übernehmen der jeweils
neuesten Version
*
eines BO in die Attribute dieses Objekts. */
private
void
getNewestBO(
application_entity
_BO
parm
application_entity
_BO
_1,
application_entity
_BO
parm
application_entity
_BO
_2)
{
/*
* Zuerst Prüfen ob gültige Werte in den Parametern
vorhanden sind. */
if
(parm
application_entity
_BO
_1
==
null
)
{
this
.
StatusCode
=
JSBS_BO.
CONST_INCONSISTENT_DATA
;
this
.
StatusMsg
=
"getNewestBO:
parm
application_entity
_BO_1
is
'null'"
;
}
if
(parm
application_entity
_BO
_2
==
null
)
{
this
.
StatusCode
=
JSBS_BO.
CONST_INCONSISTENT_DATA
;
this
.
StatusMsg
=
"getNewestBO:
parm
application_entity
_BO
_2
is 'null'"
;
}
/*
* Prüfen, welcher Datensatz später geändert wurde;
* die Werte von diesem werden in dieses BO übertragen.
*/
if
(parm
application_entity
_BO
_1.
ChangedAt
.after(parm
application_entity
_BO
_2.
ChangedAt
))
this
.copyFrom
application_entity
_BO
(parm
application_entity
_BO
_1);
else
this
.copyFrom
application_entity
_BO
(parm
application_entity
_BO
_2);
}
/* ---------------------
* METHODE zum Selektieren eines einzelnen Datensatzes
(als Teil der Historie eines BO).
* Dieses Selektieren
wird üblicherweise nur gebraucht wenn die Daten eines mobilen
Clients
* mit den Daten des Servers synchronisiert
werden müssen.
* Dann wird mit dieser Methode geprüft,
ob ein auf dem Server vergebener Wert für den DataSetID
* nicht
schon zufällig auch auf der lokalen Datenbank des mobilen Clients
vergeben wurde. */
protected
void
selectByDataSetID_DB(
double
parmDataSetID)
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode nur gelesen wird, wird als Parameter 'autocommit'
(read-only) festgelegt. */
getDatabaseConnection(true
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
true
);
/*
* Methode zum Selektieren der Werte aufrufen.
*/
bosapplication_entity
.selectByDataSetID(parmDataSetID);
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geschäfts-spezifische
Attribute, Common-Attributes, Status-Code
* und
Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}
/* ---------------------
* METHODE zum Speichern eines einzelnen Datensatzes
(als Teil der Historie eines BO)
* auf der lokalen
Datenbank eines mobilen Clients.
* Dieses Speichern
wird gebraucht wenn die Daten eines mobilen Clients mit den Daten des
Servers
* synchronisiert werden müssen.
* Wenn
der Wert des Parameters parmDataSetIDToSelect den Wert '0' hat wird
jener Datensatz geändert
* geändert, dessen DataSetID
dem Wert des DataSetID dieses BO entspricht bzw. es wird ein
neuer
* Datensatz in die DB-Tabelle eingefügt.
* Wenn
ein Wert (ungleich '0') als Parameter übergeben wird, dann wird
jener Datensatz, dessen
* DataSetID dem Wert des
übergebenen Parameters entspricht, geändert.
* Das
bedeutet, dass auch der Primärschlüssel (DataSetID) geändert wird.
*/
protected
void
synchronizedStore_DB(
double
parmDataSetIDToSelect)
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode Änderungen auf der Datenbank ausgeführt werden,
* wird als Parameter 'read-write' - nicht 'autocommit'
(read-only) - festgelegt. */
getDatabaseConnection(false
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren' und
dabei dieses Client-Side-BO als Parameter
* übergeben
damit die Werte der geschäfts-spezifischen Variablen kopiert werden
können. */
application_entity
_BOS
loc
application_entity
_BOS
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
this
,
true
);
/*
* Methode zum Speichern der Werte aufrufen.
*/
locapplication_entity
_BOS.synchronizedStore(parmDataSetIDToSelect);
/*
* Fehlerbehandlung wenn das 'store' nicht
ordnungsgemäß beendet wurde.
* Rollback ausführen
und Verbindung zur Datenbank schließen.
* Nebenbemerkung:
* In
der Methode 'returnReservedConnection' (etwas weiter unten)
wird
* geprüft, ob die Verbindung zur Datenbank
(DB-Connection) noch 'offen' ist.
* Wenn die
DB-Connection noch offen ist, wird in der Methode
'returnReservedConnection'
* ein 'commit' ausgeführt
und die DB-Connection geschlossen. */
if
(loc
application_entity
_BOS.
StatusCode
!=
JSBS_BO.
CONST_OK
)
{
/*
* Sowohl 'rollback' als auch 'close' liefern im
Fehlerfall eine 'Exception'. */
try
{
structDBCon
.rollback();
structDBCon
.close();
}
catch
(Exception
e) {
/*
* Blöde Situation wenn 'rollback' oder 'close' in der
Situation auch nicht mehr
* funktionieren.
* Nachdem
das Speichern der neuen Daten nicht funktioniert hat, ist es aber
* Aufgabe der aufrufenden Methode, eine
Fehlerbehandlung auszuführen. */
}
}
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geänderte Common-Attributes,
Status-Code und Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(loc
application_entity
_BOS);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}
/* ---------------------
* METHODE zum Speichern eines einzelnen Datensatzes
(als Teil der Historie eines BO)
* auf der Datenbank
des Servers.
* Dieses Speichern wird gebraucht wenn die
Daten eines mobilen Clients mit den Daten des Servers
* synchronisiert werden müssen.
* Im
Gegensatz zu der entsprechenden Methode für das Speichern auf der
lokalen Datenbank des Client
* kann der Primärschlüssel
(DataSetID) auf dem Server nicht durch den Client geändert
werden.
* Wurde der gleiche Primärschlüssel bereits
auf dem Server vergeben dann erfolgt der 'Tausch' des
* DataSetID
auf der 'Server-Seite' des BO (BOS). */
protected
void
synchronizedStore_JAS()
{
/*
* Client-Server-Version mit Zugriff auf die Datenbank
über den EJB-Mechanismus. *//*
* Zuerst ein BO konstruieren mit dem die Werte zum EJB
übertragen werden und das
* danach die neuen Werte
nach dem 'store()' enthält. */
application_entity
_BO
locbo
=
new
application_entity
_BO();
/*
* Die Werte dieses BOC in das BO übertragen.
*
Das ist notwendig weil beim Aufruf der Methode des EJB so wenig Daten
wie möglich
* übertragen werden sollen.
*/
locbo.copyFromapplication_entity
_BO(
this
);
/*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Wrapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
locbo
= instanceStandardEJB.
application_entity
_BO__synchronizedStore(
frmTask
.
structMinParm
,
locbo);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
this
.copyFrom
application_entity
_BO(locbo);
}
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
this
.
StatusMsg
= e.getMessage();
}
}
/* ---------------------
* METHODEN zum Aufrufen der Geschäfts-spezifischen
Datenbank-Operationen.
* In diesem Muster sind nur die
'case'-Zweige für 'Stand-Alone' und 'Fat-Client'
*
Versionen enthalten.
*
* Der Abgleich
der Daten zwischen lokaler Datenbank und Server bei der
'Mobile-Client'
* Version erfordert eine genaue Analyse,
wann Daten der lokalen Datenbank verwendet
* werden können
und wann nicht.
* Daher kann kein allgemein gültiger
Algorithmus als Muster vorgegeben werden. *//* ---------------------
* METHODE zum Speichern der neu eingegebenen oder
geänderten Variablen dieses BO. *//*
*
Zuerst die Methode für den direkten Zugriff auf die Datenbank.
*/
private
void
store_DB()
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode Änderungen auf der Datenbank ausgeführt werden,
* wird als Parameter 'read-write' - nicht 'autocommit'
- festgelegt. */
getDatabaseConnection(false
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren' und
dabei dieses Client-Side-BO als Parameter
* übergeben
damit die Werte der geschäfts-spezifischen Variablen kopiert werden
können. */
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
this
,
true
);
/*
* Methode zum Speichern der Werte aufrufen.
*/
bosapplication_entity
.store();
/*
* Fehlerbehandlung wenn das 'store' nicht
ordnungsgemäß beendet wurde.
* Rollback ausführen
und Verbindung zur Datenbank schließen.
* Nebenbemerkung:
* In
der Methode 'returnReservedConnection' (etwas weiter unten)
wird
* geprüft, ob die Verbindung zur Datenbank
(DB-Connection) noch 'offen' ist.
* Wenn die
DB-Connection noch offen ist, wird in der Methode
'returnReservedConnection'
* ein 'commit' ausgeführt
und die DB-Connection geschlossen. */
if
(bos
application_entity
.
StatusCode
!=
JSBS_BO.
CONST_OK
)
{
/*
* Sowohl 'rollback' als auch 'close' liefern im
Fehlerfall eine 'Exception'. */
try
{
structDBCon
.rollback();
structDBCon
.close();
}
catch
(Exception
e) {
/*
* Blöde Situation wenn 'rollback' oder 'close' in der
Situation auch nicht mehr
* funktionieren.
* Nachdem
das Speichern der neuen Daten nicht funktioniert hat, ist es aber
* Aufgabe der aufrufenden Methode, eine
Fehlerbehandlung auszuführen. */
}
}
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geänderte Common-Attributes,
Status-Code und Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}/*
* Methode
zum Lesen der Daten über den JAS (Java Application Server).
*/
private
void
store_JAS()
{
/*
* Client-Server-Version mit Zugriff auf die Datenbank
über den EJB-Mechanismus. *//*
* Zuerst ein BO konstruieren mit dem die Werte zum EJB
übertragen werden und das
* danach die neuen Werte
nach dem 'store()' enthält. */
application_entity
_BO
locbo
=
new
application_entity
_BO();
/*
* Die Werte dieses BOC in das BO übertragen.
*
Das ist notwendig weil beim Aufruf der Methode des EJB so wenig Daten
wie möglich
* übertragen werden sollen.
*/
locbo.copyFromapplication_entity
_BO(
this
);
/*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Wrapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
locbo
= instanceStandardEJB.
//
application_entity
_BO__store(
frmTask
.
structMinParm
,
locbo);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
}/*
* Methode
die abhängig von der Version des Anwendungsprogramms die
entsprechende(n)
* Methode(n) mit dem Code, der die
wirkliche Arbeit macht, aufruft. */
public
void
store()
{
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
* Client/Server-Version
(FatClient) implementiert ist. */
switch
(
frmTask
.
frmCC
.
RunVersion
)
{
case
JSBS_StartFrame.
CONST_StandAlone
:
/*
Einzelplatzversion. Datenbank läuft auf der lokalen Maschine;
Spezielle Methode aufrufen. */
store_DB();
break
;
/*
*/
case
JSBS_StartFrame.
CONST_FatClient
:
/*
Client-Server-Version.
*
Datenzugriff erfolgt über den EJB-Mechanismus und JAS (Java
Application Server); spezielle Methode aufrufen. */
store_JAS();
break
;
/*
*/
case
JSBS_StartFrame.
CONST_MobileClient
:
/*
* Für diese Version folgt jetzt ein generelles Muster.
*
Es ist im Einzelfall zu analysieren und zu entscheiden, welcher
Algorithmus (welches Vorgehen)
* möglich ist wenn der
Mobile Client (z.B. Notebook) keine Verbindung zum Server aufbauen
kann.
* Wenn eine 'MobileClient' Version nicht für
das Anwendungsprogramm vorgesehen ist, dann kann
* der
Code innerhalb dieses 'case' gelöscht werden.
* Damit
wird vermieden, dass nicht vorhandene Klassen und Methoden
'auskommentiert' werden müssen. */
/*
* Prüfen, ob die
Verbindung zum JAS existiert. Abhängig davon erfolgt die weitere
Verarbeitung. */
if
(
frmCC
.testJASConnection())
{
/*
Daten vom JAS abfragen. */
store_JAS();
/*
Prüfen, ob die Operation am JAS wie erwartet geendet hat.
*/
if
(
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
{
/*
Operation am JAS wie erwartet; jetzt noch
Methode
zum Prüfen, ob die Daten zwischen Server und
* mobilem
Client abgeglichen werden müssen, und zum eventuell notwendigen
Abgleichen, aufrufen.
*/
synchronizeBO();
}
/*
Fehler bei der Operation auf dem JAS - Methode beenden.
*
Damit ist der Status-Code für die aufrufende Methode abfragbar.
*/
else
return
;
}
else
{
/*
Verbindung zum JAS unterbroche; als 'offline'-Lösung die Operation
auf der lokalen Datenbank ausführen.
*/
store_DB();
}
/*
*** */
break
;
}
}/* ---------------------
* METHODE zum Deaktivieren eines BO. *//*
*
Zuerst die Methode für den direkten Zugriff auf die Datenbank.
*/
private
void
deactivate_DB()
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode Änderungen auf der Datenbank ausgeführt werden,
* wird als Parameter 'read-write' - nicht 'autocommit'
- festgelegt. */
getDatabaseConnection(false
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
this
,
true
);
/*
* Methode zum Deaktivieren des BO aufrufen.
*/
bosapplication_entity
.deactivate();
/*
* Fehlerbehandlung wenn das 'deactivate' nicht
ordnungsgemäß beendet wurde.
* Rollback ausführen
und Verbindung zur Datenbank schließen.
* Nebenbemerkung:
* In
der Methode 'returnReservedConnection' (etwas weiter unten)
wird
* geprüft, ob die Verbindnung zur Datenbank
(DB-Connection) noch 'offen' ist.
* Wenn die
DB-Connection noch offen ist, wird in der Methode
'returnReservedConnection'
* ein 'commit' ausgeführt
und die DB-Connection geschlossen. */
if
(bos
application_entity
.
StatusCode
!=
JSBS_BO.
CONST_OK
)
{
/*
* Sowohl 'rollback' als auch 'close' liefern im
Fehlerfall eine 'Exception'. */
try
{
structDBCon
.rollback();
structDBCon
.close();
}
catch
(Exception
e) {
/*
* Blöde Situation wenn 'rollback' oder 'close' in der
Situation auch nicht mehr
* funktionieren.
* Nachdem
das Speichern der neuen Daten nicht funktioniert hat, ist es aber
* Aufgabe der aufrufenden Methode, eine
Fehlerbehandlung auszuführen. */
}
}
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geänderte Common-Attributes,
Status-Code und Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
}/*
* Methode
zum Lesen der Daten über den JAS (Java Application Server).
*/
private
void
deactivate_JAS()
{
/*
* Zuerst ein BO konstruieren mit dem die Werte zum EJB
übertragen werden und das
* danach die neuen Werte
nach dem 'deactivate()' enthält.
*/
application_entity
_BO locbo
=
new
application_entity
_BO();
/*
* Die Werte dieses BOC in das BO übertragen.
*
Das ist notwendig weil beim Aufruf der Methode des EJB so wenig Daten
wie möglich
* übertragen werden sollen.
*/
locbo.copyFromapplication_entity
_BO(
this
);
/*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Wrapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
locbo
=
instanceStandardEJB.
//
application_entity
_BO__deactivate(
frmTask
.
structMinParm
,
locbo);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
}/*
* Methode
die abhängig von der Version des Anwendungsprogramms die
entsprechende(n)
* Methode(n) mit dem Code, der die
wirkliche Arbeit macht, aufruft. */
public
void
deactivate()
{
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
* Client/Server-Version
(FatClient) implementiert ist. */
switch
(
frmTask
.
frmCC
.
RunVersion
)
{
case
JSBS_StartFrame.
CONST_StandAlone
:
/*
Einzelplatzversion. Datenbank läuft auf der lokalen Maschine;
Spezielle Methode aufrufen. */
deactivate_DB();
break
;
/*
*/
case
JSBS_StartFrame.
CONST_FatClient
:
/*
Client-Server-Version.
*
Datenzugriff erfolgt über den EJB-Mechanismus und JAS (Java
Application Server); spezielle Methode aufrufen. */
deactivate_JAS();
break
;
/*
*/
case
JSBS_StartFrame.
CONST_MobileClient
:
/*
* Für diese Version folgt jetzt ein generelles Muster.
*
Es ist im Einzelfall zu analysieren und zu entscheiden, welcher
Algorithmus (welches Vorgehen)
* möglich ist wenn der
Mobile Client (z.B. Notebook) keine Verbindung zum Server aufbauen
kann.
* Wenn eine 'MobileClient' Version nicht für
das Anwendungsprogramm vorgesehen ist, dann kann
* der
Code innerhalb dieses 'case' gelöscht werden.
* Damit
wird vermieden, dass nicht vorhandene Klassen und Methoden
'auskommentiert' werden müssen. */
/*
* Prüfen, ob die
Verbindung zum JAS existiert. Abhängig davon erfolgt die weitere
Verarbeitung. */
if
(
frmCC
.testJASConnection())
{
/*
Daten vom JAS abfragen. */
deactivate_JAS();
/*
Prüfen, ob die Operation am JAS wie erwartet geendet hat.
*/
if
(
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
{
/*
Operation am JAS wie erwartet; jetzt noch
Methode
zum Prüfen, ob die Daten zwischen Server und
* mobilem
Client abgeglichen werden müssen, und zum eventuell notwendigen
Abgleichen, aufrufen.
*/
synchronizeBO();
}
/*
Fehler bei der Operation auf dem JAS - Methode beenden.
*
Damit ist der Status-Code für die aufrufende Methode abfragbar.
*/
else
return
;
}
else
{
/*
Verbindung zum JAS unterbroche; als 'offline'-Lösung die Operation
auf der lokalen Datenbank ausführen.
*/
deactivate_DB();
}
/*
*** */
break
;
}
}/* ---------------------
* METHODE zum Selektieren jenes BO, dessen
Anwender-bekannte Identifikation
* in der Reihenfolge nach
der Identifikation, der in den Parametern übergeben wird kommt.
*//*
*
Zuerst die Methode für den direkten Zugriff auf die Datenbank.
*/
private
void
selectNext_DB(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode nur gelesen wird, wird als Parameter 'autocommit'
(read-only) festgelegt. */
getDatabaseConnection(true
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
true
);
/*
* Methode zum Selektieren der Werte aufrufen.
*/
bosapplication_entity
.selectNext(parm
KeyVariable_1
,
parmKeyVariable_2
);
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geschäfts-spezifische
Attribute, Common-Attributes, Status-Code
* und
Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}/*
* Methode
zum Lesen der Daten über den JAS (Java Application Server).
*/
private
void
selectNext_JAS(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/*
* Client-Server-Version mit Zugriff auf die Datenbank
über den EJB-Mechanismus. *//*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Warapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
application_entity
_BO
locbo = instanceStandardEJB.
//
application_entity
_BO__selectNext(
frmTask
.
structMinParm
,
//
parm
KeyVariable_1
,
//
parm
KeyVariable_2
);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
}/*
* Methode
die abhängig von der Version des Anwendungsprogramms die
entsprechende(n)
* Methode(n) mit dem Code, der die
wirkliche Arbeit macht, aufruft. */
public
void
selectNext(String
parm
KeyVariable_1
,
String
parm
KeyVariable_2
)
{
/* Prüfen,
ob die Werte 'null' sind (kann unter gewissen Umständen passieren)
und in diesem Fall
* die Werte durch eine leere
Zeichenkette oder einen numerischen Wert ersetzen. */
if
(parm
KeyVariable_1
==
null
)
parm
KeyVariable_1
=
""
;
if
(parm
KeyVariable_2
==
null
)
parm
KeyVariable_2
=
""
;
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
* Client/Server-Version
(FatClient) implementiert ist. */
switch
(
frmTask
.
frmCC
.
RunVersion
)
{
case
JSBS_StartFrame.
CONST_StandAlone
:
/*
Einzelplatzversion. Datenbank läuft auf der lokalen Maschine;
Spezielle Methode aufrufen. */
selectNext_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_FatClient
:
/*
Client-Server-Version.
*
Datenzugriff erfolgt über den EJB-Mechanismus und JAS (Java
Application Server); spezielle Methode aufrufen. */
selectNext_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_MobileClient
:
/*
* Für diese Version folgt jetzt ein generelles Muster.
*
Es ist im Einzelfall zu analysieren und zu entscheiden, welcher
Algorithmus (welches Vorgehen)
* möglich ist wenn der
Mobile Client (z.B. Notebook) keine Verbindung zum Server aufbauen
kann.
* Wenn eine 'MobileClient' Version nicht für
das Anwendungsprogramm vorgesehen ist, dann kann
* der
Code innerhalb dieses 'case' gelöscht werden.
* Damit
wird vermieden, dass nicht vorhandene Klassen und Methoden
'auskommentiert' werden müssen. */
/*
* Zuerst die
Daten von der lokalen Datenbank abfragen. Per Definition muss das
immer möglich sein. */
selectNext_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage auf der lokalen Datenbank
aufgetreten ist. In diesem Fall die
* Methode beenden -
damit ist der Status für die aufrufende Methode verfügbar.
*/
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage von der lokalen Datenbank.
*/
}
else
return
;
/*
Prüfen, ob die Verbindung zum JAS existiert. Abhängig davon erfolgt
die weitere Verarbeitung. */
if
(
frmCC
.testJASConnection())
{
/*
BO für die Daten der lokalen Datenbank und den Daten vom JAS
konstruieren.
* Damit können später die jeweiligen Daten
verglichen und Unterschiede behandelt werden.
*/
application_entity
_BO
struct
application_entity
_BO_Local
=
new
application_entity
_BO();
application_entity
_BO
struct
application_entity
_BO_JAS
=
new
application_entity
_BO();
/*
Ergebnis der Abfrage der lokalen Datenbank auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_Local.copyFrom
application_entity
_BO(
this
);
/*
Daten vom JAS abfragen.
*/
selectNext_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage vom JAS aufgetreten ist. In
diesem Fall die
* Methode beenden - damit ist der Status für
die aufrufende Methode verfügbar. */
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage vom JAS.
*/
}
else
return
;
/*
Ergebnis der Abfrage über den JAS auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_JAS.copyFrom
application_entity
_BO(
this
);
/*
Methode zum Abgleich der Daten von beiden Quellen aufrufen.
*/
getNewestBO(struct
application_entity
_BO_Local,
struct
application_entity
_BO_JAS);
/*
Methode zum Prüfen, ob die Daten zwischen Server und mobilem Client
abgeglichen werden müssen,
* und zum eventuell
notwendigen Abgleichen aufrufen.
*/
synchronizeBO();
}
/*
*** */
break
;
}
}/* ---------------------
* METHODE zum Selektieren jenes BO, dessen
Anwender-bekannte Identifikation
* in der Reihenfolge vor
der Identifikation, die in den Parametern übergeben wird kommt.
*//*
*
Zuerst die Methode für den direkten Zugriff auf die Datenbank.
*/
private
void
selectPrevious_DB(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode nur gelesen wird, wird als Parameter 'autocommit'
(read-only) festgelegt. */
getDatabaseConnection(true
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
true
);
/*
* Methode zum Selektieren der Werte aufrufen.
*/
bosapplication_entity
.selectPrevious(parm
KeyVariable_1
,
parmKeyVariable_2
);
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geschäfts-spezifische
Attribute, Common-Attributes, Status-Code
* und
Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}/*
* Methode
zum Lesen der Daten über den JAS (Java Application Server).
*/
private
void
selectPrevious_JAS(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/*
* Client-Server-Version mit Zugriff auf die Datenbank
über den EJB-Mechanismus. *//*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Warapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
application_entity
_BO
locbo = instanceStandardEJB.
//
application_entity
_BO__selectPrevious(
frmTask
.
structMinParm
,
//
parm
KeyVariable_1
,
//
parm
KeyVariable_2
);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
}/*
* Methode
die abhängig von der Version des Anwendungsprogramms die
entsprechende(n)
* Methode(n) mit dem Code, der die
wirkliche Arbeit macht, aufruft. */
public
void
selectPrevious(String
parm
KeyVariable_1
,
String
parm
KeyVariable_2
)
{
/* Prüfen,
ob die Werte 'null' sind (kann unter gewissen Umständen passieren)
und in diesem Fall
* die Werte durch eine leere
Zeichenkette oder einen numerischen Wert ersetzen. */
if
(parm
KeyVariable_1
==
null
)
parm
KeyVariable_1
=
""
;
if
(parm
KeyVariable_2
==
null
)
parm
KeyVariable_2
=
""
;
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
* Client/Server-Version
(FatClient) implementiert ist. */
switch
(
frmTask
.
frmCC
.
RunVersion
)
{
case
JSBS_StartFrame.
CONST_StandAlone
:
/*
Einzelplatzversion. Datenbank läuft auf der lokalen Maschine;
Spezielle Methode aufrufen. */
selectPrevious_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_FatClient
:
/*
Client-Server-Version.
*
Datenzugriff erfolgt über den EJB-Mechanismus und JAS (Java
Application Server); spezielle Methode aufrufen. */
selectPrevious_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_MobileClient
:
/*
* Für diese Version folgt jetzt ein generelles Muster.
*
Es ist im Einzelfall zu analysieren und zu entscheiden, welcher
Algorithmus (welches Vorgehen)
* möglich ist wenn der
Mobile Client (z.B. Notebook) keine Verbindung zum Server aufbauen
kann.
* Wenn eine 'MobileClient' Version nicht für
das Anwendungsprogramm vorgesehen ist, dann kann
* der
Code innerhalb dieses 'case' gelöscht werden.
* Damit
wird vermieden, dass nicht vorhandene Klassen und Methoden
'auskommentiert' werden müssen. */
/*
* Zuerst die
Daten von der lokalen Datenbank abfragen. Per Definition muss das
immer möglich sein.
*/
selectPrevious_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage auf der lokalen Datenbank
aufgetreten ist. In diesem Fall die
* Methode beenden -
damit ist der Status für die aufrufende Methode verfügbar.
*/
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage von der lokalen Datenbank.
*/
}
else
return
;
/*
Prüfen, ob die Verbindung zum JAS existiert. Abhängig davon erfolgt
die weitere Verarbeitung. */
if
(
frmCC
.testJASConnection())
{
/*
BO für die Daten der lokalen Datenbank und den Daten vom JAS
konstruieren.
* Damit können später die jeweiligen Daten
verglichen und Unterschiede behandelt werden.
*/
application_entity
_BO
struct
application_entity
_BO_Local
=
new
application_entity
_BO();
application_entity
_BO
struct
application_entity
_BO_JAS
=
new
application_entity
_BO();
/*
Ergebnis der Abfrage der lokalen Datenbank auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_Local.copyFrom
application_entity
_BO(
this
);
/*
Daten vom JAS abfragen.
*/
selectPrevious_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage vom JAS aufgetreten ist. In
diesem Fall die
* Methode beenden - damit ist der Status für
die aufrufende Methode verfügbar. */
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage vom JAS.
*/
}
else
return
;
/*
Ergebnis der Abfrage über den JAS auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_JAS.copyFrom
application_entity
_BO(
this
);
/*
Methode zum Abgleich der Daten von beiden Quellen aufrufen.
*/
getNewestBO(struct
application_entity
_BO_Local,
struct
application_entity
_BO_JAS);
/*
Methode zum Prüfen, ob die Daten zwischen Server und mobilem Client
abgeglichen werden müssen,
* und zum eventuell
notwendigen Abgleichen aufrufen. */
synchronizeBO();
/*
***
*/
}
break
;
}
}/* ---------------------
* METHODE zum Selektieren eines aktuell gültigen BO
mit der Anwender-bekannten Identifikation.
* 'Aktuell
gültig' bedeutet, dass die Gültigkeit des Datensatzes mit dem
* im Minimalen Set von Parametern übergebenen
Arbeitsdatum übereinstimmt.
*/
/*
*
Zuerst die Methode für den direkten Zugriff auf die Datenbank.
*/
private
void
selectByUserKnownKey_DB(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/* Methode,
die die Verbindung zur Datenbank herstellt, aufrufen.
* Weil
in dieser Methode nur gelesen wird, wird als Parameter 'autocommit'
(read-only) festgelegt. */
getDatabaseConnection(true
);
/*
* Prüfen ob eine Verbindung zur Datenbank hergestellt
werden konnte.
* Eine Referenz-Nummer gleich oder
größer '0' bedeutet eine ordnungsgemäße Verbindung zur DB.
*/
if
(
intDBConReference
<
0) {
/* Verbindung
zur Datenbank konnte nicht hergestellt werden.
* Status-Code
(auf Fehler) setzen und Fehlermeldung übernehmen.
*/
StatusCode
=
CONST_DB_SYSTEM_ERROR
;
StatusMsg
=
frmCC
.
structJSBS_DB_ConnectionManager
.
StatusMsg
;
/*
* Weitere Verarbeitung abbrechen;
* Aufrufende
Methode bekommt Fehler über StatusCode signalisiert.
*/
return
;
}/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
,
true
);
/*
* Methode zum Selektieren der Werte aufrufen.
*/
bosapplication_entity
.selectByUserKnownKey(parm
KeyVariable_1
,
parmKeyVariable_2
);
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geschäfts-spezifische
Attribute, Common-Attributes, Status-Code
* und
Status-Message in diesem BOC verfügbar.
*/
copyFromapplication_entity
_BO(bos
application_entity
);
/*
* DB-Connection an den Connection-Manager zurück
geben – der Connection-Manager verwaltet
* die offene
DB-Connection und verwendet sie wieder bei der nächsten Anforderung.
*/
frmCC
.
structJSBS_DB_ConnectionManager
.returnReservedConnection(
this
,
intDBConReference
);
/*
*/
}/*
* Methode
zum Lesen der Daten über den JAS (Java Application Server).
*/
private void
selectByUserKnownKey_JAS(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/*
* Client-Server-Version mit Zugriff auf die Datenbank
über den EJB-Mechanismus. *//*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim Aufruf
der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Warapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
application_entity
_BO
locbo = instanceStandardEJB.
//
application_entity
_BO__selectByUserKnownKey(
frmTask
.
structMinParm
,
//
parm
KeyVariable_1
,
//
parm
KeyVariable_2
);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
}/*
* Methode
die abhängig von der Version des Anwendungsprogramms die
entsprechende(n)
* Methode(n) mit dem Code, der die
wirkliche Arbeit macht, aufruft. */
public
void
selectByUserKnownKey(String
parm
KeyVariable_1
,
String
parmKeyVariable_2
)
{
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
* Client/Server-Version
(FatClient) implementiert ist. */
switch
(
frmTask
.
frmCC
.
RunVersion
)
{
case
JSBS_StartFrame.
CONST_StandAlone
:
/*
Einzelplatzversion. Datenbank läuft auf der lokalen Maschine;
Spezielle Methode aufrufen. */
selectByUserKnownKey_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_FatClient
:
/*
Client-Server-Version.
*
Datenzugriff erfolgt über den EJB-Mechanismus und JAS (Java
Application Server); spezielle Methode aufrufen. */
selectByUserKnownKey_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
break
;
/*
*/
case
JSBS_StartFrame.
CONST_MobileClient
:
/*
* Für diese Version folgt jetzt ein generelles Muster.
*
Es ist im Einzelfall zu analysieren und zu entscheiden, welcher
Algorithmus (welches Vorgehen)
* möglich ist wenn der
Mobile Client (z.B. Notebook) keine Verbindung zum Server aufbauen
kann.
* Wenn eine 'MobileClient' Version nicht für
das Anwendungsprogramm vorgesehen ist, dann kann
* der
Code innerhalb dieses 'case' gelöscht werden.
* Damit
wird vermieden, dass nicht vorhandene Klassen und Methoden
'auskommentiert' werden müssen. */
/*
* Zuerst die
Daten von der lokalen Datenbank abfragen. Per Definition muss das
immer möglich sein.
*/
selectByUserKnownKey_DB(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage auf der lokalen Datenbank
aufgetreten ist. In diesem Fall die
* Methode beenden -
damit ist der Status für die aufrufende Methode verfügbar.
*/
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage von der lokalen Datenbank.
*/
}
else
return
;
/*
Prüfen, ob die Verbindung zum JAS existiert. Abhängig davon erfolgt
die weitere Verarbeitung. */
if
(
frmCC
.testJASConnection())
{
/*
BO für die Daten der lokalen Datenbank und den Daten vom JAS
konstruieren.
* Damit können später die jeweiligen Daten
verglichen und Unterschiede behandelt werden.
*/
application_entity
_BO
struct
application_entity
_BO_Local
=
new
application_entity
_BO();
application_entity
_BO
struct
application_entity
_BO_JAS
=
new
application_entity
_BO();
/*
Ergebnis der Abfrage der lokalen Datenbank auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_Local.copyFrom
application_entity
_BO(
this
);
/*
Daten vom JAS abfragen.
*/
selectByUserKnownKey_JAS(parm
KeyVariable_1
,
parm
KeyVariable_2
);
/*
Prüfen, ob ein Fehler bei der Abfrage vom JAS aufgetreten ist. In
diesem Fall die
* Methode beenden - damit ist der Status für
die aufrufende Methode verfügbar. */
if
((
this
.
StatusCode
==
JSBS_BO.
CONST_OK
)
|| (
this
.
StatusCode
==
JSBS_BO.
CONST_NOT_FOUND
))
{
/*
'Erlaubte' Status-Codes für die Abfrage vom JAS.
*/
}
else
return
;
/*
Ergebnis der Abfrage über den JAS auf die dafür vorgesehene
Variable übertragen.
*/
struct
application_entity
_BO_JAS.copyFrom
application_entity
_BO(
this
);
/*
Methode zum Abgleich der Daten von beiden Quellen aufrufen.
*/
getNewestBO(struct
application_entity
_BO_Local,
struct
application_entity
_BO_JAS);
/*
Methode zum Prüfen, ob die Daten zwischen Server und mobilem Client
abgeglichen werden müssen,
* und zum eventuell
notwendigen Abgleichen aufrufen. */
synchronizeBO();
/*
*** */
}
break
;
}
}
}
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 hilfreich zum finden der beschriebenen 'Platzhalter'.
Änderung
des Namens der Java-Packages der Anwendung
package
application_package
.boc;
/*
*
Package mit der Bibliothek der GUI-Elemente. */
.
. . . .
. . . . ./*
*
Package mit der Basisklasse für Start- und Task-Frame. */import
js_base.frame.*;
/*
*
Geerbte Generelle Klasse des BO. */import
application_package
.bo.*;
/*
*
Server-Side-Klasse des BO.
* Die Methoden in dieser Klasse
führen bei einer direkten Verbindung zur Datenbank
* die
Zugriffe auf die Datenbank-Tabelle(n) aus.
*/
import
application_package
.bos.*;
/**
D
er
Name dieses Packages kommt in der ersten Zeile des Muster-Codes und
dann noch mehrmals beim Import der zugehörigen Packages mit den
Generellen und Server-Seitigen BO Klassen, der Klasse für das
CommandCenter (Start-Frame) und auch in - noch auskommentierten -
Code-Teilen für den Aufruf der Methoden des EJB vor.
Änderung
des Namens der Klasse des CommandCenters
/*
*
Package mit der Basisklasse für Start- und Task-Frame. */import
js_base.frame.*;
/*
*
Klasse für das CommendCenter (Start-Frame) der Anwendung. */import
application_package
.client.
application
_CommandCenter;
/*
*
Geerbte Generelle Klasse des BO. */
D
er
Name dieser Klasse kommt mehrmals im Muster-Code vor.
Wenn Sie
'Find/Replace' zum Ersetzen verwenden, geben Sie bitte den Text
application
_CommandCenter
als
Suchbegriff ein; damit wird nur der Name dieser Klasse ersetzt und
nicht auch Teile anderer 'Platzhalter' die
application
enthalten.
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 BOC 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 BOC-Klasse sind innerhalb des Codes
kommentiert.
Änderung
des Namens der Klasse und der 'Constructor-Methoden'
*/
public
class
application_entity
_BOC
extends
application_entity
_BO
{
/*
Dieser
Name muss mit dem Namen der Klasse übereinstimmen, der beim Eröffnen
der Klasse gewählt wurde.
Der
Name der Klasse 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 zu
ersetzen.
application_entity
_BO
als
Vergleichswert wird deswegen gewählt weil damit auch die Variable
für die geerbte Klasse geändert wird.
Methoden
getFromGUI(...)
und
setToGUI(...)
adaptieren
/* ---------------------
* METHODE zum Übertragen der Werte aus den Variablen
dieses BO in die GUI-Elemente,
* die als Parameter
übergeben werden. */
public
void
setToGUI(JTextField
parm
GUIElement_String_Content
,
JTextField
parmGUIElement_int_Content
,
JTextField
parmGUIElement_BigInteger_Content
,
JTextField
parmGUIElement_BigDecimal_Content
,
JTextArea
parmGUIElement_TextArea
,
JComboBox
parmGUIElement_ComboBox
,
JCheckBox
parmGUIElement_CheckBox
,
JRadioButton
parmGUIElement_RadioButton
)
{
Die
Parameter der Methoden werden so adaptiert, dass für jede Variable
des BO eine passende Klasse für ein GUI-Element vorgesehen
wird.
/*
* Prüfen ob überhaupt ein Wert übergeben wurde und
dann Übertragen des Wertes aus
* der jeweiligen
Variables dieses BO in da zugehörige GUI-Element. */
if
(
parm
GUIElement_String_Content
!=
null
)
{
JSBS_GUIServices.setTextToJTextField(parm
GUIElement_String_Content
,
Variable_of_Type_String
);
}
if
(
parm
GUIElement_int_Content
!=
null
)
{
Im
Muster-Code ist ein Beispiel für jede Kombination aus (Java-)Klasse
der Variable und Klasse des GUI-Elementes enthalten.
Diese
Beispiele können kopiert und adaptiert werden.
Nicht
benötigte Beispiele müssen gelöscht werden damit der Compiler
keinen Fehler anzeigt. - aber das ist hoffentlich bekannt ;-).
Vorbereitende
Tätigkeiten bei Entwicklung einer 'MobileClient' Version des
Anwendungsprogramms
Wenn
Sie Ihr Anwendungsprogramm auch mit der möglichen Version für einen
'MobileClient' entwickeln, ist jetzt der optimale Zeitpunkt, die
dafür notwendige 'Synchronizer'-Klasse zu implementieren.
Die
Anleitung dafür finden Sie unter Leitfaden
für die Entwicklung von Heavyweight-Clients mit dem JS-FCF – Alle
Schritte zur Entwicklung von DBA (DataBase-Access) und BO
(Business-Object) Klassen > Leitfaden – BO-Synchronizer (Klasse
zur Datensynchronisation zwischen JAS und lokaler Datenbank)
und
den darin gelisteten weiteren Anleitungen.
Entfernen
Sie den Kommentar vor der Variablen-Definition für die Klasse des
'Synchronizers':
Anmerkung:
Im
Abschnitt Änderung
des Namens der Klasse und der 'Constructor-Methoden'
wurden
die Platzhalter
application_entity
_BO
bereits
durch den passenden Name für die Klasse ersetzt.
.
. . . . . . . .
. . . . . . . . .
/*
* Nummer
der in diesem Objekt geöffneten 'Connection' zur Datenbank.
*/
private
int
intDBConReference
=
0;
/*
* Objekt
für den Abgleich bei einer 'MobileClient' Version.
* In
der Klasse ist implementiert, wie die Daten eines mobile Client mit
den Daten
* am Server abgeglichen werden wenn der
mobile Client wieder mit dem Server verbunden ist.
* Wenn
eine 'MobileClient' Version implementiert ist dann muss die folgende
Zeile
* 'auskommentiert' werden. *///
private
application_entity
_BO_Synchronizer
struct
application_entity
_BO_Synchronizer
=
null
;
/* ---------------------
* CONSTRUCTOR-METHODE *//* ---------------------
.
. . . . . . . .
. . . . . . . . .
Generelle
Tätigkeiten bei Verwendung von EJB (Client-Server-Architektur)
Bevor
die Methoden des EJB (Enterprise Java Bean) aufgerufen werden
können, müssen die Methoden in den Interfaces und der Klasse für
das EJB implementiert sein.
Die Anleitung für das Hinzufügen
und Adaptieren der Methoden für ein BO finden Sie unter
Muster-Codes
für die Klasse eine EJB (Enterprise Java Bean) mit Datenbankzugriff
> Methoden für die Datenzugriffe adaptieren – generell
und
den dort folgenden Abschnitten.
Der
Platzhalter
application
_
StandardBeanRemote
muss
durch den Namen der Klasse für das EJB (vergeben in den im Dokument
Muster-Codes
für die Klasse eine EJB (Enterprise Java Bean) mit Datenbankzugriff
beschriebenen
Tätigkeiten) ersetzt werden.
Wenn Sie mehrere EJB-Klassen
verwenden und für das Ersetzen 'Find/Replace' verwenden, beachten
Sie bitte, dass Sie auch den Namen für die passende EJB-Klasse als
'Ersatz' verwenden.
Entfernen
Sie die Kommentare vor den Anweisungen zum Instanziieren des EJB,
zum Aufrufen der Methoden und zur Fehlerbehandlung.
.
. . . . . . . .
. . . . . . . . ./*
* Der Datenbankzugriff über den EJB-Mechanismus muss in
einer try/catch-Logik erfolgen
* um Fehler beim
Aufruf der Methode des EJB behandeln zu können.
*/
//
try
{
/*
*
Instanziieren (Konstruieren) des Client-seitigen Objekts ('Remote
interface') für
* den Aufruf von Methoden des EJB. Die
Methode zum Instanziieren ist im Start-Frame implementiert.
*
In diesem Muster wird das Standard-EJB verwendet.
*
* Sollte die Methode für den Datenbankzugriff in einem
anderen EJB enthalten sein
* ist das passende EJB zu
instanziieren.
*/
//
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
//
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
*
Aufrufen der 'Wrapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
//
locbo
= instanceStandardEJB.
//
application_entity
_BO__store(
frmTask
.
structMinParm
,
locbo);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
//
this
.copyFrom
application_entity
_BO(locbo);
//
}
//
catch
(Exception
e) {
/*
* Fehler beim Instanziieren des EJB oder beim Ausführen
der Methode des EJB.
* Fehlermeldung aus der Exception
übernehmen und Status setzen
*/
//
this
.
StatusCode
= JSBS_BO.
CONST_DB_UNKNOWN_ERROR
;
//
this
.
StatusMsg
= e.getMessage();
//
}
break
;
Beim
Instanziieren des EJB ist die entsprechende EJB-Klasse und die
Methode zum 'Holen' eines Objekts der EJB-Klasse manuell zu
adaptieren:
*
Sollte die Methode für den Datenbankzugriff in einem anderen EJB
enthalten sein
* ist das passende EJB zu instanziieren.
*/
application_package
.ejb.interfaces.remote.
application
_
StandardBeanRemote
instanceStandardEJB
=
frmCC
.
struct
application
_
CommandCenter__JASConnections
.get_
application
_
StandardBeanRemote();
/*
Beim
Adaptieren dieser Platzhalter beachten Sie bitte, dass das Ausführen
von Methoden des BOS auch in verschiedenen EJB erfolgen kann –
abhängig von Ihrer Architektur des Anwendungsprogramms - und damit
auch die Verbindung zu verschiedenen EJB hergestellt werden
muss.
Aus
diesem Grund enthält dieses Dokument auch keine Beschreibung, wie
die Platzhalter durch 'Find/Replace' ersetzt werden können.
Aufruf
der Methoden
store()
und
deactivate()
des
BOS adaptieren
Die
Platzhalter des Design-Patterns sind so standardisiert, dass über
ein 'Find/Replace' im Abschnitt
Änderung
des Namens der Klasse und der 'Constructor Methoden'
auch
in den Methoden
store()
und
deactivate()
die
Platzhalter (
application_entity
_BO
)
durch die geforderten Werte ersetzt werden.
Eine zusätzliche
Adaptierung ist nicht notwendig.
Aufruf
der Methoden
store()
und
deactivate()
des
EJB adaptieren
Die
Platzhalter des Design-Patterns sind so standardisiert, dass über
die generellen Adaptierungen alle Platzhalter durch die benötigten
Namen ersetzt werden.
Aufruf
der Methoden
select...(...)
des
BOS adaptieren
Die
Platzhalter des Design-Patterns sind so standardisiert, dass über
ein 'Find/Replace' im Abschnitt
Änderung
des Namens der Klasse und der 'Constructor Methoden'
auch
in den Methoden für die Abfragen (
select...(...)
)
auf die Datenbank-Tabellen die Platzhalter (
application_entity
_BO
)
durch die geforderten Werte ersetzt werden.
Zusätzlich
ist noch eine Anpassung der Selektionskriterien für die Abfrage
notwendig.
Das ist einmal in der Methodendeklaration
notwendig:/* ---------------------
* METHODE zum Selektieren jenes BO, dessen
Anwender-bekannte Identifikation
* in der Reihenfolge nach
dem Schlüssel, der in den Parametern übergeben wird kommt.
*/
public
void
selectNext
(String
parmKeyVariable_1,
String
parmKeyVariable_2)
{
/*
* Entscheiden, ob diese Application als
Einzelplatz-Version (StandAlone) oder
Weiters
muss auch der Aufruf der Methode des zugehörigen BOS adaptiert
werden:
/*
* Einzelplatz-Version bzw. Datenbank-Zugriff über
TCP/IP-Netzwerk.
* Server-Side-BO 'konstruieren'.
*/
application_entity
_BOS
bos
application_entity
=
new
application_entity
_BOS(
frmTask
.
structMinParm
,
structDBCon
);
/*
* Methode zum Selektieren der Werte aufrufen.
*/
bosapplication_entity
.selectNext(
parmKeyVariable_1,
parmKeyVariable_2);
/*
* Neue Werte des BOS wieder in dieses BOC
übertragen.
* Damit sind geschäfts-spezifische
Attribute, Common-Attributes, Status-Code
Aufruf
der Methoden
select...(...)
des
EJB adaptieren
Die
Platzhalter des Design-Patterns sind so standardisiert, dass über
die generellen Adaptierungen alle allgemeinen Platzhalter durch die
benötigten Namen ersetzt werden.
Individuell
muss der Aufruf der Methode des zugehörigen BOS adaptiert werden:
/*
*
Aufrufen der 'Warapper'-Methode des EJB. In dieser 'Wrapper'-Methode
wird die - zu dieser
* BOC-Methode - passende
Server-seitige Methode aufgerufen.
* Neue Werte des BO und
eventuelle Fehlermeldungen sind im zurückgelieferten BO enthalten.
*/
application_entity
_BO
locbo = instanceStandardEJB.
application_entity
_BO__selectNext(
frmTask
.
structMinParm
,
parmKeyVariable_1,
parmKeyVariable_2);
/*
* Werte des zurück gelieferten BO auf dieses BOC
(Client-seitiger Teil des BO) übertragen.
*/
this
.copyFrom
application_entity
_BO(locbo);
Dokument |
Inhalt |
In diesem Leitfaden werden alle Tätigkeiten für die Entwicklung der Zugriffe auf Daten gelistet – auch jene die nicht direkt das Codieren in Java umfassen. |
|
Muster-Code für
die BO-Klasse, mit denen eine Liste von Datensätzen selektiert
werden kann. |
|
Schritt desTutorials für die Entwicklung von Heavyweight-Client Anwendungen in dem die Implementierung der Client-Side-Klasse für das BO vorgestellt wird. |