Zoeken…


Field-symbolen

Veldsymbolen zijn ABAP's equivalent aan wijzers, behalve dat veldsymbolen altijd van een referentie zijn verwijderd (het is niet mogelijk om het werkelijke adres in het geheugen te wijzigen).

Verklaring

Om een veldsymbool te declareren, moet het trefwoord FIELD-SYMBOLS worden gebruikt. Typen kunnen generiek zijn ( ANY [... TABLE] ) om een grote verscheidenheid aan variabelen te verwerken.

FIELD-SYMBOLS: <fs_line>     TYPE any,    "generic
               <fs_struct>   TYPE kna1.   "non-generic

toewijzen

Veldsymbolen zijn unassigned op aangifte, wat betekent dat ze naar niets wijzen. Toegang tot een niet-toegewezen veldsymbool zal leiden tot een uitzondering en, indien niet gevangen, tot een korte dump. Daarom moet de status worden gecontroleerd met IS ASSIGNED :

IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.

Omdat het slechts referenties zijn, kunnen er geen echte gegevens worden opgeslagen. Dus, verklaarde DATA is nodig in elk geval van gebruik.

DATA: w_name  TYPE string VALUE `Max`,
      w_index TYPE i      VALUE 1.
 
FIELD-SYMBOLS <fs_name> TYPE any.

ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'.        "Changes to <fs_name> now also affect w_name

* As <fs_name> is generic, it can also be used for numbers

ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.    
ADD 1 TO <fs_name>.          "w_index gets incremented by one

Unassigning

Soms kan het handig zijn om een veldsymbool opnieuw in te stellen. Dit kan met behulp van UNASSIGN .

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

Gebruik voor interne tabellen

Veldsymbolen kunnen worden gebruikt om interne tabellen te wijzigen.

LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
    wa-name1 = 'Max'. 
ENDLOOP.    

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
    <fs>-name1 = 'Max'. 
ENDLOOP.

Aandacht! Veldsymbolen blijven toegewezen, zelfs na het verlaten van de lus. Als u ze veilig wilt hergebruiken, moet u ze ongedaan maken.

Gegevensreferenties

Essentieel voor gegevensreferenties is de toevoeging REF TO na TYPE .

Dynamische creatie van structuren

Als het type van een structuur moet worden beslist op runtime, kunnen we ons doel structuur te definiëren als verwijzing naar de algemene soort data .

DATA wa TYPE REF TO data.

Om wa een type te geven gebruiken we de instructie CREATE DATA . De toevoeging TYPE kan worden gespecificeerd door:

Referentie:

CREATE DATA wa TYPE kna1

  • Statische controles zijn actief, dus het is niet mogelijk om een onbekend type te maken

Naam:

CREATE DATA wa TYPE (lw_name_as_string)

  • De haakjes zijn nodig en lw_name_as_string bevat de typen name als string.
  • Als het type niet werd gevonden, wordt een uitzondering van het type CX_SY_CREATE_DATA_ERROR gegenereerd

Voor het starten van dynamisch gemaakte typen kan de toevoeging HANDLE worden opgegeven. HANDLE ontvangt een object dat erft van CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

  • obj kan worden gemaakt met de R un T ijd T ype D iensten
  • omdat dref nog steeds een gegevensreferentie is, moet het worden verwijderd ( ->* ) om te worden gebruikt als datacontainer (normaal gedaan via veldsymbolen)

Runtime-type services

RunTime Type Services ( kort: RTTS ) worden gebruikt voor:

  • typen maken (RunTime Type Creation; kort: RTTC )
  • typen analyseren (RunTime Type Identification; kort: RTTI )

Klassen

CL_ABAP_TYPEDESCR 
  | 
  |--CL_ABAP_DATADESCR 
  |   | 
  |   |--CL_ABAP_ELEMDESCR 
  |   |--CL_ABAP_REFDESCR 
  |   |--CL_ABAP_COMPLEXDESCR 
  |       | 
  |       |--CL_ABAP_STRUCTDESCR 
  |       |--CL_ABAP_TABLEDESCR 
  | 
  |--CL_ABAP_OBJECTDESCR 
     | 
     |--CL_ABAP_CLASSDESCR 
     |--CL_ABAP_INTFDESCR

CL_ABAP_TYPEDESCR is de basisklasse. Het implementeert de benodigde methoden voor het beschrijven van:

  • DESCRIBE_BY_DATA
  • DESCRIBE_BY_NAME
  • DESCRIBE_BY_OBJECT_REF
  • DESCRIBE_BY_DATA_REF


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow