Smart Form Tutorial(适用新手学习)

发现Smart FormECC6中和4.6C相比改变了不少,最近重新研究了一下。help.sap.com上的文档基本上是针对新特性的,不过例子却还是旧的。做个笔记省的以后找不到最新的example
最大的改变在Table上,现在tableheaderfooter比以前好做了。
还是用IDES自带的SFLIGHT表做例子,先看一下打印出来的效果:
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。这里还可以调正一页中可以打印多少行。
2. Form Interface
我们生成一个Form的同时,系统也创建了一个相应的function moduleFormApplication的数据交换就是通过functioninterface来实现的。双击左边树状结构中的'Global Setting'->'Form Interface',我们可以看到 ,这和我们在SE37中看到的function module的接口是一样的。点击'Table'这个tab,输入如下:
3. Global Definition
这里定义的是在form中共用的全局变量,还可以定义subroutine form初始化的时候调用的一个routine,可以在这里做一些data初始化的工作。  用来设置货币或者数量的单位关联用的。
下面是'Global Data'里头的定义:

上图中的T_SUM类型是我在'Types'里头定义的,其中PRICE, CURRENCY是用来做sum用的:
TYPES:
  BEGIN OF T_SUM,
    PRICE  TYPE S_PRICE,
    CURRENCY   TYPE S_CURRCODE,
  END OF T_SUM.
下面是Currecy & Quantity的单位关联设置。这样关联之后Price会按照Currency的不同,输出格式也不同:
 
4. Create a Style named 'Z_BSUN_TITEL01'
回过头我们要创建一个给这个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
5.Creat a Page named 'FIRSTPG'
下创建一个名为'FIRSTPG'page,并把它的next page设置为其本身。Page Format设置为'Portrait Format'
6.Create Windows under 'FIRSTPG'

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
7. Create Header's Text
'HEADER' Window node下面创建一个Text,取名'TITLE'Text type设置成'Text Element'。再PC Editor中点  输入 T1就是在Step 3里头定义的Paragraph Format
8. Create a table in 'MAIN' Window
'MAIN' Window node下面创建一个Table . Table下面自带了三个node: header, main area, footer,颜色跟别的由用户创建的node有区别。其中Tableheader node下面我们可以放表头。Tablefooter node跟我们在Step 6创建的FOOTER Window有区别。FOOTER Window的位置是固定的,TablefooterTableline在哪里结束,它就紧跟在后面。文章开头的打印结果中我们可以很直观的看到这两个的区别:FOOTER Window在每页的最下面(打印了两次,尽管内容不一样),Table footer在第二页中间只打印了一次。当然我们说的都是默认的情况。
9. Insert program line 'CODE_CLEAR' before 'MAIN' Window
Input Parameters:  G_TAB_DATA;
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
 Programe Line中使用到的全局变量必须在Input/Output中定义,否则check不通过。
10. Create some line types in Table 'FLIGHTINFO'
Line Type是控制表格格式的,每一个Table Line都要指定一个Line Type

Layout
如下图,注意这些Lineborder是框了线的
11. 'DATA' of Table 'FLIGHTINFO'

G_TAB_DATA
Step 2Form Interface定义的一个内部表,也就是从Application传过来准备给Form显示的数据。我们还想让显示的数据排一下序,当然这可以在外部程序中SORT,不过这里的排序还有触发event的作用,后面会讲到。如果内部表已经排好序了,只是想触发类似LOOPAT NEW/AT END OF这样的功能,那么把 这个勾上就好。下面是SORT的设置,我们对CARRID(Airline),CONNID(Flight No.)排序,并且要触发两个events,用来做subtotal统计。
12. 'Calculation' of Table 'FLIGHTINFO'
是用来对TableFields做简单计算的,包括'Number', 'Total', 'Mean Value'。如果不是涉及到货币或者数量的统计我们可以用'Total'这个Operation,具体使用可以参考help。我这里用了'Number'做一个每页的Items统计,'Number'也可以用来做行号。
13. Insert a title in table header
Table 'FLIGHTINFO'header node下增加table line HEADER_LINELINE TYPE'Line1'tablbe line自动带出5cellcell的数目是根据LINE TYPE :'Line1'来的,Step 10里头可以看到Line1是有5cell的。我们在每一个cell下面添加一个Text,作为colum title,把paragraph format设置成M1。不过'Price'这个Column因为是数字,paragraph format设置成M3

P.S.Table
自带的headerOutput Option->Print Time有两个选项

at start of Table
就不说了,不过at Page Break工作不正常,第2页并没有打印出来title,也不知道是不是我写的问题。
14. Insert table line into table main area
Main Area
是显示Application传进来的内部表的地方,和Step 13一样增加一个Line Type=LINE1Table Line,每个Cell下各增加一个Text,属性设置成'Text Element'

