![7dcc03f4ffeb0b3b8249d82028e50671.png](https://i-blog.csdnimg.cn/blog_migrate/82bdfc66a3cd023caf3747c0a4459aa5.jpeg)
1 函数简介
Abap 函数在编程中应用比较广泛,通过系统函数或自定义函数,可实现业务功能的调用, 而且函数使代码模块化,实现代码重复使用,因此可以减少代码冗余,提高编程效率。
2 Function 相关名词介绍
2.1 Function Builder 介绍
ABAP Workbench 有几个不同的工具用于编辑容器对象。这些工具可以为你提供涵盖整个软件开发 周期各阶段的辅助。而 Function Builder 属于 ABAP Workbench 中显示和处理功能模块。Function Builder 提供了在集成化的环境中创建,测试和管理函数模块的功能。
2.2 Function group 函数组
Function group 通常是一组功能相关的 function modules 的封装。比如下面此图为函数组 ZMAT 的结构,如下图所示。
![474538ecb68bc1d86727f92e798f4d44.png](https://i-blog.csdnimg.cn/blog_migrate/010fe979e197fa089311792fc6e69155.png)
上图
函数组的命名规则与
abap
程序名命名相似,以
Y
或者
Z
开头,长度不超过
26
位的字符串。
2.3 Function 函数
Abap function 并不能单独存在,它必须放在某个 function group 中,因此创建 function 之 前先要创建 function group。函数可以被任意 ABAP 程序调用,也支持异常处理,在函数运行时 可以捕获异常消息。函数的测试非常方便,可以不在某个程序中而单独测试函数。在数据库更 新,远程消息通信等方面应用较广。
2.4 函数接口
1.attributes 传输类型:Normal Fucnction Module 用于模块化编程并且对外部系统不是可见的,但是在相同的 sap 软 件系统中是全局可见的。Remote Function Module 用于对外部系统可见,因此可以通过 RFC 被调用。Update Function Module 用于函数模块的异步更新。
2.import:输入参数,比如结构型变量
3.export:输出参数,比如结构型变量
4.changing:既输入又输出的参数
5.tables: 指定的表,将被传递给一个功能模块。表的参数总是通过引用传递,比如内表传递。
6.exceptions:函数异常处理,函数模块中抛出异常:raising + 异常名
2.5 function 与 form 程序的区别
1.函数必须属于一个容器池(函数组),而 form 程序可以单独存在。
2.函数是系统全局的,而 form 程序不是。
3. 函数拥有一个固定的接口进行数据交换。这使得它更容易让你通过输入和输出参数与功能模 块交互。例如,您可以指定默认值的输入参数。
4.函数接口支持异常处理。这使您可以捕捉错误并将它们传回给调用程序处理。
5. 函数用自己的内存区域。调用程序和功能模块不能使用共享内存区域进行数据交换 – 函数必 须使用的功能模块的接口。这避免了令人不快的副作用,例如意外的数据覆盖。
6.函数使用 CALL FUNCTION + 函数名 的的形式调用函数
3 函数组操作
3.1 创建函数组
Se37 goto function groups create group.如下图所示。
![c63b4587f99d353e40911501fec6bb4e.png](https://i-blog.csdnimg.cn/blog_migrate/d165f9778c37112b5a44a29277998727.png)
![ecd3ae1a033666250ba0cfcbb6cdd1c7.png](https://i-blog.csdnimg.cn/blog_migrate/5f0d28436963870b822ed2ccf7021b01.png)
函数组命名注意以 Y 或者 Z 开头,如下图所示
然后激活函数组:Se80 选择函数组 Inactive Objects 选中新建的函数组 右键激活。如图所 示。
![233a7c75362c109e5b6ad9a96a268d2a.png](https://i-blog.csdnimg.cn/blog_migrate/65d40e4c2325cd152526d9fc07fc9a9a.png)
4 函数操作
4.1 创建函数
Se37 输入函数名,点击 create。如图 所示。
![68683675aec964211fdfe26f8d4f1df7.png](https://i-blog.csdnimg.cn/blog_migrate/9da6b7f47f5dc576eaab750d06ff0840.png)
如图 输入所属函数组名。如图所示。
![4123681816ce4c7cd698fdeeb219e54a.png](https://i-blog.csdnimg.cn/blog_migrate/34021c2f06d1f7d9cdbefa9231df1b50.png)
点击 Save 输入函数描述(短文本),如图所示。
![ede7ae3814c1c657ad480cc52919547e.png](https://i-blog.csdnimg.cn/blog_migrate/d66d83da909a17bc9ae3d37586b18f76.png)
输入函数输入输出参数,如图 所示。
![cfe38bc003b5d6bcfdb76ab3d736bdff.png](https://i-blog.csdnimg.cn/blog_migrate/48d526944c9d4f2c5024a9129602d1b1.png)
定义异常和短文本,如图所示。
![644b1f6f677218214bd128282b2fb3bf.png](https://i-blog.csdnimg.cn/blog_migrate/06f04013bcce7bc3a60da5d9ec2fcb84.png)
最后点击“源代码”,编辑函数代码。如图所示。
![5909727b8222a55ae3cbfd1c99fb3de3.png](https://i-blog.csdnimg.cn/blog_migrate/1c4e51ca245e9dc16f324d51dcbfe41c.png)
4.2 测试函数
点击下面的图标,执行函数。
如图所示。
![cd1bd54a8d6549ae85ee02fe9c9fa1e9.png](https://i-blog.csdnimg.cn/blog_migrate/91cee9c3f71edd80ec285faf470bd489.png)
![79389808ec54983c3e2815349c2f90d2.png](https://i-blog.csdnimg.cn/blog_migrate/f853e0c971d6bd0fe9b3ed5eef4c8a82.png)
4.3 使用函数
在程序中插入函数:点击菜单栏 -> 模式,如图所示。
![6f4f18cc676c1e113c6e3a7eaaab3cd7.png](https://i-blog.csdnimg.cn/blog_migrate/fdc4e45bd2b1bdd23483af623f9e8244.png)
输入函数名,如图所示。
![2dd5f041802d9ec103dc8704fd1dfba3.png](https://i-blog.csdnimg.cn/blog_migrate/25054cece7c2dbafd002c3e5bcc210ee.png)
这样就可以在程序中加入函数调用代码了。
4.4 常用系统函数
DYNP_VALUES_READ — 读取 SCREEN 字段的值,也可以用来读取报表
SELECTION SCREEN DYPN_VALUS_UPDATE — 更新屏幕字段的值
GET_GLOBAL_SYMBOLS — 返回一个程序的 TABLES,SELECT OPTIONS,TEXTS,ETC。甚至包含 SELECTION SCREEN 的文本定义
REY_DYNPRO_READ — 读取屏幕
DY_GET_SET_FIELD_VALUE —获得或者设置屏幕字段的值
RS_REFRESH_FROM_SELECTIONS — 获得当前选择屏幕内容
DY_GET_FOCUS — 获得屏幕焦点
BP_JOBLOG_READ —获得 job log 的执行结果
GET_JOB_RUNTIME_INFO — 获得 job 相关信息
CLPB_IMPORT — 从剪贴板导入内标
CONVERT_OTF — 将 SAP 文档(SAP SCRIPT)转换成其他类型
ABAP_DOCU_DOWNLOAD —以 HTML 格式下载 ABAP 文档 ARFC_GET_TID — 以十六进制形式返回终端的 IP 地址 BAL_* — 容纳了 SAP 的应用程序日志所有的函数模块 BP_EVENT_RAISE — 在 ABAP/4 程序中触发一个事件
F4IF_SHLP_EXIT_EXAMPLE — F4 接口模块
FTP_CONNECT — 打开并登陆 FTP 服务器的链接
FTP_COMMAND — 在 FTP 服务器上执行一个命令
FTP_DISCONNECT — 关闭指向 FTP 服务器的链接
GET_INCLUDETAB — 获得一个程序的
INCLUDES 列表 GUI__exec — 调用一个文件或程序
HELP_START — 为一个字段显示帮助
K_WERKS_OF_BUKRS_FIND — 返回一个特定公司代码的所有工厂
POPUP_TO_CONFIRM_LOSS_OF_DATA — 返回一个特定公司代码的所有工厂
POPUP_TO_CONFIRM_STEP — 探出一个对话框询问用户是否操作继续
POPUP_TOCONFIRM_WITH_MESSAGE POPUP_TO_CONFIRM_WITH_VALUE
POPUP_TO_DECIDE
POPUP_TO_DECIDE_WITH_MESSAGE
POPUP_TO_DISPLAY_TEXT POPUP_TO_SELECT_MONTH — 探出一个对话框供选择月
POPUP_WITH_TABLE_DISPLAY — Provide a display of a table for user to select one, with the Value of the table line returned when selected. CONVERSION_EXIT _CUNIT_OUTPUT — 单位转换
CLOI_PUT_SIGN_IN_FRONT —将负号前置,SAP 默认将负号放在数字后面。
CONVERSION_EXIT_ALPHA_INPUT — 数字串前补 0
CONVERSION_EXIT_ALPHA_OUTPUT — 消除数字串前的 0
BAPI_CURRENCY_CONV_TO_INTERNAL — 奖金额转换成内部数据格式
BAPI_CURRENCY_CONV_TO_EXTERNAL — 奖金额转换成外部数据格式
UNIT_CONVERSION_SIMPLE — 衡量单位转换
SJIS_SBC_TO_DBC — 半角转换为全角
SJIS_DBC_TO_SBC — 全角转半角
TEXT_SPLIT —字符串分割
CONVERT_TO_LOCAL_CURRENCY — 按指定日期汇率转换金额为指定货币类型
CONVERT_OTFSPOOLJOB_2_PDF — 将 OTF spool 转换为
PDF PRICNG — 获得定价条件
PROFILE_GET — 从 INI 文件读取一条记录
PROFILE_SET — 往 INI 文件写一条记录
READ_TEXT — 读取长文本
SAVE_TEXT 上传长文本
REGISTRY_GET — 从注册表读取一条记录
REGISTRY_SET — 在注册表里设置一条记录
RFC_ABAP_INSTALL_AND_RUN — 当 MODE 参数值为‘F’试运行
PROGAM 表中的程序
RH_GET_ACTIVE_WF_PLVAR — 获得激活的 HR 计划
RH_STRUC_GET — 返回所有相关的组织信息
RP_CALC_DATE_IN_INTERVAL — 年月日加减
DATE_CHECK_PLAUSIBILITY — 日起有效性检查
SD_DATETIME_DIFFERENCE — 两日期作差
DATE_CONVERT_TO_FACTORYDATE — 把输入日期转为工厂日历日期
MONTH_NAMES_GET — 获得所有的月和名字
F4_DATE — 探出一个窗口显示一个日历允许用户选择一个日期
RP_LAST_DAY_OF_MONTHS — 获得一个月最后一天
FIRST_DAY_IN_PERIOD_GET — 获得期间首日
LAST_DAT_IN_PERIOD_GET — 获得期间末日
DATE_GET_WEEK — 返回一个日期所在的周数
HOLIDAY_GET — 基于工厂日历/几日日历提供了一个节日表
RS_VARIANT_CONTENTS — 获得程序变式的信息
RS_CHANGE_CREATED_VARIANT — 修改程序变式的信息
RZL_SLEEP — 将当前程序挂起
ENQUE_SLEEP — 在继续处理之前等待一个指定的时间
ENQUEUE_ESFUNCTION — 锁定一个 ABAP 程序使它不可以被执行:注意不要用
SY-REPID 来传递你的报表名字,当吧
SY-REPID 作为参数传递给函数模块的时候,
SY- REPID 的执实际上已经发生了变化
RZL_SUBMIT — 提交一个远程报表
GUI_UPLOAD — 上传文件到服务器
GUI_DOWNLOAD — 下载文件到本地
FILE_GET_NAME —从逻辑文件名得到物理文件路径及文件名
FILENAME_GET — 弹出一个文件选择对话框
SO_SPLIT_FILE_AND_PATH — 将一个包含路径的全文件名分割为文件名和路径
EPS_GET_FILE_ATTRIBUTES — 获得文件属性
RZL_READ_DIR_LOCAL — 读取应用服务器的目录
GUI_CREATE_DIRECTORY — 在显示服务器端创建一个目录
GUI_DELETE_FILE — 在显示服务器端删除一个文件
UPLOAD_FILES — 上传一个或多个文件
MS_EXCEL_OLE_STANDARD_OLE — 创建一个文件并自动启动
Excel GUI_REMOVE_DIRECTORY — 从显示服务器删除一个目录
ESP_GET_DIRECTORY_LISTING — 返回一个本地或网络目录的文件列表
RZL_READ_DIR —如果服务器名字左部为空,从本地读取目录,否则读取远程服务器的目录
RZL_READ_FILE — 如果为给定服务器名字则读取本地文件,否则读取远程服务器文件
RZL_WRITE_FILE_LOCAL — 将内标保存到显示服务器(not PC)。不使用 OPEN DATASET 因此避 免了授权检查
SAPGUI_PROGRESS_INDICATOR — 显示一个进度条
RPY_TRANSACTION_READ — 给定一个事务代码,获得其程序和屏幕:或给定一个程序和屏幕获得 事务代码
SCROLLING_IN_TABLE — 当编写模块池的时候可以用它来处理滚动
SO_NEW_DOCUMENT_ATT_SEND_API1 — 将文档作为邮件的一部分发送
SO_SPOOL_READ — 根据 SPOOL 号获得
Printer spool SO_WIND_SPOOL_LIST — 根据用户浏览
printer spool 号
LIST-TO_ASCII — 将 ABAP 报表从
OTF 形式转换成 ASSCII 形式
SX_OBJECT_CONVERT_OFT_PDF —从 OFT 转换为 PDF(SAP 脚本转换)
SX_OBJECT_CONVERT_OFT_PRT — 从 OTF 转换为打印格式(SAP 脚本转换)
SX_OBJECT_CONVERT_OFT_RAW — 从 OTF 转换为 ASCII(SAP 脚本转换)
SXPG_CALL_SYSTEM — 检查用户是否有执行某个命令的权限
SXPG_COMMAND_LIST_GET — 获得一个包含所有定义的外部 OS 命令的列表
SXPG_COMMAND_DEFINITION_GET — 从 R/3 系统数据库读取单个外部 SO 命令的定义
SXPG_COMMAND_CHECK — 检查用户是否有执行某个命令的权限
SXPG_COMMAND__execUTE — 检查用户是否有执行某个命令的权限,拥有授权则执行命令
TERMINAL_ID_GET — 返回终端 ID
TH_DELETE_USER — 剔除一个用户,效果同
SMO4 TH_ENVIRONMENT — 获得 UNIX 环境
TH_POPUP — 在特定用户屏幕上显示一个系统消息
TH_REMOTE_TRANSACTION — 在远程服务器上运行事务代码
TH_USER_INFO — 获得当前用户的信息(会话,登陆工作台等)
TH_USER_LIST — 显示登陆到应用服务器的用户列表 WRITE_LIST — 显示一个列表对象
WS_EXCEL — 启动
EXCEL WS_VOLUME_GET — 获得终端设备标签
WWW_LIST_TO_HTML — 运行一个报表之后,调用这个方法列表输出转换成
HTML SD_VBAP_READ_WITH_VBELN — 根据销售订单读取表 VBAP 中的信息
CO_RO_CHECK_DECIMAL_POINT — 根据单位检查数据的小数位
POSTAL_CODE_CHECK — 检查邮政编码
VIEW_MAINTENANCE_CALL — 维护标示
图
F4IF_INT_TABLE_VALUE_REQUEST 显示检索的
HELP TERMINAL_ID_GET — 获得终端 ID
MESSAGE_TEXT_BUILD — 把消息转为文
本 SSF_FUNCTION_MODULE_NAME — 根据 FORM 名曲的对应的函数名(SMARFORM)
SEF_FUNCTION_MODULE_NAME SMARTFORMS — 输出报表时,生成一个函数名称,然后 CALL 这个名 称
RS_COVERPAGE_SELECTIONS — 获得一个报表的选择参数列表
RSLG_WRITE_SYSLOG_ENTRY — 往 SYSLOG 里写一条记录
RSPO_SX_OUTPUT_TEXTDATA — 将内表中的数据输出到
SPOOL
ALSM_EXCEL_TO_INTERNAL_TABLE — 将 excel 文件上传至内表
5 RFC 简介
RFC(Remote Function Call,也叫远程函数调用)是 SAP 系统和其他(SAP 或非 SAP)系统 间的一个重要而常用的双向接口技术,也被视为 SAP 与外部通信的基本协议。
简单地说,RFC 过程 就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有 一个必须是 SAP ABAP 系统。这种远程功能调用也可在同一系统内部进行(如本地 SAP 系统内的远 程调用);但通常情况下,调用程序和被调用程序处于不同系统。
SAP 所提供的外部接口包括程序通信接口(communication interface)、文件 I/O 接口 (file I/O interface)以及数据接口(data interface)。数据接口用于在系统内部对程序运 行时数据和数据库数据进行传递,其实现技术包括批输入(batch input)、SAP SQL 等。程序通 信接口和文件 I/O 接口则是与其他系统进行数据交换的通路。文件 I/O 实现文件中数据和运行时 数据间的交换(即将数据从文件上载到程序中。或将运行时数据下载至文件)。RFC 位于程序通信 接口中,以实现外部程序对 SAP 系统内部数据的访问。
6 RFC 使用
6.1 RFC 调用过程
在系统间通信过程中,需区分发送系统和接受系统。RFC 调用请求从发送系统(调用系统)中传至 接收系统(被调用系统,也称远程系统或目标系统),发送请求的系统在通信过程中又称为 RFC 客户端,通信另一方则称为 RFC 服务器。
RFC 客户端发起远程功能调用以执行 RFC 服务器提供的功 能。其中,调用系统和被调用系统均可以是 SAP 系统和非 SAP 系统,此外还可以在 SAP 系统内部将特 定应用服务器指定为目标系统。如图所示。
![fbd0a4b738ce43363be669524e887538.png](https://i-blog.csdnimg.cn/blog_migrate/062c6c9912d98b7cd39d8a12f708f3b5.png)
6.2 RFC 通信的情况
根据通信方向和系统类型,共有如下三种 RFC 通信:
两个独立的 SAP 系统之间的通信;SAPA 系统作为调用系统,与外部远程系统(非 SAP ABAP 系统)通信;外部系统作为调用系统,与 SAP 系统通信。6.3 RFC 接口系统 SAP 调用远程功能的能力是通过 RFC 接口系统(RFC interface system)实现的。根据调用方向的不 同(SAP 系统调用其他模块或其他系统调用 SAP 模块),RFC 接口提供以下两种服务。
(1)ABAP 程序的调用接口
(2)非 SAP ABAP 程序的调用接口。SAP 的 RFC 调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,特别适合于外部 报表开发,但对于大数据量的查询效率相对较低。大家在熟练掌握后,可以进一步学习高级的 IDOC 和 BAPI 接口开发技术。
7 RFC 与 BAPI 的关系
SAP R/3 的接口方式主要有 RFC(Romote Function Call,远程函数调用)、IDOC、BAPI 三种,BAPI 实际上也是 RFC 函数,它处理一组业务。使用 Tcode:BAPI/BAPIW 在 SAP 系统中可查看到各模块 的 BAPI 函数。RFC 版本:sRFC( synchronous RFC)是 RFC 的第一个版本,它要求连接的双方是同步的工作方式,即都是 在可用状态才能够实现成功调用。
aRFC(asynchronous RFC)这种 RFC 可以实现异步的 RFC 调用方式,它可以进行多个并发调用, 并且不要求被调用系统的可用状态。发出调用系统会一直尝试直到获得被调用系统的应答。它通 常用于当你需要提高系统并行调用多个 RFC 的效率,相对于强制等待程序的结果,它的效率更 高。tRFC(transactional RFC)是对 aRFC 进行相关技术改进后的一个 RFC 版本,其于 ARFC 相同点是 实现异步调用,其优点是可以将多个调用进行 LUW 分组处理, 并只执行一次运行。
现在 aRFC 基 本上已经停用。qRFC(queue(d) RFC)是 tRFC 的一个增强版本,它保证了所传输数据的处理次序。pRFC(Parallel RFC)是一种特殊的 RFC,它是 aRFC 的一种扩展类型。因为它改善了系统的性 能,在执行大量的 aRFC 时。SAP 使用它在 MRP 里面提高速度。但是它只能执行在同一个系统和同 一个 client 里。RFC 不但是一种函数,更是一种数据通信协议,类 TCP/IP.
8 BAPI 简介
BAPI (Business Application Programming Interface) 业务应用编程接口,是一种特殊的远程 方法调用 (RFC),通过 ABAP 或其他外部程序调用,如 C++,Java,Delphi,VB 等语言。
Sap 大量业务都有相应的 BAPI 函数,如创建客户,创建订单,修改订单,删除订单,新建物 料等,所以可以通过 BAPI 导入数据。与 BDC 相比,BAPI 导入数据快,稳定,没有模拟屏幕操 作,还可以自行建立 BAPI,在外部程序调用。
Bapi 是外部应用程序访问 sap 业务对象的方法。在面向对象编程方面,业务对象(business object)和 bapi 是 sap 的两个很重要的内容,业务对象就是类,bapi 就是业务对象的方法。他们 的关系描述如下:kernel --> intergrity --> interface -->access: kernel 为内核,对数据库直接进行操作 intergrity 为业务对象,将实际业务定义成一个类 interface 为应用编程接口,通过该接口,对业务对象进行操作 access 为访问方式,直接面向对象编程或远程函数调用 每一个 bapi 都有与之对应的以”bapi_“开头的函数。例如:业务对象”user“表示”系统用户“, 它有 bapi(方法)“lock”和“unlock”,它们用来锁定系统用户和对系统用户解锁。这两个方法对应 的函数为“bapi_user_lock”和“bapi_user_unlock”。
9 BAPI 操作
9.1 查看 BAPI 运行 bapi,进入 sap bapi 浏览器,在这里,我们能够通过业务层次迅速找到需要的业务对象和 方法。如:业务对象 --> bussines object 关键字段 --> short description bapi --> method 与 bapi 对应的函数 --> function module 如图所示。
![9311057ba2404a969c391e7269865946.png](https://i-blog.csdnimg.cn/blog_migrate/859bc60466851db7bb25c0e1fbb9f554.png)
10BAPI 修改销售订单数量示例
(程序进知识星球获取)