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

Kor*_*gay 2 sap 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.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

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

Jag*_*ger 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.
Run Code Online (Sandbox Code Playgroud)

您将收到的错误消息是

在类和接口中,您只能使用"TYPE"来引用ABAP字典类型,而不是"LIKE"或"STRUCTURE".

这是因为在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.
Run Code Online (Sandbox Code Playgroud)

如您所见,在这种情况下没有编译错误.在这种情况下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.
Run Code Online (Sandbox Code Playgroud)