ABAP New Features - Variables

Omitting the Declaration of TYPE POOL Statements

6.4以后,系统的type-pools声明的将在全局使用,不需要再引入TYPE- POOLS: abap, icon.定义变量时,我们也可以参考全局Class中的公有属性定义

DATA : monster_table TYPE zcl_monste rs=>mtt_monster_table .
zcl_monsters ->make_monsters_dance( monster_table ) .

Omitting Data Type Declarations

以前变量必须在DATA中声明然后再使用

    DATA: monster_instructions TYPE string.
    monster_instructions = 'Jump up and down and howl'.

编译器在检查语法时,已经知道等号后面的类型,那么我们可以让编译器来决定等号前面的变量的类型,如下所示来定义变量。

DATA(monster_instructions_new) = 'Jump up and down and howl'.
DATA(number_of_monsters_new) = lines( table_of_monsters ).  "table_of_monsters 已经定义

Creating Objects Using NEW

以前我们都是先定义再赋值,现在可以用New关键跟变量类型来创建对象,括号中传入相应的参数。

* Instead of
    DATA: monster TYPE REF TO zcl_monster.
    CREATE OBJECT monster EXPORTING name = 'FRED'.

* You'll use
    DATA(monster2) = NEW zcl_monster( name = 'FRED' ).

*and instead of
    DATA: sanity TYPE zde_monster_sanity.
    sanity = 0.

* You'll use
    DATA(sanity2) = NEW zde_monster_sanity( 1 ).

Filling Structures and Internal Tables While Creating Them Using VALUE

通常VALUE的用法像这样DATA : monster_name TYPE string VALUE ' FRED '.,但是当定义成结构内表时,以前我们不能直接用value赋值

    monster_type_selection_option-option = 'EQ'.
    monster_type_selection_option-sign   = 'I'.
    monster_type_selection_option-low    = 'MSTR'."Standard Monster
    APPEND monster_type_selection_option TO monster_type_range.

    DATA(monster)           = NEW zcl_monster( ).
    DATA(table_of_monsters) = monster->get_monsters( monster_type_range ).

7.4以后,我们可以用如下代码

    TYPES: l_typ_monster_type TYPE RANGE OF zde_monster_type.
    DATA(table_of_monsters2) = monster->get_monsters(
      VALUE l_typ_monster_type(
            ( option = 'EQ' )
            ( sign   = 'I' )
            ( low    = 'MSTR' ) ) ). "Standard Monster

Filling Internal Tables from Other Tables Using FOR

插入内表数据可以用下面方法。

    table_of_monsters = VALUE #(
    ( name = 'FRED' )  ( monster_number = 1 )
    ( name = 'HUBERT') ( monster_number = 2 ) ).

    DATA(http_name_value_pair) = VALUE ihttpnvp(
    name = 'Access-Control-Allow-Origin'
    value = '*' ).

但通常我们是将一个内表中的值赋到另一个内表,如果结构相同可以用APPEND LINES OF green_monsters TO all_monsters .7.4后可以用FOR循环,添加更多的限制条件

    SELECT *
      FROM ztsm_monsters
      INTO TABLE @DATA(all_monsters).

    TYPES: typ_monsters TYPE STANDARD TABLE OF ztsm_monsters WITH DEFAULT KEY.

    DATA(neurotic_monsters) = VALUE typ_monsters(
     FOR monster_details IN all_monsters WHERE ( sanity < 20 )
         ( name           = monster_details-name
           monster_number = monster_details-monster_number ) ).

Creating Short-lived Variables Using LET

7.4后可以用LET定义短生命周期的变量,如下在DO循环中,用LET定义了weapon_name,nonster_name,当这条语句执行后,这些变量将不再存在。

    SELECT *
      FROM ztsm_monsters
      INTO TABLE @DATA(table_of_monsters).

    DATA(iterator) = NEW lcl_monster_iterator( ).

    DO lines( table_of_monsters[] ) TIMES.
      DATA(weapon_description) = CONV string(
        LET weapon_name  = iterator->get_next_weapon( )
            monster_name = table_of_monsters[ sy-index ]-name
            date_string  = |{ sy-datum+6(2) } / { sy-datum+4(2) } / { sy-datum(4) }|
        IN |Monster { monster_name } was issued a { weapon_name } on { date_string }| ).
      WRITE:/ weapon_description.
    ENDDO.

