【转载】实现SmartForms的分页打印

1. 创建 SmartForms 程序

表格属性与接口不在这里设置,因为传输数据通过内存地址来传输,不需要建立结构。直接定义全局变量:

计算机生成了可选文字: 表格描述活动的履左单打丽物料)全局盆据类型字段符号初始化1)格式化程序货币了数量字段….冈回同陌图匡{{葫一.且一.且一.且一.且一.且变里名称GTHEOUT55HEOUTGTITOUTGSITOUT盯ABLANKS16BLANKSGCOLNTGCURRLINEGTOTALLINESGCURRpAGE口TOTALPAGETypeaS翔nn祀ntTYPESTANDARDTYpETYpESTANDARDTYPETYpETYpESTANDARDTYpETYpETYPETYpETYPE参考打印ITABHEOUTITABHEOUTITABITOUTITABITOUTITABITOUTITABITOUT缺省值用于数据传输的表和空白填充表变最用于后面的分灭统计

  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                    "一个凭证的总页码

全局变量类型的定义

计算机生成了可选文字: 表格描述Yol)!活动的一途通丝坦/类型字段符号初始化·格式化程序货币/数量字段性老产毕号乍气亿拜号‘汀勇扮群藏逻‘加又葵,气厂卓赏女口舫哪极差雳成时编号’汀勇霖灾日筋口口-Z:,re,R口pnkU丫一nUr亡In}1mntU11朴胜a51上8pAgrg一一M一一yVVVyrl亡几T亡几r几r几UU材入UUUaa‘几aaa-CCMCCCT口L口L口公【匕口』口』UD胜o.n人0.0.0..0杆1针,l针1针1针,一l二卫一l盯L1111工JU口』0H一Z亡LBTe丫一gmpUU‘几n'IJ}1nUr一1rLntf叭mntnD下二U1Aa51.It8pMgrg}I盯压下孟0:U.5NO盯』,且O.G』UV皿口』r浅r甲B盯L曰―…曰TYPES:BEGINOFITABITOUT,aufnrTYPEresbaufnr,rsnumTYPEresbrsnu口,rsposTYPEresbrspos,bdongTYPEresbbdmng,.atnrTYPEresboatnr,MAKTXLIKEMAKTMAKTXITABITOUT.尸全产牢号,舫留/相关雳求的编号口舫留/祖关霖灾功顶目编号口篇求尝童,物洲兮,夕物群淄述犷万丈莽少ENDOF19]。月1lj6lto乃O口nIQ山qJ'4二J〔b,'RQ〕〔书.二..二..二‘.1,.1心.1'.1嘴.1..1,.二、圈目圈

与程序中的内表结构一直

全局变量——初始化设置

实现SmartForms的分页打印 - 闲云如梦 - 闲云如梦

进行数据传输的定义,并计算内表IT的行数据,

至此,我们已经得到了表头和明细这2个内表的数据,下面准备画报表并输出数据。

2.表布局的逻辑结构

在SmartForm中,只有窗口类型为“主窗口”的窗口,才能被循环。例如,在最前面的样表中,明细数据有20条,不能在一页中打印输出完毕,需要输出4页才能打印完一张单据的数据,在这4张单据中,表头和表尾是不变的,但是表中间部分数据却是变化的,中间这个窗口需要被循环输出4次。因此需要将这个窗口类型设定为“主窗口”。在本例中为现实明细数据的这部分。

“窗口1”:从表最上面到明细栏的标题栏(包括标题栏)

计算机生成了可选文字: ,。演和窗口------------------------------一,自PAGEI新页面,叻队IN主窗口,0LoOPI表头循环,0LO0p4计算单个凭证总页面·亏cooE4累计单个凭证的行项目数·常cooEI初始化行记录数,0LOOpZ循环明细·亏cooEZ行记录数加1,目丁EMpLATEI明细数据·欧TDCr4物料描述·欧TEXT3数呈·留TExTZ物料编码·留TExTI项目·毯cooES计算页面·tcooE3计算空行,0Loop3补充打印空行,目丁EMpLA丁EZ空数据明细,自coNorrloNI分页卜口TRUE卜斌FA匕E,叻wINoowl表头,目TEMpLATE3表头·留%TExT4新文本4,留%TEXT3物料编码·留%丁以丁2订单编码·留%丁以丁1订单

