Smart Forms&ScriptFrom 详解 BY 江正军

Smart Forms

Smart Forms是在SAPScript的基础上产生的一种新的表单制作方式,它完全兼容SAPScript。但Smart Forms 更独立,且使用起来更加方便,可以创建FORM的同时,生成该表单对应的功能块(Function Module),从而为FORM和ABAP程序的交互提供参数接口

 

在中文环境下创建的Form,一般只在中文环境下打开来编辑,在英文环境中中文文本节点可能显示不出

 

事务码:SMARTFORMS

image001

Form:表单版式            

Style:文本样式            

Text Module:文本模块

 

一个FORM往往是由页面(PAGES)、输出区域(OUTPUT AREAS即WINDOWS)、地址栏(ADRESS)、图形(GRAPHICS,比如公司LOGO)、数据(DATA)、以及文本内容(TEXT)组成

文本模块

Text Module:文本模块,主要用于设置一段固定的文本信息,如报表头名称,或者是报表附加条款说明等信息。

image002

image003

像下面这此使用:

image004

 

 

节点元素

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不是一页的概念,它是指定页面的一种统称,具体输出内容由它下面子节点元素来决定,且输出内容可能会产生多页

image005

每Page页面除了通过Next Pag静态属性来设置下一页外,还可以在通过COMMAND节点的Go to New Page属性来设置,当然,这种页面跳转是有条件的,所以COMMAND一般放在CONDITION条件节点里使用:

image006

窗口元素

页面中的包含主窗口(Main Windows)和子窗口(Secondary Windows),其中,主窗口中的数据可以在多个打印页面中可连续输出,即可跨页面(分页显示)。每个页面(PAGE)中只能包含一个主窗口,但可以有多个子窗口(分页情况下,子窗口应该在每页上都会显示,就是页眉页脚一样)。

一个FORM中只能定义一个主窗体;

不同PAGE上的主窗体必须宽度相同,但是高度可以不同;

一个没有主窗体的PAGE指向的下一个页面不能为它自己。

 

窗口中的模板的宽度与高度不要超过了窗口的高度与宽度,否则显示不出

另外,表格式的宽度也不能比窗口的宽,否则编译时出错:image007

image008

文本节点

一般使用文本节点在已经定义的窗口中添加各种类型的文本元素,唯一的例外是地址类型的文本元素也可以通过Address节点来添加。SAP Smart Form中含下列类型的文本:

①文本元素:使用Smart Form中的PC Editor在Form创建过程中编辑的新文本。

②文本模块:独立于Smart Form,可以直接添加至Form,或参照文本模块生成Form文本元素。

③包含文本:已经插入设计好的SAPScript标准文本(在SO10中创建,可通过SE75查找),体现了二者之间的兼容性。

 

可以把一个文本节点直接添加到下列各种类型的节点下:

1、 主窗口(Main Window):文本可能在多页中连续输出

2、 子窗口(Secondary Window):将文本确切定义在指定页中

3、 表格节点(Table):用于显示表格的内容

4、 模板节点(Template):把文本定义在静态表格的单元格中

5、 标题(Header)和脚注(Footer):用于显示表格中总计数据等

6、 事件(Event)节点:用于显示表格的小计数据

image009

有以下系统字段可以直接引用

image010image011

&SFSY-FORMPAGES&:返回Form中的总页数,在一些报表中可能会出现总页数为“*”号的问题,可以考虑使用参数压缩输出字符串,例如:&SFSY-FORMPAGES(3CZ)&

&SFSY-WINDOWNAME&:返回当前窗口的名称 image012

&SFSY-PAGENAME&:返回当前页的名称image013

&SFSY-PAGEBREAK&:触发分页后该字段被赋值为 X

图形节点SE78

图开节点中的图片可以直接使用服务器上已有的图片,或者通过事务代码SE78先将本地图片上传到SAP服务器后再使用:

image014

模板节点

模板节点比表格节点要灵活,模板单元格中可以存储图片节点,可以显示图片,而不是只文本节点,另外,模板节点设置出的表格的行高是可以设置的,但表格节点是不能进行设置的。

image015

 

所有单元格的总宽度一定要等于事个模板的宽度,否则编辑出错

image016

