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