2016-04-06 2 views
2

Так они оба, кажется, работает для меня:Который должен использоваться в ABAP: ТИП или КАК?

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. 

и

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. 

Есть ли разница между ними технически? Что является предпочтительной/лучшей практикой и почему?

ответ

5

Чтобы получить значение, попробуйте скомпилировать следующую программу.

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

Тем не менее, следует отметить, что использование 'LIKE' (с dbtables) также [устарело] (http://help.sap.com/abapdocu_740/en/abenlike_obsolete.htm) и рассматривается как ** bad pratice **. – Suncatcher

+1

Вот почему я даже не знал такого прецедента :) Потому что я никогда не использовал его. – Suncatcher

+0

Аминь к этому. Вот почему я написал, что я использую 'LIKE' только тогда, когда я ссылаюсь на тип переменной другого, а не на явный тип. – Jagger

-1

Да, есть разница.
Вы не можете получить эту разницу, потому что вы заявили свои структуры через оператор TABLES, который устарел сейчас и не должен использоваться. Оператор TABLES объявляет рабочую область интерфейса с именем , идентичным Структура словаря данных.
Поэтому ваши объявления LIKE и TYPE относятся к Z_KNA1_VBRK как к объекту данных, так и к структуре DDIC. В любом другом случае такое заявление не будет компилироваться, поскольку заявления LIKE и TYPE не взаимозаменяемы.
Вы должны объявлять отдельные структуры в своей программе, а не использовать такие устаревшие элементы. Единственным допустимым исключением является обмен данными с классическими dynpro. Для дополнительной информации перейдите на страницу ABAP documentation.

+0

К сожалению, это не совсем так.В старых частях программы, таких как отчеты, процедуры или функциональные модули, «TYPE» и «LIKE» могут использоваться взаимозаменяемо, однако я предпочитаю «TYPE», когда я явно ссылаюсь на DDIC или локальный тип и «LIKE», когда я хочу создать переменная точно такого же времени, как и другая переменная. – Jagger

+0

@ Джаггер, дайте пример, где они могут использоваться взаимозаменяемо. – Suncatcher

+0

Я уже дал это в своем ответе. – Jagger

Смежные вопросы