Unterschiede, Arbeitsweise und Parameter der CollectObjects-Funktionen des Objekt-Managers
Allgemeines
Die Funktionen CollectObjects sammeln alle Objekte einer Klasse in der Datenbank und geben diese
an den Aufrufenden zurück.
Durch die Vielzahl der Objekte sind in den verschiedenen Anwendungsfällen Probleme aufgetaucht, die
es notwendig gemacht haben, mehrere Versionen zu implementieren.
Siehe auch CX_DB_UTLILITY::FindAll.
CollectObjects
Sammelt die Objekte der geforderten Klasse mit dem ObjectStore-Konstrukt os_dynamic_extent.
Das ist die effektivste Methode, aber es gibt folgende Besonderheiten:
- die Ergebnis-Collection ist pointer-basiert, kann also nach dem Transaktionsende nicht mehr verwendet werden
- Address-Space-Überlauf wird nicht behandelt
Syntax:
nClassID nMode GetManager(OBJECT) Call(CollectObjects) -> collFoundObjects
Name | Bedeutung | ||||
---|---|---|---|---|---|
nClassID |
Eine Klassen-ID nach dem Schema CX_CLASS_ID (z.B. CX_STAFF_MEMBER) | ||||
nMode |
Der Parameter mode steuert, ob die gesamte Datenbank oder nur das aktive Segment der Klasse durchsucht wird. Die Werte sind der folgenden Tabelle zu entnehmen.
|
CollectObjects2
Die Objekte werden mit einer ClassiX®-eigenen Routine aufgesammelt, wobei Address-Space-Überlauf behandelt wird. Wie bei CollectObjects() bestimmt der erste Parameter die Klasse. Der zweite Parameter steuert, ob auch von dieser Klasse abgeleitete Objekte mit aufgesammelt werden.
Die Funktion CollectObjects2 startet und beendet Transaktionen selbständig. Vor dem Aufruf darf keine Transaktion offen sein, da sonst die maximale Freigabe von Address-Space nach einem Überlauf nicht möglich ist!
Das Ergebnis ist eine ("normale") referenz-basierte Collection, die auch über Transaktionsgrenzen hinweg aufgehoben werden kann.
Es wird immer die gesamte Datenbank durchsucht.
Syntax:
nClassID bInheritance GetManager(OBJECT) Call(CollectObjects2) -> collFoundObjects
Name | Bedeutung | ||||
---|---|---|---|---|---|
nClassID |
Eine Klassen-ID nach dem Schema CX_CLASS_ID (z.B. CX_STAFF_MEMBER) | ||||
bInheritance |
Der Parameter mode steuert, ob die gesamte Datenbank oder nur das aktive Segment der Klasse durchsucht wird. Die Werte sind der folgenden Tabelle zu entnehmen.
|
CollectObjects3
Die Objekte werden mit einer ClassiX®-eigenen Routine aufgesammelt, wobei Address-Space-Überlauf behandelt wird.
Die Funktion CollectObjects3 startet und beendet Transaktionen selbständig. Vor dem Aufruf darf keine Transaktion offen sein, da sonst die maximale Freigabe von Address-Space nach einem Überlauf nicht möglich ist!
Das Ergebnis ist eine ("normale") referenz-basierte Collection mit maximal nMaxElements Objekten, die auch über Transaktionsgrenzen hinweg aufgehoben werden kann. Ist diese Collection abgearbeitet, kann man sich mit einem erneuten Aufruf von CollectObjects3() die nächsten nMaxElements Objekte geben lassen. Ist die Ergebnis-Collection leer, dann wurde das Durchsuchen der Datenbank erfolgreich beendet.
Es wird immer die gesamte Datenbank durchsucht.
Syntax:
nCmd nMaxElements nClassID bInheritance GetManager(OBJECT) Call(CollectObjects2) -> collFoundObjects
Name | Bedeutung | ||||||
---|---|---|---|---|---|---|---|
bInheritance |
Der Parameter mode steuert, ob die gesamte Datenbank oder nur das aktive Segment der Klasse durchsucht wird. Die Werte sind der folgenden Tabelle zu entnehmen.
|
||||||
nClassID |
Eine Klassen-ID nach dem Schema CX_CLASS_ID (z.B. CX_STAFF_MEMBER) | ||||||
nMaxElements |
Ein Integer-Wert, der die maximale Größe der Ergebnis-Collection bestimmt. | ||||||
nCmd |
Bestimmt den Modus, in dem CollectObjects3() beim nächsten Aufruf ausgeführt werden soll. Die Werte sind der nachfolgenden Tabelle zu entnehmen.
|
Code-Beispiele
// hier wird der CollectObjects2 gestartet MIT Inheritance
// das Ergebnis ist eine Collection mit allen gefundenen Objekten,
// also auch den von CX_TELECOM abgeleiteten !!!
CX_TELECOM TRUE GetManager(OBJECT) Call(CollectObject2)
iterate
{
// hier wird etwas mit den gesammelten Objekten getan.
// z.B. ein Reorg, Retype, oder ähnliches
}
;
Define (Beispiel_fuer_CollectObjects3)
Var(CO3_NORMAL, CO3_RESET, CO3_REPEAT, nMode)
0 -> CO3_NORMAL
1 -> CO3_RESET
2 -> CO3_REPEAT
// Modus für den ersten Aufruf muss CO3_RESET sein
CO3_RESET -> nMode
do {
// hier wird der CollectObjects3 gestartet OHNE Inheritance
// das Ergebnis ist eine Collection mit maximal 5000 Objekten
nMode 5000 CX_ATTRIBUTE_SET FALSE GetManager(OBJECT) Call(CollectObject3)
// Modus für folgende Aufrufe auf CO3_NORMAL setzen
CO3_NORMAL -> nMode
// Test, ob das Durchsuchen beendet ist...
Dup if Cardinality 0 = if
{ Drop break }
// Bearbeiten der Ergebnis Collection
iterate
{
// hier wird etwas mit den gesammelten Objekten getan.
// z.B. ein Reorg, Retype, oder ähnliches
}
} loop
;