PC Editor ,编辑Text内容,以CARRID为例:  
15. Insert a Program Line Under 'DATA_LINES'
CURRENCY_DATA
下的Programe Line: SUM,是为了做合计用的,按照Currecy的不同将Price合计。(当然单价Price的合计没什么实际意义,权当是演示)
Input Parameters:  G_REC_DATA, G_TAB_SUBTOTAL;
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_TAB_TOTAL','G_TAB_SUBTOTAL'保存的是合计和根据'Airline'进行小计的数据。
16. Print 'Grand Total' in table footer
tablefooter node下增加一个loop node  
Loop
DATA如下:

因为我只想在所有的记录打印结束之后显示总计,所以给这个loop增加一个condition。在Condition Tab里的Output Condition中增加一行:

G_ITEMS_ONPAGE
Step 12中被赋值Number, G_ITEMStep 9被赋值内部表中的记录数,当这两个值相等的时候也就是记录输出完毕的时候。再给loop node下一级增加一行table lineLINE TYPE : LINE3
GRANDTOTAL: M2 -> 'Grand total:'
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 自动增加了两个节点:

首先在'CARRID Event on Sort Begin'下一级增加一个Program Line:SUB_CLEAR,用来在CARRID改变的时候清空subtotal内部表。
Output Parameters: G_REC_SUBTOTAL;
CLEAR: G_REC_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:

Loop:PRINTSUBTOTAL:
下一级增加一个table line:SUBTOTALLINE TYPE : LINE3
AIRLINE_NAME: M2 -> 'Subtotal of&G_REC_DATA-CARRID& is'
SUB_PRICE: M2 -> &G_REC_SUBTOTAL-PRICE&
SUB_CURR: M2->&G_REC_SUBTOTAL-CURRENCY&
其中AIRLINE_NAME是有显示条件的:G_FLG_SUBTITLE没有赋值的时候才显示。

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:

DATA:

然后,在FTTABLEMain Area下增加一行Table Line: PRICESUM, Line Type: LINE1 

为了控制在最后一页的页脚打印出来金额合计,要给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&
最后,在FTTABLEFooter下增加一行Table Line: FOOTER, Line Type: LINE1 

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的代码:
*&---------------------------------------------------------------------*
*& 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  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 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.
*&---------------------------------------------------------------------*
*&      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.
IF SY-SUBRC <> 0.
*   <error handling>
ENDIF.
ENDFORM.                    " FRM_OUTPUT
到这里这个Tutorial就结束了,我们没有用到的node还有Command, Alternative,Graphic,Complex Section等。其中Command主要用来插入分页或者打印控制语句的;Alternative用来插入一个逻辑分支;Graphic插入图片的;Complex Section我自己没用过,看帮助文件说SAP不推荐使用。
real project中的form不会有这么简单,但是也不会脱离这些elements的组合。
 

转载于:https://www.cnblogs.com/duadu/archive/2007/07/23/6166698.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

执行命令npm install XXX后仍然提示 Cannot find Module XXX

最近遇到一个问题&#xff0c;在服务器上配置完node环境后 执行npm start 命令后提示 Cannot find Module "Jquery" 然后就知道可能没有安装jquery 就继续在当前文件夹下执行 npm install jquery 但是再次执行后却仍然提示 Cannot find Module "Jquery"…

青蛙学Linux—Zabbix Web使用之Zabbix发现功能①自动网络发现

Zabbix的发现功能用于自动发现主机或者监控数据&#xff0c;包括以下三种发现类型&#xff1a; 自动网络发现&#xff08;Network discovery&#xff09;主动客户端自动注册&#xff08;Active agent auto-registration&#xff09;低级别发现&#xff08;low-level discovery&…

php 修改 wordpress,wordpress怎么编辑代码修改页面

wordpress是用PHP写的。PHP是服务器端执行脚本文件。然后到客户端(就是网页)生成html文件。你看到的html代码都是PHP程序在服务器端执行后生成的。若要修改代码主要是看想修改那一部分的内容。然后找到其对应的PHP代码.然后修改。在后台点击-->,就能看见你现在使用的wp主题的…

mpvue tabBar设定 app.json

1.微信小程序&#xff0c;设置src/app.json 中的tabBar 图标选择来自 iconfont 如图所示 小程序显示如下&#xff1a; 转载于:https://www.cnblogs.com/0909/p/11144861.html

JDK 8时代的抽象类与接口

在新的Java 8日期和时间API&#xff1a;Stephen Colebourne的访谈中 &#xff0c; Stephen Colebourne告诉Hartmut Schlosser &#xff1a;“我认为最重要的语言更改不是lambda&#xff0c;而是接口上的静态方法和默认方法。” Colebourne补充说&#xff1a;“添加默认方法消除…

ajax请求拿到多条数据拼接显示在页面中

首先我们拿到的了一坨Json数据 如下 然后通过ajax请求拿到数据 在ajax的success方法中处理和使用数据&#xff1a; 其中包括&#xff1a; 用eval处理这种数据 var outStr eval(( data.data )); 用循环取出数据并使用 $.each(outStr,function(index){ console.log(outStr[i…

