~~~~~~~~~~~~~~~~~~~【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.