行定义中的“From”和“To”选项用于指定当前的设置应用于哪些行,行号的起始值为1,且行号不能出现间隔与重复。可以通过指定“Reference”的值将其他行的设置应用到当前行,指定引用号后,系统将自动拷贝该行的行高和列宽等设置到当前行

将文本等节点输出到模板指定的单元格位置:

image017

 

注意边框线的宽度:默认为15TW。在实际工作中建议设置为20TW,用来适应针式打印机,激光打印机,喷墨打印机等。

边框宽度:因为在实际工作中所使用的打印机不一样,导致有的边框线条打印不出来,所以建议设计成20TW(为临界值)

image018

地址节点

地址是经常出现在各种信函中的文本,在SAPScript中,它是文本元素的一部分。通过地址的好处是保证地址是根据发信人国家的书写规范输出,使用地址节点有一个前提条件,即该用户必须具有SAP CAA的管理员权限,否则只有通过文本节点进行地址添加

样式

image019

image020

 

image021

“表头数据”是用来设置默认的字体及段落格式,其主要属性包括如下内容:

image022

创建新的“段落格式”与“字符格式”时,名称最长不能超过两位

SAP中的字体并非从当前操作系统的字体库所取,除了一些默认的字体外,其他类型的主题还需要在SAP中额外安装,通过SE73可以实现对字段基本属性的维护

image023

通过“字符格式”还可以指定字段样式外,还可以定义成条形码:

image024

小技巧:查看Form生成的函数

在设计好一个 smartform 后,系统会自动生成一个相对应的 function module , 我们在调用smartform时实际上就是调用这个对应的 function

如下我们可以找到对应的function: 点击菜单环境->功能模块名

image025

image026

注意:程序调用Smart Form的时候,一定要用CALL FUNCTION  ' SSF_FUNCTION_MODULE_NAME '先根据Smart Form名称得到它的函数名称fm_name。然后再  CALL FUNCTION fm_name调用Smart Form。因为Smart Form的fm_name可以重新分配,是个不固定值

SmartForm强制分页(抬头、项目表都显示)

一、如果是模板,强制分页命令要放在循环中;

二、如果是表格,强制分页命令要放在表的主要区域循环中,而不能放在表头部分。

 

强制分页可以控制每页固定显示的数据条数

 

SmartForm设计:

image027

image028

image029

image030  

image031

image032

image033

*该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命令使用,这样不管是否错行读取,最后一行标示都会被正确使用ifgw_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.
image034
image035
image036

SmartForm源码:

在中文环境下导入image037

主调程序:

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.                

image038

image039

image040

打印参数控制

  DATA:lf_fm_name TYPE rs38l_fnam.
  DATA:l_output_options TYPE ssfcompop.
  DATA:l_control_parameters TYPE ssfctrlop.
  DATA:l_job_output_options TYPE ssfcresop.
  "********设置打印对话框中的参数
"打印对话框中的参数可以与l_output_options 结构中的相关字段对应
  l_output_options-tddest = 'LP01'."打印设备
  l_output_options-tdpageslct = '1,2,4'."打印哪几页,多页使用逗号分隔
  l_output_options-tdnoprev = 'X'."隐藏打印预览按钮
  "********控制打印对话框显示与否,及直接打印预览方式输出
  l_control_parameters-no_dialog = 'X'."打印前不显示打印设置对话框
  l_control_parameters-preview = 'X'."而是直接显示预览结果

  "***********调用SMARTFORM程序生成函数
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname = 'YJZJ_SMARTFORM_CONTROL_PAGING'
    IMPORTING
      fm_name  = lf_fm_name.

  "***********动态调用新生成的函数
  CALL FUNCTION lf_fm_name
    EXPORTING
      output_options     = l_output_options
      control_parameters = l_control_parameters
    IMPORTING      "获取打印对话框中用户选择、输入、操作的结果:如判断用户在
                "打印对话框中点击的是打印预览还是点击的直接打印
      job_output_options = l_job_output_options.
  IF l_job_output_options-tdpreview = 'X'. "有些开发需求中需要控制报表的打印次数,可以通过该方法来统计操作结果,将打印记录累加后存放于系统中,作为重复打印控制的依据。
    WRITE :'打印预览模式'.
  ELSE.
    WRITE:'直接打印模式'.
  ENDIF.

image041

一次性输出多张报表

