ABAP指针

1. 什么是ABAP指针:
  在ABAP里面,field symbol就相当于c语言的指针。如果你定义并且分配了相应的结构或者变量给它,其实它就指
  
  向这个结构或者变量的地址,如果修改了field symbol的值,则相应结构或者变量的值也随之更改。
  
  
  2. 如何定义指针:
  基本形式:FIELD-SYMBOLS .
  附加信息:
   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 . " 是指向standard table的
  ELSE.
   ASSIGN itab2[] TO .
  ENDIF.
  LOOP AT itab[] ASSIGNING .
   ASSIGN COMPONENT 2 OF STRUCTURE TO . ”filed_fs是ANY的
   WRITE: / .
  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.