Lade...
 

Unterschiede, Arbeitsweise und Parameter der CollectObjects-Funktion des Object-Managers

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

Parameter
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.
0 ganze Datenbank durchsuchen ... diese Variante muss benutzt werden bei
  • Segment-Splitting
  • Clustering wenn die gesuchten Objekte Slave-Objekte sind
1 es wird nur im aktuellen Objekt-Segment der Klasse gesucht

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

Parameter
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.

FALSE

nur Objekte der mit dem Parameter nClassID angegeben Klasse

TRUE

auch Objekte abgeleiteter Klassen berücksichtigen

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

Parameter
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.
FALSE nur Objekte der mit dem Parameter nClassID angegeben Klasse
TRUE auch Objekte abgeleiteter Klassen berücksichtigen

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.
0 Normal weitermachen und die nächsten nMaxElements liefern
1 neu von Anfang an suchen
2 Recover: Die letzte Collection soll erneut gesendet werden. Dies ist sinnvoll, wenn bei der Verarbeitung der Collection im Instant-View Code ein Fehler aufgetreten ist und dieser behoben wurde.

Code-Beispiele

  Define (Beispiel_fuer_CollectObjects2)
    // 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 
  ;