目录
一、概览
简介:
把部分源代码储存到一个模块里封装成一个特定的功能,是程序的一部分,也可以为多个程序调用。优势:提高程序透明度,提高代码重用,简化程序维护,方便程序调试。
包括:
函数、子例程、宏、类。
参数(接口):
用于在程序和模块之间交换数据,编写模块的时候已经决定了可以使用的参数,常用的有输入、导出、变更三种参数。
二、Function(函数)
简介:
具有全局可见性并且只能在Function Group中定义并使用。Function Group可以包含多个对某一类对象操作的函数,专门用作Function的主程序,但不能直接运行。
Function Group的维护:
se37
se80
function的维护:
除了三个参数外,还有sy-subrc异常返回值。类型:常规函数模块(本系统都可调用)、远程启用模块RFC(可以在其他系统中调用,包括非SAP系统,要sm59中指定一个目的地)、更 新模块(主要用于数据库的更新,大批量)。
异常:函数模块可引起异常,所以必须在接口中声明异常,为其选择一个名称,否则程序会终止。触发异常:RAISA<exception>,若有异常<exception>,则直接返回程序,若未列出该异常,则程序会因运行时错误而终止。
源代码:FUNCTION和ENDFUNCTION,写在注释以下。
调试:SE37,点测试按钮或F8,显示运行时间和异常。
Function的调用:
CALL FUNCTION调用,Function名称在‘’之中且大写;在EXPORTING块中,系统会将值传递给Function的导入参数,在IMPORTING块中,可使用导出参数访问调用结果,【和定义时正好相反】。
异常(EXCEPTIONS)处理:会取消对Function的处理,返回调用程序;会返回sy-subrc,同时指定OTHERS。
常用Function:
- GUI_DOWNLOAD 下载文件中的数据
- GUI_UPLOAD 上载数据到文件里
- WS_FILENAME_GET 获得文件名
- CLOI_PUT_SIGN_IN_FRONT 将负号前置, SAP默认将负号放在数字后面
- CONVERSION_EXIT_ALPHA_INPUT 数字串前补0
三、子例程
概述:
是源代码里具有一定独立功能的模块单元。类型:1.内部子例程:与调用程序位于同一个程序中;2.外部子例程。注意:子例程应避免使用主程序的变量。
定义:
用PERFORM调用,子例程可以访问主程序中所有数据对象且其定义不能互相嵌套,一般定义在程序的末尾。
FORM <subroutine> [<pass>]. <statement block> ENDFORM. |
形参:定义期间用form语句定义的参数。
实参:调用期间用perform语句指定的参数。实参和形参数量要一致。
参数传递:将主程序变量传递给子例程形式参数。 类型:1、值传【改变子例程中参数变量的值,不影响外部程序实际变量的值】;2、引用传【若改变参数变量的值,则实际变量的值也发生变化】;3、值传并返回结果【传递参数的方式同值传递相同,但在子例程执行过程中,变量值不改变,而结束执行后,把变量的最终值返回】。类型仅需了解
参数类型声明:可以通用类型(TYPE ANY),也可以指定类型但实参形参类型要一致,还有是结构体和内表类型的形参必须要用指定类型。
![](https://i-blog.csdnimg.cn/blog_migrate/b93a7364df7b32ab5fe8864b5018fd5a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4940c0673a29ef2b9f0981678803eea4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b49d7f3721b4b467a037749fa0562a20.png)
全局变量:主程序中定义的变量,在整个主程序和调用的每个子 例程中均可以进行处理。
局部变量:子例程中定义的变量,只能在子例程中使用。
注意:当全局变量和局部变量同名时,在子例程中的处理只影响局部变量;在子例程中改变了全局变量的值,但其值仅存在于子例程中。
调用:
PERFORM <subroutine> [USING <actual input list>] [CHANGING <actual input list>]…
调用指定程序(外部)中的子例程:PERFORM form IN PROGRAM prog
通过Tcode调用程序:CALL TRANSACTION Tcode
使用SUBMIT方法调用另一个程序:
SUBMIT <程序名>. |
子例程的调试:
断点:当运行结果没有达到目的,将断点打到自己认为错误的语句上,然后执行看每一步的结果,找到真正错误的地方。
在调试界面可以按F9创建断点指定语句来调试。
VA03订单界面,tcode一个/h进入调试状态。
四、宏
主要应用于同一程序中某些重复的运算,以简化代码。
DEFINE INCREMENT. "INCREMENT为宏的名称。 |
通过&N(N为索引,数字)接收传入的参数,不需要定义接受参数的类型及格式;最多可以包含九个;只能被本程序中定义于宏后面的语名所调用,一般定义于程序最开始;宏不可以调试。
例子:当iv_base = 'X'时,clientdata-matl_group = ls_mat-matkl
DEFINE set_field_value.
IF &3 = 'X'.
&1 = &2.
ENDIF.
END-OF-DEFINITION.
set_field_value clientdata-matl_group ls_mat-matkl iv_base.
五、Include程序(子程序)
一般在主程序中通过一些路径来创建,可以使用Include加载另一个程序,通常用于共享数据项的定义,一般不包含执行语句,作用:使得主程序代码量大大减少。
子例程也可以建在Include程序。
包含的程序中不能包含PROGRAM 或 REPORT语句
包含程序不能调用自身
包含的程序必须包含完整语句
![创建](https://i-blog.csdnimg.cn/blog_migrate/8fb2ace945f513ad554e8b2715480c9c.png)