有时候可能需要一次性打印多张不同的报表,直接调用SmartForms时,每次打印一张后报表后,会在循环中反复出现打印对话框,影响程序执行效率。SAP打印控制提供了假脱机功能,允许将多张需要打印的报表缓存,最的再一次性提交打印请求。

FORM callsmartform .
  DATA:lf_fm_name TYPE rs38l_fnam.
  DATA:l_control_parameters TYPE ssfctrlop.
  DO 3 TIMES.
    CASE sy-index .
      WHEN 1.
        l_control_parameters-no_open = space."首次运行时打开打印对话框
        l_control_parameters-no_close = 'X'."并且不关闭假脱机请求
      WHEN 2.
        l_control_parameters-no_open = 'X'.
        l_control_parameters-no_close = 'X'."
      WHEN 3.
        l_control_parameters-no_open = 'X'.
        l_control_parameters-no_close = space."最后关闭假脱机准备打印
    ENDCASE.


    "***********调用SMARTFORM程序生成函数
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname = 'YJZJ_SMARTFORM_CONTROL_PAGING'
      IMPORTING
        fm_name  = lf_fm_name.

    "***********动态调用新生成的函数
    CALL FUNCTION lf_fm_name
      EXPORTING
        control_parameters = l_control_parameters.
  ENDDO.
ENDFORM.

SmartForm转PDF乱码问题

 如果将SmartForm输出为PDF文件时,可能会出现乱码,则使用SPAD(假脱机管理工具)设置打印设备的设备类型,设置为以CN开头的设备类型即可,然后在程序中使用这个LP01打印设备

image042

定义打印机纸张类型

关于打印纸张的定义,在国际上有很多通用的标准,如A5、A5等,这些通用的格式一般在Windows和SAP中都默认加载。但是,在实际应用中,经常会碰到一些不规范的纸张,对于这些非通用纸张,就需要用户在系统中自己定义相关的纸张格式了。

1、 通过SPAD假脱机管理工具中的“设备类型->页格式”可以自定义纸张,打开“设备类型”页签,在“页格式”字段中输入自定义名称,然后点击后面的“显示”按钮,显示“页面格式清单”页面,再点击“编辑”即可创建新的纸张:

image043

2、 上面定义的纸张,下面再定义“格式类型”,“页格式”选择上面定义的ZF_PAGE,“类型”选择 S SAPscript的格式类型,这样就可以在SmartForm中进行调用了,如果是ALV,则要选择 L ABAP列表的格式类型:

image044

定义好页格式和格式类型的,则需要将页格式(即纸张)分配到指定的设备类型。SAP的假脱机操作中是需要指定输出设备的,而每个输出设备需要设定设备类型。所以当打印时,只有属于该打印设备的页格式才能被操作。若没有维护的话,预览不会存在问题,但在选择打印时,系统提示错误。

目前对中文输出所使用的设备类型大部分都默认为“CNSAPWIN”,在“设备类型”中输入“CNSAPWIN”,再点击“显示”,出现以下界面:

image045

点击image046,将列出该设备所支持的所有格式类型:

image047

输入“格式化”名称(注:这里输入的其实是上面创建的“格式类型”,而不是“页格式(即纸张)”),确认后如下:

image048

需要对打印机操作维护基本的指令,没维护指令时,操作该类型的报表数据可能会出现打印机不切纸或者不执行打印问题。需维护的指令和打印机的驱动存在关系,可以参照CNSAPWIN下已经维护好的格式类型来维护。

以SAP标准的A4纸张(DINA4)为例,一般需要维护操作包括:打印初始化、尾页、行结束,如:

image049

最后就可以在SmartForm编辑器里选择上面自定义的“页格式(纸张)”了:

image050

Table节点循环问题

虽然表头、主要区域、脚标三者都在 %TABLE1表里,但是只对主要区域节点进行循环,表头、脚标在每一页中只执行一次,所以,表头节点里实质上还没有开始对GT_HEAD内表进行循环,所以在表头节点里是不能访问到GW_HEAD工作区的数据的,因此,如果像下面那样在表头节点里读取到GT_HEAD中的数据,只能像这样手动根据head_index(该变量会在主要区域节点的某代码片断里进行赋值处理,即在每一个小分类处理完后,head_index设置为下一小分类,即GT_HEAD下一条数据)来读取了(其实还会在主要区域节点里对GT_HEAD再读取一次,这里为了提前读取到数据,所以只能在表头里手动读取了)

