ABAP 模块化编程概念详解

举报
百里丶落云 发表于 2023/08/07 15:12:19 2023/08/07
【摘要】 模块化编程概念 模块化编程基础概念把程序中部分源代码储存到一个模块里封装成一个特定的功能,可以认为是程序的一部分公用的,多个程序都可以调用(类似py中的函数)优点提高程序透明度提高代码重用简化程序维护方便程序调试样例获取每月最后一天(函数)获取当前时间(函数) 模块化编程内容函数 子例程宏类 参数用于在程序和模块之间交换数据定义模块化单元的时候就确定了可以使用哪些参数 参数分类输入参数...

模块化编程概念

模块化编程

基础概念

把程序中部分源代码储存到一个模块里
封装成一个特定的功能,可以认为是程序的一部分
公用的,多个程序都可以调用
(类似py中的函数)

优点

提高程序透明度
提高代码重用
简化程序维护
方便程序调试

样例

获取每月最后一天(函数)
获取当前时间(函数)

image.png

模块化编程内容

函数   
子例程
宏
类

参数

用于在程序和模块之间交换数据
定义模块化单元的时候就确定了可以使用哪些参数

参数分类

输入参数——是用来传递数据给模块化单元
导出参数——把模块化单元中的数据返回给调用程序
变更参数——是把数据传递给模块化单元并返回更改后的数据 (传入内表,内表变动,传出变动内表)

函数的概念

函数

Function:
    Function模块是具有全局可见性的特殊程序。
    Function模块只能在Function Group中定义并使用。

函数组

Function Group
    Function Group中可以包含一个以上的函数,是对某一类对象的操作。
    Function Group专门用作Function的主程序

函数操作

定义函数组

操作
SE37-->转到-->函数组-->创建组
注意创建的名称必须以 Z开头 

image.png

定义函数

前置动作->提前建立好函数组  -->上一步
T-code  se37 

image.png

image.png

函数界面介绍及demo

属性

image.png

  内容介绍
1.一般函数模块
   一般的函数模块,只能用于当前系统
2.远程模块
    可用于其他系统,SAP系统,或者非SAP系统,调用时候要指定目的地,目的地在SM59配置
3.更新函数
   用于数据库数据更新

导入

参数名称:I_开头+参数名称
类型化: TYPE就行 
关联类型: 就是你这个字段原表的参考数据类型
缺省值:提示 
可选:是否为必须录入

image.png

导出

参数名称:E_开头加输出参数名称,可以是字段,或者结构均可以
类型化: TYPE就行
关联类型: 数据类型或者结构/

image.png

即变更参数 同导入一样,

参数名称:你输出表的名称
类型化: 有type ,like  两个   参考 内表/表
关联类型: 具体哪个内表/

image.png

例外

即 抛出异常

例外:异常名称
短文本:异常描述

源代码

即你操作的所有内容代码  

案例:
FUNCTION Z_DEMO_FUNC2.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_CONNID) TYPE  S_CONN_ID OPTIONAL
*"  EXPORTING
*"     REFERENCE(E_SPFLI) TYPE  SPFLI
*"  TABLES
*"      T_SPFLI STRUCTURE  SPFLI
*"  EXCEPTIONS
*"      SALE_NOT_EXIST
*"----------------------------------------------------------------------

*输出参数
select  SINGLE *  from  SPFLI into E_SPFLI where  CONNID  = I_CONNID .
*异常判断
if sy-subrc <> 0 .
  RAISE sale_not_exist .
ENDIF .
*输出到表
select *  from  SPFLI  into table t_SPFLI where  CONNID  = I_CONNID .



ENDFUNCTION.

demo演示

image.png

image.png

image.png

函数的调用

概念

调用
使用  CALL FUNCTION  语句调用
Function的名称采用单引号内包含大写字母的形式

在EXPORTING块中,系统会将值传递给Function的导入参数
在IMPORTING块中,可使用导出参数访问调用结果
异常
在处理Function时出现应用程序错误(例如,值不适于计算),
函数模块就会提出相应的异常。
出现异常会取消对Function的处理,系统会返回到调用程序。
可在Exception中为可能的异常明确设置返回代码(sy-subrc),
同时指定  OTHERS,则会为所有未明确列出的异常分配一个共享的返回码。

自动生成函数

image.png

代码部分

*&---------------------------------------------------------------------*
*& Report  YFUNC_DEMO1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT YFUNC_DEMO1.

data : lv_CONNID   type S_CONN_ID .
data : ls_SPFLI   type SPFLI .
data : lt_SPFLI TYPE TABLE OF SPFLI .

lv_CONNID = '0017' .

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    INPUT         = lv_CONNID
 IMPORTING
   OUTPUT        = lv_CONNID .




CALL FUNCTION 'Z_DEMO_FUNC2'
*入参
 EXPORTING
   I_CONNID             = lv_CONNID
*出参
 IMPORTING
   E_SPFLI              = ls_SPFLI
*TABLES
    T_SPFLI              = lt_SPFLI
*异常捕获
 EXCEPTIONS
   SALE_NOT_EXIST       = 1
   OTHERS               = 2
          .
IF SY-SUBRC  = 0.
WRITE : ls_SPFLI-CONNID , ls_SPFLI-CITYFROM .
ELSEIF SY-SUBRC = 1 .
  WRITE : '销售凭证不存在'  .

ENDIF.

结果

image.png

子例程

