使用 ABAP Function Module SEO_CLASS_CREATE_COMPLETE 创建 ABAP 类

169 阅读2分钟

SEO_CLASS_CREATE_COMPLETE函数模块用于在SAP系统中创建一个完整的SAP类。在SAP ABAP中,类是面向对象编程的基本构建块,它允许开发者将数据和行为组织到一个单一的实体中。SAP的类通常用于描述业务对象、数据结构和业务逻辑,以实现灵活性和可维护性。

SEO_CLASS_CREATE_COMPLETE函数模块的主要用途包括:

  1. 创建类: 通过SEO_CLASS_CREATE_COMPLETE,开发者可以在SAP系统中创建一个新的ABAP类。这个类可以是一个普通的类,也可以是一个异常类、单例类或接口类。
  2. 定义属性和方法: 在创建类时,可以使用该函数模块来定义类的属性(成员变量)和方法。属性可以是公共的、受保护的或私有的,方法可以是实例方法或类方法。
  3. 处理事件: 除了属性和方法,SAP ABAP类还可以处理事件。通过SEO_CLASS_CREATE_COMPLETE,可以为类添加事件处理程序,以响应特定的事件。
  4. 实现接口: 如果一个类需要实现一个或多个接口,SEO_CLASS_CREATE_COMPLETE也可以用于为类添加接口的实现。
  5. 定义继承关系: SAP ABAP支持继承关系,允许一个类继承另一个类的属性和方法。通过SEO_CLASS_CREATE_COMPLETE,可以定义类之间的继承关系。

本文介绍使用下列 ABAP Function Module 生成新的 ABAP 类的方法。

SEO_CLASS_CREATE_COMPLETE

                  DATA: lv_classname LIKE ls_vseoclass-clsname VALUE 'ZCLJERRY8'.
                  
                  ls_vseoclass-clsname   = lv_classname.
                  ls_vseoclass-state     = seoc_state_implemented.
                  ls_vseoclass-exposure  = seoc_exposure_public.
                  ls_vseoclass-descript  = `Dynamic proxy generated by Jerry's code`.
                  ls_vseoclass-langu     = sy-langu.
                  ls_vseoclass-clsccincl = abap_true.
                  ls_vseoclass-unicode   = abap_true.
                  ls_vseoclass-fixpt     = abap_true.
                  ls_vseoclass-clsfinal  = abap_true.
                  
                  ls_imp_det = ls_imp_if-clsname       = lv_classname.
                  ls_imp_det = ls_imp_if-refclsname    = 'IF_HELLOWORLD'.
                  ls_imp_if-state      = seoc_state_implemented.
                  APPEND ls_imp_if TO lt_imp_if.
                  
                  CLEAR: ls_method_source.
                  DATA: lv_name TYPE string.
                  ls_method_source-cpdname = 'IF_HELLOWORLD~PRINT'.
                  APPEND ` WRITE:/ 'before Hello World'.` TO ls_method_source-source.
                  APPEND '  mo_origin->print( ).'       TO ls_method_source-source.
                  APPEND ` WRITE:/ 'after Hello World'.` TO ls_method_source-source.
                  
                  APPEND ls_method_source TO lt_methods_source.
                  
                  CLEAR: ls_method_source.
                  ls_method_source-cpdname = 'CONSTRUCTOR'.
                  APPEND 'mo_origin = io_origin.' TO ls_method_source-source.
                  APPEND ls_method_source TO lt_methods_source.
                  
                  DATA:
                    lt_implementation TYPE seop_source_string,
                      ls_mtdkey         TYPE seocpdkey,
                        cv_implementation TYPE seor_implementings_r,
                          ls_source_code    TYPE seo_method_source,
                            lt_methods        TYPE seoo_methods_r,
                              lt_parameters     TYPE seos_parameters_r,
                                lt_attribute      TYPE seoo_attributes_r,
                                  ls_attribute      LIKE LINE OF lt_attribute,
                                    ls_parameter      LIKE LINE OF lt_parameters,
                                      ls_method         LIKE LINE OF lt_methods.
                                      
                                      ls_method-clsname = lv_classname.
                                      ls_method-cmpname = 'CONSTRUCTOR'.
                                      ls_method-state = 1. "implemented
                                      ls_method-exposure = 2. "public
                                      APPEND ls_method TO lt_methods.
                                      
                                      ls_parameter-clsname = lv_classname.
                                      ls_parameter-cmpname = 'CONSTRUCTOR'.
                                      ls_parameter-version = 1.
                                      ls_parameter-descript = 'Jerry'.
                                      ls_parameter-type = 'IF_HELLOWORLD'.
                                      ls_parameter-sconame = 'IO_ORIGIN'.
                                      ls_parameter-cmptype = 1. "METHOD
                                      ls_parameter-mtdtype = 0. "METHOD
                                      ls_parameter-pardecltyp = 0. "IMPORTING
                                      ls_parameter-parpasstyp = 1. "pass by reference
                                      ls_parameter-typtype = 3. "type ref to
                                      APPEND ls_parameter TO lt_parameters.
                                      
                                      ls_attribute-clsname = lv_classname.
                                      ls_attribute-cmpname = 'MO_ORIGIN'.
                                      ls_attribute-state = 1.
                                      ls_attribute-attdecltyp = 0.
                                      ls_attribute-attexpvirt = 0. "private
                                      ls_attribute-typtype = 3. "type ref to
                                      ls_attribute-type = 'IF_HELLOWORLD'.
                                      APPEND ls_attribute TO lt_attribute.
                                      
                                      CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'
                                        EXPORTING
                                            devclass                   = '$TMP'
                                                version                    = seoc_version_active
                                                    authority_check            = abap_true
                                                        overwrite                  = abap_true
                                                            suppress_method_generation = abap_false
                                                                genflag                    = abap_false
                                                                    method_sources             = lt_methods_source
                                                                        suppress_dialog            = abap_true
                                                                          CHANGING
                                                                              class                      = ls_vseoclass
                                                                                  methods                    = lt_methods
                                                                                      parameters                 = lt_parameters
                                                                                          implementings              = lt_imp_if
                                                                                              attributes                 = lt_attribute
                                                                                                EXCEPTIONS
                                                                                                    existing                   = 1
                                                                                                        is_interface               = 2
                                                                                                            db_error                   = 3
                                                                                                                component_error            = 4
                                                                                                                    no_access                  = 5
                                                                                                                        other                      = 6
                                                                                                                            OTHERS                     = 7.
                                                                                                                            
                                                                                                                            WRITE: / sy-subrc." aria-label="复制" data-bs-original-title="复制">
                      <i class="far fa-copy"></i>
          </button>
</div>
      </div><pre class="sql hljs language-sql">REPORT zdyanmic.
      DATA ls_vseoclass      TYPE vseoclass.
      DATA ls_imp_if         TYPE seor_implementing_r.
      DATA lt_imp_if         TYPE seor_implementings_r.
      DATA ls_imp_det        TYPE seoredef.
      DATA lt_methods_source TYPE seo_method_source_table.
      DATA ls_method_source  TYPE seo_method_source.
      DATA lv_method         TYPE LINE <span class="hljs-keyword">OF</span> seoo_methods_r.
      
      DATA: lv_classname <span class="hljs-keyword">LIKE</span> ls_vseoclass<span class="hljs-operator">-</span>clsname <span class="hljs-keyword">VALUE</span> <span class="hljs-string">'ZCLJERRY8'</span>.
      
      ls_vseoclass<span class="hljs-operator">-</span>clsname   <span class="hljs-operator">=</span> lv_classname.
      ls_vseoclass<span class="hljs-operator">-</span>state     <span class="hljs-operator">=</span> seoc_state_implemented.
      ls_vseoclass<span class="hljs-operator">-</span>exposure  <span class="hljs-operator">=</span> seoc_exposure_public.
      ls_vseoclass<span class="hljs-operator">-</span>descript  <span class="hljs-operator">=</span> `<span class="hljs-keyword">Dynamic</span> proxy generated <span class="hljs-keyword">by</span> Jerry<span class="hljs-string">'s code`.
      ls_vseoclass-langu     = sy-langu.
      ls_vseoclass-clsccincl = abap_true.
      ls_vseoclass-unicode   = abap_true.
      ls_vseoclass-fixpt     = abap_true.
      ls_vseoclass-clsfinal  = abap_true.
      
      ls_imp_det = ls_imp_if-clsname       = lv_classname.
      ls_imp_det = ls_imp_if-refclsname    = '</span>IF_HELLOWORLD<span class="hljs-string">'.
      ls_imp_if-state      = seoc_state_implemented.
      APPEND ls_imp_if TO lt_imp_if.
      
      CLEAR: ls_method_source.
      DATA: lv_name TYPE string.
      ls_method_source-cpdname = '</span>IF_HELLOWORLD<span class="hljs-operator">~</span>PRINT<span class="hljs-string">'.
      APPEND ` WRITE:/ '</span>before Hello World<span class="hljs-string">'.` TO ls_method_source-source.
      APPEND '</span>  mo_origin<span class="hljs-operator">-</span><span class="hljs-operator">&gt;</span>print( ).<span class="hljs-string">'       TO ls_method_source-source.
      APPEND ` WRITE:/ '</span>after Hello World<span class="hljs-string">'.` TO ls_method_source-source.
      
      APPEND ls_method_source TO lt_methods_source.
      
      CLEAR: ls_method_source.
      ls_method_source-cpdname = '</span>CONSTRUCTOR<span class="hljs-string">'.
      APPEND '</span>mo_origin <span class="hljs-operator">=</span> io_origin.<span class="hljs-string">' TO ls_method_source-source.
      APPEND ls_method_source TO lt_methods_source.
      
      DATA:
        lt_implementation TYPE seop_source_string,
          ls_mtdkey         TYPE seocpdkey,
            cv_implementation TYPE seor_implementings_r,
              ls_source_code    TYPE seo_method_source,
                lt_methods        TYPE seoo_methods_r,
                  lt_parameters     TYPE seos_parameters_r,
                    lt_attribute      TYPE seoo_attributes_r,
                      ls_attribute      LIKE LINE OF lt_attribute,
                        ls_parameter      LIKE LINE OF lt_parameters,
                          ls_method         LIKE LINE OF lt_methods.
                          
                          ls_method-clsname = lv_classname.
                          ls_method-cmpname = '</span>CONSTRUCTOR<span class="hljs-string">'.
                          ls_method-state = 1. "implemented
                          ls_method-exposure = 2. "public
                          APPEND ls_method TO lt_methods.
                          
                          ls_parameter-clsname = lv_classname.
                          ls_parameter-cmpname = '</span>CONSTRUCTOR<span class="hljs-string">'.
                          ls_parameter-version = 1.
                          ls_parameter-descript = '</span>Jerry<span class="hljs-string">'.
                          ls_parameter-type = '</span>IF_HELLOWORLD<span class="hljs-string">'.
                          ls_parameter-sconame = '</span>IO_ORIGIN<span class="hljs-string">'.
                          ls_parameter-cmptype = 1. "METHOD
                          ls_parameter-mtdtype = 0. "METHOD
                          ls_parameter-pardecltyp = 0. "IMPORTING
                          ls_parameter-parpasstyp = 1. "pass by reference
                          ls_parameter-typtype = 3. "type ref to
                          APPEND ls_parameter TO lt_parameters.
                          
                          ls_attribute-clsname = lv_classname.
                          ls_attribute-cmpname = '</span>MO_ORIGIN<span class="hljs-string">'.
                          ls_attribute-state = 1.
                          ls_attribute-attdecltyp = 0.
                          ls_attribute-attexpvirt = 0. "private
                          ls_attribute-typtype = 3. "type ref to
                          ls_attribute-type = '</span>IF_HELLOWORLD<span class="hljs-string">'.
                          APPEND ls_attribute TO lt_attribute.
                          
                          CALL FUNCTION '</span>SEO_CLASS_CREATE_COMPLETE<span class="hljs-string">'
                            EXPORTING
                                devclass                   = '</span>$TMP<span class="hljs-string">'
                                    version                    = seoc_version_active
                                        authority_check            = abap_true
                                            overwrite                  = abap_true
                                                suppress_method_generation = abap_false
                                                    genflag                    = abap_false
                                                        method_sources             = lt_methods_source
                                                            suppress_dialog            = abap_true
                                                              CHANGING
                                                                  class                      = ls_vseoclass
                                                                      methods                    = lt_methods
                                                                          parameters                 = lt_parameters
                                                                              implementings              = lt_imp_if
                                                                                  attributes                 = lt_attribute
                                                                                    EXCEPTIONS
                                                                                        existing                   = 1
                                                                                            is_interface               = 2
                                                                                                db_error                   = 3
                                                                                                    component_error            = 4
                                                                                                        no_access                  = 5
                                                                                                            other                      = 6
                                                                                                                OTHERS                     = 7.
                                                                                                                
                                                                                                                WRITE: / sy-subrc.</span></pre>