1. 程式人生 > >【轉載】實現SmartForms的分頁列印

【轉載】實現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.