参考大佬文章学习,总结了下没有提到的点: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.