抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Adobe Form可以理解成是Smart Form的升级版。它拥有更加简洁的界面和操作方式。更加重要的是Adobe Form未来会被运用在BTP上。但是Smart Form无法在BTP上使用。

我找到了一些国外的教程。根据这些教程我将我学习Adobe Form的内容整理成下面的笔记。你也可以理解成是对我学习资料的翻译版本。我也会给出学习网站的链接,请见最后面的参考资料。

Adobe Form介绍与Table

一、Adobe Form介绍

1.介绍

SAP Adobe Form 是一种基于 Adobe 技术的表单生成工具,它允许用户在 SAP 系统中创建和打印高级的、交互式的 PDF 表单。这项技术提供了比传统的 SmartForms 更加丰富的用户界面和打印体验 。Adobe Form 通过结合 SAP 应用程序的数据处理功能和 Adobe 的 PDF 技术,使用户能够以可视化和灵活的方式设计和生成高质量的表单 。

2.特点

  • 与 Adobe Document Services 的集成,允许从基于 SAP NetWeaver 的后端系统或使用 REST API 的应用程序生成打印和交互式表单。
  • 支持存储表单模板在 SAP Forms service by Adobe 通过 Template Store 特性或在应用程序后端 。
  • 表单设计器工具的使用,它提供了一个可视化界面来创建和编辑表单布局,包括静态元素和动态元素 。
  • 支持 FormCalc 和 JavaScript 脚本语言,用于实现表单的动态行为和数据处理 。

3.注意事项

在SAP端使用Adobe Form需要连接操作Adobe Form的服务器,然后再在自己的本地PC中和Smart Form一样安装Adobe Form的补丁包。如果没有连接Adobe的服务器是无法使用该功能的。

二、简单示例

1.创建Interface

(1)创建Interface

和Smartform不一样,Adobe Form的RFC参数需要单独创建,和Adobe Form自身样式设计等界面的内容并没有集成在一起。所以需要单独创建。而且只有创建好Interface之后才能在创建Adobe Form,因为在创建Adobe Form时需要绑定一个Interface,而且Adobe Form中的数据源也是只有绑定了Interface之后才能使用的。

使用事务代码SFPSmart Form PDF)打开维护Adobe Form的界面。填入Interface的名称。

1.维护Adobe Form 2.维护Adobe Form 描述与接口类型

(2)界面说明

创建好Interface后,左侧的面板中是设置Adobe Form的属性面板,右侧则是对应于左侧面板的操作界面。

3.Interface 界面说明
① Form Interface

主要包含有接口的输入输出参数异常处理。当我们通过RFC调用Adobe Form时,参数的设置就在此处。

② Global Definitions

如字面意思所说,此处是用来定义全局对象的位置。你可以在这里定义全局变量(Global Data)、全局类型(Global Type)与字段索引(Field Symbol)。这些对象在整个Form中都是可以引用和使用的。

③ Initialization

调用该Adobe Form时的初始化逻辑。可以在Code Initialization中对变量进行初始化操作。或者进行一些必要的程序初始化逻辑处理。Form Routines定义与编写Form逻辑的位置。

④ Currency/Quantity Fields

当Form结构中存在数量货币字段时,需要和Smart Form一样,在这里设置这些字段对应的参照单位或参照单位字段。

(3)设置接口参数

Form Interface页签中的Import子页签中添加一个名为IV_TEXT类型为CHAR30的可选变量。

4.设置输入输出参数

2.创建Form

(1)创建Form

和上面创建Interface的初始界面一样。在Form的输入框中输入该Form的名称,然后点击创建。

5.创建Adobe Form_输入名称界面

创建时需要我们输入当前Form的描述与与Form相绑定的Interface对象名称。

6.输入描述并绑定Interface

(2)添加接口变量

按照上面的步骤创建好Form后左侧是Interface,右侧是FormContext。我们展开左侧Interface的所有页签,可以在Import页签下看到我们绑定的上面创建的Interface的参数。

System Fields是系统的标准字段。可以理解为SY开头的系统变量。这些变量在Form中固定存在。

7.Form的初始参数界面介绍

介绍完界面,我们将从Import页签中的IV_TEXT变量拖动到右边的YADOBE_FORM_DEMO1页签下。当然你也可以手动添加这些变量,但是这样你就需要将变量的所有属性信息都自己手动添加过去。从效率和可靠性方面考量,建议还是直接拖动过去更为推荐

将变量拖动过去之后会在界面的最下面显示该参数的属性信息。这些信息中会显示该参数的名称、描述、状态、以及数据源(Data -> Field)。这里的参数名称是可以修改的,修改之后就可以在Form中以这个名称进行引用。例如我们将IV_TEXT的名称修改为GV_TEXT

8.添加接口参数与修改参数名称

(3)Form Builder中的上下文

在Context(Form Context)中,指定从接口复制到表单的数据。还可以将此数据作为节点包含在层次结构中。在层次结构中还可以指定处理节点的条件来决定表单逻辑。

可以简单理解为Context为Form中的全局对象声明区域,类似于Report中的 TOP Include一样。既如此,没有在Context中进行引用的变量是无法在Form中进行使用的。如果你在Interfce中定义了一个变量,但是没有导入Context,那么该变量也就无法在Form中进行使用。

此外就如上面提到的,当你将参数从接口导入到Context中之后,你还可以修改该参数在Form层面部分属性。例如名称等。

(4)设置Layout

Layout界面就是我们正式设置Form样式与内容的地方了。点进Layout页签,可以在左侧看到Hierarchy、Tab Order、Data View等。右侧则是Design、Mater选项。

9.Layout界面

点击左侧的Data View页签,将需要在表单上打印和显示的Field拖放到Design View。你可以拖动该字段到布局中的任何位置。例如下图所示的内容。

10.Data View GV_TEXT

拖动到界面上之后,我们可以在右侧的Object页签中设置该对象的数据,例如他的文本内容等。

11.拖动元素并设置对象属性

3.测试Form

(1)直接运行Form

将Form保存并激活完成之后,点击上面的运行按钮,填入IV_TEXT变量的之后运行。

12.Form测试_直接测试 13.Form测试_输入参数值

运行结果如下所示,与我们在Interface中输入的内容一致。

14.Form测试_运行结果

(2)代码测试

编写下面的测试代码,然后直接运行。

1

三、Adobe Form中的Table

1.分类

在Adobe Form中有两种用来展示表格的方式。

  • Table Object
  • SubForm

2.介绍

(1)Table Object

① 优点
  • 简单,容易实现。当我们之后很少的一部分字段时可以使用该对象快速构建表格。
  • 允许你选择行或列。然后调整列的大小。
  • 可以控制在每页上重复表格标题。
② 缺点
  • 很难处理嵌套表。
  • 打印非标准表格时存在限制条件。
  • 如果停用Context中的部分字段时,在Table Object中想要使用该字段时就会变得异常困难。

(2)SubForm

① 优点
  • 布置表格时很灵活,当打印多行表格时,子表单更有用。
  • 可以根据要求重写排列SubForm中的单元格。
  • 当需要在表单中打印嵌套表单时,SubForm更有用。

没有什么很明显的缺点,如果我们希望在分页符的情况下重复标题,则必须使用”Overflow Leaders“。可以在对象面板的“Pagination”选项卡上设置该属性。

在实际使用过程中经常会使用到SubForm,但如果打印的是标准表时则建议直接使用Table Object,因为这样最简单。

3.创建Interface

(1)创建Interface

使用事务代码:SPF,打开Adobe Form的界面。选中Interface单选按钮,输入Interface Name并点击创建按钮。

15.创建Table与Subform的Interface_名称

填入接口描述,点击保存按钮。

16.创建Table与Subform的Interface_描述

(2)填入输入参数

在接口的Import中填入一个输入内表参数。

17.创建Table与Subform的Interface_添加输入内表参数

在Adobe Form的函数模块中如果要传递表类型的参数,则类型必须是一个表类型

完成之后保存并激活Adobe Form的Interface。

4.Table Object

(1)创建Table Object

返回到刚刚的创建界面。选中Form单选按钮,在其中输入Form的名称。然后点击创建按钮。

18.创建Table_名称

输入Form的描述与绑定的Interface名称。

19.创建Table_描述与接口

(2)绑定接口参数到Form

Context 页签中,展开 InterfaceImport 参数文件夹,将输入参数 IT_KNA1 拖动到 FormContext 中。

20.创建Table_绑定参数

(3)确认打印字段

导入的参数结构十分庞大,存在很多我们不需要展示使用的字段。所以我们可以在 FormContext 中将表类型参数展开。然后选中不需要展示的。点击鼠标右键,选择 deactivate

21.创建Table_选择多余的展示字段

被排除的字段后面会有一个灰色的叉。后续在Form中虽然可以使用 IT_KNA1 这个内表对象,但是无法引用到被打了叉的内表字段。

22.创建Table_排除多余的展示字段

(4)插入文本标题

点击 Form 横排按钮中的 Insert 按钮,选择 Standard ,再选择 Text 对象。

23.创建Table_选择插入文本对象 24.创建Table_插入文本对象

修改文本对象中的内容。并根据需要设置文本的属性信息。例如设置字体样式或设置 Layout 的排序方式等。

25.创建Table_设置文本对象

(5)打开字体工具栏

如果你没有找到字体工具栏,可以按照下面的步骤打开工具栏。出来字体工具栏外,还有其他很多工具栏都可以在这里打开。可以根据自己的需要选择对应的工具栏打开。Palettes –> Font

26.创建Table_打开工具栏

(6)拖放数据到布局

打开左侧的 Data View 页签,选中通过接口传入的内表变量 IT_NAK1 ,然后拖放到右侧的页面中。

27.创建Table_拖动数据到页面

你可以在这个位置手动调整列的宽度或者高度。也可以使用右侧的属性栏中对列进行精准的属性设置。

28.创建Table_属性设置单元格属性

(7)数据翻页

默认情况下,如果 IT_KNA1 中的数据超过一页是不会自动翻到下一页的。如果希望能通过翻页将所有数据展示出来的话,可以按照下面的操作进行设置。

① Subform 设置为 Flowed

选中图中红框圈中的 Subform 对象,在右侧的 Object 属性页签中设置 ContentFlowed

29.创建Table_设置数据分页_Flowed
② 设置内表允许使用分页符

选中内表变量 IT_KNA1,在右侧的 Object 属性中勾选上复选框 “ Allow Page Breaks Within Content ”(允许在内容中使用分页符)。

30.创建Table_设置数据分页_换行符

(8)设置数据排序

在某些国家或者地区,查看数据是从右到左查看数据的。但是SAP中默认的是从左到右排列数据的。此时可以通过设置 IT_KNA1Object 属性中的 Layout 来实现需求。

① 从左到右(默认)
31.创建Table_从左到右排序
② 从右到左
32.创建Table_从右到左排序

可以看到经过从右到左设置之后列的顺序被颠倒了。

(9)测试Table Object

使用下面的代码进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
**&&~~ Data Objects
DATA: GV_FM_NAME TYPE RS38L_FNAM, " FM Name
GS_FP_DOCPARAMS TYPE SFPDOCPARAMS,
GS_FP_OUTPUTPARAMS TYPE SFPOUTPUTPARAMS,
GT_KNA1 TYPE STANDARD TABLE OF KNA1.

"Your Adobe Form Name
CONSTANTS : GV_FORM_NAME TYPE FPNAME VALUE 'YADOBE_FORM_DEMO2'.

*======================================================================*
* START of TREATMENT *
*======================================================================*
START-OF-SELECTION.
SELECT * FROM KNA1 INTO TABLE GT_KNA1 UP TO 50 ROWS.
*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
IE_OUTPUTPARAMS = GS_FP_OUTPUTPARAMS
EXCEPTIONS
CANCEL = 1
USAGE_ERROR = 2
SYSTEM_ERROR = 3
INTERNAL_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Get the Function module name based on Form Name
*
CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
I_NAME = GV_FORM_NAME
IMPORTING
E_FUNCNAME = GV_FM_NAME.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Take the FM name by execuing the form - by using Pattern-
**&&~~ call that FM and replace the FM Name by gv_fm_name
*
**&&~~ Call the Generated FM
CALL FUNCTION GV_FM_NAME "'/1BCDWB/SM00000176'
EXPORTING
/1BCDWB/DOCPARAMS = GS_FP_DOCPARAMS
IT_KNA1 = GT_KNA1
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_CLOSE'.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
*&---- Close the spool job
CALL FUNCTION 'FP_JOB_CLOSE'
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* <error handling>
ENDIF.
*&---------------------------------------------------------------------*
51.Table组件测试1 52.Table组件测试1_Adobe Form 1 53.Table组件测试1_Adobe Form 2

5.Sub Forms

跳过创建步骤,直接进入到布局设计界面。因为前面包括创建Form、绑定数据和设置打印字段都是一样的操作。所以这里不再复述了。

通过使用这种方法,我们可以暗中任意顺序显示字段,并以多行显示字段。

(1)确定打印字段

和上面Table Object的操作一样,这里去掉了一个字段Name2。所以这里就只展示绑定的数据字段。

33.SubForm绑定接口参数结果展示

(2)确认布局

默认情况下,每个表单都具有Master PageBody Page(无标题子表单 Page1)。在Simple定义中,可以使用Master Page打印头数据Body Page打印项目数据。在Master Page页面中打印标题内容。

我们还可以在选中Master Page后在右边的Layout页签中或界面上调整Master Page的大小和区域

34.SubForm设定Title与Master Page宽度

(3)设置子表单为 FLOWED

如果要打印Table数据,则必须设置子表单的Content属性为FLOWED

35.SubForm设置Content属性为FLOWED

(4)插入SubForm

在子表单上右键,选择Insert Subform。插入SubForm对象。

36.SubForm子表单插入SubForm 37.SubForm子表单插入SubForm

(5)设置SubForm属性

可以在当前的页面,对插入的SubForm调整属性。例如调整他的高度或宽度。还可以移动他到其他位置等。

我们先将这个SubForm重命名为Header,因为计划将他作为Table的标题内容。

修改Header对象的ContentFlowed,并将Flow direction修改为Western text。以便字段并排显示。

38.修改SubForm的属性

(6)设置表格标题-插入文本字段

接下来设置表格的标题部分。这部分使用文本字段的方式显示内容。

39.设置表格标题_插入文本字段

插入文本字段后,修改该对象的属性。让其能作为表格的标题进行显示。修改的内容有以下几个内容。

  • Appearance(Object -> Field):None
40.设置表格标题_设置文本字段属性_修改边框外观
  • Position(Layout):None
41.设置表格标题_设置文本字段属性_去除文本字段
  • Type(Object -> Value):Read Only
42.设置表格标题_设置文本字段属性_设置只读
  • 修改边框颜色为纯色
43.设置表格标题_设置文本字段属性_设置边框底色为纯色

将设置好的Text Field复制四份,然后显示在同一行。修改Text Field的名称方便区分。并在Value页签中设置Hard Coded用于在表单中进行显示。

44.设置表格标题_设置文本字段属性_设置TextField名称与Hard Coded

(7)打印Item数据-创建Item子表单

使用和上面插入Header子表单一样的方式,插入一个Items子表单。然后将Header中的5个Text Field复制到Items子表单中。

同时修改Items表单的contentFlowedFlow directionWestern text

45.设置Items表单_设置表单属性与字段

(8)打印Item数据-表单绑定数据表

Items表单的Binding页签中,将从Interface中传过来的IT_KNA1变量绑定在此处。

46.设置Items表单_绑定数据 47.设置Items表单_绑定上数据

(9)打印Item数据-映射TextField

将数据映射到Items表单的TextField字段上。数据与字段的映射关系如下:

  • CustomerNo <—-> KUNNR
  • CustomerNo <—-> LAND1
  • Name <—-> NAME1
  • Street <—-> STRAS
  • City <—-> ORT01
48.设置Items表单_绑定TextField的数据 49.设置Items表单_绑定TextField的数据完成

将其余字段按照同样的方式绑定完成。完成之后回到Items子表单确保Repeat Subform复选框是勾选的状态。

50.设置Items表单_勾选Items的Repeat Subform

(10)测试Sub Forms

测试的代码和上面的内容一样,只不过Adobe Form的名称不一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
**&&~~ Data Objects
DATA: GV_FM_NAME TYPE RS38L_FNAM, " FM Name
GS_FP_DOCPARAMS TYPE SFPDOCPARAMS,
GS_FP_OUTPUTPARAMS TYPE SFPOUTPUTPARAMS,
GT_KNA1 TYPE STANDARD TABLE OF KNA1.

"Your Adobe Form Name
CONSTANTS : GV_FORM_NAME TYPE FPNAME VALUE 'YADOBE_FORM_DEMO2_SUBFORM1'.

*======================================================================*
* START of TREATMENT *
*======================================================================*
START-OF-SELECTION.
SELECT * FROM KNA1 INTO TABLE GT_KNA1 UP TO 50 ROWS.
*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
IE_OUTPUTPARAMS = GS_FP_OUTPUTPARAMS
EXCEPTIONS
CANCEL = 1
USAGE_ERROR = 2
SYSTEM_ERROR = 3
INTERNAL_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Get the Function module name based on Form Name
*
CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
I_NAME = GV_FORM_NAME
IMPORTING
E_FUNCNAME = GV_FM_NAME.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Take the FM name by execuing the form - by using Pattern-
**&&~~ call that FM and replace the FM Name by gv_fm_name
*
**&&~~ Call the Generated FM
CALL FUNCTION GV_FM_NAME "'/1BCDWB/SM00000176'
EXPORTING
/1BCDWB/DOCPARAMS = GS_FP_DOCPARAMS
IT_KNA1 = GT_KNA1
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_CLOSE'.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
*&---- Close the spool job
CALL FUNCTION 'FP_JOB_CLOSE'
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* <error handling>
ENDIF.
*&---------------------------------------------------------------------*

直接展示打印的PDF内容如下所示。

54.SubForm组件测试_Adobe Form 1 55.SubForm组件测试_Adobe Form 2

四、参考资料

本片学习笔记的参考资料如下所示:

SAP Adobe Interactive Form Tutorial. Part I. First Adobe Form

SAP Adobe Interactive Form Tutorial. Part II. Tables in Adobe Form

如果你有什么建议或者发现上面笔记中的错误,欢迎在博客评论留言告知我,十分感谢。

评论