有关FIELD-SYMBOLS的用法

(一)定义
1 . FIELD-SYMBOLS: []为内部字段定义field-symbols .
    当不输入时﹐继承赋给它的变量的所有属性
    当输入时﹐赋给它的变量必须与同类型
例如﹕ (说明﹕用户日期格式为dd.mm.yyyy)

FIELD-SYMBOLS: .
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO .
WRITE:/ .

继承dat属性﹐为C型﹐输出为: 19950916

FIELD-SYMBOLS: TYPE d.
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO .
WRITE:/ .

类型为D型﹐而dat为C型﹐类型不匹配﹐出现语法错误

FIELD-SYMBOLS: TYPE d.
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO TYPE 'D' .
WRITE:/ .

类型为D型﹐而dat为C型﹐类型不匹配﹐但TYPE ‘D’是将dat类型转换成D型再分配给
     输出为﹕16091995

2.定义结构化的field-symbols
    FIELD-SYMBOLS: STRUCTURE DEFAULT .
首先将指派给 ,然后继承结构的属性
注意点: a. 中不包涵类型为I或F字段时﹐的定义长度>= 所有字段长度之和﹐否则语
法错误
          b. 中包涵类型为I或F字段时﹐最好为结构类型﹐且结构应该同与 ﹐否则容
易出错
例如﹕
DATA: wa(100) VALUE '001LH 123419950627' .
DATA: BEGIN OF line1 ,
          col1(6) TYPE c,
          col2(4) TYPE c,
          col3(8) TYPE c,
       END OF line1.
FIELD-SYMBOLS: STRUCTURE sbook DEFAULT wa . “sbook为SAP现存结构
FIELD-SYMBOLS: STRUCTURE line1 DEFAULT wa .
WRITE:/ -mandt, -carrid, -connid, -fldate .
WRITE:/ -col1, -col2, -col3 .
输出结果﹕ 001 LH 1234 27.06.1995
001LH 1234 19950627

如果下列代码就会出错﹕ (原因wa没有line1长)
DATA: wa(17) VALUE '001LH 123419950627' .
DATA: BEGIN OF line1 ,
          col1(6) TYPE c,
          col2(4) TYPE c,
          col3(8) TYPE c,
       END OF line1.
FIELD-SYMBOLS: STRUCTURE line1 DEFAULT wa .

结构中含有I, F类型的结构例如﹕
DATA: BEGIN OF line1 ,
          col1 TYPE i,
          col2(4) TYPE c,
       END OF line1.
DATA: BEGIN OF line2,
          col1 TYPE i,
          col2(4) TYPE c ,
       END OF line2 .
line2-col1 = 8 . line2-col2 = 'test' .
FIELD-SYMBOLS: STRUCTURE line1 DEFAULT line2 .
WRITE:/ -col1, -col2 .
输出结果﹕ 8 test

如果如下则错误(因为line2长度< line1 )
DATA: BEGIN OF line1 ,
          col1 TYPE i,
          col2(5) TYPE c,
       END OF line1.
DATA: BEGIN OF line2,
          col1 TYPE i,
          col2(4) TYPE c ,
       END OF line2 .
line2-col1 = 8 . line2-col2 = 'test' .
FIELD-SYMBOLS: STRUCTURE line1 DEFAULT line2 .
WRITE:/ -col1, -col2 .


(二) ASSIGN的用法﹕
1.静态分配
a.无偏移量
ASSIGN TO

例如﹕
FIELD-SYMBOLS: .
FIELD-SYMBOLS: TYPE i .
DATA: txt(20) TYPE c VALUE 'Hello, How are you?'.
DATA: num TYPE i VALUE 5 .
ASSIGN txt TO .
ASSIGN num TO .
DESCRIBE FIELD LENGTH .
WRITE:/ , 'has length', .

输出结果﹕Hello, How are you? has length 20
如下代码将出错(原因没有指向任何内存地址)
FIELD-SYMBOLS: .
FIELD-SYMBOLS: TYPE i .
DATA: txt(20) TYPE c VALUE 'Hello, How are you?'.
DATA: num TYPE i VALUE 5 .
ASSIGN txt TO .
*ASSIGN num TO .
DESCRIBE FIELD LENGTH .
WRITE:/ , 'has length', .






b.有偏移量
ASSIGN [+][()] TO

