ABAP笔记:定义指针,动态指针分配:ASSIGN COMPONENT <N> OF STRUCTURE <结构> TO <指针>.

7 篇文章 0 订阅

参考大佬文章学习,总结了下没有提到的点:SAP ABAP指针的6种用法。_abap 指针-CSDN博客

定义指针:其实指针这玩意,就是类似你给个地方,把东西临时放进去,然后指针就是这个东西的替身了,写代码的时候更方便,指针可以直接赋值。

  FIELD-SYMBOLS: <F1>,<F2>,<F3>.

ASSIGN <结构体> TO <F1>.参照结构体定义指针

 ASSIGN <变量> TO <F2>.参照变量定义指针

动态指针分配:

 <N> -结构的字段技术名称,或者当前行 ,SY-INDEX这种变量,可以是动态的

 <结构>-结构体,工作区之类的

 <指针>-一般以F开头

粗浅理解为:将<结构>中的某个<N>的值 ,分配给<指针>

哈哈,怎么感觉说了好像没说~还得自己理解。

仔细一点就是把结构中,具体的某一个字段,分配给指针,这个字段可以是动态变化的,也可以是静态的某个字段,这里的<N>代表的是结构中的字段技术名称。听不懂没关系,可以看下面示例代码参悟。

ASSIGN COMPONENT <N> OF STRUCTURE <结构> TO <指针>.

使用场景:

可以用灵活计算财务在一行的账龄金额例如 T100,T200,或者各个期间的金额累计,如DMBTR1,DMBTR2……,结构的T100,,T200可以参考如下代码,动态替代,以下计算累计的方式

    REPORT ztest.
    DATA:BEGIN OF wa_tab,
      char1 TYPE i VALUE '1',
      char2 TYPE i VALUE '2',
      char3 TYPE i VALUE '3',
      char4 TYPE i VALUE '4',
      END OF wa_tab.
      DATA:comp(6) VALUE 'CHAR05'.
      FIELD-SYMBOLS: <F1>,<F2>,<F3>.
      ASSIGN WA_TAB TO <F1>.
      ASSIGN COMP TO <F2>.
      DATA :LS_TEST TYPE CHAR10,
            LS_I TYPE I,
            LS_SUM TYPE I.

    DO 4 TIMES.

    LS_I  = LS_I +  1.
    LS_TEST  = 'char' && LS_I .
     ASSIGN COMPONENT LS_TEST OF STRUCTURE <F1> TO <F3>.
     IF <F3> IS ASSIGNED AND SY-SUBRC = 0.
       LS_SUM = LS_SUM  + <F3>.
       WRITE :/ '第' && LS_I && '次累计' , LS_SUM .
     ENDIF.
    ENDDO.

注意事项:

1.需要配合sy-subrc 来判断是否分配成功,

而不是 IF <F3> IS ASSINGED,这个只是判断有没有分配,不能判断有没有成功分配到值

如图结果第五次为999

    REPORT ztest.
    DATA:BEGIN OF wa_tab,
      char1 TYPE i VALUE '01',
      char2 TYPE i VALUE '02',
      char3 TYPE i VALUE '03',
      char4 TYPE i VALUE '04',
      END OF wa_tab.
      DATA:comp(6) VALUE 'CHAR05'.
      FIELD-SYMBOLS: <F1>,<F2>,<F3>.
      ASSIGN WA_TAB TO <F1>.
      ASSIGN COMP TO <F2>.
      DATA :LS_TEST TYPE CHAR10,
            LS_I TYPE I.


    DO 5 TIMES.

    LS_I  = LS_I +  1.
    LS_TEST  = 'char' && LS_I .
     ASSIGN COMPONENT LS_TEST OF STRUCTURE <F1> TO <F3>.
     IF sy-subrc = 0.
     WRITE:/ <F3>.
     ELSE.
     <F3> = 999.
     WRITE:/ <F3>.
     ENDIF.
     CLEAR <F3>.
    ENDDO.

2.如果下一次没有分配成功,指针的值仍为上一次分配的值,第五次执行结果等于第四次,并不是第五次没有分配成功,指针就会清空

    REPORT ztest.
    DATA:BEGIN OF wa_tab,
      char1 TYPE i VALUE '1',
      char2 TYPE i VALUE '2',
      char3 TYPE i VALUE '3',
      char4 TYPE i VALUE '4',
      END OF wa_tab.
      DATA:comp(6) VALUE 'CHAR05'.
      FIELD-SYMBOLS: <F1>,<F2>,<F3>.
      ASSIGN WA_TAB TO <F1>.
      ASSIGN COMP TO <F2>.
      DATA :LS_TEST TYPE CHAR10,
            LS_I TYPE I,
            LS_SUM TYPE I.


    DO 5 TIMES.

    LS_I  = LS_I +  1.
    LS_TEST  = 'char' && LS_I .
     ASSIGN COMPONENT LS_TEST OF STRUCTURE <F1> TO <F3>.
     IF  <F3> <> ''.
      WRITE:/ <F3>.
     ENDIF.
    ENDDO.

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Idan Lian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值