2016-04-06 14 views
2

diese So scheinen beide für mich zu arbeiten:Was sollte in ABAP verwendet werden: TYPE oder LIKE?

TABLES: 
    T001,  "Table of Company Codes. 
    Z_KNA1_VBRK. "View I created.. 

DATA: 
    CCNAME TYPE T001-BUTXT, 
    CCCURR TYPE T001-WAERS, 
    KNAVBK TYPE Z_KNA1_VBRK, 
    AMNICC TYPE Z_KNA1_VBRK-NETWR. 

und

DATA: 
    CCNAME LIKE T001-BUTXT, 
    CCCURR LIKE T001-WAERS, 
    KNAVBK LIKE Z_KNA1_VBRK, 
    AMNICC LIKE Z_KNA1_VBRK-NETWR. 

PARAMETERS: 
    COMPCODE LIKE T001-BUKRS. 

Gibt es einen Unterschied zwischen ihnen technisch? Welches ist bevorzugt/beste Praxis und warum?

Antwort

5

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. 
+1

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

+1

Deshalb kannte ich solch einen Anwendungsfall nicht :) Weil ich ihn nie benutzt habe. – Suncatcher

+0

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

-1

Ja, es gibt einen Unterschied.
Sie können diesen Unterschied nicht erhalten, weil Sie Ihre Strukturen über die TABLES-Anweisung deklariert haben, die jetzt veraltet ist und nicht verwendet werden sollte. TABLES Erklärung erklärt Schnittstelle Arbeitsbereich mit einem Namen identisch mit Data Dictionary Struktur.
Daher behandelt sowohl Ihre LIKE und TYPE-Deklarationen Z_KNA1_VBRK entweder als Datenobjekt oder DDIC-Struktur entsprechend. In jedem anderen Fall wird eine solche Deklaration nicht kompiliert, da LIKE- und TYPE-Anweisungen nicht miteinander austauschbar sind.
Sie sollten separate Strukturen in Ihrem Programm angeben, anstatt solche veralteten Elemente zu verwenden. Die einzige zulässige Ausnahme ist der Datenaustausch mit klassischen Dynpros. Für weitere Details wechseln Sie zu ABAP documentation.

+0

Das ist leider nicht ganz richtig.In alten Programmteilen wie Berichten, Prozeduren oder Funktionsbausteinen könnten 'TYPE' und' LIKE' synonym verwendet werden, ich bevorzuge jedoch 'TYPE' wenn ich explizit auf einen DDIC oder lokalen Typ referenziere und' LIKE' wenn ich einen erstellen möchte Variable von genau der gleichen Zeit wie andere Variable. – Jagger

+0

@Jagger, geben Sie ein Beispiel, wo sie austauschbar verwendet werden könnten. – Suncatcher

+0

Ich habe es bereits in meiner Antwort gegeben. – Jagger

Verwandte Themen