ABAP: Field-Symbols:<FS>用法

原创 2016年05月31日 14:46:05

内部字段定义 :

FIELD-SYMBOLS:<FS>   [<TYPE>] 

在ABAP编程中使用非常广泛,类似于指针,可以指代任何变量。

当不输入<type>时,<fs>继承赋给它的变量的所有属性
当输入<type>时,赋给它的变量必须与<fs>同类型。
举个简单的例子:

  FIELD-SYMBOLS:<F1>.
  DATA:DAT(8) VALUE '19920108'.
  ASSIGN DAT TO <F1>.
  WRITE:/ <F1>.
"<f1> 继承dat属性,为C类型,值为19920108 。"

注意,这里定义了<f1>之后,使用assign .. to ..,将变量分配给内部字段<f1>,这时<f1>才继承了dat的属性及值。

如果写成如下:

  FIELD-SYMBOLS:<F2> TYPE D.
  DATA:DAT(5) TYPE C VALUE '12345'.
  ASSIGN DAT TO <F2>.
  WRITE:/ <F2>.

这时就会报错:dat与<f2>的类型不兼容。因为F2定义为D类型,所以assign的只能是同类型变量。

FIELD-SYMBOLS:<F3> TYPE D.
  DATA:DAT(8) VALUE '19920108'.
  ASSIGN DAT TO <F3> TYPE 'D'.
  WRITE:/ <F3>.

这次虽然<F3>为D类型,而dat为C类型,但是type D 是将dat类型转换成D类型再分配给<F3>,输出19920108.

简单介绍下之后,我们不再赘述,下面结合之前的博文《将Excel导入SAP数据库表》讲下如何使用field-symbol:

首先我们摘取相关代码如下

1.先定义<fs>.

FIELD-SYMBOLS:<FS>.
SORT I_EXCEL BY ROW COL.
DATA:NUM_COL TYPE I.

2.循环i_excel内表,依次读出Excel中每一行的内容,写入I_TABLE内表(这里要结合之前的将excel导入SAP的博文内容):

我们选择的Excel有两行内容
这里写图片描述

所以取到i_excel中的内容如下图:
这里写图片描述

去掉表头行后:
这里写图片描述

执行下面的代码:

LOOP AT I_EXCEL INTO W_EXCEL.
  NUM_COL = W_EXCEL-COL.
    ASSIGN COMPONENT  NUM_COL  OF STRUCTURE W_TABLE TO <FS>.
    <FS> = W_EXCEL-VALUE.
  AT END OF ROW.
    APPEND W_TABLE TO I_TABLE.
    CLEAR:W_TABLE.
  ENDAT.
  CLEAR:W_EXCEL.
ENDLOOP.

根据代码,我们一起单步调试一下:
loop第一次,先将i_excel的第一行写入工作区 w_excel,这时w_excel中的内容为:
w_excel-row = 0002.
w_excel-col = 0001.
w_excel-value = 1.
所以num_col = w_excel-col 也就是1.
那ASSIGN COMPONENT NUM_COL OF STRUCTURE W_TABLE TO <FS>.就相当于:
assign component 1 of structure w_table to <fs>.
也就是将w_table-num 分配给了<fs>,前面我们提到,分配给<fs>之后,<fs>继承了分配给它的变量的属性和值。
此外还有一点:当我们改变<fs>本身时,它的分配变量也会跟着改变,简单来说,就是双向的。改变任何一方,另一方都会跟着改变。所以我们这里的思路就是通过改变<fs>达到改变w_table-num的目的。
回到代码:<FS> = w_excel-value.
将 2-1单元格的 value 赋值给<fs>,相当于就是将第一行的序号字段赋值给了w_table-num.也就是1 。这时w_table-num = 1.
紧接着,后面有一个用法:
at end of row.
…..
endat.
这段代码的作用就是:以row字段为准,当row值将要改变时(也就是下一次循环的值)执行其中的代码。
所以这个用法只能在loop中使用,而且使用之前我们要注意给内表按照row排序:SORT I_EXCEL BY ROW COL.

