Чтобы получить значение, попробуйте скомпилировать следующую программу.
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.
сообщение об ошибке вы получаете
Внутри классов и интерфейсов, вы можете использовать только «TYPE» для обозначения типов ABAP словаря, а не «как» или «структуры».
Это связано с тем, что в контексте OO вам нужно явно указать TYPE
, когда вы действительно обращаетесь к типу. Это современное состояние.
Теперь измените свою программу немного и попробуйте объявить глобальные переменные с помощью LIKE
и TYPE
.
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.
Как вы можете видеть, в этом случае ошибок компиляции нет. В этом контексте TYPE
и LIKE
взаимозаменяемы, они означают одно и то же. Это относится также к «старым» частям средств ABAP модуляции, таких как подпрограммы и функциональные модули.
Однако я использую следующее эмпирическое правило.
Всякий раз, когда я обращаюсь к DDIC или локальному типу, я использую TYPE
. Если я хочу создать переменную, которая имеет точно такой же тип, как и у другой переменной, я использую LIKE
. Если тип исходной переменной изменится в будущем, изменение должно быть сделано только в одном месте.
Пример.
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.
Тем не менее, следует отметить, что использование 'LIKE' (с dbtables) также [устарело] (http://help.sap.com/abapdocu_740/en/abenlike_obsolete.htm) и рассматривается как ** bad pratice **. – Suncatcher
Вот почему я даже не знал такого прецедента :) Потому что я никогда не использовал его. – Suncatcher
Аминь к этому. Вот почему я написал, что я использую 'LIKE' только тогда, когда я ссылаюсь на тип переменной другого, а не на явный тип. – Jagger