Suche
  • Ihr Partner für IT-Aufgaben
  • info@korkisch.eu • +49 (0) 7151 944 54 90
Suche Menü

Shared Objects Memory als Datenpuffer (Teil 2)

Um das Shared Objects Memory (SOM) zu nutzen benötigen wir zunächst eine Wurzelklasse. Diese Wurzelklasse beschreibt die Instanzobjekte, welche später im SOM abegelegt werden. Die Wurzelklasse muss Shared-Memory-fähig sein. Dazu muss in den Eigenschaften der Klasse das entsprechende Häkchen gesetzt werden. Diese Klasse kann weitere Referenzen auf andere Objekte halten, welche widerrum Shared-Memory-fähig sein muss.

Die Verwaltung der im SOM abgelegten Daten erfolgt über sogenannte Gebiete. Jedes Gebiet ist mit einer Wurzelklasse verknüpft. Gebiete werden über die Transaktion SHMA angelegt bzw. bearbeitet. Über das Gebiet werden verschiedene Einstellungen unter anderem zum Laufzeitverhalten des SOM Gebiets definiert. Beim Anlegen eines Gebiets wird automatisch eine Klasse mit dem Namen des Gebiets generiert, die sogenannte Gebietsklasse. Diese Klasse erbt von Klasse CL_SHM_AREA.

Zudem kann ein Gebiet eine Kunstruktorklasse besitzen, diese Klasse implementiert das Interface IF_SHM_BUILD_INSTANCE und dient u.a. zum Aufbau der Gebietsinstanzen. Außerdem kann diese Klasse dazu genutzt werden beim erstmaligen Aufruf alle benötigten Daten zu ermitteln und zu berechnen. Soll dies automatisch geschehen, muss in den Einstellungen zum Gebiet die Option „Automatischer Aufbau“ gesetzt sein.

Anlegen eines Gebiets

Transaktion SHMA, als Name des Gebiets wählen wir ZCL_SFLIGHT_AREA. Der Präfix ZCL ist empfehlenswert da im Hintergrund die Gebietsklasse mit selbigen Namen generiert wird.
Transaktion SHMANach einem Klick auf „Anlegen“ müssen verschiedene Angaben zum Gebiet gemacht werden. Ein Pflichtfeld ist die Angabe der Wurzelklasse des Gebiets.

Transaktion SHMA, Eigenschaften

Anlegen der Wurzelklasse

Die Wurzelklasse kann per Vorwärtsnavigation angelegt werden. Dazu tragen wir den Namen der Klasse in das Feld Wurzelklasse im Bereich Grundeigenschaften ein.

SHMA Grundeinstellungen, WurzelklasseNach der Bestätigung unserer Eingabe mit „Enter“ werden wir gefragt, ob wir die Klasse anlegen wollen.

SHMA, Wurzeldatenklasse anlegenSHMA Wurzeldatenklasse anlegen 2

Nachdem die Klasse angelegt wurde, muss sie in den Eigenschaften als Shared-Memory-fähig markiert werden.

SOM WurzelklasseZur Veranschaulichung implementieren wir 2 Methoden und definieren eine Attribut als Tabelle, welche die gelesenen Daten hält.

Wurzelklasse WurzelklasseWurzelklasse

Methode SET_SFLIGHT

liest die Daten von der Datenbank und legt sie im Attribut OTO_SFLIGHT ab.

METHOD set_sflight.
  CLEAR oto_sflight[].
  SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE me->oto_sflight[].
ENDMETHOD.

Methode GET_SFLIGHT_BY_ID

liefert zur ID der Fluglinie alle Einträge aus der Tabelle OTO_SFLIGHT.

METHOD get_sflight_by_id.
  FIELD-SYMBOLS: <line> TYPE sflight.

  CLEAR et_sflight[].

  LOOP AT me->oto_sflight[] ASSIGNING <line>
    WHERE carrid EQ iv_carrid.

    APPEND <line> TO et_sflight[].

  ENDLOOP.

ENDMETHOD.

Nach dme Aktivieren der Klasse ZCL_SFLIGHT_AREA_ROOT kehren wir mit F3 zurück in die Transaktion SHMA. Dort werden wir nun aufgefordert die Konstruktorklasse anzulegen.

Anlegen der Konstruktorklasse

Dynamische EinstellungenDa wir unter Grundeigenschaften die Option „Automatischer Aufbau“ aktiviert haben, müssen wir die Konstruktorklasse benennen. Als Namen geben wir ZCL_SFLIGHT_AREA_LOAD an und bestätigen mit „Enter“. Da hier kein Anlegen per Vorwärtsnavigation möglich ist, öffnen wir einen weiteren Modus und starten die Transaktion SE24 (bzw. SE80). Dort legen wir die Klasse ZCL_SFLIGHT_AREA_LOAD an und implementieren das Interface IF_SHM_BUILD_INSTANCE.

KonstruktorklasseDie Methode BUILD muss implementiert werden.

METHOD if_shm_build_instance~build.

  DATA: lo_sflight_area TYPE REF TO zcl_sflight_area,
        lo_sflight_root TYPE REF TO zcl_sflight_area_root,
        lx_root_exception TYPE REF TO cx_root.


  TRY.
      lo_sflight_area = zcl_sflight_area=>attach_for_write( ).

      CREATE OBJECT lo_sflight_root AREA HANDLE lo_sflight_area.

      lo_sflight_area->set_root( lo_sflight_root ).

      lo_sflight_root->set_sflight( ).

      lo_sflight_area->detach_commit( ).

    CATCH cx_shm_error INTO lx_root_exception.
      RAISE EXCEPTION TYPE cx_shm_build_failed
        EXPORTING
          previous = lx_root_exception.
  ENDTRY.

ENDMETHOD.

Beim Aktivieren der Klasse tritt der Fehler auf, dass die Gebietsklasse noch nicht vorhanden ist. Dies liegt daran, dass wir das Gebiet und somit die Gebietsklasse in Transaktion SHMA noch nicht gespeichert haben. Entweder wir wählen beim Aktivieren die Option „Dennoch Aktivieren“ oder wir speichern das Gebiet nachdem wir die Option „Automatischer Aufbau“ herausgenommen und das Feld Konstruktorklasse gelöscht haben. Danach können wir die Konstruktorklasse aktivieren. Nach der Aktivierung müssen wir dann die Option „Automatischer Aufbau“ wieder setzen und können nun die Konstruktorklasse im entsprechendne Feld hinterlegen.

Da wir die Option „Automatischer Aufbau“ gewählt haben müssen wir im Bereich Laufzeiteinstellung die Option Gebietsaufbau entweder auf „Autostart bei Leseanfrage“ oder „Autostart bei Leseanfrage und jeder Invalidierung“ setzen. Ich empfehle die letztere Option, damit ist gewährleistet, dass auch nach einer Invalidierung der Gebietsinstanz eine automatische Erzeugung aller Instanzen und Daten ausgelöst wird.

Aufruf des Shared Objects

Der Zugriff auf das Shared Objects Memory und speziell auf das angelegte Gebiet ZCL_SFLIGHT_AREA könnte wie folgt aussehen. Dazu legen wir ein kleines Testprogramm an.

*&---------------------------------------------------------------------*
*& Report  ZTEST_SFLIGHT_AREA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ztest_sflight_area.
DATA: lo_sflight_area TYPE REF TO zcl_sflight_area,
      lt_sflight TYPE sflight_tab1,
      ls_sflight TYPE sflight.
TRY.
    lo_sflight_area = zcl_sflight_area=>attach_for_read( ).
    lo_sflight_area->root->get_sflight_by_id( EXPORTING iv_carrid = 'AA'
                                              IMPORTING et_sflight = lt_sflight ).
    lo_sflight_area->detach( ).
  CATCH cx_shm_attach_error.
* should do something
ENDTRY.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
  EXPORTING
    i_structure_name = 'SFLIGHT'
  TABLES
    t_outtab         = lt_sflight
  EXCEPTIONS
    program_error    = 1
    OTHERS           = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

 

Weitere Informationen

Im SAP Community Network findet man einige nützliche Informationen und Tutorials wie das Shared Objects Memory genutzt werden kann.

1 Kommentar Schreibe einen Kommentar

  1. Pingback: Shared Objects Memory als Datenpuffer (Teil 1) | Michael Korkisch - IT-Beratung

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.