前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP 之指针的常见使用方式

ABAP 之指针的常见使用方式

作者头像
百里丶落云
发布2022-12-05 08:37:05
1.7K0
发布2022-12-05 08:37:05
举报
文章被收录于专栏:享~方法

开启掘金成长之旅!这是我参与「掘金日新计划 · 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么? 此时必须使用指针.

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是指针
  • 如何定义ABAP 中的指针
  • 语法及案例
    • ABAP指针用法修改项目内容
      • ABAP指针用法内表新增行项目
      • 技术总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档