凡尘clsoho™的博客

E-mail & MSN: clsoho@hotmail.com
QQ1超级群: <101817641已满> QQ2群:<110722895已满>
QQ3超级群:<23765855>QQ4超级群:<85338969>

SAP smartforms的使用前面的也写了一些。但是都是比较笼统的理解,讲解的也不够详细深入。这里再做一些补充,说一下详细制作form的方法。

  1.首先,对于要创建smartform实现数据打印的程序来说,第一就是对打印格式的梳理。需要用到哪些段落格式,左对齐、右对齐还是居中,还需要用到哪些字体。这是准备工作。

      输入事务码smartforms,进行打印格式的创建界面。首先完成格式的创建。选择第二项,样式,输入要创建的样式的名字,点击创建。此处以样式ztest举例。如图所示:

20100423-01

图1.

  为格式输入描述。点击段落格式,创建段落格式A1,A2,A3,格式A1为“定中心”,即“居中”,字体为“粗体”,打印中标题使用;段落格式A2为“左对齐”;段落格式A3为“右对齐”。

段落格式创建完成后创建字符格式。点击字符格式,创建字符格式B1,B2,B3,字体族全部设置为CNKAI,字体大小分别为20pt,15pt,11pt.字体颜色为黑色。B1为标题字体大小,B2为表头,B3为表体字体大小如图2.最好在边距上定为1MM,否则可能字与表格贴在一起。

20100423-02

 

图2.

至此,创建form所用到的段落格式和字体格式已经创建完了。整体结构如下图所示。

20100423-03

 

图3

下面开始创建表格。

2.接下来我们在创建好样式的基础上创建表格。

     同样是事务码smartforms,选择第一项,输入要创建的表格的名字点创建进行表格创建界面。这里是关键。需要对打印表格的整体结构进行设计。

   1).点击表格绘制器。20100423-04 右边出现表格设计窗口。这里是进行表格整体结构的设计。比较设计标题,表头,表尾等工作都是在这里完成。我们可以只使用一个MAIN窗口,也可以对表头、表尾用单独的窗口。这取决于打印需求。如果需要打印的表格要求标题和表尾在每一页都要打印,就可以创建两个窗口作为表头了表尾窗口;如果需要打印的表格要求标题只在第一页,表尾只在最后一页打印,那么只需要一个MAIN窗口就可以了。我们这里只用MAIN窗口,将标题、页头和表头都放在MAIN窗口中,另外再建立一个窗口作为打印页码的显示窗口。如图所示:

20100423-05

 

图4.

   2).整体表结构设计完成后我们开始设计表的其它部分。页头设计,包括标题,说明等等。在MAIN窗口上点击右键->创建->模板,  创建页头模板PAGE_HEAD。

20100423-06

 

双击模板,点击右边的“细节”按钮。为模板设计行列数及行高列宽。我们这里将页头分为四行,第一行为标题行内容为“测试表格”,第二行为客户内容为“测试客户”,第三行为备注内容为测试表格,第四行为期间内容为2010年2月1日 到2010年2月28日。表宽度设置为17CM。将模板的输出选项卡中的样式填为步骤1创建的样式ZTEST。将模板的条件选项卡中的以及附加事件“仅在第一页显示”前面的复选框选中,如图所示:

20100423-07

 

20100423-08

 

 图5.

     接下来在模板上创建四个文本,点击右键->创建->文本。文本分别为上面要求的文本。为文本选择段落格式和字符格式。标题为段落格式A1,居中,字符格式为B1;输出选项卡中的格式仍然选择ZTEST。依次为每个文本选择格式。页头创建完毕。然后在每个文本对应的“输出选项”选项卡中最下方的输出结构中填入要将文本显示在模板的哪一行哪一列。这里页头每行只有一列,所以每个文本的这里应该填1 1,2 1 ,3 1 ,4 1.

     接着要创建打印表的表头。同样是创建一个模板,名称为table_head,同时创建5个文本为每列显示的内容的中文说明,第一列为序号,第二列为交货单号等等。然后在每个文本对应的“输出选项”选项卡中最下方的输出结构中填入要将文本显示在模板的哪一行哪一列。这里页头每行只有一列,所以每个文本的这里应该填1 1,1 2 ,1 3 ,1 4,1 5,1 6.这个模板要在每一个新页开始的时候打开出来。

  3)创建loop 循环。在MAIN窗口上点击右键,选择创建->流逻辑->循环。然后再在loop循环上面点击右键,创建要打印的数据明细模板。类型与表头模板相同。在LOOP循环的数据选项卡中填入要打印的内表如图所示:

20100423-10

 

20100423-12

 

  4)控制打印换页。在每一页都输出表头。在LOOP循环上创建可选项,在可选项的TRUE项下创建命令,选中转到新页,NEWPAGE。在控制打印换页之前需要先判断已经输出了多少行,这是在LOOP循环下创建程序行进行行数统计的变量完成的工作,假如每页要输出40行,那么只要变量与40求余为0,就说明需要换页了。我们在命令的条件中输入条件,即变量 = 0,刚执行换页操作。

   5)下面的表尾,页尾和页码窗口就不再一一讲述了,方法与上面的大致相同,只要摸索着做就可以了。另外对于要打印的数据表否需要建立数据库表或者是把表EXPORT到ABAP内在中,然后在SMARTFORM中IMPORT,前面介绍的比较清楚,这里就不做介绍了。我觉得把取到的数据表export到内在中比建立数据库表要省时省力,推荐用这种方法。各人根据各人的爱好不同选择不同的方法。下面是表格的整体结构。

20100423-11 20100423-13

3.在程序中调用FORM

  DATA fm_name TYPE tdsfname. 定义函数名称

*调用函数生成函数名称

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

    EXPORTING

      formname           = 'ZTFORM' "这里为已创建的FOMR名

      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.

*调用FORM函数

  CALL FUNCTION fm_name

    EXPORTING

      im_zfidz         = text-mid

      user_id          = p_kunnr

      user_name        = name1

      date             = date

      date_begin       = budat-low

      date_end         = budat-high

      dmbtr_f          = dmbtr_f

    EXCEPTIONS

      formatting_error = 1

      internal_error   = 2

      send_error       = 3

      user_canceled    = 4

      OTHERS           = 5.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

posted on 2010-04-23 14:48  凡尘clsoho  阅读(13311)  评论(6编辑  收藏  举报