Um den Unterschied zu erhalten, versuchen Sie das folgende Programm zu kompilieren.
REPORT zzz.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
main.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD main.
DATA: ls_t000t TYPE t000,
ls_t000l LIKE t000.
ENDMETHOD.
ENDCLASS.
Die Fehlermeldung erhalten Sie liegt
Innerhalb Klassen und Schnittstellen, können Sie nur „TYPE“ verwenden können, um Dictionary-Typen zu beziehen, nicht „LIKE“ oder „Struktur“. Diese
ist, weil in der OO Kontext Sie schreiben müssen explizit TYPE
, wenn Sie tatsächlich auf einen Typ verweisen. Dies ist der aktuelle Stand der Technik.
Jetzt ändern Sie Ihr Programm leicht und versuchen Sie, globale Variablen mit LIKE
und TYPE
zu deklarieren.
REPORT zzz.
DATA: gs_t000t TYPE t000,
gs_t000l LIKE t000.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
main.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD main.
DATA: ls_t000t TYPE t000.
* ls_t000l LIKE t000.
ENDMETHOD.
ENDCLASS.
Wie Sie sehen können, gibt es in diesem Fall keine Kompilierungsfehler. In diesem Zusammenhang sind TYPE
und LIKE
austauschbar, sie meinen das Gleiche. Dies gilt auch für die "alten" Teile von ABAP-Modularisierungsmitteln wie Subroutinen und Funktionsbausteinen.
Allerdings verwende ich die folgende Faustregel.
Immer, wenn ich auf eine DDIC oder lokalen Typ verweisen, verwende ich TYPE
. Wenn ich eine Variable erstellen möchte, die genau dem gleichen Typ wie andere Variable ist, verwende ich LIKE
. Sollte sich der Typ der ursprünglichen Variablen in Zukunft ändern, muss die Änderung dann nur an einer Stelle vorgenommen werden.
Beispiel.
METHOD main.
DATA: ls_t000t TYPE t000. "should the type change from T000 to T002
"in the future, one has to change it only in one place.
DATA: ls_t000l LIKE ls_t000t.
ENDMETHOD.
Dennoch sollte angemerkt werden, dass die Verwendung von 'LIKE' (mit dbtables) auch [veraltet] ist (http://help.sap.com/abapdocu_740/en/abenlike_obsolete.htm) und wie ** bad pratice behandelt wird **. – Suncatcher
Deshalb kannte ich solch einen Anwendungsfall nicht :) Weil ich ihn nie benutzt habe. – Suncatcher
Amen dazu. Deshalb habe ich geschrieben, dass ich 'LIKE' nur dann verwende, wenn ich auf den Variablentyp eines anderen und nicht auf einen expliziten Typ verweise. – Jagger