注意,我将输出表头的窗口“windows1 表头”放在了输出明细数据的窗口“主窗口”的下面,这是必须的,因为表头中的数据需要从表头内表GT_HE_ITAB中。loop1是循环内表GT_HE_ITAB,将数据放到表头工作区GS_HE_ITAB中。所以,windows1 页头窗口就可以直接使用工作区GS_HE_ITAB中的数据。如果该窗口放在了主窗口的前面,那么至少第一页中表头会没有数据,而且后面每一页的表头显示的都是下一个表头的内容。

注:虽然打印机输出时,先打印WINDOWS1 页头,再打印MAIN主窗口,最后打印WINDOW2页尾窗口,但是程序执行时,却是按照上图中树结构从上到下进行处理的,是先处理MAIN主窗口,其次WINDOWS1 页头,最后WINDOW2页尾窗口的逻辑顺序。

下面详细介绍整个逻辑流程和代码:

1.LOOP1表头循环

计算机生成了可选文字: 循环描述瓜而汀-!表头循环/蔽藉。计算事件输出选项·条筐LOOp循环GT--H,u叶O到HEOUT行0

作用:循环表头内表中的数据,每次打印一个凭证的行项目数据。由于内表在这里不能用,因此将每个表头数据放置到工作区。

2.LOOP4CODE4

计算机生成了可选文字: 叻以IN主窗口,0LOOpl衷失循环渔一琴些吐鲤丝赁醚塑.一.一...与整rnnF4眼什单个传征的行而日扮考co0EI初始化行记录数

计算机生成了可选文字: 循环描述L00P4计算单个凭证总页面.摇r计算盯事件丫翰出选项厂蔚「LOOp循环OUT0万一标丽一川1行葫WHE眨资1父名称AUFNR条1团

