kannst Du mal bitte ein Beispiel posten.snooze hat geschrieben:Hallo,
sollen für Datenelemente, welche innerhalb einer Klasse für die Verarbeitung verwendet werden, DDIC-Objekte angelegt werden?
Nein
Zunächst würde ich nein sagen. DDIC-Objekte brauchen nicht angelegt zu werden, wenn niemand (außer der aktuellen Klasse) das Objekt benötigt.
Beispiel
Beispielsweise wird eine interne Tabelle zum cachen von Daten in einer Klasse verwendet. Ausserhalb der Klasse wird die cache-Tabelle nicht verwendet.
Aber:
Die Verwendung dieser internen Tabelle ist recht kompliziert, wenn diese nicht im DDIC angelegt wurde.
In jeder Methode, die auf diese Tabelle zugreifen will, müssen der Datentyp und Feldsymbol definiert werden und das Klassen-Attribut dem Feldsymbol zugewiesen werden. -> total nervig!
Ohne DDIC-Definition wird jede Menge Code benötigt, der sonst nicht anfallen würde.
Wie macht Ihr das?
Code: Alles auswählen.
ZCL_TESTCLASS
Attribute:
I_T9P2A /InstanPrivate / Type Ref to / DATA
METHOD get_taetigkeit.
* Parameter:
* TSCHL Importing Type ZZTSCHL
* TSCHX Returning Type ZZTSCHX
DATA: BEGIN OF wa_t9p2a,
tschz TYPE zztschl,
tschx TYPE zztschx.
DATA END OF wa_t9p2a.
FIELD-SYMBOLS: <itab> TYPE SORTED TABLE.
IF me->i_t9p2a IS NOT BOUND.
me->update_t9p2a( ).
ENDIF.
ASSIGN: me->i_t9p2a->* TO <itab>.
LOOP AT <itab> INTO wa_t9p2a.
IF wa_t9p2a-tschz = tschl.
tschx = wa_t9p2a-tschx.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD update_t9p2a .
* Struktur der internen Tabelle
TYPES: BEGIN OF wa_t9p2a,
tschz TYPE zztschl,
tschx TYPE zztschx.
TYPES END OF wa_t9p2a.
TYPES tab_i9p2a TYPE SORTED TABLE OF wa_t9p2a WITH UNIQUE KEY tschz.
FIELD-SYMBOLS: <itab> TYPE SORTED TABLE.
IF me->i_t9p2a IS NOT BOUND.
* erstellen der internen Tabelle
CREATE DATA: me->i_t9p2a TYPE tab_i9p2a.
ENDIF.
ASSIGN: me->i_t9p2a->* TO <itab>.
FREE <itab>.
SELECT tschz tschx FROM t9p2a
INTO TABLE <itab>
WHERE begda LE sy-datum
AND endda GE sy-datum.
ENDMETHOD.
probier's mal hiermit...snooze hat geschrieben:Anbei ein einfaches Beispiel für eine Klasse, welche eine interne Tabelle zum puffern verwendet.
...Ich hätte gerne das 'Best Practice'.
...
Code: Alles auswählen.
ZCL_TESTCLASS
lokale Typen: (kommt man von der Klassenübersicht aus hin...)
TYPES: BEGIN OF typ_t9p2a,
tschz TYPE zztschl,
tschx TYPE zztschx,
END OF typ_t9p2a,
tab_i9p2a TYPE SORTED TABLE OF typ_t9p2a WITH UNIQUE KEY tschz.
Attribute:
I_T9P2A /InstanPrivate / Type tab_i9p2a.
METHOD get_taetigkeit.
* Parameter:
* TSCHL Importing Type ZZTSCHL
* TSCHX Returning Type ZZTSCHX
DATA: wa_t9p2a type typ_t9p2a.
IF LINES( me->i_t9p2a ) EQ 0. "hat Tabelle keinen Inhalt?
me->update_t9p2a( )."dann befüllen lassen
ENDIF.
LOOP AT me->i_t9p2a INTO wa_t9p2a.
IF wa_t9p2a-tschz = tschl.
tschx = wa_t9p2a-tschx.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD update_t9p2a .
FREE me->i_t9p2a
SELECT tschz tschx FROM t9p2a
INTO TABLE me->i_t9p2a
WHERE begda LE sy-datum
AND endda GE sy-datum.
ENDMETHOD.
nein, das ist eine der Funktionen (wie ABS, TRUNC oder COS), die beim Befehl COMPUTE aufgeführt sind. Möglicherweise ist diese Funktion aber erst ab 4.7 verfügbar, so dass alternativsnooze hat geschrieben:Doch noch eine Frage
In Deinem Codebeispiel gibt es die StelleIst LINES ein Marcro?Code: Alles auswählen.
IF LINES( me->i_t9p2a ) EQ 0.
Code: Alles auswählen.
IF me->i_t9p2a[] IS INITIAL.
Code: Alles auswählen.
DESCRIBE TABLE me->i_t9p2a LINES sy-tfill.
IF sy-tfill IS INITIAL.
Nein, kein Marcro und auch kein Makro.snooze hat geschrieben:Doch noch eine Frage
In Deinem Codebeispiel gibt es die StelleIst LINES ein Marcro?Code: Alles auswählen.
IF LINES( me->i_t9p2a ) EQ 0.