子例程的概念

子例程概述:
    子例程是源代码里具有一定独立功能的模块单元。
类型:
    内部子例程:内部子例程的源代码与调用程序位于同一个ABAP程序 中
    外部子例程:外部子例程的源代码位于另外的ABAP程序中,而不是位于调用程序内部。
注意:
    子例程中应避免使用主程序的变量,应使用参数
    在子例程中定义的变量,只在子例程中有效

子例程的定义方式

子例程定义方式

子例程的定义方式:FORM开头、以 ENDFORM 结尾的ABAP代码块。
语法:
FORM  <subroutine>  [<pass>].
   <statement block>
ENDFORM.
其中:
<subroutine> 用于定义子例程名,
<pass> 参数<pass>选项也可以没有
子例程可以访问其所在主程序中声明的所有数据对象。
一般都将同一程序中定义的所有内部子例程都集中定义在程序的末尾。
子例程的定义不能互相嵌套。

形参和实参

形参和实参:
形参(formal parameters):
子例程定义期间用FORM语句定义的参数
实参(actual parameters):
子例程调用期间用PERFORM语句指定的参数

参数传递方式

参数传递:
    将主程序变量传递给子例程形式参数
传递类型:
值传:
    子例程中参数变量的值的改变,不影响外部程序实际变量的值
引用传:
    若子例程中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变
值传并返回结果:
    传递参数的方式同值传递相同,但在子例程执行过程中,变量值不改变,而结束执行后,把变量的最终值返回

局部和全局变量

局部和全局变量:
全局变量:
在主程序中定义的变量
这些变量在整个主程序和调用的每个子例程中均可见(可进行处理)
局部变量:
在子例程中定义的变量称作局部变量,
这些变量只存在于相关的子例程中(与形式参数相同),只能在子例程中使用。



注意:
    当全局变量和局部变量同名时,在子例程中局部变量起作用,而全局变量的值不改变。
    在子例程中对全局变量的值进行修改以后,其修改的值仅存在于子例程中

image.png

子例程demo

无参数

*调用子例程

PERFORM FOR_DEMO1 .
*无参数
FORM FOR_DEMO1  .
  WRITE : '测试无参数子例程' .
ENDFORM .

image.png

值传

A:值传
子例程中参数变量的值的改变,不影响外部程序实际变量的值
DATA : A TYPE I VALUE 1 ,
        B  TYPE I VALUE 2,
        C  TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.

FORM  FRM_PLUS USING VALUE(P_A) VALUE(P_b) value(P_C).

  P_C = P_A + P_B + P_C.

  WRITE P_C.
 ENDFORM.

image.png

引用传

B:引用传(以下用的最多)
若子例程中的参数变量的值发生了改变,那么,传递程序的实际变量的值也发生改变
DATA : A TYPE I VALUE 1 ,
        B  TYPE I VALUE 2,
        C  TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.
FORM  FRM_PLUS USING P_A P_b P_C.
  P_C = P_A + P_B + P_C.
  WRITE P_C.
 ENDFORM.

image.png

值传并返回结果

C:值传并返回结果
传递参数的方式同值传递相同,但在子例程执行过程中,变量值不改变,而结束执行后,把变量的最终值返回。
DATA : A TYPE I VALUE 1 ,
        B  TYPE I VALUE 2,
        C  TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.

FORM  FRM_PLUS USING VALUE(P_A) VALUE(P_b) CHANGING P_C.

  P_C = P_A + P_B + P_C.

  WRITE P_C.
endform.

image.png

外部调用子例程

通过调用指定程序调用子例程

语法

不同的ABAP程序中的子例程是可以共用的(不建议)
PERFORM form IN PROGRAM prog

代码

DATA:num2 TYPE i VALUE 10.
PERFORM add_value CHANGING num2 IN PROGRAM XXXX.
WRITE:num2."调用子例程加10.

通过Tcode调用程序

解释

通过CALL来实现对某TCode中相对应的子例程的调用
CALL TRANSACTION TCode 

代码

CALL TRANSACTION 'ICON' AND SKIP FIRST SCREEN. 

使用submit 的方法调用另一个程序

使用SUBMIT方法调用另一个程序
    在ABAP中可以直接调用具体程序来实现该程序的所有功能,
    并提供程序执行中所需要输入的字段及参数
语法:
     SUBMIT <程序名>.
      ...USING SELECTION-SCREEN <SCR>.   "调用子屏幕
      ...VIA  SELECTION-SCREEN.    "显示所调用程序的初始屏幕
      ...AND RETURN.    "调用指定程序执行后可返回上一屏幕

宏定义

宏(Macros)是一段独立的代码,能实现数据的运算与输出,
功能与子例程类似,主要应用于同一程序中某些重复的运算,以简化代码

语法:
DEFINE INCREMENT.    "INCREMENT为宏的名称。
   ......
END-OF-DEFINITION. 
与子例程不同的是,宏通过&NN为索引)接收传入的参数,不需要定义接收参数的类型及格式。
宏参数最多可以包含九个(&1&2...&9)
宏只能被本程序中定义于宏后面的语名所调用,宏一般定义于程序最开始

演示代码

DEFINE increment.   "定义宏
add 1 to &1.
write: / &1.
write: / &2.
END-OF-DEFINITION.
DATA:number TYPE i VALUE 1,
str(10) TYPE c VALUE 'HELLO SAP'.
increment number str.   "调用宏
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。