计算机生成了可选文字: 程序行描述CODE4“奋般属性窿亘二组一「J{输入参数G_COUNTI输出参数:4卜4卜4卜Cf(I[\1’川\1

作用获取明细表有多少条数据,先loop符合条件的明细表,对这个表的数据计算有多少条行数据

3.CODE1初始化行记录并计算一张凭证的页数

计算机生成了可选文字: 程序行描述CODEI初始化产属,~-「J{输入参数G_ToTALPAGE}GCOUNT(几丁日丁以}’、}通‘‘曰月0工tRlg汽U心.1口乙久弓.二名.二书.二侣..富GTOTALPAGE二GCOUNTMOD8.曰1FGTOTALPAGE二0.GTOTALpAGEELSE.GTOTALPAGEENDIF.二GCOUNTDIV8.二GCOUNTDIVS+GCOUNT二0.

loop4得到的行数据作为判断计算出一张凭证(表头+明细)有几页

4.loop2循环明细数据

计算机生成了可选文字: 0LoOPZ循环明细COOEZ行记录数加1下EMpLATEI明细数据考目TEXT4物料描述TEXT3数呈TEXTZ物料编码TEXTI项目留留留留亏co0ES计算页面玄co0E3计算空行

计算机生成了可选文字: 循环描述!毛ooPZl循环明细少自函喊计算{事件输出选项条件LOOp循环C丁0仃OUT勺rGS耳OUT行{到团.漂纷”·马户]AUFNR圃口比斗(}[支GSHEOUT一UFNR4卜

准备循环打印当前凭证的所有行项目

计算机生成了可选文字: 程序行描述!CODEZ{行记录数加1巨输入参”GCOUNTG_cuRRLINE}4卜月卜幽,「J沙招打斤一厅厅*rL成.之灭级GCOUNT二GCOUNT+1.GCURRLINE二GCURRLINE+一门J叼‘峨二曰目圆

明细模板的设置

计算机生成了可选文字: ,目TEMpLATEI明细数据·留TEXT4物料描述·欧TEXT3数最·欧TEXTZ物料编码·留TEXTI项日

这里就不做详细介绍了对应的字段

计算机生成了可选文字: 模板描述TEMPLATEI明细数据口二]钟租巫至巫宽度{16.001丽]水平对齐垂直对齐匡生一陈厂一,!10.001丽〕叮‘阎回…啄}国.〕[习二工吕一几名称LINEI参考产度月璨1·训堕塑少MZ·00CM一刊川一叫叫2.训一3.钊4二口一色至4.00CM4.00C妞6.00

这里的高度很重要

CODE5计算当前页码

计算机生成了可选文字: 程序行描述CODES…计算页面口人派厕r巨亚止一匕输入参数G_couNTIGCURRPAGE4卜,JOATA:LLINELLINETYPE二GCOUNT"OD曰1FLLINE二0IG二CURRPAGE声LSE.{G一cURRPA'ELENDIF.二GCOUNT二GCOUNT/8.D1VS+}d己二d月0lts八目回国

作用:每输出一行,计算当前行所在的页码,即为当前页

5计算空行并打印空行

CODE3计算空行

实现SmartForms的分页打印 - 闲云如梦 - 闲云如梦

作用:在当前凭证的所有有效数据行打印完毕以后,还需要计算需要打印多少空行,才能刚好打印满一张纸。用计算的数量,填充内表IG_BLANKS,计算完毕以后,G_COUNT必须清0。

打印空行:

计算机生成了可选文字: 勺刁,匡彝画画通攀二二二-二卜日妇下EMPI勇TEZ空数据明细

计算机生成了可选文字: 循环苗述IL00P3!补充打印空行数据}计算事件输出选项条件LOOp循环IGBLANKS心一到,WAB【ANKSO

计算机生成了可选文字: 模饭猫述TEMPLATEZ空数据明细模板}输出选项条件宽度r16.00{圃水平对齐垂直对齐气皿00一塑」日)翼】l必】降名称LINEI巳}国{1暨1从至一样的属性}千少~‘凸一“"参考刊川…叫}8.00MM2.00C妞4.00CM4.00CM6.00

强制分页设置

计算机生成了可选文字: !自巨些压坦,彗分页,口TRUE·全今coM以NDI强制分页斌FA匕E

计算机生成了可选文字: 可选的描述,CONDIT10NI}分页画颐工砚二一一一节点条件逗噜11嘟]l巳日国]1JI扣一确定条件字段名称GCURRLINE书比较值}困】叮OTALuNES

作用:在一个凭证打印完毕以后,将要进入打印下一个凭证之前,需要分页,但是在打印完最后一个凭证的最后一页以后,却不能有分页,否则最后会多一个空行。

当上面的条件相等的时候开始转到page1重新执行一次

计算机生成了可选文字: 命令描述CO加MANDI}嘛丁骊般属性团转到新贞阅r

自动分页的条件是“MAIN主窗口”的高度被打印满了,因此一定要注意,主窗口的高度必须等于你需要的高度,不要多,也不要少,在本例中,高度为8行 x 8mm =64mm

计算机生成了可选文字: MAIN!星面于口述窗描_’般属性/…鱼且和剑生_一左边“"上边距翰出选顶}18.00门’丽宽度高度以一以奋八翻不自1.出夕乍

下面就是代码介绍:

打印预览:

