call function中的 exporting/importing/changing 您所在的位置:网站首页 创建function方法 call function中的 exporting/importing/changing

call function中的 exporting/importing/changing

2023-08-21 18:22| 来源: 网络整理| 查看: 265

文章目录 se37 功能模块功能组啥样的功能模块啥样的,怎么去call它创建功能组创建功能模块调用功能模块测试功能模块保存测试结果增添文档及释放 啥是function module啥是method 作为一个新手,单纯从字面上看,功能模块和方法。 看不懂。好像都可以理解为一个方法啊。

凭我有限的知识,我只听过se37/se38和功能组啥的。 而且我现在还在混淆中。 今天我就磕上了,不怕不懂,就怕不学。虽然又笨基础又烂,但咱还是要学习的。

我为啥要看这个呢,因为我今天在结束例程里面看到了 。本来这种我知识盲区的,我就直接忽略了,因为我反正看不懂。但是今天不行了,全是的。没办法往下看了。因为单纯从这个exporting 和 importing我就理解不了了。光靠猜也不行啊。 在这里插入图片描述 在这里插入图片描述 那就一口气来看看: 先贴两个事务码图来加深我的印象。

se37 功能模块

在这里插入图片描述 se38 程序 在这里插入图片描述 然后再来查概念: function module我们双击进去看,就能看到function builder。 好了,那就从function builder来看。 function builder的全称: ABAP工作台工具,允许创建,测试和管理function modules。 从这东西的外表看,它是一个封装的程序代码,然后提供了一些交互的数据接口。这个就好像我之前也写过一篇封装啥的。 反正就是理解成一个方法,然后可重复使用。(我以后如果成为大牛,回来看肯定会被我气死,我这都瞎写的啥啥啥) 这些哪哪你都可以调用,然后SAP自己也提供了很多的功能模块给你用。我们上面那个就是SAP自己提供的。

功能组啥样的

先不管创建不创建的,我们先得知道这个组干嘛的。就是一个大池子,用来放功能模块的。但是它可不是单纯就是像个包一样的放东西的,不仅是容器,它自己也要有货的。自带的全局数据生命和一些子例程,然后它里面的所有功能模块都能用。

那这玩意类比到面向对象编程。。。我忘了,我又得回去看看了。 那这不就是类么?功能模块是公共静态方法,类里面包括全局声明。 哎,可惜我C语言没学好。 但是不管, 我要来看看这个功能组到底啥样:在这里插入图片描述 对于每个叫FGRP的功能组,系统会生成一个主程序叫SAPLFGRP。主程序会包含INCLUDE的声明: L FGRP TOP:第一个include程序包含功能组的全局数据。 L FGRP Uxx : 这些包含功能模块,xx序列指功能模块被创建的顺序排列。 L FGRP Fxx: 这些事来写子例程(forms)的。可以被功能组下的功能模块来call。

这些听说不好改。 还有其他的前缀: Exx: 是指类和方法 Oxx 指PBO模块 Ixx 指PAI模块 Exx 指event blocks Fxx 指本地子例程 在Top include里面可以添加Dxx: 本地类的declaration声明。

接下来看一个功能组: 在这里插入图片描述 双击进来看,名字多了个SAPL。 底下的include程序,第一个是L BFCR TOP.是全局数据声明。 下面是Uxx,代表功能模块。 在下面F01是Form,子例程。 在这里插入图片描述 这会来依次看看: 在这里插入图片描述 全局数据里面定义了这个function-pool 也就是功能组。然后还有个表,还有DATA声明。也就是以后的function module都会用到的。

再往下的功能模块,里面有好几个。按顺序来的。 在这里插入图片描述 再往下一个子例程form,挺长的,不看了。 在这里插入图片描述 大致也就这样。

系统提供了很多功能模块,但是咱作为小白,啥也不知道,这会咋弄呢? 这里找:utilities是工具、设备的意思。 在这里插入图片描述 放开Edit下的All Selections,可以看到所有可帮助搜索的选项。 在这里插入图片描述 在这里插入图片描述 随便点个RFC modules,执行查找: 在这里插入图片描述

功能模块啥样的,怎么去call它

功能模块,我觉得也跟方法好像没啥差。也就长那样,但是它那个接口参数我就不理解了。 进口出口的。单词意思我都知道,就是我一直把import和export搞混淆。

我一般看到的就是 在这里插入图片描述 Import:从Call的程序传给功能模块。上面也能看到,从我们外部call的程序里,export出去,也就是这些值赋给function module的导入参数。

Export: 这个也就是从功能模块传回调用的程序。从上面的图看来,也就是的值是从功能模块导入的。 那为啥不是 -amount = amount_internal这种格式呢? 咋还反着来呢?

Changing: 就是说这些值可变的,原始参数值从调用程序传给功能模块,功能模块可以改变初始值然后再传回给调用程序。 Tables:可以导入和导出的内部表,内部表的内容从调用程序传输到功能模块,功能模块可以改变内部表的内容然后传回给功能模块,表总是通过引用来分配的。 Exceptions: 功能模块运行出错会有exceptions。

