Listenobjekte bearbeiten

Mit einem Listenobjekt können Sie alles tun, was Sie mit einem Einzelobjekt auch tun können, und noch ein paar Dinge mehr, nämlich:

  • Listenelemente hinzufügen oder anfügen, oder in dem Listenobjekt suchen
  • ganze Listen in andere Listen einfügen, sortieren oder löschen

Bei der Nutzung von Listenobjekten in Schleifen ist besondere Vorsicht geboten; mehr dazu lesen Sie weiter unten.

Nutzung von Listenobjekten in Schleifen

Selbstprogrammierte Schleifen über TAA-Listenobjekte

Wenn Sie eine Schleife über ein Listenobjekt programmieren, müssen Sie selbst dafür sorgen, dass die Liste während dieser Schleife nur unter Ihrer Kontrolle verändert wird. Andernfalls können schwerwiegende Fehler auftreten, die zudem je nach Laufzeitumgebung unterschiedliche Folgen haben können. (Z.B. aktuelles Listenobjekt (CURRENT) ist gelöscht worden, und anschließend wird ein PUT darauf versucht, oder die Currency hat sich aufgrund zwischenzeitlicher Einfügungen verändert.)

Am einfachsten sind Zugriffe auf das Listenobjekt zu kontrollieren, indem Sie es in einer Schleife nicht als Parameterobjekt an aufgerufene Module weitergeben. Da Sie diese Kontrolle über globale Objekten nicht ausüben können, sollten Sie globale Listenobjekte nicht für Schleifensteuerungen verwenden.

Um das aktuelle Listenelement an ein aufgerufenes Modul weiterzugeben, haben Sie im Moment nur die Möglichkeit, dies auf ein Einzelobjekt zu kopieren. Nach Verarbeitungsende müssten Sie dann das Einzelobjekt auf das Listenelement zurückzukopieren bzw. aufgrund des Zustands des gerufenen Moduls das aktuelle Element löschen, oder ein neues einfügen.

Objektmengengesteuerte Schleifen in Cedge

Es ist in Cedge möglich, eine Schleife über ein Listenobjekt zu definieren (objektmengen-gesteuerte Schleife, „FOREACH <rec> IN <lst>“). Innerhalb dieser Schleife können Module aufgerufen werden, die als Parameter ein Element aus dem Listenobjekt als Einzelobjekt (Klasse REC) erhalten.

Für das aufgerufene Modul ist nicht zu erkennen, dass es sich bei dem erhaltenen Einzelobjekt tatsächlich um ein Element aus einer Liste handelt.

Ebenso ist es möglich, dass während der Cedge-Schleife ein aufgerufenes Modul die Liste als Parameterobjekt erhält. Auch dieses Modul kann nicht erkennen, dass gerade eine Schleife über dieses Listenobjekt abgearbeitet wird.

Nach dem Ende der Schleife bleibt der Link von dem Record-Objekt auf das zuletzt benutzte Listenobjekt erhalten, und zwar so lange, bis das Record-Objekt nicht mehr existiert, oder es eine neue Verwendung bekommt, indem es z.B. durch einen NEW initialisiert wird, oder in einer neuen Schleife neu gelinkt wird.

Wenn während der Schleife in einem der aufgerufenen Module in der Liste Elemente hinzugefügt oder gelöscht werden, so kann die Verarbeitung abhängig von der Laufzeitumgebung unterschiedliche und falsche Ergebnisse liefern!

LAN

Im LAN kann die Original-Liste während der Schleife verändert werden.

Bei Beginn der Schleife in Cedge wird eine Liste aller zu dem Zeitpunkt in dem Listenobjekt enthaltenen Elemente angelegt, und nur diese Liste wird abgearbeitet. Die Umgebung erkennt, wenn ein Element aus dieser Liste zwischenzeitlich aus dem Listenobjekt gelöscht wurde, und überspringt dieses dann. Wenn in dem Listenobjekt während der Schleife neue Elemente eingefügt wurden, werden diese nicht mit verarbeitet.

Wenn Sie das mit einem Listenelement verbundene („gelinkte“) Einzelobjekt löschen, löschen Sie in Wirklichkeit das Listenelement.

Host

Auf dem Host dürfen Sie das Listenobjekt niemals verändern, während es eine Schleife steuert! Aus technischen Gründen wird dies zur Laufzeit nicht überwacht.

Wenn Sie das Listenobjekt trotzdem verändern, treten die verschiedensten unerwünschten Wirkungen auf, die sich zum Teil als Fehler bemerkbar machen, teilweise aber unbemerkt bleiben können (!), und das Ergebnis Ihrer Verarbeitung wird falsch sein.

Wenn Sie das mit einem Listenelement verbundene („gelinkte“) Einzelobjekt löschen, löschen Sie auch hier in Wirklichkeit das Listenelement.

Deshalb auch eine dringende Warnung vor der Nutzung von globalen Listenobjekten als Schleifensteuerung: Sie haben keine Kontrolle darüber, ob und wie andere Module auf diese Objekte zugreifen.

Wenn Sie sich bei der Programmierung auf das Verhalten einer dieser beiden Umgebungen verlassen, so muss Klarheit darüber bestehen, dass das Modul in einer anderen Laufzeitumgebung nicht genauso ablaufen wird.

Wenn eine solche Schleife in beiden Umgebungen gleiche Verarbeitungsergebnisse liefern soll, müssen Sie sicherstellen, dass während der Dauer dieser Schleife das steuernde Listenobjekt selbst nicht verändert wird. Dies erreichen Sie z.B., indem Sie das Listenobjekt während der Schleife nicht als Parameterobjekt an aufgerufene Module weiterreichen, und statt dessen nur Module aufrufen, die das auf das Listenelement gelinkte Einzelobjekt erhalten. Das Einzelobjekt sollte in der Schnittstelle des gerufenen Moduls nicht die Rollen CRE oder DEL haben.

Außerdem darf dafür das steuernde Listenobjekt kein globales Objekt sein.

cobref:cob:list · Zuletzt geändert: 08.04.2020 10:18

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum