Show TOC Anfang des Inhaltsbereichs

Diese Grafik wird im zugehörigen Text erklärt Verbindung zu internen Tabellen  Dokument im Navigationsbaum lokalisieren

Eine interne Standard-Tabelle wird in JavaScript als Proxy-Objekt der vordefinierten Proxy-Klasse SAPAbapItabClass abgebildet.  Sortierte Tabellen, Hash-Tabellen sowie Standardtabellen mit Sekundärschlüsseln werden nicht unterstützt.

Die Proxy-Klasse realisiert ein Array. Der JavaScript-Referenz kann über den Parameter NAME_PROP der Methode BIND ein (case-sensitiver) Name (proxy) gegeben werden. Die Zählung der Array-Elemente beginnt mit dem Index 0.

Auf eine Zeilen der internen Tabelle mit dem Index index kann über 'proxy[index]' zugegriffen werden.

Das Proxy-Objekt hat

      eine Property 'length', die die aktuelle Anzahl der Zeilen in der internen Tabelle enthält,

      eine Methode 'appendLine', die es erlaubt neue initiale Zeilen an die interne Tabelle anzuhängen

      und eine Methode 'deleteLines(idx,count)', die es erlaubt 'count' Zeilen ab Zeile 'idx' zu löschen.

Falls der Zeilentyp der internen Tabelle strukturiert ist, bilden die Komponenten der Struktur Properties des Proxy-Objekts, wobei die ABAP-Namen in Kleinbuchstaben übernommen werden.

Die ansonsten in JavaScript mögliche Vorgehensweise, neue Array-Elemente durch die Adressierung nicht vorhandener Einträge anzulegen ist nicht möglich. Wie in JavaScript üblich, beginnt die Zählung der Elemente des Arrays bei null. Das Proxy-Objekt kann in JavaScript nicht um weitere Properties oder Methoden erweitert werden. Wie Strukturen können auch interne Tabellen in JavaScript nicht als Ganzes geändert werden. Wenn in JavaScript die Schlüsselfelder einer Tabelle mit eindeutigem Schlüssel modifiziert wird, kann es zu einem Laufzeitfehler kommen, wenn die Eindeutigkeit verletzt wird.

Beispiel

report DEMO_JAVA_SCRIPT_BIND_ITAB.

data: begin of LINE,
        COMP type I,
      end of LINE.

data ITAB like standard table of LINE.

data SOURCE type STRING.
data JS_PROCESSOR type ref to CL_JAVA_SCRIPT.

JS_PROCESSOR = CL_JAVA_SCRIPT=>CREATE( ).

JS_PROCESSOR->BIND( exporting NAME_OBJ  = 'abap'
                              NAME_PROP = 'Itab'
                    changing  DATA      = ITAB ).

do 5 times.
  LINE-COMP = SY-INDEX.
  append LINE to ITAB.
enddo.

concatenate 'var len = abap.Itab.length;           '
            'var sum = 0;                          '
            'for (var i = 0; i < len; i++)         '
            '{                                     '
            '  sum += Number(abap.Itab[i].comp)    '
            '}                                     '
            'abap.Itab.appendLine();                '
            'len++;                                '
            'abap.Itab.appendLine();                '
            'len++;                                '
            'abap.Itab[len-1].comp=sum;             '
   into SOURCE separated by CL_ABAP_CHAR_UTILITIES=>CR_LF.

JS_PROCESSOR->EVALUATE( JAVA_SCRIPT = SOURCE ).

loop at ITAB into LINE.
  
write / LINE-COMP.
endloop.

Dieses Beispiel zeigt, wie in JavaScript auf eine strukturierte interne Tabelle zugegriffen werden kann. Hier wäre auch eine interne Tabelle mit elementarem ABAP-Datentyp möglich, wobei in JavaScript einfach die Angabe '.comp' entfallen würde. Das JavaScript-Programm berechnet die Summe der Einträge, hängt zwei initiale Zeilen an die interne Tabelle an und füllt den letzten Eintrag mit der Summe. Nach Aufruf der Methode EVALUATE enthält die interne Tabelle im ABAP-Programm sieben Zeilen. Beachten Sie auch, dass die interne Tabelle im ABAP-Programm nach Aufruf der Methode BIND gefüllt wurde. JavaScript arbeitet immer mit den gerade in ABAP aktuellen Daten.

Vorsicht ist geboten, wenn elementare Properties des Array-Objekt in JavaScript einer weiteren JavaScript-Variablen zugewiesen wird. Wenn die interne Tabelle in ABAP reorganisiert wird, kann die Bindung zwischen solchen Referenzen in JavaScript und ABAP verloren gehen und es kommt zu einer Ausnahme. Ein Beispiel:

Beispiel

report DEMO_JAVA_SCRIPT_BIND_ITAB.

data: begin of LINE,
        COMP type I,
      end of LINE.

data ITAB like standard table of LINE.

data SOURCE type STRING.
data RETURN_VALUE type STRING.

data JS_PROCESSOR type ref to CL_JAVA_SCRIPT.
JS_PROCESSOR = CL_JAVA_SCRIPT=>CREATE( ).

JS_PROCESSOR->BIND( DATA      = ITAB
                    NAME_OBJ  = 'abap'
                    NAME_PROP = 'Itab' ).

do 5 times.
  LINE-COMP = SY-INDEX.
  append LINE to ITAB.
enddo.

concatenate 'var pointer = abap.Itab[4];          '
            'pointer.comp;                        '
  into SOURCE separated by CL_ABAP_CHAR_UTILITIES=>CR_LF.

RETURN_VALUE = JS_PROCESSOR->EVALUATE( JAVA_SCRIPT = SOURCE ).
message
return_value TYPE 'I'.

clear ITAB.

do 5 times.
  LINE-COMP = SY-INDEX ** 2.
  append LINE to ITAB.
enddo.

SOURCE = 'pointer.comp;'.

RETURN_VALUE = JS_PROCESSOR->EVALUATE( JAVA_SCRIPT = SOURCE ).

Während der erste Aufruf der Methode noch den Wert '5' zurückgibt, führt der zweite Aufruf zu einer unbehandelbaren Ausnahme, der der Laufzeitfehler SYSTEM_DATA_ALREADY_FREE zugeordnet ist, da die JavaScript-Referenz 'pointer' auf einen undefinierten Speicherbereich zeigt.

 

Ende des Inhaltsbereichs