在 ABAP 中应该使用哪个:TYPE 或 LIKE?

Which should be used in ABAP : TYPE or 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.

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.

它们在技术上有什么区别吗?哪个是首选/最佳实践,为什么?

是的,有区别。
您无法获得这种差异,因为您通过 TABLES 语句声明了您的结构,该语句 已过时 现在不应使用。 TABLES 语句使用 数据字典结构相同的名称声明接口工作区。
因此,您的 LIKE 和 TYPE 声明都将 Z_KNA1_VBRK 视为数据对象或 DDIC 结构。 在任何其他情况下,此类声明都不会编译,因为 LIKE 和 TYPE 语句 不可互换 .
您应该在程序中声明单独的结构,而不是使用此类过时的元素。唯一允许的例外是与经典 dynpros 的数据交换。 如需更多详细信息,请切换至 ABAP documentation.

要获得差异,请尝试编译以下程序。

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.

您将收到的错误消息是

Within classes and interfaces, you can only use "TYPE" to refer to ABAP Dictionary types, not "LIKE" or "STRUCTURE".

这是因为在 OO 上下文中,您需要在实际引用类型时显式编写 TYPE。这是当前的技术水平。

现在稍微改变你的程序并尝试使用 LIKETYPE 声明全局变量。

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.

如您所见,在这种情况下没有编译错误。在这种情况下 TYPELIKE 可以互换,它们的意思相同。这也适用于 ABAP 模块化方式的 "old" 部分,例如子例程和功能模块。

但是我使用以下经验法则。

每当我提到 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.