image051

ScriptForm转PDF并发送邮件

 (转PDF应该还可以使用此函数:SX_OBJECT_CONVERT_OTF_PDF

data: gt_otfdata  like itcoo occurs 0 with header line.

 以动态的方式获取ScriptForm数据(没有试过,可能获取不到):

field-symbols: <fs> type any.
    data: l_tab_otfdata(30) value '(SAPLSTXC)OTF[]'.
    assign (l_tab_otfdata) to <fs>.
    if sy-subrc = 0.
      gt_otfdata[] = <fs>.
    endif.

如果上面这种方式取不到Form表单数据,则可以在CLOSEForm时得到:

  call function 'CLOSE_FORM'
    importing
      result  = result
    tables
      otfdata = gt_otfdata
    exceptions      
      others  = 1. 

CLOSE_FORM 的otfdata  作用:当调用PRINT_TEXT 或者 OPEN_FORM时,如果参数OPTIONS(结构类型为ITCPO)中的字段TDGETOTF值为'X' 时,将会通过参数OTFDATA以OTF的格式输出,在这种情况下,打印输出、屏幕显示、传真将不会被执行。

    itcpo-tdnoprint  = ' '.No printing from print preview
    itcpo-tdnoprev   = 'X'.No print preview
    itcpo-tdgetotf = 'X'.Return of OTF table. No printing, display, or faxing

下面开始将ScriptForm数据转换成PDF格式的数据:

data: binfilesize type i.

data: i_tline type table of tline with header line,

* convert OTF to PDF
  call function 'CONVERT_OTF'
    exporting
      format                = 'PDF'
    importing
      bin_filesize          = binfilesize
    tables
      otf                   = gt_otfdata
      lines                 = i_tline
    exceptions
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      others                = 5.

经过上面的PDF的转换,我们就可以将以上的PDF格式的数据直接存储到文本中(此时下载或写入文件时需要以二进制的方式进行传输),这个文本就是PDF。但如果还需要将这个PDF以附件的形式发送邮件,则还需要下一步转换(其实就是将两列的i_tline内表合并成一列的内表i_objbin):

 data:i_objbin  like solisti1 occurs 0 with header line.

call function 'QCE1_CONVERT'
      tables
        t_source_tab         = i_tline
        t_target_tab         = i_objbin
      exceptions
        convert_not_possible = 1
        others               = 2.

最后以附件的形式将i_objbin发送出去

SmartForm转PDF

  DATA: job_output_options TYPE ssfcresop.
  DATA: ls_output  TYPE ssfcrescl.
  DATA: lt_lines TYPE TABLE OF tline WITH HEADER LINE,
        lt_docs TYPE TABLE OF docs WITH HEADER LINE,
        t_otfdata TYPE ssfcrescl,
        t_pdf_tab LIKE tline OCCURS 0 WITH HEADER LINE, " SAPscript: Text Lines
        t_otf TYPE itcoo OCCURS 0 WITH HEADER LINE.     " OTF Structure

  DATA: lv_filesize TYPE i.

DATA: control_parameters TYPE ssfctrlop,
  output_options     TYPE ssfcompop.
  control_parameters-no_dialog = 'X'. 
  control_parameters-getotf    = 'X'.

*output_options用来设置打印参数弹出对话框中的值
output_options-tddest = 'LP01'. "设备名称 

......
  CALL FUNCTION fm_name
    EXPORTING
      control_parameters = control_parameters
      output_options     = output_options
    IMPORTING                                          "convert pof user 3
      job_output_info    = ls_output
      job_output_options = job_output_options
    TABLES
      gt_ekko            = gt_ekko
      gt_ekpo            = gt_ekpo
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
    IMPORTING
      bin_filesize          = lv_filesize
    TABLES
      otf                   = ls_output-otfdata
      lines                 = lt_lines
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      OTHERS                = 5.
*"还可以使用下面的CONVERT_OTF_2_PDF函数来替代上面CONVERT_OTF函数
*  DATA:it_docs TYPE STANDARD TABLE OF docs.
*  CALL FUNCTION '
CONVERT_OTF_2_PDF'
*    IMPORTING
*      bin_filesize   = lv_filesize
*    TABLES
*      otf            = ls_output-otfdata
*      doctab_archive = it_docs
*      lines          = lt_lines.


  g_path = 'C:\temp\test2.pdf'.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
       bin_filesize        = lv_filesize
      filename              = g_path
      "write_field_separator = cl_abap_char_utilities=>horizontal_tab
*      confirm_overwrite     = c_char_x

      filetype              = 'BIN'
      "codepage              = '8400'
    TABLES
      data_tab              = lt_lines.

image052

Smartform中多套页面之间的跳转(强制分页)

现在的SR是在当前Form上基础之上加上第三套页面,目前有两套了:

image053

每个页中都需要有Main窗体,并且每个页而中的Main窗体都是一样的(每个页中的其他页窗体可有可无,也可不同)。从上图看,虽然FIRST页里的Main窗体中有强制分页命令,但此分页命令不一定在FIRST页显示后立刻执行(多页情况下),而是要等到前面的ITEM内表显示完后才执行

整体页面走向如下:

image054

每套页面之间使用强制分页,而每套页面里是自动分页的。

 

表格不能再套表格,但表格中还可以套循环(列中也可以套循环,如长文本多行输出)

image055

 

在Samrtform中,最好不要通过拷贝的方式来创建Page、Window、Template,这里的拷贝就像程序里的引用一样,修改或删除时会影响其他

 

SMARTFORM中定义内表:

image056

smartform输出格式(输入类型)设置

image057

 

Syntax

说明

&field+<offset>&

对于字符变量设置从何位置显示数据,如果offset大于字符变量长度时,系统就不会显示任何数据

&field(<length>)&

设置输出长度.

&field(*)&

如果该字段类型是abap数据字典里定义的类型,系统将按照字典定义的长度设置输出长度

&field(S)&

禁止输出符号位

&field(<)&

符号位显示在数据的左边

&field(.<nat.number>)&

设置显示小数的位数

&field(E<nat.number>)&

设置为科学标示法

&field(T)&

禁止千分位的显示(适用于: DECCURRINTQUAN几种数据类型).

&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 = ' '

image058

修改Smartform对象所在的包

image059

ScriptForm导出与导入、拷贝

通过系统提供的报表程序:RSTXSCRP

image060

 

如果是在同一机器上,直接通过拷贝比较方便:

image061

ScriptForm中调用Form

image062

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.

image063

在程序中改变ScriptForm的起始页

调用START_FORM函数,通过STARTPAGE可以指定起始页,这样可以跳过SE71中设置的页面跳转流。

为ScriptForm增加后继页面

目前有这样一个需求:需要在当前已经做好的ScriptForm最后加上三个条款页面。这里我先创建三个新的页面“ZLAST1、ZLAST2、ZLAST3”,但不能简单的将NEXT页的NextPage属性修改成指向ZLAST1新增的页面,因为这里的NEXT页是用来做分来使用的,这会导致分页出问题。正确的做法参考下面:

(下图中FIRST与NEXT是修改前版本就有了的:)

image064

(MAIN窗体被各个窗体共享使用)

image065

image066

image067

image068

image069

(先在MAIN窗体脚本中写上跳转新增页面的脚本命令,每个新增页面都需要写)

image070

(然后在打印程序中调用这些Element,调用的地方为MAIN窗体中最后一个Element调用之后,这里为END_VALUES)

image071

 

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:

image072

Click on the editor button. The following editor appears:

image073

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)

image074

The following screen appears:

image075

If you would like to use MS Word Editor in both Script and Smartforms, then check the both checkboxes as shown below:

image076

Click on Activate.

The following popup appears (related to SAPScript Editor):

image077

Click on Yes. Now the following popup appears (related to Smartforms Editor):

image078

Click on Yes to proceed.

Now the MS Word editor is available for both SAP Script and Smartforms.

Result: In the SmartForms:   

image079

In SAP Script:

image080

You can anyti me revert to old editor by deactivation MS Word editor option using the transaction I18N.

 

注:如果在使用I18N时,出现以下问题时:

image081

出现这种情况,大家可以在SE38中运行RSCPSETEDITOR,勾掉SMARTFORMS和SAPSCRIPT前面的勾就可以了!
激活后SMARTFORM中的文本编辑器就改为SAP默认的了!

image082

 

原文出自  江正军 技术博客,博客链接: www.cnblogs.com/jiangzhengjun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值