在IntelliJ IDEA中为不同的数据源着色

IntelliJ IDEA中的数据库插件是使用数据库中数据的有用工具。 只要我们有了JDBC驱动程序来连接数据库&#xff0c;就可以配置数据源。 然后&#xff0c;我们可以运行查询&#xff0c;检查表的内容并使用数据库工具窗口更改数据。 具有多个数据源&#xff08;例如开发和测试环境…

[蓝桥杯]ALGO-185.算法训练_Trash Removal

题目描述&#xff1a; 代码如下&#xff1a; 1 #include <algorithm>2 #include <cstdio>3 #include <cstdlib>4 #include <cmath>5 #include <cstring>6 #include <iostream>7 #define INF 0x7fffffff8 using namespace std;9 10 typed…

从客户端...中检测到有潜在危险的 Request.Form 值

在.net中&#xff0c;Request时出现有HTML、Javascript等字符串时&#xff0c;系统会认为是危险值&#xff0c;运行显示“从客户端……中检测到有潜在危险的Request.Form值”这样的错。解决办法&#xff1a; &#xff08;1&#xff09; 在.aspx文件头中加入这句&#xff1a; …

android 之 百度地图

简介 百度地图Android定位SDK为基于移动客户端开发LBS应用提供基础定位能力。 功能介绍 功能介绍&#xff1a; 地图展示&#xff1a;包括2D图、卫星图、3D图地图展示。 地图操作&#xff1a;提供控制平移、缩放、底图旋转、变换视角等地图相关操作的功能。 短串分享&#xff1a…

从javaagent迁移到JVMTI:我们的经验

当您需要从JVM内部收集数据时&#xff0c;您会发现自己很危险地接近Java虚拟机内部进行工作。 幸运的是&#xff0c;有一些方法可以避免被JVM实现细节所困扰。 Java之父没有给您提供过两个漂亮的工具供您使用。 在这篇文章中&#xff0c;我们将说明两种方法之间的差异&#xf…

HTML--HTML对象的关于位置和大小的属性的图解

转载于:https://www.cnblogs.com/duadu/archive/2007/08/08/6166687.html

flower.php,flower.php

session_start();//定义个常量&#xff0c;用来授权调用includes里面的文件define(IN_TG,flower);define(IN_JS,flower);//定义个常量&#xff0c;用来指定本页的内容define(SCRIPT,message);//引入公共文件require dirname(__FILE__)./includes/common.inc.php;//判断是否登录…

BABOK - 需求管理和沟通(Requirements Management and Communication)概要

本文更新版本已挪至 http://www.zhoujingen.cn/itbang/345.html ------------------------------------------- 描述 需求管理和沟通描述我们如何管理冲突、问题、变更&#xff0c;并确保涉众和项目团队在方案范围内保持一致。不同项目的复杂度和方法论支持都不一样&#xff0c…

Java 8的默认方法:可以做什么和不能做什么?

什么是默认方法 在Java 8发行版中&#xff0c;您可以修改接口以添加新方法&#xff0c;以便该接口与实现该接口的类保持兼容。 如果您要开发一个库&#xff0c;该库将由基辅到纽约的几位程序员使用&#xff0c;那么这非常重要。 在Java 8出现之前&#xff0c;如果您在库中发布了…

P1047 校门外的树

P1047 题目描述 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴0的位置&#xff0c;另一端在L的位置&#xff1b;数轴上的每个整数点&#xff0c;即0,1,2,…,L&#xff0c;都种有一棵…

.Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0

添加完Swagger包引用后运行报错&#xff1a;Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 [HttpPost] 之类的特性 添加后就可以解决这个报错原因 但是我的父类控制器里的两个方法只是为了做返回值的一些处理&#xff0c…

matlab impdt,实验1 基于Matlab的数字信号处理基本操作

图1-7 离散时间信号的基本运算及波形图>>title(x2(n)),axis([-15 15 0 1]) >>subplot(413)>>stem(n3,x,fill),grid on >>title(x3(n)),axis([-15 15 0 1]) >>subplot(414)>>stem(n4,x,fill),grid on >>title(x4(n)),axis([-15 15 0 …

画函数图形的C#程序(改进版) (转)

我在10月份发表过一篇随笔“画函数图形的C#程序&#xff0c;兼论一个病态函数”&#xff0c;在那篇随笔中写道&#xff1a; 这个画函数图形的C#程序有一个严重的缺点&#xff0c;就是函数表达式是直接写的源程序中的&#xff0c;不能象SciLab和Matlab那样交互式地输入。 后来&a…

Swift-UITextView占位文字及占位文字颜色扩展(可在xib中直接使用)

使用案例 extension UITextView {private struct RuntimeKey {static let hw_placeholderLabelKey UnsafeRawPointer.init(bitPattern: "hw_placeholderLabelKey".hashValue)/// ...其他Key声明}/// 占位文字IBInspectable public var placeholder: String {get {re…