1. 什么是ABAP指针:在ABAP里面,field symbol就相当于c语言的指针。如果你定义并且分配了相应的结构或者变量给它,其实它就指
向这个结构或者变量的地址,如果修改了field symbol的值,则相应结构或者变量的值也随之更改。
2. 如何定义指针:基本形式:FIELD-SYMBOLS <fs>.附加信息: 1. ... TYPE :定义一个数据类型,然后定义指针 2. ... TYPE REF TO :指针指向类或者接口 3. ... TYPE REF TO :指针指向数据结构 4. ... TYPE LINE OF :指针内表的行项目 5. ... LIKE :指针为数据库表类型 6. ... LIKE LINE OF :指针类型为数据库表的行项目
3. 如何分配指针:(1). ASSIGN f TO .:分配一个指针,包括以下几种类型1. ... CASTING ... :主要对unicode系统地操作 1a. ... CASTING 1b. ... CASTING TYPE type 1c. ... CASTING ... DECIMALS dec 1d. ... CASTING LIKE f12. ... TYPE type :直接指定类型3. ... DECIMALS dec :指定小数点位数4. ... RANGE range:指定范围(2). 分配结构中的某个字段给指针ASSIGN COMPONENT idx OF STRUCTURE struc TO .ASSIGN COMPONENT name OF STRUCTURE struc TO .(3). 分配类的方法给指针ASSIGN dref->* TO .(4). 从f开始,是f的n倍长之后的内容分配给指针ASSIGN f INCREMENT n TO .(5). 分配局部变量给指针ASSIGN LOCAL COPY 3a. ASSIGN LOCAL COPY OF f TO . 3b. ASSIGN LOCAL COPY OF INITIAL f TO . 3c. ASSIGN LOCAL COPY OF INITIAL LINE OF itab TO . 4c. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO .(6). ASSIGN dynamicJ:动态分配指针 4a. ASSIGN (f) TO . 4b. ASSIGN oref->(f) TO . 4c. ASSIGN (f1)=>(f2) TO . 4d. ASSIGN TABLE FIELD (f) TO . 4e. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO . 4f. ASSIGN LOCAL COPY OF ... (f) TO .
4. 如何取消分配: UNASSIGN .
不清楚内表内表到底是itab还是itab2,但是又要访问内表里的第2个字段。所以在loop的时候不能用to到一个结构体,而要用assigning一个指向ANY的指针,然后进行后面的操作。
IF n = 1. ASSIGN itab[] TO <tab_fs>. " <tab_fs>是指向standard table的ELSE. ASSIGN itab2[] TO <tab_fs>.ENDIF.LOOP AT itab[] ASSIGNING <wa_fs>. ASSIGN COMPONENT 2 OF STRUCTURE <wa_fs> TO <field_fs>. ”filed_fs是ANY的 WRITE: / <field_fs>.ENDLOOP.
具体实现:
1.结构的动态查询
DEFINE SELECT_DATA_TO_WA. SELECT &1 FROM &2 INTO CORRESPONDING FIELDS OF &3 WHERE (&4). EXIT. ENDSELECT.END-OF-DEFINITION.
2.变量的动态查询
DEFINE SELECT_DATA_TO_VARIANT. SELECT &1 FROM &2 INTO &3 WHERE (&4). EXIT. ENDSELECT.END-OF-DEFINITION.
3.内表的动态查询
DEFINE SELECT_DATA_TO_VARIANT. SELECT &1 FROM &2 INTO CORRESPONDING FIELDS OF TABLE &3 WHERE (&4). EXIT. ENDSELECT.END-OF-DEFINITION.
具体程序实现:
DATA: L_FIELD(100) TYPE C, L_TABLE(10) TYPE C, L_COND(100) TYPE C.
DATA: I_COND TYPE TALBE OF L_COND.
FIELD-SYMBOLS TYPE ANY.
START-OF-SELECTION.
CONCATENATE 'CARRID' 'CONNID' 'CITYFROM' INTO L_S SEPARATE BY SPACE.
CONCATENATE 'CONNID = ' '0123' INTO L_COND.
APPEND COND TO I_COND.
L_TABLE = 'SPFLI'.
IF IS ASSIGNED.
UNASSIGN . ASSIGN SPFLI TO .
ELSE.
ASSIGN SPFLI TO .
ENDIF.
SELECT_DATA_TO_WA (L_S) (L_TABLE) I_COND.