在ABAP中。有多种方法能够建立模块化的功能。

以下依次对其种三种进行介绍。

一、            使用子程序(Subroutine)

1.      基本的语法:

FORM subname. …… ENDFORM.   定义子程序的方式

调用的时候使用PERFORM subname.就可以

2.      关于參数的定义

主程序中的子程序能够改变主程序中定义的变量(由于是全局可见的)

有三种參数传递的方法:

①call by value:传递的是一个变量的备份(copy)。对该变量的更改不会影响主程序中变量原始值

用法:在USING声明下,VALUE(f)

②call by value and result:传递的也是一个变量的备份(copy),可是对它的改动会返回给主程序中,而且覆盖原来的值。也就是会改动原来的变量值

用法:在CHANGING声明下,VALUE(f)

③call by reference:传递的是一个变量的引用,也会改变主程序中的变量值

用法:在CHANGING声明下。f

子程序代码演示样例:

TYPES gty_perc TYPE p DECIMALS 2. //这里通过TYPES自己定义一个类型

DATA: gv_int1 TYPE i,

gv_int2 TYPE i,

gv_result TYPE gty_perc.

PERFORM calc_perc

USING

gv_int1

gv_int2

CHANGING

gv_result.

FORM calc_perc

USING

value(pv_act)TYPE i

value(pv_max)TYPE i

CHANGING

value(cv_pc)TYPE gty_perc.

DATAlv_pc TYPE p LENGTH 16 DECIMALS 1.

lv_pc= pv_act * 100 / pv_max.

cv_pc= lv_pc.

ENDFORM.

这里不用定义返回值,由于CHANGING的含义就是对主程序中的值进行改动

什么时候用call by value andresult,什么时候用call by reference?

设定了參数的TYPE之后,假设传进来的參数类型不匹配,会报error

在子程序中也能够定义变量(如上面的lv_pc)。子程序中定义的变量是本地的。仅仅能在当个子程序中使用。比方数值大小的比較。可能须要在子程序中定义一个本地暂时变量用来存放暂时数据。

二、使用function module

创建function module后各个tab的含义

1.      Import:这里放的是Import Parameter,是主程序传入function module的參数

2.      Export:存放Export Parameter,是从function module中返回的结果

3.      Changing:类似于subroutine中的changing,存放须要有functionmodule改变原始值的參数

4.      Source code:用于编写function module的源码,来实现函数的逻辑

5.      Excepotion:编写异常处理(实际操作中截图)

编写好function module后,能够直接执行改程序进行function module的性能測试。測试界面第一个screen上能够输入Import的数值,点击执行后。第二个screen给出返回值

在主程序中,点击上方的patternbutton。在CALLING FUNCTION输入框中输入想要调用的function module名就可以调用。或者进行拖拽形式的调用。

Function module调用演示样例代码:

CALL FUNCTION ‘ZBC_POWER’

EXPORTING

iv_base    = pa_int1

iv_power = pa_int2

IMPORTING

ev_result= gv_result

EXCEPTIONS

POWER_VALUE_TOO_HIGH= 1

OTHERS                                 = 2.

CASE sy-subrc.

WHEN0.

WRITEgv_result.

WHEN1.

WRITE‘Power Value max 4’.

WRITE2.

WRITE‘Unknown Error’.

ENDCASE.

注意:ABAP中sy-subrc为获取的异常代码(标识)

在编写的function module中。对于异常的处理,使用RAISE进行。例如以下source code

IF iv_max = 0.

ev_percentage= 0.

RAISEdivision_by_zero.  //这里的division_by_zero是在这钱excepttion的tab内定义的异常

ELSE

*利用代码进行计算

ENDIF.

三、            使用类方法(class)

含义和java中的类同样,也有变量和方法等

Class和function module的差别在于。class能够多重实例化,而function module仅仅是一个方法

Class中能够定义静态方法和实例方法,后者必须实例化class后才干调用

创建class的界面各个tab含义

1.      Attributes:创建变量,并定义其变量名、类型、静态/动态、可见性等属性

2.      Method:创建方法,设定方法名、静态/动态、可见性等属性

Method下的分分tab:

①parameter:定义相关的參数。这里定义參数的时候,像function module一样,在type中定义它们是import还是export

②exception:异常处理(类似function module中的定义)

Class的调用方法

调用class的method时,能够直接拖拽class->method文件夹下的详细函数到主程序(try/catch也会自己主动生成。去掉凝视就可以)或者能够和function module调用方法一样,点击pattern

演示样例代码:

CALL METHOD

ZBC_COMPUTE=> get_power

EXPORTING

Iv_base    = pa_int1

Iv_power = pa_int2

IMPORTING

ev_result = gv_result.

WRITEgv_result.

CATCH power_too_high.

WRITE‘Max Value for Power is 4’.

ENDTRY.

实例化对象的方法:

DATA refertence_name TYPE REF TO class_name.

之后就能够利用这个实例化的变量调用方法:

CALL METHOD reference_name ->method_name.

关于class的创建:定义method时,在method tab下的界面中输入方法名,然后选中创建的方法,进入代码编辑器编写方法的代码(每一个方法都有自己相应的代码编辑页面)

ABAP学习之旅——多种方式建立模块化功能的更多相关文章

  1. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  2. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  3. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  4. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

  5. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

  6. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

  7. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

  8. 我的AngularJS 学习之旅

    我的AngularJS 学习之旅 基础篇 1.Angular的 起源 2.比较Web 页面实现的几种方式 3.一些基本术语 4.Angular与其他框架的兼容性 5.总结 6.综合实例   很早之前就 ...

  9. 180分钟的python学习之旅

    最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...

随机推荐

  1. Discuz!代码

    我如何使用Discuz!代码   Discuz!代码 效果 [b]粗体文字 Abc[/b] 粗体文字 Abc [i]斜体文字 Abc[/i] 斜体文字 Abc [u]下划线文字 Abc[/u] 下划线 ...

  2. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange

    Topic Exchange 此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息. 向交换机发送消息时,消 ...

  3. li标签和checkbox绑定

    参考原文:https://www.cnblogs.com/youxin/p/3885496.html 我们经常需要li或span包含一个checkbox,不管点击checkbox或li都会触发相应的事 ...

  4. vim common usage

    vim normal模式下 1.c+i+分隔符,删除分隔符里面的内容(不删除分隔符,c+a+分隔符则包括分隔符一起删掉) 如将光标位于'%s : %d years old ' 中,此时按c+i+'   ...

  5. 学习 Qt 编程的好书精品推荐!

    最近一段时间,准备开始搞Qt方面的东西,想找几本书看看.网上介绍QT的书籍也有很多,不想浪费时间,所以想找几本精品的书籍来看.花了半天的时间找了几本非常不错的,这里面整理好之后推荐给大家! 下面介绍的 ...

  6. 算法竞赛入门经典5.2 STL初步

    1. 排序和检索,学会使用sort排序,以及low_bound函数 Raju and Meena love to play with Marbles. They have got a lot of m ...

  7. bzoj1174 Toponyms

    给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. 第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长度不超过2000 ...

  8. Quartz Spring分布式集群搭建Demo

    注:关于单节点的Quartz使用在这里不做详细介绍,直接进阶为分布式集群版的 1.准备工作: 使用环境Spring4.3.5,Quartz2.2.3,持久化框架JDBCTemplate pom文件如下 ...

  9. 添物不花钱学JavaEE(基础篇)- Tomcat

    Tomcat是大家常用的Java Web容器. 添物网使用的也是Tomcat. 官方网址: http://tomcat.apache.org/ 官方文档看看. 可以看的图书 <Tomcat权威指 ...

  10. hihoCoder#1120 小Hi小Ho的惊天大作战:扫雷·三

    原题地址 看上去非常复杂, 实际上是这一系列最简单的一步,本质上是个搜索过程,相比于前一道题,可以不用策略三,而且题目的数据规模超级小,所以暴力搜索就能过. 把尚未确定的点放在一个unsettled列 ...