ABAP
Dynamisch programmeren
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_stringbevat de typen name als string.- Als het type niet werd gevonden, wordt een uitzondering van het type
CX_SY_CREATE_DATA_ERRORgegenereerd
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
objkan worden gemaakt met de R un T ijd T ype D iensten- omdat
drefnog 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