那我们如何调用功能模块的呢? 在这里插入图片描述 这个里面f代表formal parameters形式参数,a代表actual parameters实际参数。 可以看出来赋参都是:在这里插入图片描述 也就是我们上面的 在这里插入图片描述 赋值多个形式参数,中间要有间隔或者新起一行。 对于EXPORTING,赋值实际参数给形式参数,形式参数必须在功能模块的import导入参数那定义过。 对于IMPORTING,把功能模块的形式输出参数赋值给调用程序的实际参数。形式参数在功能模块得在导出参数那里有定义。 对于CHANGING,功能模块执行后,系统返回形式参数的执行结果给实际参数。 对于EXCEPTIONS,如果一旦有例外,功能模块就终止了。

系统终止功能模块,并不返回参数值。但是会赋值r给到系统字段SY-SUBRC 就是一个返回码return code。

创建功能组

到SE80下面找 function group 在这里插入图片描述 A到X开头的是SAP开发的。 Y到Z开头的是客户开发的。 在这里插入图片描述 一般咱自建的都是Z打头的。如果你查不到你的组,它就会问你要不要新建这个组。 直接新建个来看看,保存到本地。下面这个图应该是点击local object。 在这里插入图片描述 默认自动生成两个include,一个top,一个Uxx. 在这里插入图片描述

创建功能模块

一般功能模块用来干啥?执行税务计算,工厂日历。。。 然后这些你写的程序,想要以后重用,那你就在function builder里面建。

流程是啥?

先查查看是否有已实现的function module没有合适的组就创建一个function group创建功能模块定义导入导出参数和例外写功能模块代码,在TOP include里面添加全局数据激活这个功能模块测试这个模块记录功能模块文档及参数(方便其他人使用)释放功能模块

要注意的一点是,你调用功能模块的时候,同一个功能组下的所有功能模块都会被加载到调用程序,你要特别注意计划哪些功能该属于一个功能组。否则,调用功能模块会增加内存耗用。(不过不复杂的就无所谓。。。我觉得)

在这里插入图片描述 在这里插入图片描述 属性里一般都是选regular的。立刻执行。然后系统自动创建一个include,组名也变成SAPL ZTEST了,include自己生成的是U01.因为这是第一个。

在这里插入图片描述 接下来,确认参数和例外。 在这里插入图片描述 参数名称,类型:数据库字段类型,ABAP数据字典结构组件,或者ABAP数据字典。一般有参考类型的就用参考类型。 默认值一般可用在import参数和changing参数里,而且import和changing也可以选择optional或者mandatory。

exception里面呢,就填写text了。哪一个exception能被triggered啥的。 在这里插入图片描述 填完以上的参数,就可以写代码了: 在这里插入图片描述 是的,参数我瞎填的,代码我不会写。。。现在不会,马上以后就会了😂照着例程的方法来写吧。。。 声明数据类型和对象。 我知道声明要用TYPES或者DATA 。如果在TOP里面声明,那下面所有的function module都可以用。

在功能模块里也可以调用子例程。子例程可以写在ENDFUNCTION后面,不过我看人家在INCLUDE里面直接弄了一个子例程么。这个以后再看吧。还有Form啥的。

例外啥的: RAISE<exception> 系统终结功能模块,而且返回值到SY-SUBRC。如果调用程序不能处理这个例外,系统会触发一个runtime error。 MESSAGE...RAISING<exception> 不会有runtime error。进程继续,系统显示定义类型的信息。 你得在Include TOP里面确定MESSAGE-ID。然后值会被插入到以下: ○ SY-MSGID (message ID)

○ SY-MSGTY (message type)

○ SY-MSGNO (message number)

○ SY-MSGV1 to SY-MSGV4 (contents of the fields to that are included in the message). 在这里插入图片描述 在这里插入图片描述

到此我们来理解下功能模块代码的使用:(以下代码我抄的) 在这里插入图片描述 然后激活。

调用功能模块

接下来可以se38 report里面去调用。

report mdtest. data: result type f. call function ‘MY_DIVIDE’ exporting z1 = 6 m1 = 4 importing res = result exceptions div_zero = 1 others = 2. if sy-sybrc eq 0. write: / ‘Result =’ , result. else. write ‘Division by zero’. endif. 测试功能模块

也可以直接小扳手测试: 在这里插入图片描述 好了,到这里,好像没啥问题。然而我得到了一个ABAP runtime error 这个error是啥,是这个错: 在这里插入图片描述 这个小错怎么解决呢?右键到组上来激活它。因为这个组我们没激活。 在这里插入图片描述 现在来执行: 在这里插入图片描述 或者来debug。

还可以SE30来查看运行时间分析。

保存测试结果

在这里插入图片描述 测试完成可以选择保存记录。 下次从test data directory可以查看你上次保存的测试记录。 在这里插入图片描述 在这里插入图片描述 如果改了功能,可以用这个测试条件再测试一次: 选中该条测验:regression test(回归测验) 在这里插入图片描述 还会给你显示两次测试的区别: 在这里插入图片描述 还可以在功能组上按顺序测试一系列功能模块,特别是那种连续性的。一个建一个删这种功能的。 在这里插入图片描述

增添文档及释放

在function module documentation 记录 在这里插入图片描述

释放你的功能模块的话,要通知下组负责人。 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有