开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
HELLO.这里是百里,一个学习中的ABAPER ,在SAP 开发中,我们会经常遇到数据变更.数据修改等内容,数据赋值等内容. 我们可以使用传统方式的modify ,move to ,或者等于都可以进行数据赋值. 其实有更方便的方式,就是指针. 他可以不用参考对应的类型.
在ABAP 中的指针 和C语言的指针类似, 如果你定义并且分配了相应的结构或者变量给它,其实它就指向这个结构或者变量的地址,如果修改了field symbol的值,则相应结构或者变量的值也随之更改。
1、定义指针:
指针的定义主要有以下语句
定义任意类型的指针,但是不具备栏位结构(仅仅是一个地址)
FIELD-SYMBOLS <carrid> TYPE ANY.
参考数据库表定义(这种指针是含有栏位结构的,参考内表同理)
FIELD-SYMBOLS <sflight> TYPE sflight.
FIELD-SYMBOLS <sflight> LIKE sflight.
FIELD-SYMBOLS <sflight> LIKE LINE OF sflight.
动态定义具有栏位结构的指针类型
DATA: tabname TYPE tabname VALUE 'SFLIGHT' ,
dref TYPE REF TO data.
FIELD-SYMBOLS: <itab> TYPE ANY TABLE.
CREATE DATA dref TYPE TABLE OF (tabname).
ASSIGN dref->* TO <itab>.
2、指针的分配(常用句法)
分配某个变量给指针
ASSIGN var TO <field-symbols>
分配结构中的某个字段的地址给指针
ASSIGN COMPONENT pos OF STRUCTURE struc TO <field-symbols>.
分配整个内表行给指针(指针必须定义为有栏位结构的类型)
READ TABLE itab INDEX/WITH KEY ASSIGNING <field-symbols>.
LOOP AT itab
ASSIGNING <field-symbols>.
ENDLOOP.
分配类的方法或借口给指针
ASSIGN dref->* TO <field-symbols>.
DATA: BEGIN OF LINE,
COL1 TYPE I VALUE '11',
COL2 TYPE I VALUE '22',
COL3 TYPE I VALUE '33',
END OF LINE.
DATA COMP(4) VALUE 'COL3'.
FIELD-SYMBOLS: <F1>, <F2>, <F3>.
ASSIGN LINE TO <F1>.
ASSIGN COMP TO <F2>.
DO 3 TIMES.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <F1> TO <F3>. "按具体列数
WRITE <F3>.
ENDDO.
ASSIGN COMPONENT <F2> OF STRUCTURE <F1> TO <F3>. "按具体值
WRITE / <F3>.
我们正常修改数据内容是,采用loop 循环数据内容,然后将数据存入到工作区内,在修改工作区对应的内容值. 修改完毕后,通过modify 的方式进行赋值,同时在清空工作区内容. 这是我们传统的赋值方式. 通过修改指针我们可以减少一些动作,比如清空工作区,modify 动作.
我们这里讲一个demo,是通过po号,料号,等数据内容获取对应值 .
内表行项目内容修改(不需要MODIFY ... INDEX SY-TABIX)
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
"默认X销售需求,可选择Y试验,C零时插单
<fs_out>-zjhlx = 'X'.
READ TABLE gt_makt INTO DATA(ls_makt) WITH KEY matnr = <fs_out>-matnr.
IF sy-subrc = 0.
<fs_out>-maktx = ls_makt-maktx.
ENDIF.
READ TABLE gt_mkal INTO DATA(ls_mkal) WITH KEY matnr = <fs_out>-matnr
werks = <fs_out>-pwwrk
verid = <fs_out>-verid.
IF sy-subrc = 0.
<fs_out>-verid_desc = ls_mkal-text1.
ENDIF.
<fs_out>-zrets = p_zrets.
ENDLOOP.
我们平时增加内表数据采用的APPEND 对应数据到对应的内表 . 我们此时使用指针的方式,可以减少对应的清空工作区数据的动作.
"新增行项目到内表GT_OUT.
LOOP AT lt_out INTO DATA(ls_out).
APPEND INITIAL LINE TO gt_out ASSIGNING <fs_out>.
CHECK <fs_out> IS ASSIGNED.
MOVE-CORRESPONDING ls_out TO <fs_out>.
"销售组织
READ TABLE lt_tvkot INTO DATA(ls_tvkot) WITH KEY vkorg = <fs_out>-vkorg.
IF sy-subrc = 0.
<fs_out>-vkorg_desc = ls_tvkot-vtext.
ENDIF.
"部门
READ TABLE lt_tspat INTO DATA(ls_tspat) WITH KEY spart = <fs_out>-spart.
IF sy-subrc = 0.
<fs_out>-spart_desc = ls_tspat-vtext.
ENDIF.
"审核状态
IF <fs_out>-sdabw = 'X'.
<fs_out>-sdabw_desc = gc_sdabw_1.
ENDIF.
UNASSIGN <fs_out>.
ENDLOOP.
指针是一个非常实用的动作,在工作中熟练的使用指针,可以减少我们大量工作量.比如动态内表, 逻辑修改, 以及以及 就是修改 别人的代码的时候 ,我们看到别人杂乱无章的数据 ,你敢写个modify么? 此时必须使用指针.
这里是百里,一个努力的学习者.. 努力学习好好记录,点滴进步,就是成功.