计算机生成了可选文字: L附‘吵似of口0004‘印”…固归,订单10000388物料编码〕00000122〕00124000009544.000热镀锌钢板1.5*1250*2000(耐指〕0021900002551,220.000压齿螺母环保DMBM0402031一s-〕003300001018610.000后挂耳DMBMS.o吸吸.3吸71邝000004〕00001454610.000前挂耳DMBM8.044.3472邝00今扫L「.

附程序代码:

  REPORT  Z_ZJ_PP_P01.
TABLES: CAUFV,  "订单表头 PP/CO"
         afko,
        MAKT ,  "物料描述(成品)
        RESB .  "预定/相关需求

*定单物料表头
TYPES BEGIN OF gt_s_caufv,"订单表头 PP/CO
        aufnr   TYPE caufv-aufnr, "生产单号
        plnbez  TYPE caufv-plnbez,"产品料号
        MAKTX   LIKE  MAKT-MAKTX,  "订单物料描述(短文本)
        gamng   TYPE caufv-gamng,"工单数量
        rsnum   TYPE caufv-rsnum,"预留/相关需求的编号
        gltrp   TYPE caufv-gltrp,"订单需求日期
*        stlbez  TYPE caufv-stlbez,"产品料号
*        aufpl   TYPE       caufv-aufpl,"订单中工序的工艺路线号
*        werks    TYPE      caufv-werks,"订单生产工厂
*        auart    TYPE      caufv-auart,"订单类型
        END OF  gt_s_caufv.
DATA gt_caufv TYPE STANDARD TABLE OF gt_s_caufv WITH HEADER LINE.

*定单下阶物料明细
TYPES: BEGIN OF gt_s_resb,"预定/相关需求
        aufnr TYPE resb-aufnr,"生产单号
        rsnum TYPE resb-rsnum,"预留/相关需求的编号
        rspos TYPE resb-rspos,"预留/相关需求的项目编号
        bdmng TYPE resb-bdmng,"需求数量
        matnr TYPE resb-matnr,"物料号
        MAKTX LIKE  MAKT-MAKTX,"物料描述(短文本)
       END OF   gt_s_resb.
DATA gt_resb TYPE STANDARD TABLE OF gt_s_resb WITH HEADER LINE.

DATA: num TYPE i.
*查询输入界面
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.
*
*PARAMETERS:
*
*  p_mybez LIKE  caufv-plnbez .            "成品编码

SELECT-OPTIONS:

  p_aufnr FOR afko-aufnr OBLIGATORY .       "生产单号


SELECTION-SCREEN END OF BLOCK block1.


START-OF-SELECTION.

PERFORM GET_DATA.
  DESCRIBE TABLE  gt_caufv LINES num.
  IF num NE 0.
    PERFORM FRM_PRINT_SELECTED.
  ENDIF.
  IF num EQ 0.
    MESSAGE '没有符合条件的数据 ' TYPE 'I'.

  ENDIF.



FORM GET_DATA.
*获取产品物料数据
 SELECT
   CAUFV~aufnr
   CAUFV~plnbez
   MAKT~MAKTX
   CAUFV~gamng
   CAUFV~rsnum
   CAUFV~gltrp
   INTO CORRESPONDING FIELDS OF TABLE gt_caufv
   FROM  CAUFV
   INNER JOIN MAKT ON  CAUFV~plnbez  =  MAKT~MATNR
   WHERE aufnr IN p_aufnr.
*获取定单下阶物料明细数据
  SELECT
   resb~aufnr
   resb~rsnum
   resb~rspos
   resb~bdmng
   resb~matnr
   MAKT~MAKTX
   INTO CORRESPONDING FIELDS OF TABLE gt_resb
   from resb
   INNER join MAKT  ON resb~MATNR = MAKT~MATNR
   WHERE aufnr IN p_aufnr.

   SORT gt_resb BY RSPOS .


ENDFORM.


FORM FRM_PRINT_SELECTED.

 DATA: fm_name TYPE rs38l_fnam value ''.
 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname                 =  'Z_ZJ_PP_001' "SmartForms程序
   IMPORTING
        fm_name            = fm_name
   EXCEPTIONS
        no_form            = 1
        no_function_module = 2
        OTHERS             3.


   CALL FUNCTION fm_name

  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.

 ENDFORM.

 

最后也非常感谢学无止境的博主分享经典smartForms教材:http://www.cnblogs.com/zhumk/archive/2005/06/04/167904.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值