BC400-Unit4:Modularization

这篇博客详细介绍了ABAP中的模块化编程技术,包括使用CALL FUNCTION的EXPORTING和IMPORTING,通过子程序和Function Modules进行模块化,利用BAPIs和Global Classes实现更高级别的抽象。内容涵盖从基本的参数传递到Function Group的组织,以及如何通过TRY...CATCH处理异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

~~~~~~~~~~~~~~~~~~~【Lesson 1:Introducing Modularization】~~~~~~~~~~~~~~~~~~~

1.CALL FUNCTION中的EXPORTING和IMPORTING

1)EXPORTING:把FUNCTION需要的参数传出去。

2)IMPORTING:取回FUNCTION的返回值。

3)示例:pa_int1和pa_int2是主程序的数据,gv_result是主程序用来存储返回值的变量。


~~~~~~~~~~~~~~~~~【Lesson 2:Modularizing Using Subroutines】~~~~~~~~~~~~~~~~~

1.子程序

1)子程序定义在FORM……ENDFORM.中,通过PERFORM调用。

2)子程序中的数据只在子程序中有用,概念同Java,也分为实参和形参。

3)传递参数时,通过值或结果调用的是值传递(要用value标注出来),通过引用传递的是引用传递。

2.接口参数的类型

1)Generic Typing:父类型,可能类型冲突。

2)Exact Typing:精确类型。


~~~~~~~~~~~~~~~【Lesson 3:Modularizing Using Function Modules】~~~~~~~~~~~~~~~

1.Function Group

1)Function Group中是Function module以及围绕Function module的各种对象。

2)Function Module的结构

2.搜索Function Module的方式

1)Application-related:在一个特定应用组件中搜索(包括继承的)。

2)Application-independent:独立于应用组件的(Repository Information System)。

3)Program-related:在program源代码中搜索CALL FUNCTION语句。

3.调用子程序和Function Module示例

REPORT ZBC400_40_FUNCTION_MODULE.

TYPES gty_result TYPE p LENGTH 16 DECIMALS 2.

PARAMETERS:
  pa_int1  TYPE i,
  pa_op    TYPE c LENGTH 1,
  pa_int2  TYPE i.

DATA gv_result TYPE gty_result.

IF ( pa_op = '+' OR
      pa_op = '-' OR
      pa_op = '*' OR
      pa_op = '/' AND pa_int2 <> 0 OR
      pa_op = '%' OR
      pa_op = 'P').

  CASE pa_op.
      WHEN '+'.
           gv_result = pa_int1 + pa_int2.
      WHEN '-'.
           gv_result = pa_int1 - pa_int2.
      WhEN '*'.
           gv_result = pa_int1 * pa_int2.
      WHEN '/'.
           gv_result = pa_int1 / pa_int2.
      WHEN '%'.
           PERFORM calc_percentage USING pa_int1 pa_int2 CHANGING gv_result.
      WHEN 'P'.
           CALL FUNCTION 'BC400_MOS_POWER'
             EXPORTING
               iv_base = pa_int1
               iv_power = pa_int2
             IMPORTING
               ev_result = gv_result
             EXCEPTIONS
               power_value_too_high = 1
               result_value_too_high = 2
               OTHERS = 3.
           CASE sy-subrc.
             WHEN 0.
             WHEN 1.
               WRITE 'Max value of power is 4'(mvp).
             WHEN 2.
               WRITE 'Result value too high'(rvh).
             WHEN 3.
               WRITE 'Unknown error'(uer).
           ENDCASE.
  ENDCASE.

  WRITE:'Result'(res),gv_result.

ELSEIF pa_op = '/' AND pa_int2 = 0.

  WRITE 'No division by zero!'(dbz).

ELSE.

   WRITE 'Invalid operator!'(iop).

ENDIF.

*&--------------------*
*&  Form calc_percentage
*&--------------------*

FORM calc_percentage USING pv_act TYPE i pv_max TYPE i CHANGING cv_result TYPE gty_result.

 IF pv_max = 0.
    cv_result = 0.
    WRITE 'WARNING!!!Error in percentage calculation'(epc).
 ELSE.
    cv_result = pv_act / pv_max * 100.
 ENDIF.

ENDFORM.
~~~~~~~~~~~~~~~~~~~【Lesson 4:Implementing Function Modules】~~~~~~~~~~~~~~~~~~~

1.创建一个Function Module示例

1)Function Module要在Function Group中。

2)Module中要设置IMPORTING、EXPORTING、EXCEPTIONS.

3)Text Signal:输出的错误消息的标识,便于多语言翻译。

4)EXCEPTIONS中的名字都要对应一个sy-subrc code(程序执行后返回的状态码),用来处理不同的错误。

* Program calling the function module
REPORT bc400_mos_function_module_2.
PARAMETERS:pa_int1 TYPE i,
                     pa_op TYPE c LENGTH 1,
                     pa_int2 TYPE i.
