ABAP 开发系列(10): Function Module

内容包括:

1. Function Module概述

2. Function Group

3. Function Module的操作

4. RFC (Remote Function Call)

5. 创建Function Module实例

6. BAPI

 

1. Function Module 概述

Function Module是模块化(Modularization)的另一种单元,也叫函数模块,一般简称为函数(FM)。

SAP R/3系统提供了Function Library(FL)来封装Function Module,而每个Function Module 都会有一个输入/输出参数的接口供程序调用传输。

能多次独立或直接被SAP其他程序调用,强调了其可复用性。

Function Module也支持远程访问模式,即:Remote Function Call(RFC),提供外部接口供非SAP系统使用;

同时,SAP官方也提供了 JCO(Java Connector)、NCO(.Net Connector)等组件与SAP RFC通信。

下面介绍 Function Module 的操作及相关应用。

 

2. 函数组(Function Groups

每个Function Module都必须指定分属Function Group,用于区分函数操作类别。

一般情况下,Function Group定义的都是操作类似的Function Module,包括一系列组件:

 

1). 数据对象(Data Objects

Function Group的全局变量、内表、结构、类等对象,可通用于整个Function Group;

2). 子程序(Subroutine

创建的子程序可被在该Function Group内的 Function Module 调用;

3). 屏幕(Screens

创建的屏幕可被在该Function Group内的Function Module使用;

abap_10_FM_Function_Group_Object_Name

 

2.1 创建Function Group

1). 通过T-Code:SE37,进入Function Builder的初始界面:

abap_10_FM_Function_Builder_Initial_Screen

2) 通过菜单栏路径:Goto -> Function Groups -> Create Groups

abap_10_FM_Create_Function_Group_Location

(除了Create Group外,还有 Change Group、Display Group、Delete Group、Find Group,分别用于修改、显示、删除、查找Function Group属性信息)

选择Create Group之后,会弹出 “Create Function Group” 的对话框:

abap_10_FM_Create_Function_Group

输入Function Group名称及描述后保存按钮。

弹出 “Create Object Directory Entry” 对话框,要求存放在哪个开发包(Package)里面,因为为测试Demo,故点击“本地对象(Local Object)”即可。

abap_10_FM_Create_Object_Directory_Entry

 

3)保存成功后,系统会在状态栏上弹出提示:

abap_10_FM_Create_Success_Status

 

3.  Function Module 的操作

每个Function Module的接口都会包含以下元素:

1). Import Parameter(输入参数)

abap_10_FM_Import_Parameter

调用 Function Module 时,外部传入的参数;

如若勾选参数中的Option选项,则该参数为非必输,如若不勾选,则表示必输。

定义传入参数与定义变量时一样,可用Like语句参考数据字典中的类型,如若用TYPE定义,Associated Type可以是基本类型,也可以是预定义类型。

 

2). Export Parameter (输出参数)

abap_10_FM_Export_Parameter

当 Function Module 处理完数据逻辑后,返回输出的参数;

不仅可返回变量,也可返回结构。

 

3). Changing Parameter

abap_10_FM_Changing_Parameter

作为输入参数传入 Function Module 操作后,修改并作为返回输出的参数;

 

4). Tables

abap_10_FM_Tables_Parameter

可传输内表作为数据源,Function Module 处理完成后,返回结果集。

 

5). Exceptions (异常)

abap_10_FM_Exceptions_Parameter

设定异常参数,在 Function Module 处理过程中,自定义异常输出。

 

3.1 Calling Function Module

Function Module 可以被不同的程序重复调用,避免了不同系统相同功能代码的重复开发。

然而在开发过程中,不可能每个函数的Import参数和Export参数都能记住,可以使用 ABAP 的Pattern方式调用 Function Module。

操作步骤:

1) 将光标聚焦在需要Call Function的地方;

2) 点击ABAP编辑器工具栏中的 ”Pattern“按钮:

abap_10_FM_Pattern_Toolbar

弹出对话框,在CALL  FUNCTION 栏位输入函数名称并单击确定:

abap_10_FM_Pattern_Dialog

3) 编辑器中会出现Function 相应的接口参数:


CALL FUNCTION 'LAST_DAY_OF_MONTHS'
  EXPORTING
    day_in                  =
