zoukankan      html  css  js  c++  java
  • ABAP Help Document(12):5.数据对象创建

    5.Creating Objects

        动态创建对象,创建数据对象或类对象。

    5.1 create data

    创建数据对象:CREATE DATA;

    示例:

    "动态对象
    "CREATE DATA
    "隐式定义数据类型
    "1. CREATE DATA dref [area_handle].
    "使用ABAP预定义类型
    *2. CREATE DATA dref [area_handle]
    *     TYPE {abap_type|(name)}
    *     [LENGTH len] [DECIMALS dec].
    "d,t,i,f,decfloat16,decfloat34,string,xstring
    "不需要指定length,decimals
    "c,n,x
    "需要指定length
    "p
    "需要指定length,decimals
    "使用已有Type
    *3. CREATE DATA dref [area_handle]
    *   { {TYPE [LINE OF] {type|(name)}}
    *   | {LIKE [LINE OF] dobj}  }.
    "引用类型创建变量
    *4. CREATE DATA dref [area_handle]
    *                   TYPE HANDLE handle.
    "创建reference变量
    *5. CREATE DATA dref [area_handle]
    *    TYPE REF TO {type|(name)}.
    "创建内表
    *6. CREATE DATA dref [area_handle]
    *{ {TYPE [STANDARD]|SORTED|HASHED TABLE OF [REF TO] {type|(name)}}
    * | {LIKE [STANDARD]|SORTED|HASHED TABLE OF dobj} }
    * [ {WITH [UNIQUE|NON-UNIQUE]
    * {KEY {comp1 comp2 ...}|(keytab)}|{DEFAULT KEY}}
    * | {WITH EMPTY KEY} ]
    * [INITIAL SIZE n].
    FORM f_create_obj.
      TYPES:t_itab TYPE TABLE OF i WITH NON-UNIQUE KEY table_line.
      DATA:lt_itab_ref TYPE REF TO t_itab.
      DATA:i_ref TYPE REF TO i.
      DO 10 TIMES.
        IF lt_itab_ref IS INITIAL.
          CREATE DATA lt_itab_ref.
        ENDIF.
        APPEND sy-index TO lt_itab_ref->*.
      ENDDO.
      IF i_ref IS INITIAL.
        CREATE DATA i_ref.
      ENDIF.
      LOOP AT lt_itab_ref->* INTO i_ref->*.
        WRITE:/ i_ref->*.
      ENDLOOP.
    
      "使用ABAP已有类型
      DATA:lv_ref TYPE REF TO DATA.
      CREATE DATA lv_ref TYPE P LENGTH 8 DECIMALS 2.
    
      "使用type定义结构体,或数据库表结构
      DATA:lt_ref TYPE REF TO DATA.
      FIELD-SYMBOLS:<fs_wa> TYPE ANY.
      FIELD-SYMBOLS:<fs_comp> TYPE ANY.
      "创建数据
      CREATE DATA lt_ref TYPE spfli.
      ASSIGN lt_ref->* TO <fs_wa>.
      SELECT * FROM spfli UP TO 1 ROWS INTO <fs_wa>.
        "读取前四列
        DO 4 TIMES.
          ASSIGN COMPONENT sy-index OF STRUCTURE <fs_wa> TO <fs_comp>.
          IF sy-subrc = 0.
            WRITE:/ <fs_comp>.
          ELSE.
            EXIT.
          ENDIF.
        ENDDO.
      ENDSELECT.
    
      "动态数据类型
      "CL_ABAP_DATADESCR
      "CL_ABAP_ELEMDESCR
      "element,i,c,n,string,decfoat等类型
      "CL_ABAP_STRUCTDESCR, CL_ABAP_TABLEDESCR,CL_ABAP_REFDESCR
      "structure,table,reference类型
      DATA:lo_struct TYPE REF TO cl_abap_structdescr.
      DATA:lt_comp_tab TYPE cl_abap_structdescr=>component_table.
      DATA:ls_comp_tab LIKE LINE OF lt_comp_tab.
      DATA:lv_ref1 TYPE REF TO DATA.
      "get方法exception,CX_SY_STRUCT_CREATION
      DATA:lo_excep TYPE REF TO cx_sy_struct_creation.
      FIELD-SYMBOLS:<fs_struct> TYPE ANY.
      FIELD-SYMBOLS:<fs_comp1> TYPE ANY.
      FIELD-SYMBOLS:<fs_comp2> TYPE ANY.
      "构造结构
      ls_comp_tab-name = 'name'.
      ls_comp_tab-type = cl_abap_elemdescr=>get_string( ).
      APPEND ls_comp_tab TO lt_comp_tab.
      ls_comp_tab-name = 'age'.
      ls_comp_tab-type = cl_abap_elemdescr=>get_i( ).
      APPEND ls_comp_tab TO lt_comp_tab.
      "获取数据类型
      TRY .
        lo_struct = cl_abap_structdescr=>get( lt_comp_tab ).
        "根据动态结构创建数据
        CREATE DATA lv_ref1 TYPE HANDLE lo_struct.
        "数据
        ASSIGN lv_ref1->* TO <fs_struct>.
        ASSIGN COMPONENT 'NAME' OF STRUCTURE <fs_struct> TO <fs_comp1>.
        <fs_comp1> = 'Tom'.
        ASSIGN COMPONENT 'AGE' OF STRUCTURE <fs_struct> TO <fs_comp2>.
        <fs_comp2> = 10.
      CATCH cx_sy_struct_creation INTO lo_excep.
        MESSAGE lo_excep TYPE 'E'.
        RETURN.
      ENDTRY.
    
      "根据类名
      "CL_ABAP_STRUCTDESCR
    *  DATA:lv_ref2 TYPE REF TO DATA.
    *  DATA:lv_cls_name TYPE string.
    *  FIELD-SYMBOLS:<fs_cls> TYPE ANY.
    *  FIELD-SYMBOLS:<fs_attr> TYPE ANY.
    *  DATA:lo_oo_cls TYPE REF TO cl_oo_class.
    *  TRY .
    *    "获取类名
    *    CREATE OBJECT lo_oo_cls EXPORTING clsname = ''.
    *    lv_cls_name = lo_oo_cls->class-clsname.
    *  CATCH cx_class_not_existent.
    *  ENDTRY.
    *  lv_cls_name = 'PROGRAM=program名CLASS=类名'.
    *  CREATE DATA lv_ref2 TYPE (lv_cls_name).
    *  ASSIGN lv_ref2->* TO <fs_cls>.
    *  ASSIGN ('<FS_CLS>->类attr名') TO <fs_attr>.
    *  WRITE:/ <fs_attr>.
    
    ENDFORM

    5.2 create object

    创建类对象:CREATE OBJECT;

    示例2:

    "CREATE OBJECT
    "隐式定义类
    *1. CREATE OBJECT oref [area_handle] [parameter_list].
    "明确定义类
    *2. CREATE OBJECT oref [area_handle]
    *  TYPE { class  [parameter_list] }
    *  | { (name) [parameter_list|parameter_tables] }.
    "创建object,有参构造
    *[EXPORTING  p1 = a1 p2 = a2 ...]
    *[EXCEPTIONS exc1 = n1 exc2 = n2 ... [OTHERS = n_others]].
    *[PARAMETER-TABLE ptab]
    *[EXCEPTION-TABLE etab].
    FORM f_create_obj1.
      DATA: container TYPE REF TO cl_gui_container,
            exc_ref TYPE REF TO cx_root,
            exc_text TYPE string.
    
      DATA: class TYPE string VALUE `CL_GUI_DIALOGBOX_CONTAINER`,
            ptab TYPE abap_parmbind_tab,
            ptab_line TYPE abap_parmbind.
    
      ptab_line-name = 'PARENT'.
      ptab_line-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF CL_GUI_CONTAINER=>DESKTOP
                    INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.
    
      ptab_line-name = 'WIDTH'.
      ptab_line-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF 1000 INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.
    
      ptab_line-name = 'HEIGHT'.
      ptab_line-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF 300 INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.
    
      TRY.
          CREATE OBJECT container TYPE (class)
                        PARAMETER-TABLE ptab.
        CATCH cx_sy_create_object_error INTO exc_ref.
          exc_text = exc_ref->get_text( ).
          MESSAGE exc_text TYPE 'I'.
      ENDTRY.
    ENDFORM.

    5.3 shared objects

        Shared Objects:创建Object作为Shared Objects,定义类时使用语法:SHARED MEMORY ENABLED;

        Area Class:定义Area,使用Tcode:SHMA。全局终结Area类:CL_SHM_AREA;所有Area类父类:CL_ABAP_MEMORY_AREA;

    Areas

    Areas-Basic Properties:

    1. Area Name,示例:'CL_';2. Area Root Class, 是全局定义内存共享的Class;3. Client-Dependent Area,使用Client区分Area;4. Automatic Area Building;5. Transactional Area;

    Areas-Fixed Area Properties:

    1. Area Binding;2. Area Instance Versioning;

    Area-Dynamic Area Properties:

    1.Area Constructor Class,实现SHM_IF_SHM_BUILD_INSTANCE接口类,IF_SHM_BUILD_INSTANCE~BUILD类方法作为constructor方法;

    2. Displacement Type,可能的displacement type:Displacement Not Possible, Displacement Possible。

    Areas-Runtime-Dependent Area Properties:

    1. Area Build Type,可能值:No Autostart、Autostart for Read Request、Autostart for Read Request and Every Invalidation;

    2. Size of an Area Instance Version,可能值:No limit、Maximum ... KB;

        3.Number of Versions of an Area Instance,可能值:No limit、Maximum ...;

        4.Lifetime of an Area Instance,可能值: No specification、Expires after ... minutes、Refresh after ... minutes、Without read access ... minutes;

    Area Instance Versions

        管理存储Shared Objects。Tcode: SHMM,overview of area instance。类:CL_SHM_UTILITIES;

    Area Handles:

        Area Handles是area class的实例;

        Area Lock, Creating Area Instance Versions, ATTACH_FOR_WRITE;Changing Area Instance Versions,ATTACH_FOR_UPDATE;Reading Area Instance Versions,ATTACH_FOR_READ;

        Deactivating Area Handles, 移除Reading Lock,DETACH; 移除Changing Lock,并提交修改,DETACH_COMMIT; 移除Changing Lock,并回滚修改,DETACH_ROLLBACK;DETACH_AREA,DETACH_ALL_AREAS,一次移除多个绑定;

        Additional Methods,1. Methods INVALIDATE_INSTANCE or INVALIDATE_AREA;

    2. Methods FREE_INSTANCE or FREE_AREA;3. Method GET_INSTANCE_INFOS;4. Methods GET_LOCK_KIND, IS_VALID, IS_ACTIVE_VERSION, IS_SHARED, HAS_ACTIVE_PROPERTIES and GET_DETACH_INFO,Area handle信息;5 .BUILD method,调用area constructor方法;

        Area Instance Versions状态:1.Building;2.Active;3.Obsolete;4. Expired;

    Shared Objects

        Access Shared Objects,使用GET_HANDLE_BY_OREF, GET_HANDLE_BY_DREF, and GET_HANDLE_BY_DATA获取CL_ABAP_MEMORY_AREA类实例;

        Shared Objects创建,CREATE OBJECT oref AREA HANDLE handle;

    CREATE DATA dref AREA HANDLE handle;

    Area类结构:

    CL_ABAP_MEMORY_AREA

      --CL_SHM_AREA

    --Area Classes

      --CL_IMODE_AREA

    CL_ABAP_MEMORY_AREA is the superclass of all area classes.

    CL_SHM_AREA is the superclass of all self-defined area classes.

    CL_IMODE_AREA is a predefined area class for the internal session.

    Area接口:

    IF_SHM_BUILD_INSTANCE

    --Area Constructor Class

    CL_ABAP_MEMORY_AREA类结构:

    1.Static Methods

    GET_HANDLE_BY_OREF

    GET_HANDLE_BY_DREF

    GET_HANDLE_BY_DATA

    2.Instance Methods

    IS_SHARED

    IS_VALID

    IS_ACTIVE_VERSION

    HAS_ACTIVE_PROPERTIES

    GET_DETACH_INFO

    CL_SHM_AREA类结构:

    1.Instance Attributes

    PROPERTIES

    INST_NAME

    CLIENT

    Static Methods

    MULTI_ATTACH

    DETACH_ALL_AREAS

    2.Instance Methods

    DETACH

    DETACH_COMMIT

    DETACH_ROLLBACK

    GET_LOCK_KIND

    GET_ROOT

    3.Instance Events

    SHM_COMMIT_EVENT

    SHM_ROLLBACK_EVENT

    示例:DEMO_SHARED_OBJECTS

  • 相关阅读:
    vue使用laydate.js插件报错laydate.css: Invalid
    自定义css样式结合js控制audio做音乐播放器
    福利福利~262集前端免费视频!
    解决Vue在IE中报错出现不支持=>等ES6语法和“Promise”未定义等问题
    设置Chart.js默认显示Point点的值不用鼠标经过才显示
    js监听某个元素高度变化来改变父级iframe的高度
    Vue中注意target和currentTarget的使用
    VUE中让由全局变量添加生成的新数组不随全局变量的变化而变化
    bootstrap-table前端实现多条件时间段查询数据
    js小数点相乘或相除出现多位数的问题
  • 原文地址:https://www.cnblogs.com/tangToms/p/14691077.html
Copyright © 2011-2022 走看看