在上面的程序中,我们为了让一行所有的字段都对应赋值到w_table的对应字段上,然后再提交到i _table中。回到刚才的第一次循环结束:
由于内表中第二行row值还为0002,所以不执行at end of 中的代码,loop第二次:
w_excel-row = 0002.
w_excel-col = 0002.
w_excel-value = A.
道理同上,这次assign component 2 of structure w_table to <fs>.
将 w_table-txt 分配给<fs>,然后将’A’赋值给<fs>,也就是 w_table-txt = ‘A’.这次执行at end of 中代码,因为内表下一行row是0003(见上图),所以执行 append w_table to i_table. clear:w_table.
这样我们就写入i_table中一行内容,那就是序号 :1 ,内容:A。

这样我们依次把excel中的每一行都取到了i_table中,当然这样还没有完全完成,最终我们要将数据写入gt_table,从而提交到数据库中。所以还要执行下面的代码:

LOOP AT I_TABLE INTO W_TABLE.
  GW_TABLE-MANDT = SY-MANDT.
  GW_TABLE-NUM = W_TABLE-NUM.
  GW_TABLE-TXT = W_TABLE-TXT.
APPEND GW_TABLE TO GT_TABLE.
CLEAR:GW_TABLE.
CLEAR:W_TABLE.
ENDLOOP.

后面这部分是博文如何将Excel导入sap数据库表的内容,但是field-symbols的用法非常方便,具体的其他使用方法本人后续会总结后分享给大家共同学习进步,有不对之处还望各位大神指正。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ABAP中FIELD-SYMBOLS的详细用法

(一)定义 1 . FIELD-SYMBOLS: []为内部字段定义field-symbols . 当不输入时﹐继承赋给它的变量的所有属性 当输入时﹐赋给它的变量必须与同类型 ...

ABAP FIELD-SYMBOLS 有大作用- 将没有可改参数的增强出口变得也能改主程序的值了

看下图代码: report  z_xul_test2 中 定义了 全局变量 G_DATA1 , 分别调用了 z_xul_tes1 中的 form  和 function zbapi_test , 这两...

ABAP FIELD-SYMBOLS

ABAP FIELD-SYMBOLS

Field Symbol使用总结

Field-Symbols(以下简称FS)大致类似于C语言里的指针,主要作用是程序更加灵活,有时可以实现一般无法实现的功能(比如之前那篇关于动态内表的),合理使用FS还可以提高程序效率,但是FS也有缺...
  • Raffin
  • Raffin
  • 2013年11月09日 00:42
  • 3388

FIELD-SYMBOLS的两种用法

第一种,把fs当做一个泛型,什么东西都可以放进去  DATA : BEGIN OF man,           name TYPE str,           sex(20) TYPE ...

FIELD-SYMBOLS的一些简单使用小结

Field-Symbols(以下简称FS)大致类似于C语言里的指针,主要作用是程序更加灵活,有时可以实现一般无法实现的功能(比如之前那篇关于动态内表的),合理使用FS还可以提高程序效率,但是FS也有缺...

FIELD-SYMBOLS:

Field symbols allow you to access data objects dynamically in ABAP programs. Unlike static access to...

使用SMARTFORM字段参数设置解决SMARTFORM中数量、金额字段显示问题

在SMARTFORM中,数量和金额类型的字段在显示的时候会和其他字段不在同一个水平面上,解决的方法:&ITAB-MENGE(C)&  ,下面是SMARTFORM字段参数设置的几个注意事项: 1、使用S...

SAP中上传图片,汇总一下

一.如何在ALV中引用LOGO (tcode:OAER) 参考资料: http://www.sapzg.com/zlk/html/ABAP/syjq/200810/28-1354.html 1.  ...

通过Field-symbols修改内表

report demo_field_symbols_assign_comp . DATA: BEGIN OF gs_itab, drph(10) , cmsl01(17), cmsl02(17...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ABAP: Field-Symbols:<FS>用法
举报原因:
原因补充:

(最多只允许输入30个字)