• ABAP基础语法


    1.数据类型及属性

    类型

    说明

    C

     

    N

    0到9之间字符组成的数字字符串

    D

    日期格式必须为 YYYYMMDD

    T

    格式为 24-hour的 HHMMSS

    I

    -2.147.483.648 to +2.147.483.647

    F

    小数位最大可以到17位,即可精确到小数点后17位

    P

    两个数字位压缩后才占一个字节,由于0-9的数字只需要4Bit位,所以一个字节实质上允许存储二位数字,这就是P数据类型为压缩数据类型的由来。并借用半个字节来存储小数点位置、正号、负号相关信息

    X

    十六进制字符 0-9, A-F具体的范围为:00~FF

    类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符

    如果未在 DATA 语句中指定参数<length>,则创建长度为 1

    注:如果值是字母,则一定要大写

    语法示例:

    DATA: number(16) TYPE p DECIMALS 14 VALUE '12345678901234567.89012345678901'.

    "16 * 2 = 32表示了整个字面意义上允许的最大字面个数,而14表示的是字面上小数点后面允许的最大小数位,而不是指14个字节,只有这里定义时的16才表示16个字节

     

    predefined ABAP types

    Type

    Length

    Standard length

    Description

    b

    1 Byte

     

    1 byte integer (internal)

    c

    1 to 65,535 characters

    1 character

    Text field

    cursor

    as i

    as i

    Database cursor

    d

    8 characters

     

    Date field

    f

    8 bytes

     

    Floating point number

    i

    4 bytes

     

    4 byte integer

    n

    1 to 65,535 characters

    1 character

    Numeric text

    p

    1 to 16 bytes

    8 bytes

    Packed number

    string

    variable

     

    Text string

    s

    2 bytes

     

    2 byte integer (internal)

    t

    6 characters

     

    Time field

    x

    1 to 65,535 bytes

    1 byte

    Byte field(hexadecimal)

    xstring

    variable

     

    Byte string

     

    数据字典预置类型与ABAP类型对应关系。

    数据字典预置类型

    ABAP类型

    运行长度

    说明

    ACCP

    N(6)

    6

    会计计算周期

    CHAR

    C(n)

    1-255

    字符

    CLNT

    C(3)

    3

    集团,数据区域代码

    CUKY

    C(5)

    5

    货币代码

    CURR(n,m)

    P((n+1)/2)DECIMALm

    42736

    货币金额

    DATS

    D(8)

    8

    日期

    DEC n,m

    P((n+1)/2)DECIMALm

    n(1-31)m(1-17)

    数值计算

    FLTP

    F(8)

    18

    浮点数

    INT1

    X(1)(类型b)

    3

    单字节整形数

    INT2

    X(2)(类型s)

    5

    双字节整形数

    INT4

    X(4)(类型i)

    10

    四字节整形数

    LANG

    C(1)

    内部1位外部2位

    语言代码

    LCHR

    C(n)

    256-最大值

    长字符

    LRAW

    X(n)

    256-最大值

    长位字串

    NUMC n

    N(n)

    1-255

    数值文字

    PREC

    X(2)

    16

    精确度

    QUAN n,m

    P((n+1)/2)DECIMALm

    42736

    数量

    RAW n

    X(n)

    1-255

    位字串

    TIMS

    T(6)

    6

    时间

    VARC n

    C(n)

    255-最大值

    长字符(仅3.0前可用)

    STRING

    STRING

    1-最大值

    字符串

    RAWSTRING

    XSTRING

    1-最大值

    位字符串

    UNIT

    C(n)

    2~3

    单位

    SAP系统变量

    SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功

    SY-DBCNT: 在open SQL语句中,表示执行影响到的数据条数 
    SY-DBLNT: 被处理过的记录的笔数 
    SY-UNAME: 当前使用者登入SAP的USERNAME;
    SY-DATUM: 当前系统日期;
    SY-UZEIT: 当前系统时间;
    SY-TCODE: 当前执行程序的Transaction code
    SY-INDEX :
    SY-TABIX:
    SY-TMAXL: Internal table的总笔数
    SY-SROWS: 屏幕总行数;
    SY-SCOLS: 屏幕总列数;
    SY-MANDT: 當前系統編號(CLIENT NUMBER)
    SY-VLINE: 画竖线
    SY-ULINE: 画横线
    SY-PAGNO: 当前页号
    SY-LINSZ: 当前报表宽度
    SY-LINCT: 当前报表长度
    SPACE: 空字符串
    SY-LSIND: 列表索引页
    SY-LISTI: 上一个列表的索引
    SY-LILLI: 绝对列表中选定行的行号
    SY-CUROW: 屏幕上的行
    SY-CUCOL: 光标列
    SY-CPAGE: 列表的当前显示页
    SY-STARO:真实行号
    SY-LISEL: 选择行的内容,长度为255
    SY-LINNO: 当前行

    q  系统内部有一个专门存放系统变量的结构SYST,其中最常用的系统变量有:
    SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功
    SY-UNAME: 当前使用者登入SAP的USERNAME;
    SY-DATUM: 当前系统日期;    

    SY-DATAR:如果屏幕上至少有一个输入字段的值被用户或其他数据传输所更改, 值为X。但如果没有修改,回车后的值是空。
    SY-UZEIT: 当前系统时间;
    SY-TCODE: 当前执行程序的Transaction code
    SY-REPID: ABAP 程式名,目前的主程式
    SY-DYNNR: 画面号

    SY-CPROG: ABAP 程式名
    SY-SYSID: R/3 系統,R/3 系統名稱
    SY-UCOMM: PAI 驱动的功能代码,一般用来参照定义变量
    SY-INDEX(DO) : 当前LOOP循环过的次数
    SY-TABIX(LOOP READ): 当前处理的是internal table 的第几笔

    sy-langu:记录登陆系统的语言。

     

     

    2.数据与变量声明

    l  变量以字母作为首字符,长度不超过30字节(SPACE是预定义字段constant with C)。

    l  如果没有指定类型,默认使用类型C。

    l  LIKE参数,既可以参照内部字段,也可以参照数据库中的字段。只要在程序的一个地方中数据属性发生改变,其他使用LIKE参数定义的数据也发生改变。

    l  透明表(还有其它数据词典中的类型,如结构)即可看作是一种类型,也可看作是对象,所以即可使用TYPE,也可以使用LIKE

    TYPES:定义数据类型

    -       数据类型是纯粹的说明。

    -       没有与数据类型相关联的内存。

    -       数据类型描述数据对象的技术属性。

    -       数据类型是数据对象的属性并与数据对象联系紧密。

    DATA:声明数据对象(变量、常量)

    -       数据对象是程序在运行时使用的物理单元。

    -       每个数据对象都有分配给它的特定数据类型。

    -       每个数据对象占据一些内存空间。

    -       ABAP/4 根据数据对象的数据类型处理数据对象。

    l  TABLES: spfli.

    DATA spfli TYPE spfli.

    以上两个语句等价。即在定义内存变量时,可以将透明表当做结构体来使用

    l  CONSTANTS 利用<value>参数指定的初始值,在程序的执行期间不能更改。

    DATA 语句

    用于创建变量

    CONSTANTS 语句

    用于创建常量(必须赋值),数字常量有数据类型P与I,文本常量有C与N。

    STATICS语句

    用于创建变量,这些变量在程序运行期间一直存在,但仅在过程中可见

    TABLES语句

    用于创建表工作区

    TYPES 语句

    用于创建用户定义的数据类型

    语法示例:

    DATA : BEGIN OF address2,
      street(20) TYPE c,
      city(20) TYPE c,
      END OF address2.
    DATA obj4 TYPE STANDARD TABLE OF address2."这里使用的实质上是词典中的类型address2
    DATA obj5 LIKE STANDARD TABLE OF address2."这里使用是的上面定义的变量address2

    3.数据赋值

    l  Value参数赋予字段相应的初始值。

    WRITE {source|(source_name)} TO destination.

    The data objects source_name and destination must be character type and flat.

    语法示例:

    DATA: date_short TYPE c LENGTH 8,
          date_long  TYPE c LENGTH 10,
          date_mask  TYPE c LENGTH 8.
    WRITE sy-datum TO: date_short,
                       date_long,
                       date_mask DD/MM/YY.

    WRITE ICON_OKAY AS ICON TO PUBU2. "给PUBU2按钮添加图标,并且在给按钮赋值之前,否则将会把文字替换。

    MOVE source {TO|?TO} destination.

    destination1 = destination2 = ... = destination = source.

    MOVE-CORRESPONDING struc1 TO struc2.

    UNPACK source TO destination.

    For source, the data type p of length 16 without decimal places is expected. The data type of destination must be character-type and flat.

    READ LINE line_num FIELD VALUE num.

    4.数据清除.

    CLEAR dobj [ {WITH val [IN {BYTE|CHARACTER} MODE] } 所有的space被var替代
               | {WITH NULL} ].
    如果使用有表头行的内表,CLEAR 仅清除表格工作区域,CLEAR dobj[] 都清除

    REFRESH itab.清除内表所有行

    FREE  dobj.”内存释放

    5.字符串处理

    CONCATENATE

    {dobj1 dobj2 ...}|{LINES OF itab}
    INTO result
    [IN {BYTE|CHARACTER} MODE]
    [SEPARATED BY sep] ”用sep分割

    SPLIT dobj AT sep INTO
          { {result1 result2 ...} | {TABLE result_tab} }
          [IN {BYTE|CHARACTER} MODE].


    [RESPECTING BLANKS].“对于c, d, n, t类型的字符串有一个RESPECTING BLANKS选项可使用,表示尾部空格也会保留。

    FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF]  pattern
    IN [section_of] dobj     
    pattern:{[SUBSTRING] sub_string} | {REGEX regex}” sub_string in pattern is an empty string or is of type c, d, n, or t and only contains empty characters,  regex in pattern contains a regular expression that is the same as the empty character string,
    [IN {BYTE|CHARACTER} MODE]
    [{RESPECTING|IGNORING} CASE]
    [MATCH COUNT  mcnt]
    “成功匹配次数
    { {[MATCH OFFSET moff] [MATCH LENGTH mlen]} ”
    最后一次整体匹配到的串(整体串,最外层分组,而不是指正则式最内最后一个分组)起始位置与长度
    |[RESULTS result_tab|result_wa]}
    result_tab接收所有匹配结果,result_wa只能接收最后一次匹配结果
    [SUBMATCHES s1 s2 ...].
    通常与前面的MATCH OFFSET/ LENGTH一起使用。只会接收使用括号进行分组的子组。如果变量s1 s2 ...比分组的数量多,则多余的变量被initial;如果变量s1 s2 ...比分组的数量少,则多余的分组将被忽略;且只存储第一次或最后一次匹配到的结果

    REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern
    IN [section_of] dobj WITH new
    [IN {BYTE|CHARACTER} MODE]
    [{RESPECTING|IGNORING} CASE]
    [REPLACEMENT COUNT rcnt]
    { {[REPLACEMENT OFFSET roff] [REPLACEMENT LENGTH rlen]}
    | [RESULTS result_tab|result_wa] }.

    l   SHIFT dobj {BY num PLACES} | {UP TO sub_string} “sub_string开始

    [LEFT|RIGHT][CIRCULAR]  ” CIRCULAR:将移出的字符串放在左边或者左边

    { {LEFT DELETING LEADING}|{RIGHT DELETING TRAILING} } pattern

    执行结果返回给系统变量SY-SUBRC,若执行成功时,返回值为"0",倘若子串与原字符串不匹配,返回值为"4"。

    l   CONDENSE text [NO-GAPS]. 如果是C类型只去掉前面的空格(因为是定长,即使后面空格去掉了,左对齐时后面会补上空格),如果是String类型,则后面空格也会被去掉;字符串中间的多个连续的空格使用一个空格替换(String类型也是这样);NO-GAPS:字符串中间的所有空格都也都会去除(String类型也是这样);空格去掉后会左对

    l   CONVERT TEXT text INTO SORTABLE CODE hex. 数据对象文本(X)的内容被转换为可排序的字节序列,结果被分配给变量hex;数据对象文本保持不变,若hexxstring类型,则其长度将自动调整。

    l   TRANSLATE text {TO {UPPER|LOWER} CASE}
                 | {USING pattern}.

    l   SEARCH <c> FOR <str>.

    语法示例:

    DATA text TYPE string.
    text = `Barbcbdbarb`.
    TRANSLATE text USING 'rVcX'. ”BaVbXbdbaVb
    TRANSLATE text TO UPPER CASE. ”BABVXBDBAVB
    WRITE:/ text.

    6.PARAMETERS语句

    PARAMETERS {para[(len)]}|{para [LENGTH len]}
               [
    type_options]
               [
    screen_options]
               [
    value_options]
               [
    ldb_options].

    l  type_options:

    { TYPE type [DECIMALS dec] } | { LIKE dobj } |{ LIKE (name)}.

     TYPE type:参照某一类型对象定义PARAMETERS。
     ...DECIMALS dec:定义小数位,对输入参数自动格式化,该语法只对P类型有效(参数某一类型定义关键字TYPE)。
     ...LIKE dobj:參照某一字典对象定义PARAMETERS。

    l  screen_options:

    { {[OBLIGATORY|NO-DISPLAY] [VISIBLE LENGTH vlen]}
        | {AS CHECKBOX [USER-COMMAND fcode]}
        | {RADIOBUTTON GROUP group [USER-COMMAND fcode]}
        | {AS LISTBOX VISIBLE LENGTH vlen [USER-COMMAND fcode]
                                          [OBLIGATORY]} }
        [MODIF ID modid].

     ...MEMORY ID pi:将PARAMETERS存储在SAP内存,参数名长度不能超过三位 ...NO-DISPLAY:将PARAMETERS设置为隐藏,不会的屏幕上输出。
     ...OBLIGATORY:限制该PARAMETERS为必填,否则会提示输入。...AS CHECKBOX:创建CHECKBOX对象。

    ...RADIO BUTTON GROUP radi:创建(RADIO)单选框。...VISIBLE LENGTH vlen:定义显示长度。
     ...USER-COMMAND ucom:为创建对象分配对象名,该值保存在内表中可供其它对象操作。 ...AS LISTBOX VISIBLE LENGTH vlen:创建一个下拉框,并指定长度.

    l   value_options

    ... [DEFAULT val]
        [LOWER CASE]
        [MATCHCODE OBJECT search_help]
        [MEMORY ID pid]
        [VALUE CHECK] ... .若要使值表检查生效,则首先需要将此 Domain 引用到表字段,再对此表字段通过 按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,

    AS CHECKBOX, RADIOBUTTON, or NO-DISPLAY 不能同时使用...DEFAULT f:定义默认值。 ...LOWER CASE:输入值中不允许输入小写字符,否则会自动转换为大写。

    l   ldb_options

    ... FOR {TABLE|NODE} node
        [HELP-REQUEST]
        [VALUE-REQUEST]
        [AS SEARCH PATTERN] ... .

    ... ON <field>:该语法用于控制屏幕元素输入时的遇错处理,检查具体输入字段(SELECTION-OPTIONS或PARAMETERS)是否完整或正确,若输入有错或不满足条件,其它屏幕元素会变成灰色,不接受输入直到该字段输入正确为止。
          ...ON VALUE-REQUEST FOR <field low/high>:SELECT-OPTIONS按选择帮助<F4>键时触发该事件。
          ...ON HELP-REQUEST FOR <field low/high>:SELECTION-OPTIONS按选择帮助<F1>键时键发该事件。

    LISTBOX下拉列表

       FUNCTION ”F4IF_INT_TABLE_VALUE_REQUEST”

       FUNCTION ”VRM_SET_VALUES”.

    语法示例:

    PARAMETERS:          P1 RADIOBUTTON GROUP GRP1 DEFAULT 'X',
                                 P2 RADIOBUTTON GROUP GRP1.

    7.字段符号

    FIELD-SYMBOLS <fs> { typing | STRUCTURE struc DEFAULT dobj }.

    l   FIELD-SYMBOLS:<fs>.

    l   FIELD-SYMBOLS <fs> TYPE itab."将<fs>定义成了具体限定类型

    8.字段的动态分配

    ASSIGN ... TO <fs>:将某个内存区域分配给字段符号,这样字段符号就代表了该内存区域

    l   ASSIGN name TO <fs>."结果是<fs>与name变量等同"静态分配:编译时就知道要分配的对象

    l   ASSIGN (name) TO <fs>."结果是是<fs>的值为str变量值 "通过变量名动态访问变量

    l   UNASSIGN:该语句是初始化<FS>字段符号,执行后字段符号将不再引用内存区域

    l    CLEAR:与UNASSIGN不同的是,只有一个作用就是初始化它所指向的内存区域,而不是解除分

    语法示例:

    DATA: BEGIN OF line,
      col1 TYPE i VALUE '11',
      col2 TYPE i VALUE '22',
      col3 TYPE i VALUE '33',
    END OF line.
    DATA comp(5) VALUE 'COL3'.
    FIELD-SYMBOLS: <f1>, <f2>, <f3>.
    ASSIGN line TO <f1>.
    ASSIGN comp TO <f2>.

    "还可以直接使用以下的语法访问其他程序中的变量
    ASSIGN ('(ZJDEMO)SBOOK-FLDATE') TO <fs>.

    "通过索引动态的访问结构成员
    ASSIGN COMPONENT sy-index OF STRUCTURE <f1> TO <f3>.

    "通过字段名动态的访问结构成员
    ASSIGN COMPONENT <f2>OF STRUCTURE <f1> TO <f3>.

    9.预置函数

    ... func( arg ) ...

    l   数值运算及算术运算函数

    ADD 10 to int.

    SUBSTRACT 10 from int.

    MULTIPLY int by 10.

    DIVIDE int by 10.

    语法示例:

    DATA: i1 TYPE I,i2 TYPE I,i3 TYPE I,
          f1 TYPE p DECIMALS 1, f2 TYPE p VALUE '2.3' DECIMALS 1,f3 TYPE p DECIMALS 1,
    word1 TYPE string VALUE 'ABCD',word2 TYPE string VALUE 'EFG',xstr TYPE XSTRING.
     f1 = ( i1 + EXP( f2 ) ) * i2 / SIN( 3 - i3 ).
        COMPUTE f3 = SQRT( SQRT( ( i1 + 12 ) * i3 ) + f2 ).”注意符号间间距
         i1 = STRLEN( word1 ) + STRLEN( word2 ).
    WRITE:/ i1,i2,i3,f1,f2,f3.

    10. DESCRIBE

    DESCRIBE TABLE itab[KIND knd][LINES lin][OCCURS n].

    KIND knd :T 时代表标准表,为S时代表排序表,为H时代表哈希表

     LINES lin  内表表行数量

     OCCURS n在内表用选项initial size 或者老式的选项ocurs创建期间决定内表所需要的初始化内存大小

    DESCRIBE DISTANCE

    DESCRIBE DISTANCE BETWEEN dobj1 AND dobj2 INTO dst
                              IN {BYTE|CHARACTER} MODE.

    dobj1 and dobj2两个变量地址起始位置的距离

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/xj159/p/11947371.html
Copyright © 2020-2023  润新知