说明﹕(1). 都可以是变量
       (2).系统不会判断所选择的部分是否在内部,偏移量和长度都可以比
            的长度大,写地址时﹐可以超出的的限制﹐但不能超过定义的内存区
       (3).如果没有指定长度 ,系统默认为的长度
       (4).如果小于的长度﹐可以通过为指定一个‘*’来阻止
限制之外的区域
例如﹕
FIELD-SYMBOLS: .
DATA: BEGIN OF line1,
          col1(10) VALUE '0123456789',
          col2(10) VALUE 'abedefghij',
       END OF line1.
WRITE:/ line1-col1+5.
ASSIGN line1-col1+5 TO .
WRITE:/ .
ASSIGN line1-col1+5(*) TO .
WRITE:/ .

输出结果﹕56789
56789abede
56789

在内存地址分配时﹐和容易造成内存中的数据更改问题﹐例如﹕
FIELD-SYMBOLS: , .
DATA: BEGIN OF line ,
         a VALUE '1', b VALUE '2',
         c VALUE '3', d VALUE '4',
         e VALUE '5', f VALUE '6',
         g VALUE '7', h VALUE '8',
       END OF line .
DATA: off TYPE i .
DATA: len TYPE i VALUE 2 .
ASSIGN line TO .
WRITE:/ .
DO 2 TIMES .
   off = sy-index * 3 .
   ASSIGN line-a+off(1) TO .
   = 'XX'.
ENDDO .
ASSIGN line TO .
WRITE:/ .
输出结果为﹕12345678
123X56X8
可以看出在把的地址指向line时﹐ = ‘XX’时就更改了所指定的内存中的值



   2.动态分配(不是万不得以﹐不要使用这种方式,因其找非常容易出错)
a. ASSIGN () TO
说明﹕ 1.如果分配是在子程序或功能模块中执行﹐程序将在局部的子程序或功能模块中搜索字

               2.如果分配是在子程序或功能模块之外执行,或未找到字段,程序在全局变量中搜索
                 字段
               3.如在全局变量中都未找到字段,则在工作程序Tables处声明的工作区中寻找
       注意﹕如果找到 ,则SY-SUBRC = 0 ,否则SY-SUBRC = 4

例如﹕
主程序Report1 .
REPORT1 .
TABLES : SBOOK .
SBOOK-FLDATE = ‘20031219’ .
PERFORM fomr1(Report2) .

子程序Report2 .
REPORT2 .
  FORM form1 .
     PERFORM form2(Report3) .
  ENDFORM .

字程序Report3 .
  REPORT3.
     FORM form2 .
          DATA: name(20) TYPE C VALUE ‘SBOOK-FLDATE’ .
          FIELD-SYMBOLS .
          ASSIGN (name) to .
          IF SY-SUBRC = 0 .
             WRITE:/ .
          ENDIF .
     ENDFORM .
  输出结果﹕19.12.2003

  说明﹕子程序Report3中引用了主程序的工作取区域的字段fldate,如果用静态Assign来无法实现﹐因为在子程序Report3无SBOOK-FLDATE ,语法检查会出现错误
  
b.表工作区的动态分配
   ASSIGN TABLE FIELD () TO
把主程序Tables处声明的工作区域指派给
例如﹕
TABLES : sbook .
DATA: name1(20) VALUE 'SBOOK-FLDATE' .
DATA: name2(20) VALUE 'name1' .
FIELD-SYMBOLS : .
ASSIGN TABLE FIELD (name1) TO .
WRITE:/ 'sy-subrc' , sy-subrc .
ASSIGN TABLE FIELD (name2) TO .
WRITE:/ 'sy-subrc' , sy-subrc .

输出结果﹕ sy-subrc 0
sy-subrc 4

3.将字段符号分配给其他字段符号
          ASSIGN [+][()] TO .
       等同与下列动态分配
          ASSING TABLE FIELD () TO .
       其中包含字段符号的名称
       说明﹕可以是同一个字段符号
       例如﹕
DATA: BEGIN OF line1 ,
         a VALUE '1', b VALUE '2',
         c VALUE '3', d VALUE '4',
         e VALUE '5', f VALUE '6',
         g VALUE '7', h VALUE '8',
       END OF line1 .
DATA: off TYPE i .
FIELD-SYMBOLS : .
ASSIGN line1-a TO .
DO 4 TIMES .
   off = sy-index - 1 .
   ASSIGN +off(1) TO .
   WRITE: .
ENDDO .

输出结果﹕ 1 2 4 7
分析﹕
   首先指向line1-a地址
   循环中﹕
     off = 0时, +0(1)  , 指向line1-a地址值为﹕1
     off = 1时, +1(1)  , 指向line1-b地址值为﹕2
     off = 2时, +2(1)  , 指向line1-d地址值为﹕4
     off = 3时, +2(1)  , 指向line1-g地址值为﹕7

   4.分配字段串组件
     
      ASSIGN COMPONENT OF STRUCTURE TO .
系统将字符串的组件赋给字段符号 ,可以指定为文字或变量
例如﹕
DATA: BEGIN OF line1,
         col1 TYPE i VALUE '11',
         col2 TYPE i VALUE '22',
         col3 TYPE i VALUE '33',
       END OF line1.
DATA: comp(10) TYPE c VALUE 'col3' .
FIELD-SYMBOLS : , , .
ASSIGN line1 TO .
ASSIGN comp TO .
DO 3 TIMES .
   ASSIGN COMPONENT sy-index OF STRUCTURE TO .
   WRITE: .
ENDDO .
ASSIGN COMPONENT OF STRUCTURE TO .
WRITE: / .

输出结果﹕ 11 22 33
                  33

(三) .定义字段符号的格式
1.定义字段符号的类型
        ASSIGN …. TO TYPE .
    说明﹕a.如果没有定义类型﹐则不继承赋给它的变量的类型与长度﹐而类型为
           b.如果定义了类型﹐则系统将赋给它的变量的类型转换成在给,此时
注意类型转化的可兼容性
         例如﹕
DATA: text(8) TYPE c VALUE '20031221' .
DATA: t_type .
DATA: t_len TYPE i .
FIELD-SYMBOLS : .

ASSIGN text TO .
WRITE:/ .
DESCRIBE FIELD TYPE t_type
                LENGTH t_len .
WRITE: t_type , t_len .

ASSIGN text TO TYPE 'D' .
WRITE:/ .
DESCRIBE FIELD TYPE t_type
                LENGTH t_len .
WRITE: t_type , t_len .

输出结果﹕20031221 C 8
21122003 D 8

2.更改字段符号的小数位
     ASSIGN …. TO DECIMALS .
  说明﹕的小数位为位﹐这会导致字段符号的值与指派的变量的值不同。
         可以是变量或常量﹐如果不在0和14之间﹐或者指派的变量的类型不是P
型﹐将导致程序运行错误
   例如﹕
DATA: pack1 TYPE p DECIMALS 2 VALUE '400' .
DATA: pack2 TYPE p DECIMALS 2 .
DATA: pack3 TYPE p DECIMALS 2 .
FIELD-SYMBOLS: , .
WRITE:/1(8) 'Pack1', pack1 .
ASSIGN pack1 TO DECIMALS 1 .
WRITE:/1(8) '', .
pack2 = .
WRITE:/1(8) 'Pack2', pack2 .
ASSIGN pack2 TO DECIMALS 4 .
WRITE:/1(8) '', .
pack3 = + .
WRITE:/1(8) 'Pack3', pack3 .
= '1234.56779' .
WRITE:/1(8) '', .
WRITE:/1(8) 'Pack2', pack2 .

输出结果﹕
Pack1 400.00
4,000.0
Pack2 4,000.00
40.0000
Pack3 4,040.00
1,234.5678
Pack2 123,456.78

(四) .运行检查﹐防止取指派变量定义取之外的数据
注意点﹕1.对于内表﹐存储区的大小由记录的行数的多少﹐这种表行数不固定﹐运行时存储区动态分配,
           容易造成取存储区之外的数据﹐应该注意
         2.对于DATA定义的变量﹐存储区固定﹐注意不要取存储区之外的数据
   例如﹕
DATA: BEGIN OF line1 ,
         col1(4) TYPE c VALUE '1234',
         col2(2) TYPE c VALUE '56',
       END OF line1 .
DATA: text1(1) TYPE c VALUE 'a' .
DATA: text2(2) TYPE c VALUE 'bc' .
DATA: text3(3) TYPE c VALUE 'def'.
FIELD-SYMBOLS : .
DO 6 TIMES .
   ASSIGN text1+sy-index(1) TO .
   WRITE: .
ENDDO.
程序运行错误,因为在循环中超出存储区域的范围

转载于:https://www.cnblogs.com/hyladmin/archive/2008/12/05/1348051.html

你可能感兴趣的:(有关FIELD-SYMBOLS的用法)