ABAP指针

来源:互联网 发布:excel2003 sql 编辑:程序博客网 时间:2024/05/24 22:45

文章 转自 http://www.dlsap.com/thread-1197-1-1.html

 

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 f1
2. ... 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.