好久没写了,趁着房间前写一下最近打印的过程,打印也是一个比较费时费眼睛的事情,需要核对数据 ,调整样式。
记录本次SMARTFORM的制作过程。事务代码:SMARTFORMS
首先了解制作出一个打印单必须的条件是什么,数据来源以及样子。
在SMARTFORMS事务码中有三个选项,表格,样式,文本模块
直接实际操作进入创建表单,创建好有三个设置,表格属性,表格接口,全局定义。
表格属性定义输出属性
表格接口有9个预定义好的参数,主要用来定义传入,传出的内表,工作区,字段等等,(功能与函数的参数定义类似,方便理解)
全局定义用来定义适用于本表单的内表,工作区,字段等,以及初始化代码(类似与写代码一开始定义全局变量的步骤以及DAILOG初始化的功能等等)。
准备工作做完了,就开始构造打印表单的格式以及数据捆绑。首先明确一个点,拿到打印单的样式,就可以自己选择怎么构造出合适的样式,怎么方便。具体操作如下:
一般会有一个默认的页面,右键可以在改页面下创建窗口,点击表格绘制器可以进行查看调整,有点像画屏。(本次创建了两个窗口一个抬头,一个主窗口)
抬头窗口就是TITLE标题的存放区域,右键可以在该窗口下面创建如下功能(解释一下本次用到的,模板就是涂黄HEAD抬头信息那个格子方块,表就是涂黄的工作内容那个样式,还有一个流逻辑中的命令,可以写代码进行数据操作可以SELECT,等等像平常代码一样进行编写出逻辑)
首先进行模板的操作,模板的大小可以自由调整,但是不能超过窗口的大小。然后就对改区域进行划分,如下图进行拆分,插入,自己尝试了才知道具体是什么效果,就这样可以调整出你需要的样式,(本次拆了两行,第一行三个格子,第二行四个)看效果图二进行对比。
调整好合适的格式之后,就是为这些格子填入内容,主要是创建文本为格子注入内容,(本次创建了7个文本,对应7个格子)H开头为文本。
图二如下
文本就是装载内容的,点开H15_1,往里面拖入字段(字段在表格绘制器左边标黄的小图标,点开就会出现在左下角,有一个问题需要设计者考虑,数据是装在工作区还是内表,这个字段是对应工作区的字段,模板中的文本只允许存在工作区带标题行的数据,也就是单条,如果存在表中,后面创建表的时候再注明。)本次往里面放了一个工作区的字段,也可以单放文字,也可以在里面加文字和字段例如姓名:XXX(姓名:LS_XX-XM),如图二。总之这个文本你填什么展示出来的就是什么,放工作区就是动态,根据工作区内容来改变,应该很好理解。
图二如下
还有一个最重要的选择就是在输出选项中的输出结构,这个行列来为这个文本选择出现的位置,因为之前设计的时候把整个区域划分成了两行,总共七个格子,必须来这为文本指定位置,如第一行,第2列(就是第一行,第二个格子)。不来这个指定就不会展示!
好了,表头已经制作完成,用到了一个模板及旗下的七个文本,构成了我的TITLE。(空白的地方就是放了接口中的字段,没填数据所以没有文字。)
接下里制作主窗口,这里用到了表结构。顾名思义就是要用内表了,来源就是接口中定义的内表,类似与LOOP循环,还可以限制要用多少行的数据,循环必须搭配一个工作区(在全局变量定义),有点像可视化代码的感觉。
继续先解释一下鉴定这个表结构我拆分了成了两行两列,仔细看第一列很细,是为了竖着放文字才这样设计,总之就是根据自己需求灵活设计。视线回到左边鉴定这张表结构,默认自带三个表头,主要区域,角标。(还是看需求来进行选择,如果你的数据都在一张内表中,完全可以只建一个表结构来完成所有设计,这个表头类似于之前创建的抬头窗口的作用。头,中,尾,一个打印表单的基本元素构成,再去看窗口,窗口我也是按着这个基本元素来建的。建了一个抬头窗口,主窗口,没用创建尾窗口,因为我不需要尾标的内容,在这个表,我都是在主要区域中进行创建文本等等操作,用不到头尾,因为头尾我另外创建好了窗口,数据也是分散在几个表中,本次思路仅代表本次情况,要灵活发挥)
说完构思,我们拆分好自己想要的格式之后,就创建表行,在主要区域右键创建, %ROW3 和 %ROW4,是创建的表行。(如果不知道是对应TYPE1 还是TYPE2,对着TYPE1双击就对跳转搭配对应的表行)如下图黑色区域双击就会跳到涂黄的%CELL6,这我就知道TYPE1对应着ROW3,且第一行第二格对应%CELL6,自然第一行第一个格子就对应%CELL4。
得到对应的位置了之后,那我根据自己需求在CELL4下面创建一个文本,竖着把文字填好。CELL6创建主要的内容。
这里还用到一个功能(条件),如果再文本中把条件填上就会出现如下面蓝色箭头,这个功能就是判断表里的这个字段,是你设定的值的话才会显示,等于IF语句功能。(这里我是跟会根据勾选框的值来判断样式,例如等于空输出■ 是 □ 否 。
本次实例用到的主要功能都在上面解释了,传入数据的接口,利用拆分设计自己想要的格式,找到对应的区域,接下里无非就是把数据和格式对好,有特殊要求就创建流逻辑命令行来写代码处理,例如,字符串操作(只想输出几个字符),数据梳理(发现缺少某些数据,或者整理数据),还是有很多的功能实际操作才能感知,每个人理解不同,我写博客还是喜欢记录一些详细的操作步骤,最后附上这次创建的最终稿。
突然想起来小技巧,可以适当增加空文本或者空的窗口,模板,来分割,或者填充出想要的格式,上图中空行就是用空的模板填充的,设计格式还有个比较的重要
的点就是下图中的(开始)的属性,有直接添加和新段落,特别是再表结构的设计中,表结构设计是按行生效的,也就是说你再某行创建好几个文本,那么就会按现货顺序排序,如果下一个文本选择属性
直接添加那么,展示的就结果就是直接跟着上一个文本的最后一个子符(就是跟在上一个文本的后面),剩下两个也就懂什么意思了,这个功能也是设计构造的一个重要点。
看到最后了,最后再来一个怎办处理打印中长文本中一个方便的想法,首先回到代码
表里的字段定义成复合结构。
types:
BEGIN OF TS_LONG_GZNR,
zwork TYPE tline_t,
END OF TS_LONG_GZNR.
然后对长文本进行处理,用过READ_TEXT这个函数的应该都很熟悉这个结构
一般长文本常用是存在STRING字符串里,列如:在一个内表中定义了STRING用来装长文本。
z06pmcl_ltxt=>text_to_ltxtab( "或其他标准 长文本
EXPORTING
iv_text = os_3025l-zbzcc
IMPORTING
et_tline = LS_GZNR-ZWORK ).
方法里面的详细代码,传出传入不用再说了吧
DATA:lt_strint TYPE string_t,
ls_tline TYPE tline,
lv_length TYPE int4,
lv_begin TYPE int4.
FIELD-SYMBOLS:<lv_string> TYPE string.
CLEAR:et_tline.
SPLIT iv_text AT cl_abap_char_utilities=>cr_lf
INTO TABLE lt_strint.
LOOP AT lt_strint ASSIGNING <lv_string>.
ls_tline-tdformat = '*'.
lv_length = strlen( <lv_string> ).
CLEAR lv_begin.
WHILE lv_length > lv_begin + 132.
ls_tline-tdline = <lv_string>+lv_begin(132).
APPEND ls_tline TO et_tline.
lv_begin = lv_begin + 132.
CLEAR ls_tline-tdformat.
ENDWHILE.
ls_tline-tdline = <lv_string>+lv_begin.
APPEND ls_tline TO et_tline.
CLEAR ls_tline-tdformat.
ENDLOOP.
想这样把字符串转换了之后,SMARTFORMS中文本可以选择动态文本,填上这个字段就可以直接输出长文本超过255的限制。