Architektur von Abap-Klassen (Klassen Attribute)

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Architektur von Abap-Klassen (Klassen Attribute)

Beitrag von snooze ( / / 0 / 3 ) »
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?

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Architektur von Abap-Klassen (Klassen Attribute)

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
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?
kannst Du mal bitte ein Beispiel posten.
Ich verstehe nämlich Dein Problem noch nicht so richtig. Vor allem weiß ich nicht so recht, was Du für ein Problem mit Feldsymbolen hast.

PS:
wenn Du lokale Typen brauchst, kannst Du diese doch auch klassenglobal definieren und dich in Deinen Methoden darauf beziehen.

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Moinsen.

In der SE24 können klassenlokale Typen definiert werden. Diese sind in allen Methoden verfügbar, nicht jedoch ausserhalb der Klasse.

In der SE24 siehe Tab "Typen" bzw. Button "Typen" (Strg+F5).

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beispiel

Beitrag von snooze ( / / 0 / 3 ) »
Anbei ein einfaches Beispiel für eine Klasse, welche eine interne Tabelle zum puffern verwendet.

Die Klasse funktioniert, das ist nicht das Problem.

Die Frage ist wie Ihr das macht. Über Feldsymbole (so wie im Codebeispiel) mit viel 'unnötigem' Code (2/3 des Codes sind nur die Feldsymbole) oder über einen DDIC-Typ (der eigentlich nicht benötigt wird).

Ich hätte gerne das 'Best Practice'.

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.

Re: Beispiel

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
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'.
...
probier's mal hiermit...

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.
Die Verwendung einer REF TO DATA erscheint mir unsinnig, da ja bereits klar ist, dass die klassenlokale Tabelle einen bestimmten Typ hat.

PS: Methode update_t9p2a impliziert einen Update der Datenbanktabelle T9P2A. Besser wäre der Name read_t9p2a.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Danke

Beitrag von snooze ( / / 0 / 3 ) »
Hallo Ereglam,

mir viel es wie Schuppen aus den Haaren!!!

Vielen Dank :lol: :lol: :lol:

Beitrag von snooze ( / / 0 / 3 ) »
Doch noch eine Frage

In Deinem Codebeispiel gibt es die Stelle

Code: Alles auswählen.

IF LINES( me->i_t9p2a ) EQ 0.
Ist LINES ein Marcro?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
snooze hat geschrieben:Doch noch eine Frage

In Deinem Codebeispiel gibt es die Stelle

Code: Alles auswählen.

IF LINES( me->i_t9p2a ) EQ 0.
Ist LINES ein Marcro?
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 alternativ

Code: Alles auswählen.

IF me->i_t9p2a[] IS INITIAL.
oder das altgediente

Code: Alles auswählen.

DESCRIBE TABLE me->i_t9p2a LINES sy-tfill.
IF sy-tfill IS INITIAL.
benutzt werden muss.

PS:
mir gefällt die Variante mit 'LINES(' am besten, weil dadurch eindeutig klar ist, was ich dort prüfen will und es schön kurz ist. ;)
Zuletzt geändert von ereglam am 13.04.2005 10:37, insgesamt 1-mal geändert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Gast ( / / 0 / 3 ) »
snooze hat geschrieben:Doch noch eine Frage

In Deinem Codebeispiel gibt es die Stelle

Code: Alles auswählen.

IF LINES( me->i_t9p2a ) EQ 0.
Ist LINES ein Marcro?
Nein, kein Marcro und auch kein Makro.
Sondern seit 6.x Syntac-Bestandteil.

(s. F1-Hilfe zu COMPUTE und zu IF)

Seite 1 von 1

Vergleichbare Themen

20
Antw.
1003
Views
Globale Klassen oder Lokale Klassen
von ZF_SAPler » 29.11.2022 13:47 • Verfasst in ABAP® für Anfänger
9
Antw.
4632
Views
Lokale Klassen in globalen Klassen
von ralf.wenzel » 20.04.2020 22:55 • Verfasst in ABAP Objects®
1
Antw.
1333
Views
Deprecated bei ABAP OO Klassen?
von Azubiene » 17.02.2006 13:10 • Verfasst in ABAP Objects®
1
Antw.
1888
Views
SAP HR Klassen
von Gast » 24.01.2005 13:41 • Verfasst in Human Resources
40
Antw.
24184
Views
Persistente Klassen für was ?
von Alpha » 17.11.2008 11:06 • Verfasst in ABAP Objects®

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Fiori App aus dem Launchpad aufrufen
vor einer Stunde von Bright4.5 2 / 6
alv_grid aktualisieren
vor 2 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 11 Stunden von Shortcut IT 3 / 42

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Fiori App aus dem Launchpad aufrufen
vor einer Stunde von Bright4.5 2 / 6
alv_grid aktualisieren
vor 2 Stunden von Egzon gelöst 4 / 80
SELECT CHAR16 in CHAR12-Feld
vor 11 Stunden von Shortcut IT 3 / 42

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170