ABAP
Programmazione dinamica
Ricerca…
Field-Simboli
I simboli di campo sono equivalenti ai puntatori di ABAP, ad eccezione del fatto che i simboli di campo sono sempre dereferenziati (non è possibile modificare l'indirizzo reale in memoria).
Dichiarazione
Per dichiarare un campo-simbolo è necessario utilizzare la parola chiave FIELD-SYMBOLS . I tipi possono essere generici ( ANY [... TABLE] ) per gestire un'ampia varietà di variabili.
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
Assegnazione
I simboli di campo unassigned sono unassigned alla dichiarazione, il che significa che non indicano nulla. L'accesso a un campo-simbolo non assegnato causerà un'eccezione e, se non eseguito, a un breve dump. Pertanto, lo stato dovrebbe essere controllato con IS ASSIGNED :
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
Poiché sono solo riferimenti, non è possibile memorizzare dati reali all'interno. Quindi, dichiarato DATA è necessario in ogni caso di utilizzo.
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
Annullamento dell'assegnazione
A volte potrebbe essere utile resettare un Field-Symbol. Questo può essere fatto usando UNASSIGN .
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
Utilizzare per tabelle interne
I simboli di campo possono essere usati per modificare tabelle interne.
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.
Attenzione! I simboli di campo rimangono assegnati anche dopo aver lasciato il ciclo. Se vuoi riutilizzarli in sicurezza, annullali immediatamente.
Riferimenti di dati
Essenziale per i riferimenti dati è l'aggiunta REF TO dopo il TYPE .
Creazione dinamica di strutture
Se il tipo di una struttura deve essere deciso in runtime, possiamo definire la nostra struttura di destinazione come riferimento ai data tipo generico.
DATA wa TYPE REF TO data.
Per dare wa un tipo che usiamo la dichiarazione CREATE DATA . Il TYPE aggiunta può essere specificato da:
Riferimento:
CREATE DATA wa TYPE kna1
- I controlli statici sono attivi quindi non è possibile creare un tipo sconosciuto
Nome:
CREATE DATA wa TYPE (lw_name_as_string)
- Le parentesi sono necessarie e
lw_name_as_stringcontiene il nome dei tipi come stringa.- Se il tipo non è stato trovato, verrà generata un'eccezione di tipo
CX_SY_CREATE_DATA_ERROR
Per l'istanziazione di tipi creati dinamicamente è possibile specificare l'aggiunta di HANDLE . HANDLE riceve un oggetto che eredita da CL_ABAP_DATADESCR .
CREATE DATA dref TYPE HANDLE obj
objpossono essere creati utilizzando la R UN T empo T ipo S ervizi- perché
drefè ancora un datareference, deve essere dereferenziato (->*) per essere usato come datacontainer (normalmente fatto tramite Field-Symbols)
Servizi di tipo RunTime
RunTime Type Services ( abbreviazione: RTTS ) sono utilizzati per:
- creazione di tipi (Creazione di tipo RunTime; corto: RTTC )
- tipi di analisi (RunTime Type Identification; short: RTTI )
Classi
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 è la classe base. Implementa i metodi necessari per descrivere:
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF