FIELD SYMBOL和TYPE REF TO的用法和比较

Type Ref To(以下简称:TRT)和 Field Symbol(以下简称:FS)在 ABAP 中都有着类似指针的作用;

下面结合对比和实例来介绍下两者的用法和区别之处。

先预定义类型ty_ym,内表it_ym,工作区wa_ym,变量v_ym(char20)以供后面使用:

一、定义

Type Ref To 和 Field Symbol 的定义都可以指定特定的类型或者结构,或者不指定。


二、初始化

Type Ref To 有两种初始化的方法:

第一种是用 CREATE DATA 动态开辟内存;

第二种是用 GET REFERENCE OF 指向已经存在的内存变量.

Field Symbol 的初始化,则只能指向已经存在的内存变量。


如果定义 ref 是指定特定的类型或者结构的,那么 CREATE DATA 时 TYPE 可以省略。

无论定义时 ref 是否有特定的类型或者结构,CREATE DATA 时必须指定特定的类型或者结构,不能是data这种泛型的。


在使用 Field Symbol 和 Type Ref To 前必须初始化,不然会发生 RUNTIME ERROR。

三、使用

如果第一步定义时指定了特定的类型或者结构,那么 Field Symbol 和 Type Ref To 都可以直接使用;

如果第一步定义时没有指定类型或者结构,那么 Type Ref To 必须 ASSIGN 到另外一个 Field Symbol 里间接使用。

1) 指定特定的类型时:

1
2
ref -> * = 'abc'.
<fs> =  'abc' .

2) 指定特定的结构时:

1
2
ref-> *-col1 = 'abc'.  "简写是ref->col1
< fs >-col1 =  'abc' .

3) 不指定特定的类型或者结构时:


注意事项:

一般来说为了使用方便,还是应该指定 Field Symbol 或者 Type Ref To 的类型或者结构,以便之后直接使用。

在使用 Type Ref To 时,如果是 TYPE REF TO DATA,那么之后想使用这个 Type Ref To 时,依然会不可避免的用到 Field Symbol;

这样代码写起来就很麻烦,还不如一开始就使用 Field Symbol 写。

但像动态内表这种事先不知道结构的场合,那么只能使用 Type Ref To,再结合 Field Symbol;

如果直接使用 Field Symbol,那么 Field Symbol 将无法参考某个已经存在的结构进行初始化。

第一步假如 TYPE REF TO DATA,后面的第二步初始化时依然要指定特定的结构,所以还不如第一步就指定结构。

建议只有在事先不知道结构时,才使用泛型定义。

所以要么定义和初始化时都指定类型或者结构,要么就是动态内表或者结构都无法在事先指定;

像第一步 TYPE REF TO DATA 第二步 CREATE DATA ref TYPE ty_ym 不是好的做法。

 

4、区别

Type Ref To 和 Field Symbol 在用法上目前发现的主要区别:

1) Type Ref To 可以动态开辟内存,在动态内表时,可以等在程序运行时获得结构后再开辟内存,并且赋值给某个 Field Symbol。

而光用 Field Symbol 是做不到的,因为 Field Symbol 的初始化需要“挂”在已知结构上。

2)Type Ref To 不像 Field Symbol 那样有LOOP AT it_tab ASSIGNING < fs >的写法,ref->*不是指向内表数据,

而是类似工作区指向某块内存,所以更改数据后需要 modify 到内表,如果不需要数据了要clear。

而 Field Symbol 则不需要考虑 modify 和 clear。

3)IF < fs1 > = < fs2 > 是比较内存里的值,相对应的是IF ref1->* = ref2->*,而不能判断比较 IF ref1 = ref2 。

### SAP 中使用 SFTP 函数进行文件传输 为了实现在SAP系统中通过SFTP协议进行文件传输,通常有两种主要途径来达成这一目标: #### 使用ABAP编程实现SFTP功能 一种方法是在ABAP环境中编写自定义程序或修改现有程序以支持SFTP连接。这涉及到调用特定的功能模块或者类库来进行安全的文件传输操作。例如,在ABAP中存在`CL_SFTP_FACTORY`这样的类可以帮助创建SFTP会话实例并执行诸如上传、下载等命令[^2]。 ```abap DATA: lo_sftp TYPE REF TO cl_sftp_factory, lv_host TYPE string VALUE 'your.sftp.server', lv_user TYPE string VALUE 'username'. lo_sftp = cl_sftp_factory=>create( host = lv_host user = lv_user ). CALL METHOD lo_sftp->open_connection. IF sy-subrc EQ 0. " 进行文件传输的操作... ENDIF. CALL METHOD lo_sftp->close_connection. ``` 这段代码展示了如何初始化一个SFTP对象,并尝试打开与指定主机用户的连接。成功建立连接后就可以继续完成实际的数据交换任务了。 #### 利用中间件如SAP PI/PO 或者第三方工具 另一种更为灵活的方法是借助于像SAP Process Integration (现称为SAP PI/PO)这样的集成解决方案。这些平台提供了一系列预构建适配器服务接口,其中包括针对不同类型的远程服务器(包括那些仅接受SSH/SFTP通信)的支持[^1]。这意味着无需深入编码即可快速设置好自动化流程,从而简化跨系统的交互过程。 对于希望进一步增强安全性以及管理复杂性的场景来说,还可以考虑采用其他专业的ETL工具或是云服务平台所提供的相应特性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值