报表要求:(见下表)
![[转载]SAP:Smartforms <wbr>学习资料收集(感谢原创) [转载]SAP:Smartforms <wbr>学习资料收集(感谢原创)](http://image80.360doc.com/DownloadImg/2014/12/1516/48099646_1) 要求: 1、不是套打,表格线也需要输出 2、每张报表打印8行记录,不足的空白行也需要输出 3、按凭证号打印单据,可以连续打印多张报表。 一、创建样式: 在创建Form之前,需要创建多种段落和字体样式,供Form中的文字使用。需要设置多种“段落格式”,并且必须在“表头数据”中设定“标准段落”
1.创建段落格式,一般有RH(Report
Header),PD(Page Header), PB(Page Bottom),LD(Line Header and
Details),字体:CNSONG,9pt。注意最好在各段落的“首行缩”中设定1mm的缩进,否则,在Form中表格线和文字之间会没有任何间隙。 2.设置“表头数据”中“标准段落” 3、保存并激活样式文件。
二、创建SmartForm
1、在“全局设置”-〉“表格属性”-〉“输出选项”中 设定“页格式”:即纸张的大小 “样式”:设定本Form使用的默认样式文件,这里指定为第一步创建的样式文件。
2、在“全局设置”-〉“表格接口”-〉“导入” 设置两个参数: ptr_header type
c ptr_items type
c 这两个参数用来传入我们在Report中Export内表数据的句柄(ID
key)。
3、在“全局设置”-〉“全局定义”中进行多项设定 a、“类型”设定,在这里需要定义4个类型,一个用来保存表头数据的工作区和内表,一个用来保存明细数据的工作区和内表,它们的结构必须与Report中Export到数据库中的内表的结构完全对应一致,否则,我们将不能从传入的句柄(ID
key)中恢复内表数据。
* 领料单抬头信息 TYPES: BEGIN OF TYP_header_ROW , mblnr LIKE mseg-mblnr, " 凭证号 bldat LIKE rkpf-rsdat, " 凭证日期 c_so(16) TYPE c, " 销售订单号 c_issdt LIKE sy-datum, " 发货日期 werks LIKE mseg-werks, " 地点 PLNAT_NAME LIKE t001w-name1, " 出货单位名称 kokrs LIKE mseg-kokrs, " 控制范围 kostl LIKE mseg-kostl, " 成本中心 cc_name LIKE cskt-ktext, " 成本中心名称名称 c_depart(45) TYPE c, " 领料部门 bwart LIKE mseg-bwart, " 移动类型代码 btext_mt LIKE t156t-btext, " 移动类型描述 c_btext_mt(60) TYPE c, " 移动类型次数 C_TOTAL(17) TYPE C, "合计输出时由用户手工填写 END OF TYP_header_ROW .
TYPES: TYP_HEADER_TABLE TYPE TYP_HEADER_ROW OCCURS 0.
* 领料单明细信息 TYPES: BEGIN OF TYP_ITEMS_ROW , mblnr LIKE mseg-mblnr, " 物料凭证编号 : 物料凭证 rsnum LIKE rkpf-rsnum, " 凭证号 : 预留单 mjahr LIKE mseg-mjahr, " 物料凭证年度 zeile LIKE mseg-zeile, " 序号 bwart LIKE mseg-bwart, " 移动类型代码 werks LIKE mseg-werks, " 地点 kokrs LIKE mseg-kokrs, " 控制范围 kostl LIKE mseg-kostl, " 成本中心 matnr LIKE mseg-matnr, " 物料号码 maktx LIKE makt-maktx, " 物料描述 erfme LIKE mseg-erfme, " 计量单位 c_planc LIKE resb-bdmng, " 计划数量(手工填写) c_outc LIKE mseg-erfmg, " 实发数量 c_count(6) TYPE c, " 件数(手工填写) lgort LIKE mseg-lgort, " 仓储地点 charg LIKE mseg-charg, " 备注 END OF TYP_ITEMS_ROW.
TYPES: TYP_ITEMS_TABLE TYPE TYP_ITEMS_ROW OCCURS 0. b、在“全局数据”中,定义全局的变量,我们需要定义如下几个变量 wa_header type
typ_header_row "表头数据工作区,由于SmartForms中的内表不能有HeaderLine,因此必须定义一个与内表结构一样的工作区
ig_header type typ_header_table "表头数据内表 wa_items type typ_items_row "表单明细工作区 ig_items type typ_items_table "表单明细内表 wa_blanks type typ_items_row "空白行工作区 ig_blanks type typ_items_table "空白行内表 g_count type i "记录一张报表的明细的记录数量 G_CURRLINE type i "记录所有报表共计打印了多少行,用于判断最后一页 G_TOTALLINES type i "记录内表ig_items总行数,用于判断最后一页 G_CURRPAGE type i "一个凭证的当前页码 G_TOTALPAGE type i "一个凭证的总页码
c、在“初始化”中,将数据句柄中的内表恢复到刚设定的全局变量中 输入参数:ptr_header,ptr_items,ig_header,ig_items,g_totallines
perform Restor_buffer using ptr_header changing ig_header. perform Restor_buffer using ptr_items changing ig_items.
DESCRIBE TABLE IG_ITEMS LINES G_TOTALLINES. d、在Freecode"格式化程序"中,定义Form Restor_buffer函数
form Restor_buffer using typeid type c changing t type table. import t from database indx(hk) id typeid. endform.
至此,我们已经得到了表头和明细这2个内表的数据,下面准备画报表并输出数据。
4、在“页和窗口”中,在“%Page1”页下,添加3个窗口 "MAIN主窗口":
在SmartForm中,只有窗口类型为“主窗口”的窗口,才能被循环。例如,在最前面的样表中,明细数据有20条,不能在一页中打印输出完毕,需要输出4页才能打印完一张单据的数据,在这4张单据中,表头和表尾是不变的,但是表中间部分数据却是变化的,中间这个窗口需要被循环输出4次。因此需要将这个窗口类型设定为“主窗口”。在本例中为现实明细数据的这部分。 “窗口1”:从表最上面到明细栏的标题栏(包括标题栏) “窗口2”:最底下2行。 注意:窗口的宽度加上遍距不能大于纸张宽度。
创建好这三个窗口,设定好窗口的宽度,高度,以及位置信息。下图是整个SmartForm的结构
![[转载]SAP:Smartforms <wbr>学习资料收集(感谢原创) [转载]SAP:Smartforms <wbr>学习资料收集(感谢原创)](http://image80.360doc.com/DownloadImg/2014/12/1516/48099646_2.jpg) ![[转载]SAP:Smartforms <wbr>学习资料收集(感谢原创) [转载]SAP:Smartforms <wbr>学习资料收集(感谢原创)](http://image80.360doc.com/DownloadImg/2014/12/1516/48099646_2.jpg)
注意,我将输出表头的窗口“%windows1
页头”放在了输出明细数据的窗口“主窗口”的下面,这是必须的,因为表头中的数据需要从表头内表ig_header中来。loop1是循环内表ig_header,将数据放到表头工作区wa_header中。因此,%windows1
页头窗口就可以直接使用工作区wa_header中的数据。如果该窗口放在了主窗口的前面,那么至少第一页中表头会没有数据,而且后面每一页的表头显示的都是下一个表头的内容。 注:虽然打印机输出时,现打印%WINDOWS1
页头,再打印MAIN主窗口,最后打印%WINDOW2页尾窗口,但是程序执行时,却是按照上图中树结构从上到下进行处理的,是先处理MAIN主窗口,其次%WINDOWS1
页头,最后%WINDOW2页尾窗口的逻辑顺序,可以从跟踪SMARTFORMS程序得知。
|