DATA gv_result TYPE p LENGTH 16 DECIMALS 2.

IF (pa_op = '+' OR  pa_op = '-' OR
     pa_po = '*' OR pa_op = '/' AND pa_int2 <> 0 OR
     pa_po = '%' OR pa_po = 'P').
  CASE pa_op.
     WHEN '+'.
        gv_result = pa_int1 +pa_int2.
     WHEN '-'.
        gv_result = pa_int1 - pa_int2.
     WHEN '*'.
        gv_result = pa_int1 * pa_int2.
     WHEN '/'.
        gv_result = pa_int1 / pa_int2.
     WHEN 'P'
        CALL FUNCTION 'BC400_MOS_POWER'
           EXPORTING
              iv_base = pa_int1
              iv_power = pa_int2
           IMPORTING
              ev_result = gv_result
           EXCEPTIONS
              power_value_too_high = 1
              result_value_too_high = 2
              OTHERS = 3.
           CASE sy-subrc.
               WHEN 0.
               WHEN 1.
                   WRITE 'Max value of power is 4'(mvp).
               WHEN 2.
                   WRITE 'Result value too high'(rvh).
               WHEN 3.
                   WRITE 'Unknown error'(uer).
           ENDCASE.
      WHEN '%'.
           CALL FUNCTION 'BC400_MOS_PERCENTAGE'
               EXPORTING
                   iv_act = pa_int1
                   iv_max = pa_int2
               IMPORTING
                   ev_percentage = gv_result
               EXCEPTIONS
                   division_by_zero = 1
                   OTHERS = 2.
            IF sy-subrc <> 0.
                WRITE 'Error in Function Module'(efm).
            ENDIF.
    ENDCASE.
    WRITE: 'Result:'(res),gv_result.
ELSEIF pa_op = '/' AND pa_int2 =0.
    WRITE: 'No division by zero!'(dbz).
ELSE.
    WRITE: 'Invalid operator!'(iop).
ENDIF.

* The Function Module

FUNCTION BC400_MOS_PERCENTAGE.

*Error handing
    IF iv_max = 0.
        ev_percentage = 0.
        RAISE division_by_zero.
* Calculate result
    ELSE.
        ev_percentage = iv_act / iv_max * 100.
    ENDIF.

ENDFUNCTION.
          

~~~~~~~~~~~~~~~~~~~【Lesson 5:Modularizing Using BAPIs】~~~~~~~~~~~~~~~~~~~

1.Standard BAPIs

1)GetList:返回一个满足特定条件的可访问对象的列表。

2)GetDetail:返回特定对象的attributes。

3)Create,Change,Delete,Cancel:对对象的操作。

4)AddItem,RemoveItem:添加或删除子对象。

~~~~~~~~~~~~~~~~【Lesson 6:Modularizing Using Global Classes】~~~~~~~~~~~~~~~~

1.Global Class

1)Objects是Class的实例。

2)类方法的调用class_name=>metho()。


2.基于Class的异常处理——TRY……CATCH

TRY.
    CALL METHOD cl_bc400_compute=>get_power
        EXPORTING
            iv_base = pa_int1
            iv_power = pa_int2
        IMPORTING
            ev_result = gv_result.
    WRITE gv_result.
CATCH cx_bc400_power_too_high.
    WRITE 'Max Value for Power is 4'.
CATCH cx_bc400_result_too_high.
    WRITE 'Result value was too high'.
ENDTRY.
3.对象创建和方法调用


~~~~~~~~~【Lesson 7:Implementing Simple Global Classes and Static Methods】~~~~~~~~~

1.创建简单的Global Class

1)Navigation area中,选择Class/Inteface,输入类名,创建。

2)Activate这个类。

2.简单静态方法示例

METHOD GET_PERCENTAGE。

* Simple error handling
    IF iv_max = 0.
        ev_percentage = 0.
* Calculate result
   ELSE.
        ev_percentage = iv_act /iv_max * 100.
   ENDIF.

ENDMETHOD.

~~~~~~~~~~~~~~~~~【Lesson 8:Modularizing Using Local Classes】~~~~~~~~~~~~~~~~~

1.定义Local Class

2.静态方法语法

1)Local Class方法的调用同Global Class。

2)静态方法可直接被调用而不用生成类实例。

* Class Definitions
CLASS lcl_compute DEFINITION
    PUBLIC SECTION.
        CLASS-METHODS:get_percentage
                  IMPORTING
                     iv_act TYPE i
                     iv_max TYPE i
                  EXPORTING
                     ev_percentage TYPE p.
ENDCLASS.

* Methods Call
CLASS lcl_compute IMPLEMENTATION.
     METHOD get_percentage.
* Simple error handling
         IF iv_max = 0.
             ev_percentage = 0.
* Calculate result
         ELSE.
             ev_percentage = iv_act / iv_max * 100.
         ENDIF.
    ENDMETHOD.
ENDCLASS.
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值