在SAP SMARTFORMS(智能表单) 设计过程中,我们可能会遇到这种需求:有没有办法能够动态调整我的窗口位置?本文笔者将带领大家一起来学习一下如何在SMARTFORMS中通过增加ABAP代码来实现这个功能。
SMARTFORMS
在激活时会生成一个对应的FUNCTION MODULE
,通过DEBUG
进入FUNCTION MODULE
,可以发现:SMARTFORMS中定义的窗口信息
、TEMPLATE
等都是存放在特定的内表中的,如下图所示:
内表 | 作用 |
---|---|
%HEADER | 存放smartforms属性信息 |
%REFTAB | 存放的信息还不太清楚 |
%DOCSTRUC | 存放窗口的详细信息 |
%TABDEFS | 存放template控件和tables控件相关的信息 |
我们可以通过改变%DOCSTRUC
中的数据来改变窗口的位置信息、背景颜色等
PS: 可以看到TDWINDOW字段就是对应了当前行所控制的窗口名称,在后面的ABAP代码中,我们将使用TDWINDOW字段作为WHERE子句中的限制条件
在上面的分析中,我们已经明白了动态调整窗口位置的实现原理,那么下一步要进行的操作就是编写ABAP
代码来进行控制了,这一步的关键问题在于我们的代码要放在什么位置才能在SMARTFORMS
打印前完成对%DOCSTRUC
内表的更新操作。
通过观察分析:发现了SMARTFORMS
打印数据流的FUNCTION MODULE
在如下图所示位置:
确定了数据流打印的位置后,那么下一步便是确定在什么位置添加ABAP代码
,我们知道在SMARTFORMS
中有三处
地方可以进行代码的编写,它们分别是全局定义中初始化
页签和格式化程序
页签以及程序行
控件
代码位置 | 作用 |
---|---|
初始化页签 | 用于数据全局初始化,在打印输出前进行调用 |
格式化程序页签 | 用于子例程FORM的编写,可在程序行控件以及初始化中被调用 |
程序行控件 | 用于一般ABAP代码的编写,在打印输出时进行调用 |
PS: 从表格中我们可以知道,要想实现在
SMARTFORMS
打印前完成对%DOCSTRUC
内表的更新操作,需要在打印输出前进行调用,因此只能在初始化页签中进行ABAP代码编写
首先我们在初始化页签中输入断点BREAK-POINT
,打印预览执行DEBUG
跳转到断点位置,观察下图我们可以发现初始化中的ABAP代码是存储在一个名为%GLOBAL_INIT
的子例程中。
观察下图可以发现:PERFORM %GLOBAL_INIT
语句在打印数据流的FUNCTION MODULE
之前,那么我们对于%DOCSTRUC
内表的更新操作便可以写在初始化页签中。
FIELD-SYMBOLS:<lt_docstruc> TYPE tsfdocstrc.
DATA:ls_docstruc TYPE ssfdocstrc.
ASSIGN ('%DOCSTRUC') TO <lt_docstruc>.
IF sy-subrc = 0.
LOOP AT <lt_docstruc> INTO ls_docstruc WHERE tdwindow = 'MAIN'.
IF piv_wtop IS NOT INITIAL.
ls_docstruc-wtop = piv_wtop.
"PIV_WTOP 是定义的全局变量
MODIFY <lt_docstruc> FROM ls_docstruc TRANSPORTING wtop.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
在这里我们定义了一个表格接口PIV_WTOP
用于控制打印预览时主窗口的上边距,并且还在主窗口下创建了一个模板,模板的上边距与主窗口一致并且边框设置为了实线,以便于观察,如下图所示:
PS: 关于窗口各个边距的详细字段信息,可以进入
%DOCSTRUC
内表中进行查看
本文花费大量时间介绍了如何动态调整SMARTFORMS窗口位置
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!