ABAP 之指针的常见使用方式

举报
百里丶落云 发表于 2023/08/09 10:43:49 2023/08/09
【摘要】 序HELLO.这里是百里,一个学习中的ABAPER ,在SAP 开发中,我们会经常遇到数据变更.数据修改等内容,数据赋值等内容. 我们可以使用传统方式的modify ,move to ,或者等于都可以进行数据赋值. 其实有更方便的方式,就是指针. 他可以不用参考对应的类型. 什么是指针在ABAP 中的指针 和C语言的指针类似, 如果你定义并且分配了相应的结构或者变量给它,其实它就指向这个结...

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

什么是指针

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

如何定义ABAP 中的指针

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>.

ABAP指针用法修改项目内容

我们正常修改数据内容是,采用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.


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

我们平时增加内表数据采用的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么? 此时必须使用指针.

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

003902AgR2I.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。