Text Module:文本模块, 主要用于设置一段固定的文本信息,如报表头名称,或者是报表附加条款说明等信息,可以在form中直接引用。
如上面定义好的文本模块在下面form文本设置中可引用(文本类型=M文本模块):
节点元素 FORM中元素的输出顺序由Pages and Windows中的后继节点结构和顺序来决定,导航树中的第一个页节点是FORM处理的起始页,该节点在FORM创建过程中被自动创建。 节点类型决定了节点可能的处理过程,如打印节点内容(文本、地址、图片等)、执行节点中的语句或根据规则执行当前节点的后继循环节点。 导航树中的所有节点,按照从上到下的顺序依次进行处理(包括“Pages and Windows”节点之间) 除开“Pages and Windows”外,其它所有节点都是可以加上执行条件属性设置的,也就是说,只要满足设置条件时,该节点及子节点才被处理 Page节点 每一个Form至少包含一个页(Page)节点 Page节点为“Pages and Windows”的子节点,如果某个Page内容超出一页,则会将其他内容输出到Pages节点的Next Page属性所指定页面,即多出一页的内容会产生分页,一般Next Page分页默认为自己,因为一般报表的主体内容会使用分页,并且这些分页排版相同,所以此种Page的Next Page不会设置成其他Page。如果报表需要有封面与封底,则需要另外添加Page这样的节点元素 注:要注意的是,这里的Page不是一页的概念,它是指定页面的一种统称,具体输出内容由它下面子节点元素来决定,且输出内容可能会产生多页
每Page页面除了通过Next Page静态属性来设置下一页外,还可以在通过Command节点的Go to New Page属性来设置,当然,这种页面跳转是有条件的,所以Command一般放在Condition条件节点里使用:
*该SMARTFORMS使用了强制分布技术,这样确保了每页只显示有固定的行数,但单纯的使用强制分布只是解决了“接下页(%TEXT12、)”正确显示的问题,这样就可以在SMARTFORMS里对每小类(每条GT_HEAD)正确的进行小计,但强制分布同时会带来两个问题:一是强制分页会在在最末页多出一个空白页(经后其研究发现,最末多出空白页,是由于原本在最后一页数据输出后,没有对分页命令进行控制,所以在最末而数据输入后,再执行了一次分页命令,而不是由于本身使用了强制分页这项技术导致的这个问题);第二个问题是使用强制分页后Head与Item不同步(错行读取问题)(经后其研究发现,该问题也不是由于本身使用了强制分页引起的,根本的原因是由于表节点循环问题引起的,具体请参考这里)。针对多出最后一个空白页使用了有条件(在最后一条GT_HEAD数据读取后不再执行分页命令AGE_COMMAND,加上分页条件:HEAD_INDEX <= HEAD_COUNTS,HEAD_COUNTS为*GT_HEAD总条数)的强制分页解决了该问题;针对头Head与Iteam错行读取问题使用了程序手动控制头的读取操作,而不是使用原有系统自动遍历方式。
"分类小计
total_amount = total_amount + gw_item-amount.
*是否最后一行标示
"如果不在%LOOP1里强制分页,则会有错行问题:即在读取到每一小分类最后一行(带 X 的行)时,系统还是读取下一行(也就是下一个小分类数据的第一行),但又不显示在页面上,这会造成每一个小分类数据小计不准确(所以如果需要在SMARTFORMS里进行小计,则一定要实现强制分页),既然要错行读取,所以先将gt_item-islastrow标示存储到全局变量lastrow中,供PAGE_COMMAND命令使用,这样不管是否错行读取,最后一行标示都会被正确使用if gw_item-islastrow = 'X'.
* lastrow = gw_item-islastrow .
endif.
"当使用强制分页时,可以不用像上面那样判断 就可以给 lastrow 赋值,如果不使用
"强制分页,则需要像上面那样赋值
lastrow = gw_item-islastrow .
if lastrow = 'X' .
"下一页所需读取的gt_head数据的索引号
head_index = head_index + 1.
endif. "每页数据的流水号
serial_number = serial_number + 1.
DATA mod TYPE i.
mod = serial_number mod 5.
if mod = 0 ."如果满一页时
"当前页码加一
current_page = current_page + 1.
DISP_AUTO_PAGING_TXT = 'X'.
endif.
SmartForm源码: 在中文环境下导入
主调程序:
REPORT yjzj_smartform_control_paging.
DATA: BEGIN OF gt_head OCCURS 10,
class TYPE string,"班级名
totalpages TYPE i,"每个小分类的总页数
END OF gt_head.
DATA: BEGIN OF gt_item OCCURS 10,
class TYPE string,"班级名
student TYPE string,"学生名
amount TYPE i,"XX数量
islastrow,"标示是否为每一小分类的最后一行
END OF gt_item.
DATA: g_rows TYPE i,"记录已读取的行数
g_spacelines TYPE i,"不满一页时需要补充的空行行数
g_tabix LIKE sy-tabix,
flg .
START-OF-SELECTION.
PERFORM initdata.
LOOP AT gt_head.
CLEAR: g_rows,flg.
LOOP AT gt_item WHERE class = gt_head-class.
flg = 'x'.
g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
g_rows = g_rows + 1. "条数加1
IF g_rows = 5."满一页后计数双从零开始
"满一页数总页数加一
gt_head-totalpages = gt_head-totalpages + 1.
CLEAR: g_rows.
ENDIF.
ENDLOOP.
IF g_rows <> 0 OR flg IS INITIAL."如果不满一页,或者无数据时
CLEAR: gt_item.
gt_item-class = gt_head-class.
g_spacelines = 5 - g_rows."需要补的空白行数
DO g_spacelines TIMES.
APPEND gt_item.
"SY-TABIX为上面APPEND语句操作后所影响的索引号
g_tabix = sy-tabix."记录最后一行的索引号,后面可能会需要修改这条数据
ENDDO.
"满一页数总页数加一
gt_head-totalpages = gt_head-totalpages + 1.
ENDIF.
gt_item-islastrow = 'X'."最后一行标示
MODIFY gt_item INDEX g_tabix TRANSPORTING islastrow.
MODIFY gt_head TRANSPORTING totalpages .
ENDLOOP.
PERFORM callsmartform.
FORM initdata.
DATA: times TYPE i,
classname TYPE string,
number TYPE i VALUE 1,
str TYPE string.
DO 5 TIMES.
str = sy-index.
CONDENSE str.
times = 4 + sy-index.
CONCATENATE str `班` INTO gt_head-class RESPECTING BLANKS.
APPEND gt_head.
DO times TIMES.
gt_item-class = gt_head-class.
str = number.
CONCATENATE gt_head-class ` - 学生` str INTO gt_item-student.
number = number + 1.
gt_item-amount = sy-index.
APPEND gt_item.
ENDDO.
ENDDO.
gt_head-class = '6 班'.
APPEND gt_head.
ENDFORM. "initData
FORM callsmartform .
DATA: lf_fm_name TYPE rs38l_fnam.
"***********调用SMARTFORM程序生成函数
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'YJZJ_SMARTFORM_CONTROL_PAGING'
IMPORTING
fm_name = lf_fm_name.
"***********动态调用新生成的函数
CALL FUNCTION lf_fm_name.
ENDFORM.
Syntax 说明 &field+<offset>& 对于字符变量设置从何位置显示数据,如果offset大于字符变量长度时,系统就不会显示任何数据 &field(<length>)& 设置输出长度. &field(*)& 如果该字段类型是abap数据字典里定义的类型,系统将按照字典定义的长度设置输出长度 &field(S)& 禁止输出符号位 &field(<)& 符号位显示在数据的左边 &field(.<nat.number>)& 设置显示小数的位数 &field(E<nat.number>)& 设置为科学标示法 &field(T)& 禁止千分位的显示(适用于: DEC, CURR, INT和QUAN几种数据类型). &field(Z)& 禁止数字前导0的显示 &field(I)& 禁止显示空值 &field(K)& 禁止类型系统按数据字典定义的转换函数进行输出转换 &field(R)& 右对齐(只有在定义了输出长度时才有效) &field(F<filler>)& 用<filler>指定的字符替换左边的空格. &field(L)& 将日期转换为本地显示格式,使用JDAT指定的格式 &field(C)& 该设置效果和ABAP的CONDENSE语句相同. /: SET COUNTRY country_key 设置按某个国家显示小数点,千位符和日期的格式 (注:这个包括下面两个SET命令只能在ScriptForm使用) /: SET DATE MASK = 'date_mask' 设置日期显示格式 DD 天 (two digits) DDD天名称(缩写) DDDD 天名称 (全称) MM 月 (two digits) MMM 日期名称 (缩写) MMMM 日期名称 (全称) YY 年(two digits) YYYY 年 (four digits) LD 天 (formatted as for the L option) LM 月 (formatted as for the L option) LY 年 (formatted as for the L option) 示例 /: SET DATE MASK = 'Foster City, MM.DD.YY' &DATE& -> Foster City, 03.01.97 &DATE(Z)& -> Foster City, 3.1.97 /: SET DATE MASK = 'MMMM DD, YYYY' &DATE& -> March 01, 1997 取消设置 /: SET DATE MASK = ‘’ /: SET TIME MASK = 'time_mask' 时间设置 HH hours (two digits) MM minutes (two digits) SS seconds (two digits) 假设当前时间是10:08:12. &TIME& -> 10:08:12 /: SET TIME MASK = 'HH:MM' &TIME& -> 10:08 /: SET TIME MASK = 'HH hours MM minutes' &TIME& -> 10 hours 08 minutes &TIME(Z)& -> 10 hours 8 minutes 取消设置: /: SET TIME MASK = ' '
修改Smartform对象所在的包
ScriptForm导出与导入、拷贝 通过系统提供的报表程序:RSTXSCRP
如果是在同一机器上,直接通过拷贝比较方便:
ScriptForm中调用Form
FORM frm_bom_level TABLES input STRUCTURE itcsy output STRUCTURE itcsy . DATA: l_posnr LIKE resbd_p_tab-posnr, l_matnr LIKE resbd_p_tab-matnr, l_rspos LIKE resbd_p_tab-rspos, l_level(4) . DATA: l_wa LIKE LINE OF resbd_p_tab. READ TABLE input WITH KEY name = 'RESBD_P-POSNR'. l_posnr = input-value. READ TABLE input WITH KEY name = 'RESBD_P-MATNR'. l_matnr = input-value. READ TABLE input WITH KEY name = 'RESBD_P-RSPOS'. l_rspos = input-value. ..... READ TABLE output WITH KEY name = 'L_LEVEL'. output-value = l_level. MODIFY output INDEX sy-tabix. ENDFORM.
ScriptForm的中英两个版本的框架是一样的,比如只要你修改某个版本的Windows尺寸,则另一个版本也会跟本改变,但窗体中的内容不会跟着变化,所以中英文的只是内容不同。 一个Form里只能有一个Main窗体,即多个Page页面只能共用一个Main窗体。 每个页面的Main窗体只需要宽度一样,高度可以设置成不一样。 语法:/: NEW-PAGE [page_name] 示例: /: NEW-PAGE 当前页结束,接下来的文本将新起一页,并且这个页面为WRITE_FORM时指定的page /: NEW-PAGE S1 当前页结束,接下来的文本显示在S1页面中 /: NEW-PAGE [page_name]只能写在MAIN窗体脚本中(才起作用),并且跳转的页面page_name中一定要有MAIN窗口(否则调用时出错)。 只有含有MAIN窗体的Page页面,并且在MAIN窗体脚本中使用了NEW-PAGE指令指定跳转到该页面的页面才可以正常显示出来。 Script\SmartForms使用禁用Word编辑器 This document details the procedure in using Microsoft Word as editor in SAP Script / Smart Forms. In normal case, when you try opening the editor in Smart Forms, the following editor would appear:
Click on the editor button. The following editor appears:
Now to change the above editor to MS Word, do the following: Go to transaction I18N(Internationalization). Click on I18N Menu àI18N Customizing à I18N System Configuration (as shown in the screenshot below)
The following screen appears:
If you would like to use MS Word Editor in both Script and Smartforms, then check the both checkboxes as shown below:
Click on Activate. The following popup appears (related to SAPScript Editor):
Click on Yes. Now the following popup appears (related to Smartforms Editor):
Click on Yes to proceed. Now the MS Word editor is available for both SAP Script and Smartforms. Result: In the SmartForms:
In SAP Script:
You can anyti me revert to old editor by deactivation MS Word editor option using the transaction I18N. 注:如果在使用I18N时,出现以下问题时: