所以这些似乎对我有用:
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.
技术上它们之间有什么区别吗?哪个是首选/最佳实践,为什么?
答案 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
。这是目前最先进的技术。
现在稍微更改您的程序并尝试使用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
可以互换,它们的含义相同。这也适用于" 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。