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

时间:2016-04-06 10:49:10

标签: 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.

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.

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

2 个答案:

答案 0 :(得分: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字典类型,而不是" LIKE"或" 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可以互换,它们的含义相同。这也适用于" old" 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 :(得分:-1)

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