* IMPORTING
*   LAST_DAY_OF_MONTH       =
* EXCEPTIONS
*   DAY_IN_NO_DATE          = 1
*   OTHERS                  = 2
          .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

系统会将Function必输项作为默认的输入项。

 

注意:

原先定义的Export接口变为了程序中的Importing 参数;Import接口在程序中变为了Exporting参数:

abap_10_FM_Import_Exporting

 

3.2 异常处理

在Function Module中的Exception接口中,定义异常参数:

abap_10_FM_Exceptions_Process

然后在程序处理过程,如若出现异常,可以通过 Raise 语句 输出异常:


FUNCTION STRING_SPLIT. 
  ...
  IF ...
     RAISE NO_DATA.
  ENDIF.

在调用函数时,通过EXCEPTIONS接口抛出异常


CALL FUNCTION 'STRING_SPLIT'
  EXPORTING
    delimiter = '-'
    string    = text
  IMPORTING
    head      = head
    tail      = tail
  EXCEPTIONS
    not_found = 1
    not_valid = 2
    too_long  = 3
    too_small = 4
    OTHERS    = 5.

 

4. RFC (Remote Function Call)

RFC是 Function Module 类型的一种,区别在于处理的类型为 Remote,在 Function Module 的Attribute属性中可以看到:

abap_10_FM_RFC

RFC允许该Function被SAP与非SAP程序调用,是SAP与外部应用系统的通信接口。

 

示例:

DATA:  INFO LIKE RFCSI,       "Importing parameter
       MSG_TEXT(80) TYPE C.   "Message text
 ...

CALL FUNCTION 'RFC_SYSTEM_INFO'   
DESTINATION 'NONE' 
 IMPORTING 
    RFCSI_EXPORT = INFO 
 EXCEPTIONS 
    COMMUNICATION_FAILURE = 1
    SYSTEM_FAILURE        = 2 .

IF SY-SUBRC NE 0. 

    WRITE: MSG_TEXT. 

ELSE. 

   WRITE: 'O.K.'. 

ENDIF. 

...

通过DESTINATION定义不同的源,连接外部系统。

 

5. 创建Function Module实例

下面通过示例创建一个Function Module:

操作步骤:

1) 通过T-Code:SE37进入Function Builder,输入Function Module名称(以Z开头),点击Create:

abap_10_FM_Create_Function_Module_Initial_Screen_Demo

弹出 “Create Function Module”对话框,输入上面创建好的Function Group及 Function Module 描述:

abap_10_FM_Create_Function_Module_Demo

2) 点击确认后,会提示弹出对话框,表示该 Function Module 已被SAP保留:

abap_10_FM_Create_Function_Module_Information_Demo

 

3) 切换到Attribute选项卡,选择处理类型:

abap_10_FM_Create_Function_Module_Attribute_Demo

a). Normal Function Module:普通调用模式,该Function在SAP系统中使用;

b). Remote-Enabled Module:开启Remote功能,即远程调用模式,RFC

c). Update Module:将该 Function Module 设置为Update 模式,调用该模式,可使用Update语句:

CALL FUNCTION  ‘FMXXX’  IN UPDATE TASK

必须每次使用COMMIT命令时才能完成数据操作。

这里保持默认设置即可。

 

4) 输入接口参数(Import/Export/Changing/Tables参数)

abap_10_FM_Create_Function_Module_Import_Demo

 

5) 编辑程序后,激活程序:

abap_10_FM_Create_Function_Module_Source_Demo

 

6) 调用程序:


CALL FUNCTION 'ZSAPJX_FM'
  EXPORTING
    ip_date = '20140101'.

 

6. BAPI

BAPI的全程为Business Application Process Interface,实质上是一种特殊的RFC,通过BAPI能够完成一些特殊的商业任务。

可以通过BAPI批量维护、处理业务数据。

 

SAP R/3系统提供了大量的BAPI,可以通过BAPI浏览器查找(T-Code:BAPI),可以将操作对象按实际业务进行分组:

abap_10_FM_Bapi_Explorer

 

例如,查找取物料明细的BAPI:Logistic – General -> Logistic Basic Data -> Material -> GetDetail

abap_10_FM_Bapi_GetDetail

双击Function Module名称即可查看BAPI的相应的接口参数。

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>