一、
SMARTFORM
的特征
SMARTFORM
是在
SAPScript
的基础之上产生的一种新的
FORM
制作方式,它完全兼容
SAPScript
。在做
SMARTFORM
的过程中基本上不需要多少编程知识,它有一个图形界面来帮助我们完成工作。这个图形界面由三个部分组成,它们分别是:
Form Painter
、
PC Editer
、
Table Painter
。
启动
SMARTFORM
设计的事务代码:
SMARTFORMS
,进入的界面如下:
输入你要创建的
SMARTFORM
的名称,然后点击“创建”,进入下面的
Form Builder
界面:
注:上面另外两个选项
Style
、
Text module
分别是用来定义
FORM
的样式和文本模块的。
上面的屏幕分为三个部分:
Form Painter
:
主要用来设计
SMARTFORM
输出页面的格式,可以在页面上包含窗口和图(最右边)
形,还可以指定它们在页面上的位置以及它们的大小等。在图片左上角的工
具栏有一个按钮
可以用来显示和隐藏这个窗口。
PC Editer
:
主要用来初始化文本(
TEXT
)和域(
FIELD
),它包含的功能主要有以下几个方(中间)
面,
1
)输入、删除、选择、
Navigating in the SAP Form Builder
:
它主要用来显示一个
SMARTFORM
的层次结构。
(最左边)
当你在层次结构中选择了一个
NODE
(结点)后,在上面截屏的中间部分会显示这个
NODE
的
MAINTENANCE
屏幕。
二、
在做
FORM
前要了解的几个概念
1、
FORM
的结构:一个
FORM
往往是由页面
(PAGES)
、输出区域
(OUTPUT AREAS
即
WINDOWS)
、地址栏
(ADRESS)
、图形(
GRAPHICS
,比如公司
LOGO
)、数据
(DATA)
、以及文本内容
(TEXT)
组成。
2、
主窗体和子窗体:(
MAIN WINDOWSAND SUBWINDOWS
)这是页面上两个不同的输出区域,用来输出数据,文本等内容。对于主窗体,你在一个
FORM
中只能定义一个窗体作为主窗体;不同
PAGE
上的主窗体必须宽度相同,但是高度可以不同;一个没有主窗体的
PAGE
指向的下一个页面不能为它自己。对于子窗体,它也可以在多个页面上面显示,但是那些不匹配
SUBWINDOWS
的值,子窗体不会将它们显示出来。
三、
一个小的
SMARTFORM
实例
首先给要创建的
SMARTFORM
取名为
ZTEST_HXG_F3
,点击“创建”按钮,进入下面的页面:
首先看一下这个截图的左上角:
FORM ATTRIBUTES
:主要是这个窗体的一般属性和输出选择。
FORM INTERFACE
:这个属性很重要!它主要用来描述这个
SMARTFORM
的接口属性,比如
IMPORT
、
EXPORT
、
TABLES
、
EXCEPTION
。当我们做好了一个
SMARTFORM
以后,如果想从
ABAP
程序中调用这个
FORM
的话,就会用到这些接口来传递参数,这个将在下面详细说明。
GLOBAL DEFINITIONS
:主要用来定义一些全局的数据,还有
FIELD SYMBOLS
、初始化等。
当我们创建了
ZTEST_HXG_F3
的时候,系统会默认的建立一个页面(也就是刚开始在
PAGES AND WINDOWS
下面的
%PAGE
,它下面是一个
MAIN WINDOWS
)。现在我将它的名字改为
FIRST ,
描述改为“第一页“。然后在
MAIN WINDOW
上点击右键,如上图创建一个
TABLE
。
看上图:这就是刚才我们定义的
TABLE
的
MAINTENANCE
屏幕。我们在这个屏幕上可以定义很多的内容,看到
了吗?它是
SMARTFORM
中一个很重要的组成部分哦,我们将要在
FORM
中显示的表格,都是在这里定义的。
我们可以定义的内容有:
TABLE
的宽度,水平线对齐方式。
上面这个图用来定义
TABLE
的输出格式,比如现在我们定义了
LINE1
,我们定义了三个列,三个列的宽度分别都是
4CM
。但是请注意,当你制定这些列的宽度的时候,它们三个的列的和不能大于表格的宽度
,否则系统会报错。当然这里我只定义了一个
LINE TYPE
,你还可以在下面定义很多的
LINE TYPE
。做完了这一步以后我们可以点击
进入这个屏幕看一下我们定义的表格的效果。
看到了吗?我们定义的三列清楚的在上面显示出来了。上图中的
LINE1
表示我们用的是
LINE1
的输出格式(主要是指输出列的宽度和长度)。
我们在屏幕上输出报表的时候,画表格,一般的表格都是由表头,还有内表的填充数据来组成,这里也不例外,比如我们就可以把我们定义的
TABLE
和内表联系起来,只需点击上面的“
TABLE
“边上的”
DATA
“选项卡,进去设置一下就可以了,取内表名为
ITAB
。具体设置如下图所示:
首先我们来定义表头
HEADER
,也就是各个列的列名:
首先选中上面这些内容,这样在就会在
TABLE
下面多处一个
HEADER
事件,如图所示:
这样我们就可以在
HEADER
下面定义各个列的名称了。这里我们以固定列(即三列)来演示!
在它下面首先要建立一个
FOLER
。你必须得为每一列都定义一个
FOLDER
,这里有三列,我们就在
HEADER
下面创建三个
FOLDER
。
FOLDER
结点的作用是用来合并一些相关结点的,并且它帮助我们很好的区分各个层次。建立好
FOLDER
之后,在每个
FOLDER
下面再创建一个
TEXT
。
这样就形成了这样一个层次结构。
要想显示成下面这个样子:
我们还得设置一两个地方:如图所示
选中第一个
FOLDER
,双击它,在右边的窗口中选中如图上面标记的内容,这样做的目的是,
NEW LINE
表示我们开始一个新的行,这个行是从
FOLDER1
开始的,
LINE TYPE
选择
LINE1
的意思是说,我们这个行的输出格式是以
LINE1
为参照的!那么接下来的两个
FOLDER
的要这样设置,如下图:
表示接下来的两个
FOLDER
中的内容是和第一个
FOLDER
同处一行,但是是不同的
CELL
。
接下来的事情就是设置每一列的列名了,注意这里的列名是静态的文本。我以第一列为例子来介绍,其他两列类似,选中
FOLDER1
下的
TEXT1
,如下图:
在椭圆选中的地方输入你想要取的列名,比如我这里就是取为:第一列。其他两列的列名类似,这里就不再赘述了。
在前面我们已经把这个
SMARTFORM
和内表
ITAB
连接起来了。接下来就看看通过
SMARTFORM
显示动态内容的情况!
首先我们在
FORM INTERFACE
中定义这个表的名字和其他参数,如下图:
然后点击左上角椭圆选中的那个按钮,这样在左下角就会出现这个
SMARTFORM
的
FIELD LIST
。
注意:这里定义的
ITAB
只有三个字段,刚好跟我们定义的
TABLE
吻合,当然你也可以定义自己的内表。
做完了这以步后测试一下,如果没有问题,就进行下一步:
同在
TABLE
的
HEADER
中定义一样,我们还要定义三个
FOLDER
和三个
TEXT
,定义好了图如下:
这几个
FOLDER
的设置和上面
HEADER
一样,唯一不同的就是这里每个
FOLDER
下面的
TEXT
的内容不是我们自己在上面输入“第一列“、”第二列“、”第三列“。而是如上图的箭头所示,从左边那个地方用鼠标按住以后拖到右边的箭头所指的那个地方。这样我们这列对应的数据就会是”动态“的。
做好了这一切以后,测试,没有错误,那么基本上一个简单的
SMARTFORM
就完成了。当一个
SMARTFORM
激活以后,系统就会自动给它分配一个
FUNCTION MODULE
。我们只需要点击“
F8
“直接运行这个
SMARTFORM
,就会进入这个界面:
上面这个
FUNCTION MODULE
就是我们做完了的
SMARTFORM
所对应。你可以在程序中调用这个
SMARTFORM
。下面就介绍一下在程序中如何写代码:
report z_hxg_007 .
data: itab like alsmex_tabline occurs 0 with header line.
data fm_name type rs38l_fnam.
data: num1 type i,
num2 type i,
num3 type i.
call function 'SSF_FUNCTION_MODULE_NAME'
“这个FUNCTION主要是用来取你要调用的
exporting
SMARTFORM
对应的FUNCTION MODULE的
formname = 'ZTEST_HXG_F3'
名字然后赋值给FM_NAME,因为SMARTFORM
importing
对应的FUNCTION MODULE名字很长,并且
fm_name = fm_name
难以记忆
exceptions
no_form = 1
no_function_module = 2
others = 3.
num1 = 1.
num2 = 2.
num3 = 3.
do 20 times.
itab-row = num1.
itab-col = num2.
itab-value = num3.
append itab.
clear itab.
num1 = num1 + 1.
num2 = num2 + 1.
num3 = num3 + 1.
enddo.
call function fm_name
“调用SMARTFORM,很显然这里是以FUNCTION
* EXPORTING
MOUDULE
的方式和SMARTFORM交互
* ARCHIVE_INDEX =
* ARCHIVE_PARAMETERS =
* CONTROL_PARAMETERS =
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
* OUTPUT_OPTIONS =
* USER_SETTINGS = 'X'
* G_CARRID = <variable>
* G_CONNID = <variable>
* G_FLDATE = <variable>
* IMPORTING
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* JOB_OUTPUT_OPTIONS =
tables
itab = itab
“把ITAB内表的内容传递到SMARTFORM中去
exceptions
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4.
* others = 5.
运行程序,到达这个屏幕:
系统会提示你输入一个“输出设备”,随便输入一个,然后点击下面的“
PRING PREVIEW
”。
你就会看到最后的结果!如下图
基本上就介绍这么多,其实
SMARTFORM
可以把
FORM
做的非常好看,我们还可以插入图形,
ADRESS
等等很多元素,因为自己还用的不是很熟,也就只能分享这点成果。后续我会关注的问题就是复杂的
SMARTFORM
的建立,以及我们在打印的过程中如何控制
SMARTFORM
的换页等,希望有机会跟你探讨!呵呵
^_^