发现
Smart Form
在
ECC6
中和
4.6C
相比改变了不少,最近重新研究了一下。
help.sap.com
上的文档基本上是针对新特性的,不过例子却还是旧的。做个笔记省的以后找不到最新的
example
。
最大的改变在
Table
上,现在
table
的
header
和
footer
比以前好做了。
还是用
IDES
自带的
SFLIGHT
表做例子,先看一下打印出来的效果:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/f7f48e9f8af64634845bb0be5c2fddd7.png)
Smart Form
相对
SAP Script
来说,系统给封装了很多功能,这样用户在
Form
中的代码写的少了一些,更容易维护,如果把
SAP Script
比作汇编语言的话,
Smart Form
可以算上
C++
了,不过个人感觉对于复杂表单的设计来说,用
SAP Script
更容易实现。在
Smart Form
中调整表格边线比较费劲。
1. Create a Form named 'ZBSUNTEST'
用 TCode: SMARTFORMS 创建一个空白的 Form 。双击左边树状结构中的 'Global Setting'->'Form Attributes' 。在
里头可以看到纸张的设置,默认是
A4
。这里还可以调正一页中可以打印多少行。
用 TCode: SMARTFORMS 创建一个空白的 Form 。双击左边树状结构中的 'Global Setting'->'Form Attributes' 。在
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/2e43515366074ecf8b949ac1bd37257d.png)
2. Form Interface
我们生成一个 Form 的同时,系统也创建了一个相应的 function module 。 Form 与 Application 的数据交换就是通过 function 的 interface 来实现的。双击左边树状结构中的 'Global Setting'->'Form Interface' ,我们可以看到
,这和我们在
SE37
中看到的
function module
的接口是一样的。点击
'Table'
这个
tab
,输入如下:
我们生成一个 Form 的同时,系统也创建了一个相应的 function module 。 Form 与 Application 的数据交换就是通过 function 的 interface 来实现的。双击左边树状结构中的 'Global Setting'->'Form Interface' ,我们可以看到
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/806a15dac74a44e4bb0d31ded85dbbb2.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/7328e0e21cc54e578a06ce399239c37c.png)
3. Global Definition
这里定义的是在 form 中共用的全局变量,还可以定义 subroutine 。
是
form
初始化的时候调用的一个
routine
,可以在这里做一些
data
初始化的工作。
用来设置货币或者数量的单位关联用的。
下面是 'Global Data' 里头的定义:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/fb5024d4b06147e9b687348d7b6f0925.png)
上图中的 T_SUM 类型是我在 'Types' 里头定义的,其中 PRICE, CURRENCY 是用来做 sum 用的:
这里定义的是在 form 中共用的全局变量,还可以定义 subroutine 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/805b8d138efe4c25b05f88996ff45117.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/cd03656810e1450a896ef8f3f3e5a0d7.png)
下面是 'Global Data' 里头的定义:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/fb5024d4b06147e9b687348d7b6f0925.png)
上图中的 T_SUM 类型是我在 'Types' 里头定义的,其中 PRICE, CURRENCY 是用来做 sum 用的:
TYPES:
BEGIN OF T_SUM,
PRICE TYPE S_PRICE,
CURRENCY TYPE S_CURRCODE,
END OF T_SUM.
BEGIN OF T_SUM,
PRICE TYPE S_PRICE,
CURRENCY TYPE S_CURRCODE,
END OF T_SUM.
下面是
Currecy & Quantity
的单位关联设置。这样关联之后
Price
会按照
Currency
的不同,输出格式也不同:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/3357145532124ab1ae9dfdc43b0860b2.png)
4. Create a Style named 'Z_BSUN_TITEL01'
回过头我们要创建一个给这个 Form 使用的 Style 。还是用 SMARTFORMS 这个 TCode 来创建。在这个 Styel 里头我只创建了 'Paragrah Format' ,真正的项目中 'Character Format' 肯定也是不可缺少的。这个 Style 使用在 Step 1 中创建的 Form 所有的 Output Option 中。
回过头我们要创建一个给这个 Form 使用的 Style 。还是用 SMARTFORMS 这个 TCode 来创建。在这个 Styel 里头我只创建了 'Paragrah Format' ,真正的项目中 'Character Format' 肯定也是不可缺少的。这个 Style 使用在 Step 1 中创建的 Form 所有的 Output Option 中。
M1: Aligned:left;Indent->left margin:0.20 CM;font family: Arial;font size: 12pt
M2: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 11pt
M3: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 12pt;font color:blue
T1: Aligned:center;font family: Arial;font size: 14pt;font style: Bold Italic
M2: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 11pt
M3: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 12pt;font color:blue
T1: Aligned:center;font family: Arial;font size: 14pt;font style: Bold Italic
5.Creat a Page named 'FIRSTPG'
在
下创建一个名为
'FIRSTPG'
的
page
,并把它的
next page
设置为其本身。
Page Format
设置为
'Portrait Format'
。
在
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/fb43aa44d0fe4013b468f41d37b498be.png)
6.Create Windows under 'FIRSTPG'
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/2a70c974cdd74eacb8ff0c864439f4b4.png)
Windows 的 Position and Size 如下 ( 单位都是 CM) :
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/2a70c974cdd74eacb8ff0c864439f4b4.png)
Windows 的 Position and Size 如下 ( 单位都是 CM) :
HEADER: L2.60, U0.20, W14.70, H2.00
MAIN: L2.00, U2.00, W16.00, H25.00
FOOTER: L2.60, U27.20, W14.70, H2.00
MAIN: L2.00, U2.00, W16.00, H25.00
FOOTER: L2.60, U27.20, W14.70, H2.00
7. Create Header's Text
在 'HEADER' Window node 下面创建一个 Text ,取名 'TITLE' 。 Text type 设置成 'Text Element' 。再 PC Editor 中点
输入
。
T1
就是在
Step 3
里头定义的
Paragraph Format
。
在 'HEADER' Window node 下面创建一个 Text ,取名 'TITLE' 。 Text type 设置成 'Text Element' 。再 PC Editor 中点
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/413c02e7b76847d5973eb3a8f7053c7e.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/cd033a3ea6ed4e7d914d892911c09bf5.png)
8. Create a table in 'MAIN' Window
在 'MAIN' Window node 下面创建一个 Table ,
. Table
下面自带了三个
node: header, main area, footer
,颜色跟别的由用户创建的
node
有区别。其中
Table
的
header node
下面我们可以放表头。
Table
的
footer node
跟我们在
Step 6
创建的
FOOTER Window
有区别。
FOOTER Window
的位置是固定的,
Table
的
footer
是
Table
的
line
在哪里结束,它就紧跟在后面。
文章开头的打印结果中我们可以很直观的看到这两个的区别:
FOOTER Window
在每页的最下面(打印了两次,尽管内容不一样),
Table footer
在第二页中间只打印了一次。当然我们说的都是默认的情况。
在 'MAIN' Window node 下面创建一个 Table ,
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/08381382b3aa4a0189ea9281dc7617dc.png)
9. Insert program line 'CODE_CLEAR' before 'MAIN' Window
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/cd86a4ac6e444429bea76d84b507c8e1.png)
Input Parameters: G_TAB_DATA;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL, G_ITEMS_ONPAGE;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL, G_ITEMS_ONPAGE;
REFRESH: G_TAB_TOTAL, G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL, G_REC_SUBTOTAL, G_ITEMS, G_ITEMS_ONPAGE.
DESCRIBE TABLE G_TAB_DATA LINES G_ITEMS. "Get total item number
CLEAR: G_REC_TOTAL, G_REC_SUBTOTAL, G_ITEMS, G_ITEMS_ONPAGE.
DESCRIBE TABLE G_TAB_DATA LINES G_ITEMS. "Get total item number
Programe Line
中使用到的全局变量必须在
Input/Output
中定义,否则
check
不通过。
10. Create some line types in Table 'FLIGHTINFO'
Line Type 是控制表格格式的,每一个 Table Line 都要指定一个 Line Type
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/e3ccce64120e4237a1829d024096ffe7.png)
Layout 如下图,注意这些 Line 的 border 是框了线的
Line Type 是控制表格格式的,每一个 Table Line 都要指定一个 Line Type
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/e3ccce64120e4237a1829d024096ffe7.png)
Layout 如下图,注意这些 Line 的 border 是框了线的
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/888e0259d6594d9c9be6ccb6600e750e.png)
11. 'DATA' of Table 'FLIGHTINFO'
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/6d32fa2e9075419eb6d5effe620cb740.png)
G_TAB_DATA 是 Step 2 在 Form Interface 定义的一个内部表,也就是从 Application 传过来准备给 Form 显示的数据。我们还想让显示的数据排一下序,当然这可以在外部程序中 SORT ,不过这里的排序还有触发 event 的作用,后面会讲到。如果内部表已经排好序了,只是想触发类似 LOOP 的 AT NEW/AT END OF 这样的功能,那么把
这个勾上就好。下面是
SORT
的设置,我们对
CARRID(Airline),CONNID(Flight No.)
排序,并且要触发两个
events
,用来做
subtotal
统计。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/6d32fa2e9075419eb6d5effe620cb740.png)
G_TAB_DATA 是 Step 2 在 Form Interface 定义的一个内部表,也就是从 Application 传过来准备给 Form 显示的数据。我们还想让显示的数据排一下序,当然这可以在外部程序中 SORT ,不过这里的排序还有触发 event 的作用,后面会讲到。如果内部表已经排好序了,只是想触发类似 LOOP 的 AT NEW/AT END OF 这样的功能,那么把
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/1ac892b2517c424e93c04157f174c21c.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/dee1b35a12a540bcb94d22cec4838c43.png)
12. 'Calculation' of Table 'FLIGHTINFO'
是用来对
Table
的
Fields
做简单计算的,包括
'Number', 'Total', 'Mean Value'
。如果不是涉及到货币或者数量的统计我们可以用
'Total'
这个
Operation
,具体使用可以参考
help
。我这里用了
'Number'
做一个每页的
Items
统计,
'Number'
也可以用来做行号。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/15febe2bd5b44e959c0abb8d73c8fc80.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/8a496658c530475596c1df388bcb0d93.png)
13. Insert a title in table header
在 Table 'FLIGHTINFO' 的 header node 下增加 table line : HEADER_LINE 。 LINE TYPE 选 'Line1' 。 tablbe line 自动带出 5 个 cell , cell 的数目是根据 LINE TYPE :'Line1' 来的, Step 10 里头可以看到 Line1 是有 5 个 cell 的。我们在每一个 cell 下面添加一个 Text ,作为 colum title ,把 paragraph format 设置成 M1 。不过 'Price' 这个 Column 因为是数字, paragraph format 设置成 M3
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/a5afa775e63644d989c56ab61e4a78ef.png)
P.S.Table 自带的 header 的 Output Option->Print Time 有两个选项
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/8513f53803e3401abb8732025725c4a1.png)
at start of Table 就不说了,不过 at Page Break 工作不正常,第 2 页并没有打印出来 title ,也不知道是不是我写的问题。
在 Table 'FLIGHTINFO' 的 header node 下增加 table line : HEADER_LINE 。 LINE TYPE 选 'Line1' 。 tablbe line 自动带出 5 个 cell , cell 的数目是根据 LINE TYPE :'Line1' 来的, Step 10 里头可以看到 Line1 是有 5 个 cell 的。我们在每一个 cell 下面添加一个 Text ,作为 colum title ,把 paragraph format 设置成 M1 。不过 'Price' 这个 Column 因为是数字, paragraph format 设置成 M3
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/a5afa775e63644d989c56ab61e4a78ef.png)
P.S.Table 自带的 header 的 Output Option->Print Time 有两个选项
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/8513f53803e3401abb8732025725c4a1.png)
at start of Table 就不说了,不过 at Page Break 工作不正常,第 2 页并没有打印出来 title ,也不知道是不是我写的问题。
14. Insert table line into table main area
Main Area 是显示 Application 传进来的内部表的地方,和 Step 13 一样增加一个 Line Type=LINE1 的 Table Line ,每个 Cell 下各增加一个 Text ,属性设置成 'Text Element' 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/2f133c00f9d24cb9a9dffe37fd05b53a.png)
点 PC Editor 的
,编辑
Text
内容,以
CARRID
为例:
Main Area 是显示 Application 传进来的内部表的地方,和 Step 13 一样增加一个 Line Type=LINE1 的 Table Line ,每个 Cell 下各增加一个 Text ,属性设置成 'Text Element' 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/2f133c00f9d24cb9a9dffe37fd05b53a.png)
点 PC Editor 的
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/96caa0872ba64bcf9443869e2d6a770b.png)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/5f30d7bafccd48c7bacba9083335beb5.png)
15. Insert a Program Line Under 'DATA_LINES'
CURRENCY_DATA 下的 Programe Line: SUM ,是为了做合计用的,按照 Currecy 的不同将 Price 合计。(当然单价 Price 的合计没什么实际意义,权当是演示)
CURRENCY_DATA 下的 Programe Line: SUM ,是为了做合计用的,按照 Currecy 的不同将 Price 合计。(当然单价 Price 的合计没什么实际意义,权当是演示)
Input Parameters: G_REC_DATA, G_TAB_SUBTOTAL;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL;
G_REC_TOTAL-PRICE = G_REC_DATA-PRICE.
G_REC_TOTAL-CURRENCY = G_REC_DATA-CURRENCY.
COLLECT G_REC_TOTAL INTO G_TAB_TOTAL.
COLLECT G_REC_TOTAL INTO G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL.
G_REC_TOTAL-CURRENCY = G_REC_DATA-CURRENCY.
COLLECT G_REC_TOTAL INTO G_TAB_TOTAL.
COLLECT G_REC_TOTAL INTO G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL.
内部表
'G_TAB_TOTAL','G_TAB_SUBTOTAL'
保存的是合计和根据
'Airline'
进行小计的数据。
16. Print 'Grand Total' in table footer
在 table 的 footer node 下增加一个 loop node ,
。
Loop 的 DATA 如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/039e97300e8c480bb0a06687b82ce97a.png)
因为我只想在所有的记录打印结束之后显示总计,所以给这个 loop 增加一个 condition 。在 Condition Tab 里的 Output Condition 中增加一行:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/448cda575faf44b686049014121cd012.png)
G_ITEMS_ONPAGE 在 Step 12 中被赋值 Number, G_ITEM 在 Step 9 被赋值内部表中的记录数,当这两个值相等的时候也就是记录输出完毕的时候。再给 loop node 下一级增加一行 table line , LINE TYPE : LINE3
在 table 的 footer node 下增加一个 loop node ,
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/ba76b797fd67460a9a6800b0b436bdec.png)
Loop 的 DATA 如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/039e97300e8c480bb0a06687b82ce97a.png)
因为我只想在所有的记录打印结束之后显示总计,所以给这个 loop 增加一个 condition 。在 Condition Tab 里的 Output Condition 中增加一行:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/448cda575faf44b686049014121cd012.png)
G_ITEMS_ONPAGE 在 Step 12 中被赋值 Number, G_ITEM 在 Step 9 被赋值内部表中的记录数,当这两个值相等的时候也就是记录输出完毕的时候。再给 loop node 下一级增加一行 table line , LINE TYPE : LINE3
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/128788a513e14ab28243f046bfadbd82.png)
GRANDTOTAL: M2 -> 'Grand total:'
PRICESUM_TAB: M2 -> &G_REC_TOTAL-PRICE&
CURR_TAB: M2->&G_REC_TOTAL-CURRENCY&
PRICESUM_TAB: M2 -> &G_REC_TOTAL-PRICE&
CURR_TAB: M2->&G_REC_TOTAL-CURRENCY&
17. Print subtotal in table (1)
我们在 Step 10 里头的 Sort 中勾选了 CARRID 字段的两个事件之后就能够发现 table node 自动增加了两个节点:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/a76c0e495e464aef9a9592698ac62a56.png)
首先在 'CARRID Event on Sort Begin' 下一级增加一个 Program Line:SUB_CLEAR ,用来在 CARRID 改变的时候清空 subtotal 内部表。
我们在 Step 10 里头的 Sort 中勾选了 CARRID 字段的两个事件之后就能够发现 table node 自动增加了两个节点:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/a76c0e495e464aef9a9592698ac62a56.png)
首先在 'CARRID Event on Sort Begin' 下一级增加一个 Program Line:SUB_CLEAR ,用来在 CARRID 改变的时候清空 subtotal 内部表。
Output Parameters: G_REC_SUBTOTAL;
CLEAR: G_REC_SUBTOTAL.
REFRESH: G_TAB_SUBTOTAL.
REFRESH: G_TAB_SUBTOTAL.
然后在
'CARRID Event on Sort End'
下一级增加一个
Program Line:CLEAR_SUBTITLE
,用来清空一个打印标志。
Output Parameters: G_FLG_SUBTITLE;
CLEAR: G_FLG_SUBTITLE.
每一个
CARRID(Airline)
下面可能会有多种不同的货币价格,这个标志的作用是为了限制下面的
'Subtotal of &G_REC_SUBTOTAL-CARRID& is'
这句话在小计的时候不至于
print
出来很多遍。
18. Print subtotal in table (2)
在 'CARRID Event on Sort End' 下一级增加一个 Loop:PRINTSUBTOTAL:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/d8bc1ec0b14b474bba3759df4302eaf4.png)
Loop:PRINTSUBTOTAL: 下一级增加一个 table line:SUBTOTAL , LINE TYPE : LINE3
在 'CARRID Event on Sort End' 下一级增加一个 Loop:PRINTSUBTOTAL:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/d8bc1ec0b14b474bba3759df4302eaf4.png)
Loop:PRINTSUBTOTAL: 下一级增加一个 table line:SUBTOTAL , LINE TYPE : LINE3
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/4599b131e3ed427f8bb89a0e9bb7041c.png)
AIRLINE_NAME: M2 -> 'Subtotal of&G_REC_DATA-CARRID& is'
SUB_PRICE: M2 -> &G_REC_SUBTOTAL-PRICE&
SUB_CURR: M2->&G_REC_SUBTOTAL-CURRENCY&
SUB_PRICE: M2 -> &G_REC_SUBTOTAL-PRICE&
SUB_CURR: M2->&G_REC_SUBTOTAL-CURRENCY&
其中
AIRLINE_NAME
是有显示条件的:
G_FLG_SUBTITLE
没有赋值的时候才显示。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/9b63647cef244135b303b76904951ceb.png)
AIRLINE_NAME print 出来之后我们在 Program Line 'SET_SUBTITLE' 中将 G_FLG_SUBTITLE 设置为 'X' 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/9b63647cef244135b303b76904951ceb.png)
AIRLINE_NAME print 出来之后我们在 Program Line 'SET_SUBTITLE' 中将 G_FLG_SUBTITLE 设置为 'X' 。
Output Parameters: G_FLG_SUBTITLE;
G_FLG_SUBTITLE = 'X'.
19. Print 'Grand Total' in page footer
在 FOOTER Window 的下一级添加一个 Table Line: FTTABLE, Line Type:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/225911ca627e461087b2fba495c0da9d.png)
DATA:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/ae399dafc75b4a16ae762513f878948b.png)
然后,在 FTTABLE 的 Main Area 下增加一行 Table Line: PRICESUM, Line Type: LINE1
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/6e375f1678f340308cc6a7abba61cc03.png)
为了控制在最后一页的页脚打印出来金额合计,要给 PRICESUM 增加一个条件。在 Conditions Tab 里头的
And Additional Event 中勾选 'Only after end of main window' 。 'SUM' 和 'CURR' 这两个 Text 的设置如下:
在 FOOTER Window 的下一级添加一个 Table Line: FTTABLE, Line Type:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/225911ca627e461087b2fba495c0da9d.png)
DATA:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/ae399dafc75b4a16ae762513f878948b.png)
然后,在 FTTABLE 的 Main Area 下增加一行 Table Line: PRICESUM, Line Type: LINE1
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/6e375f1678f340308cc6a7abba61cc03.png)
为了控制在最后一页的页脚打印出来金额合计,要给 PRICESUM 增加一个条件。在 Conditions Tab 里头的
And Additional Event 中勾选 'Only after end of main window' 。 'SUM' 和 'CURR' 这两个 Text 的设置如下:
SUM: M2 -> &G_REC_TOTAL-PRICE&
CURR: M2->&G_REC_TOTAL-CURRENCY&
CURR: M2->&G_REC_TOTAL-CURRENCY&
最后,在
FTTABLE
的
Footer
下增加一行
Table Line: FOOTER, Line Type: LINE1
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/7f1452d21923436e9fca01d8a539ad2d.png)
ITEMS: M2 -> ITEMS IN THIS PAGE:&G_ITEMS_ONPAGE(3)&
PAGE: M2->PAGE:&SFSY-PAGE&
![](https://p-blog.csdn.net/images/p_blog_csdn_net/CompassButton/7f1452d21923436e9fca01d8a539ad2d.png)
ITEMS: M2 -> ITEMS IN THIS PAGE:&G_ITEMS_ONPAGE(3)&
PAGE: M2->PAGE:&SFSY-PAGE&
20. Calling a Smart Form from Application
生成 smart form 的同时系统会自动创建一个对应的 funtion module ,这个 function 的名字可以通过菜单 Enviroment->Function Module Name 得到。在程序中一般通过 function 'SSF_FUNCTION_MODULE_NAME' 来得到。下面是我们的测试这个 smart form 的代码:
生成 smart form 的同时系统会自动创建一个对应的 funtion module ,这个 function 的名字可以通过菜单 Enviroment->Function Module Name 得到。在程序中一般通过 function 'SSF_FUNCTION_MODULE_NAME' 来得到。下面是我们的测试这个 smart form 的代码:
*&---------------------------------------------------------------------*
*& Report Z_SUN_SFORM
*&
*&---------------------------------------------------------------------*
*& Report Z_SUN_SFORM
*&
*&---------------------------------------------------------------------*
REPORT Z_SUN_SFORM NO STANDARD PAGE HEADING LINE-SIZE 150 MESSAGE-ID ZBSUN.
************************************************************************
* D E C L A R A T I O N O F I N T E R N A L T A B L E S
************************************************************************
DATA:
G_TAB_OUTPUT TYPE STANDARD TABLE OF SFLIGHT.
************************************************************************
* D E C L A R A T I O N O F I N T E R N A L T A B L E S
************************************************************************
DATA:
G_TAB_OUTPUT TYPE STANDARD TABLE OF SFLIGHT.
************************************************************************
* D E C L A R A T I O N O F V A R I A B L E S
************************************************************************
DATA:
G_REC_OUTPUT TYPE SFLIGHT,
G_REC_OPTIONS LIKE ITCPO,
G_REC_RESULT TYPE ITCPP.
************************************************************************
* D E C L A R A T I O N O F C O N S T A N T S
************************************************************************
CONSTANTS:
G_CON_FLG_ON TYPE C VALUE 'X',
G_CON_FORMNAME(8) TYPE C VALUE 'ZBSUN_01'.
* D E C L A R A T I O N O F V A R I A B L E S
************************************************************************
DATA:
G_REC_OUTPUT TYPE SFLIGHT,
G_REC_OPTIONS LIKE ITCPO,
G_REC_RESULT TYPE ITCPP.
************************************************************************
* D E C L A R A T I O N O F C O N S T A N T S
************************************************************************
CONSTANTS:
G_CON_FLG_ON TYPE C VALUE 'X',
G_CON_FORMNAME(8) TYPE C VALUE 'ZBSUN_01'.
************************************************************************
* S E L E C T I O N S C R E E N
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME.
SELECT-OPTIONS S_LINE FOR G_REC_OUTPUT-CARRID NO INTERVALS.
SELECT-OPTIONS S_DATE FOR G_REC_OUTPUT-FLDATE.
SELECTION-SCREEN END OF BLOCK BLOCK1.
* S E L E C T I O N S C R E E N
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME.
SELECT-OPTIONS S_LINE FOR G_REC_OUTPUT-CARRID NO INTERVALS.
SELECT-OPTIONS S_DATE FOR G_REC_OUTPUT-FLDATE.
SELECTION-SCREEN END OF BLOCK BLOCK1.
************************************************************************
* S T A R T - O F - S E L E C T I O N
************************************************************************
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
* S T A R T - O F - S E L E C T I O N
************************************************************************
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
************************************************************************
* E N D - O F - S E L E C T I O N
************************************************************************
END-OF-SELECTION.
PERFORM FRM_OUTPUT.
* E N D - O F - S E L E C T I O N
************************************************************************
END-OF-SELECTION.
PERFORM FRM_OUTPUT.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* GET FLIGHT DATA
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT *
INTO TABLE G_TAB_OUTPUT
FROM SFLIGHT
WHERE CARRID IN S_LINE
AND FLDATE IN S_DATE.
IF SY-SUBRC <> 0.
MESSAGE E000.
* No data selected.
ENDIF.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
* OUTPUT DATA
*----------------------------------------------------------------------*
FORM FRM_OUTPUT.
DATA: FM_NAME TYPE RS38L_FNAM.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = 'ZBSUNTEST'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
FM_NAME = FM_NAME
* EXCEPTIONS
* NO_FORM = 1
* NO_FUNCTION_MODULE = 2
* OTHERS = 3
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* GET FLIGHT DATA
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT *
INTO TABLE G_TAB_OUTPUT
FROM SFLIGHT
WHERE CARRID IN S_LINE
AND FLDATE IN S_DATE.
IF SY-SUBRC <> 0.
MESSAGE E000.
* No data selected.
ENDIF.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
* OUTPUT DATA
*----------------------------------------------------------------------*
FORM FRM_OUTPUT.
DATA: FM_NAME TYPE RS38L_FNAM.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = 'ZBSUNTEST'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
FM_NAME = FM_NAME
* EXCEPTIONS
* NO_FORM = 1
* NO_FUNCTION_MODULE = 2
* OTHERS = 3
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL FUNCTION fm_name
* EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_PARAMETERS =
* CONTROL_PARAMETERS =
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
* OUTPUT_OPTIONS =
* USER_SETTINGS = 'X'
* IMPORTING
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* JOB_OUTPUT_OPTIONS =
TABLES
G_TAB_DATA = G_TAB_OUTPUT
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
* EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_PARAMETERS =
* CONTROL_PARAMETERS =
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
* OUTPUT_OPTIONS =
* USER_SETTINGS = 'X'
* IMPORTING
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* JOB_OUTPUT_OPTIONS =
TABLES
G_TAB_DATA = G_TAB_OUTPUT
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* <error handling>
ENDIF.
* <error handling>
ENDIF.
ENDFORM. " FRM_OUTPUT
到这里这个
Tutorial
就结束了,我们没有用到的
node
还有
Command, Alternative,Graphic,Complex Section
等。其中
Command
主要用来插入分页或者打印控制语句的;
Alternative
用来插入一个逻辑分支;
Graphic
插入图片的;
Complex Section
我自己没用过,看帮助文件说
SAP
不推荐使用。
在
real project
中的
form
不会有这么简单,但是也不会脱离这些
elements
的组合。