【案例总结】+SAP调用SMARTFORMS时传输数据的三种方式

目录

引言

方法一、接口导入参数传输方式

方法二、使用EXPORT/IMPORT传输参数

方法三、使用ASSIGN传输参数

最后总结一下


引言

在SAP中,调用SMARTFORMS一般是使用四部曲

CALL FUNCTION ‘SSF_OPEN’

CALL FUNCTION ‘SSF_FUNCTION_MODULE_NAME’

CALL FUNCTION SMARTFORMS函数名

CALL FUNCTION ‘SSF_CLOSE’

这个接口SSF_OPEN是传输打印参数的接口:

这个函数是获取SMARTFORMS名称的函数,ZFI1013是我们表单的名字

这里L_FNAME这个参数是表单对应的函数的编号,因为SMSRTFORMS表单在生成接口时,每次生成的编号都是不同的,正式机和测试机不同,上一版和下一版也不同,所以每次都需要获取一下名称,才能够调用到SMARTFORMS

下面这个函数SSF_CLOSE是最后打印预览的函数

在使用SMARTFORMS打印时,基本上就是这样的一个流程。我们都知道,在打印的时候,都是打印的我们程序里内表的数据,内表的数据是如何与SMARTFORMS表单连接起来的呢?这里有三种方法可以试一下:

假设我们是在一个ALV报表程序里面调用我们的SMARTFORMS

方法一、接口导入参数传输方式

这是最传统的一种方式,但是会比较麻烦,下面是一个案例

首先使用SMARTFORMS看一个表格,截图如下,点开全局设置下面的表格接口栏目,可以看到红框里面的参数,分别是导入、导出、表、例外,这个是不是很熟悉?是的,这个和我们创建RFC接口时的参数是一样的。因为本质上我们使用SMARTFORMS创建的表单就是一个接口,只要我们CALL它,并且传入相应的参数,表单就可以接收到,就可以让我们的内表数据展示到表单上。

上图表单的表参数这里,参数名称是GT_GZB,关联类型是ZZS_GZB一个结构,这个结构是使用SE11创建的,激活后,任何地方都可以使用这个结构,当然也包括了我们的ALV程序和SMARTFORMS表单。我刚刚说的比较麻烦就是,我们要使用这个表参数,就必须使用SE11创建一个结构来供smartforms引用,所以就比较麻烦,好吧,其实就麻烦那么一点点。

在SMARTFORMS定义好传输的参数之后,我们如何将ALV的数据传输过来呢?

接下来,在ALV报表程序里面,调用SMARTFORMS时,加上这样的参数:

这样就可以把ALV程序里面的LT_GZB内表数据赋值给表单参数GT_GZB了,要注意LT_GZB的结构要和GT_GZB的结构一致,不然会报错。

用这个方式设计出来的SMARTFORMS表单虽然有点麻烦,但是好处非常明显,它可以直接输入数据进行测试。如下:

可以看到,我们在测试SMARTFORMS时,它是可以自己做数据上去测试的,这样就可以在不运行ALV程序的情况下,单独测试表单,看我们的表单设计是否合理。

方法二、使用EXPORT/IMPORT传输参数

还是和刚才一样,我们打开SMARTFORMS表单的全局设置,这次我们看全局定义栏目。

首先我们在全局数据这里我们定义一个全局变量GT_ITEMS,关联类型为TY_EXCEL_TAB。

然后在类型这里,声明我们的类型,要注意我的TY_EXCEL_TAB是表类型。

然后在初始化这里写上IMPORT的代码:

到这个步骤,我们已经完成一半儿了,接下来去ALV报表程序里面写另一半,如下截图:

EXPORT GT_ITEMS = GT_ALV TO MEMORY ID ‘ZSDR0017’.

这个代码的意思是,将内表GT_ALV储存在内存ZSDR0017里面,这个内存名称ZSDR0017只是我随意写的一个名字,大家完全可以根据自己的需求进行命名。

IMPORT则是将其读取出来。

然后就是调用打印函数,如下,直接调用SMARTFORMS就可以了,不需要SSF_OPEN 和SSF_CLOSE,很简单方便了:

这个方法是我最喜欢使用的一个方法,因为可以少写很多代码。但是,必须保证EXPORT和IMPORT时,参数类型一致,不能有一点点不一样,不然就会宕机!!!真的会宕机宕到怀疑人生,大家有兴趣可以参考一下我的另一篇文章:

ABAP+EXPORT/IMPORT定义结构注意点_sap 增强中对export 和import-CSDN博客

当然这个方式设计的表单,在测试的时候就不能自己创建数据进行测试了,在测试界面没有自定义的一些参数来让我们自己捏造数据,并且在测试的时候会说生成测试环境错误,其实用的时候是正常的:

这时候不填充任何参数直接运行,可以生成一个简单的SMARTFORM框架出来,没有啥参考意义,就得和ALV报表程序一起测试。

方法三、使用ASSIGN传输参数

这个方法我个人很少用,但是很多开发会使用这个方法。写上来是为了做一个参考

我们依然是打开SMARTFORMS的全局设置,看到全局定义页签,全局数据这里定义一个变量GT_ITEMS,参考类型TY_ITEMS

然后在类型栏目下声明TY_ITEMS的类型,这里也注意,TY_ITEMS是表类型

然后在初始化栏目下,ASSIGN获取相应程序的内表。

这个代码的意思是,把ALV报表程序ZMMR9006里面的内表GT_PRTITEMS[]赋值给SMARTFORMS表单的GT_ITEMS;把ALV报表程序ZMMR9006里面的工作区GW_HEAD赋值给SMARTFORMS表单的GS_HEADER.

到这里我们也完成一半操作了。

接下来我们返回ALV程序

在四部曲的第三步之前,保证程序ZMMR9006内表GT_PRTITEMS[]和工作区GW_HEAD已经被赋值了就可以了。在调用SMARTFORMS的时候,不需要输入任何我们自定义的SMARTFORMS参数。

方法三看起来确实好像更简单,但是,它比方法二更容易宕机,而且完全不能单独测试,一言不合就宕机。因为ASSIGN很容易赋值失败,在ALV程序没有处于运行状态的时候,使用ASSIGN就会宕机。

最后总结一下

好啦,以上就是今天介绍的三种给SMARTFORMS传输参数的方式,其实这三种方式不是互斥的,在实际工作中完全可以一起使用,只不过在使用的时候要注意语法和条件。如果后续我见到了其它的方式,我一定会来补充的!!

这个文章其实“预谋”好久了,一直都在拖延,今天终于写完啦,关于SMARTFORMS的知识点其实还是蛮多的,我也在一步一步学习,之前在小白操作手册里面有写过一个SMARTFORMS的案例,那个比较完善,但是感觉很稚嫩,可以两篇文章一起阅读一下,(大补)相辅相成哈哈哈哈哈

ABAP小白开发操作手册+(八)SMARTFORMS打印_sap smartforms-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值