String Processing

7.02前,拼接字符串用concatenate的方法,7.02后,用||来表示字符串,用{}来引入传入的变量。

    DATA: helper TYPE string,
          result TYPE string,
          number TYPE zde_monster_number VALUE '0000000001',
          status TYPE string VALUE 'is feeling GROOVY, man'.

    CONCATENATE 'Monster Number' number INTO helper SEPARATED BY space.
    CONCATENATE helper status INTO result SEPARATED BY ' / '.

    result = |Monster Number { number } / { status }|.

7.4以前,对于ALPHA类型的前导0,要显示时,首先要CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT',要用select从数据库表查询时,首先要CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'进行转换。
7.4后,当我们要在显示string中去掉前导0,可以用message = |{ monster_number ALPHA = OUT }|.

Method Chaining

从7.02开始就可以链式地调用方法,以前先定义好了参数,再将参数传进去,现在参数可以直接传方法的返回值。

    DATA: exception TYPE REF TO zcx_monster_exceptions.
    TRY.
        "Do Something
      CATCH zcx_monster_exceptions INTO exception.
        DATA(helper) = exception->get_text( ).
        zcl_bc_screen_message=>output( helper ).
    ENDTRY.

    TRY.
        "Do Something
      CATCH zcx_monster_exceptions INTO exception.
        zcl_bc_screen_message=>output( exception->get_text( ) ).
    ENDTRY.

Avoiding Type Mismatch Dumps When Calling Functions

在CALL方法传参数时,我们要保证输入输出参数的类型与方法的参数类型一致,如果参数多就需要我们多次进入该方法查看参数类型,这样操作比较麻烦,如下面代码:

    DATA: number_of_heads TYPE i,
          number_of_hats  TYPE i,
          monster_number  TYPE zde_monster_number VALUE '0000000001'.

    DATA(monster) = NEW zcl_monster( ).

    monster->get_ahead_get_a_hat(
    EXPORTING id_monster_number  = monster_number
    IMPORTING ed_number_of_heads = number_of_heads
              ed_number_of_hats  = number_of_hats ).

7.4以后,我们可以从方法中定义变量类型而不是在程序开始时,如下代码,直接在call方法时定义变量,这样避免了类型不匹配问题,代码量也减少了,并且如果方法中参数类型修改了,此处调用也能自动匹配新类型。

    monster->get_ahead_get_a_hat(
    EXPORTING id_monster_number  = monster_number
    IMPORTING ed_number_of_heads = DATA(number_of_heads2)
              ed_number_of_hats  = DATA(number_of_hats2) ).

当通过构造方法定义类时,以前我们定义class具体的类型,方法返回可能子类或父类,现在我们可以通过构造方法返回的类型来决定class的类型。

 DATA: monster2 TYPE REF TO zcl_green_monster.
 monster2 = zcl_laboratory=>build_new_monster( ).

 DATA(monster3) = zcl_laboratory=>build_new_monster( ).

Using Constructor Operators to Convert Strings

对于string类型与char类型,以前我们在参数中若类型不匹配,需要用=赋值相同类型的变量再传入方法参数。7.4开始,可以用CONV #( monster_name2 )进行类型的转换匹配。

    DATA: helper       TYPE char20,
          monster_name TYPE string.

    monster_name = 'HUBERT'.
    helper       = monster_name.
    DATA(monster) = NEW zcl_monster( ).
    monster->invite_to_party( helper ).


    DATA: monster_name2 TYPE string.
    monster_name2 = 'HUBERT'.
    monster->invite_to_party( id_name = CONV #( monster_name2 ) ).

Functions That Expect TYPE REF TO DATA

当我们要动态地传入参数时,将方法中的参数定义成DATA类型。7.4以前,首先create data参照传入的动态类型,然后用GET REFERENCE OF取得值再作为参数传入。7.4以后,可以直接用REF #( value )作为动态参数传入。

    DATA: generic_data_object TYPE REF TO data.
    DATA(monster) = NEW zcl_monster( ).
    "VALUE is an IMPORTING parameter TYPE ANY
    CREATE DATA generic_data_object LIKE value.
    GET REFERENCE OF value INTO generic_data_object.
    monster->log( generic_data_object ).

    " Using Constructor Operator REF to Fill a TYPE REF TO DATA Parameter
    monster->log( REF #( value ) ).
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容