在SAP-ABAP字段符号和数据基准(Field symbol and Data reference

2019-07-31 13:05发布

如果我们比较ABAP场符号和数据的引用在C指针,我们观察到: -

在C,说我们声明一个变量“VAR”类型“整数”默认值“5”。

变量“VAR”将被存储在内存中的一些地方,并说该持有这个变量的内存地址为“1000”。

现在我们定义一个指针“ptr”的内容,该指针被分配给我们的变量。

所以, “PTR” 将是 “1000” 和 “* PTR” 将是5。

让我们比较在ABAP上述情况。

这里我们声明了一个字段符号“FS”并将其赋值给变量“VAR”。

现在我的问题是什么“FS”持有? 我在网上搜索严格这一点,但发现很多ABAP顾问有FS持有即1000变量的地址,但是,这是错误的观点。 在调试我发现,FS只持有5。所以FS(在ABAP)相当于* PTR(C语言)。 如果我的理解是错误的,请大家指正。

现在让我们来声明一个数据参考“DREF”,另一个申请符号“fsym”和创建我们分配相同的现场符号数据引用后。 现在,我们可以在这一领域的象征做操作。 所以数据refernec和字段符号之间的区别是: -

在字段符号的情况下,首先,我们将声明一个变量并将其分配给字段符号。

在数据参考的情况下,首先我们了解创建一个数据引用,然后赋值给字段符号。

那么什么是使用数据参考的? 同样的功能,我们可以通过现场符号也achive。

Answer 1:

现场符号很像一个指针,而是一个你只能在解除引用的形式访问。 换句话说,这将举行,在内部,这是分配给它的变量的内存地址,但它不会让你看到的内存地址,只存储在它指向的变量的数据。 这可以证明,因为如果你更改字段符号指向内部表行的内容,你会看到,这些变化将直接在该行进行。

一种数据引用的作用像一个简单的指针,不同之处在于不能递增或递减的存储器地址等在C(PTR ++,ptr--并且这样的)。 它从现场符号不同,因为你可以比较两个数据的引用来检查它们是否指向内存中的完全一样的斑点。 比较两个场符号将是一个简单的值进行比较。 另一个区别是,你可以通过创建数据的引用,用CREATE DATA命令动态地分配内存。 经过现场符号只能分配给一个已分配的变量。



Answer 2:

虽然数据引用和字段符号看起来非常相似,并且经常以类似的方式使用(见其他答案),它们是完全不同的。

数据引用是存储价值,就像一个字符串或整型变量。 他们在记忆力和内容的固定大小。 唯一的区别是,这些引用是指向其他数据对象,即内容具有特殊的意义。 他们可以指向行不通的,它们可以被废弃时,你可以通过他们对其他的程序,你可以操纵或者指针( GET REFERENCE ),或者它指向的值。 没什么特别的吧,真的 - 只是指针作为您从您最喜爱的编程语言认识他们。

现场符号是没有“真正的”变量。 该文件指出,

他们不预留物理空间的领域

现场符号是真正的地方只有巧妙操纵符号表的ABAP VM的。 我会尽力来说明这 - 注意,这是一个严重的简化模型。 比方说,你声明三个变量:

DATA: my_char TYPE c,
      my_int  TYPE i,
      my_ref  TYPE REF TO i.

那么符号表将包含 - 等等 - 条目可能看起来像这样的:

name       type  size addr
------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461

(我不知道有关的参考变量的实际大小。)

这些条目仅指向包含的值的地址。 根据这些变量的作用域,他们可能会驻留在完全不同的存储区域,但是这不是我们现在的关注。 最重要的要点是:

  • 内存必须保留变量(这是自动完成的,即使是引用)。
  • 参考文献的工作就像所有其他变量。

让我们一个字段符号添加到这一点:

FIELD-SYMBOLS: <my_fs> TYPE any.

那么符号可能是这样的:

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *        

字段符号被在其初始状态(未赋值)创建。 它不指向任何地方,并在此状态下使用它会导致在很短的转储。 最重要的一点是: 它不是由像其他变量“堆”内存支持。 让我们

ASSIGN my_char TO <my_fs>.

同样的符号可能是这样的:

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *                   MY_CHAR

现在,当访问<my_fs>运行时系统将其识别为一个字段符号,查找在符号表中的当前目标和重定向所有操作的实际位置my_char 。 如果,另一方面,你会发出命令

GET REFERENCE OF my_int INTO my_ref.

符号表将不会改变,但在“堆地址” 0x123461,你会找到“地址” 0x123457。 只是赋值像my_char = 'X'my_int = 42 * 2

这是在一个非常简化的版本,为什么的原因,你不能传递现场符号改变参数,并让他们的子程序内被重新分配 。 他们不以同样的方式,其他变量确实存在,他们有他们加入到符号表的范围之外没有任何意义。



Answer 3:

字段符号,它一直围绕在ABAP更长的时间,让您操作和运行时通过字段的值,不知道该字段的名称预先。 考虑这种使用情况:你有一个结构,20场,你可以通过名称引用每个字段并将其分配给字段符号,然后更改特定字段等的价值

数据引用( TYPE REF TO DATA ),这是一种较新的相对除了ABAP,允许初始化在运行时数据不知道的类型预先使用“创建数据”语句。

对于使用的例子CREATE DATA ,请参见以下SAP帮助页面。 它显示了你如何能够例如得到一个参考对象的引用使用(即ABAP对象参考) CREATE DATA ,这是一件好事,你可以不与字段符号做: http://help.sap.com/abapdocu_70/en /ABAPCREATE_DATA_REFERENCE.htm



Answer 4:

字段符号是 - 学校名称est的预兆 - 一个字段的象征。 你把它分配给一个变量,并成为该变量的别名。

参考和场符号之间的主要区别在于,引用可以指向通过创建数据或创建对象创建匿名数据。 字段符号必须始终分配给现有的变量。



文章来源: Field symbol and Data reference in SAP-ABAP
标签: sap abap