所以这些似乎对我有用:
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)
技术上它们之间有什么区别吗?哪个是首选/最佳实践,为什么?
为了得到差异,请尝试编译以下程序.
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)