ABAP 之指针的常见使用方式

2022-12-05 08:37:05 浏览数 (1)


开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

HELLO.这里是百里,一个学习中的ABAPER ,在SAP 开发中,我们会经常遇到数据变更.数据修改等内容,数据赋值等内容. 我们可以使用传统方式的modify ,move to ,或者等于都可以进行数据赋值. 其实有更方便的方式,就是指针. 他可以不用参考对应的类型.

什么是指针

在ABAP 中的指针 和C语言的指针类似, 如果你定义并且分配了相应的结构或者变量给它,其实它就指向这个结构或者变量的地址,如果修改了field symbol的值,则相应结构或者变量的值也随之更改。

如何定义ABAP 中的指针

代码语言:javascript复制
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>.

语法及案例

代码语言:javascript复制
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>.

ABAP指针用法修改项目内容

我们正常修改数据内容是,采用loop 循环数据内容,然后将数据存入到工作区内,在修改工作区对应的内容值. 修改完毕后,通过modify 的方式进行赋值,同时在清空工作区内容. 这是我们传统的赋值方式. 通过修改指针我们可以减少一些动作,比如清空工作区,modify 动作.

我们这里讲一个demo,是通过po号,料号,等数据内容获取对应值 .

内表行项目内容修改(不需要MODIFY ... INDEX SY-TABIX)

代码语言:javascript复制
  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.

ABAP指针用法内表新增行项目

我们平时增加内表数据采用的APPEND 对应数据到对应的内表 . 我们此时使用指针的方式,可以减少对应的清空工作区数据的动作.

代码语言:javascript复制
"新增行项目到内表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么? 此时必须使用指针.

这里是百里,一个努力的学习者.. 努力学习好好记录,点滴进步,就是成功.

0 人点赞