目录
引言
在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的案例,那个比较完善,但是感觉很稚嫩,可以两篇文章一起阅读一下,(大补)相辅相成哈哈哈哈哈
3090

被折叠的 条评论
为什么被折叠?



