【轉載】實現SmartForms的分頁列印
表格屬性與介面不在這裡設定,因為傳輸資料通過記憶體地址來傳輸,不需要建立結構。直接定義全域性變數:
wa_blanks type typ_items_row "空白行工作區
ig_blanks type typ_items_table "空白行內表
g_count type i "記錄一張報表的明細的記錄數量
G_CURRLINE type i "記錄所有報表共計列印了多少行,用於判斷最後一頁
G_TOTALLINES type i
G_CURRPAGE type i "一個憑證的當前頁碼
G_TOTALPAGE type i "一個憑證的總頁碼
全域性變數型別的定義
與程式中的內表結構一直
全域性變數——初始化設定
進行資料傳輸的定義,並計算內表IT的行資料,
至此,我們已經得到了表頭和明細這2個內表的資料,下面準備畫報表並輸出資料。
2.表佈局的邏輯結構
在SmartForm中,只有視窗型別為“主視窗”的視窗,才能被迴圈。例如,在最前面的樣表中,明細資料有20條,不能在一頁中列印輸出完畢,需要輸出4頁才能列印完一張單據的資料,在這4張單據中,表頭和表尾是不變的,但是表中間部分資料卻是變化的,中間這個視窗需要被迴圈輸出4次。因此需要將這個視窗型別設定為“主視窗”。在本例中為現實明細資料的這部分。
“視窗1”:從表最上面到明細欄的標題欄(包括標題欄)
注意,我將輸出表頭的視窗“windows1 表頭”放在了輸出明細資料的視窗“主視窗”的下面,這是必須的,因為表頭中的資料需要從表頭內表GT_HE_ITAB中。loop1是迴圈內表GT_HE_ITAB,將資料放到表頭工作區GS_HE_ITAB中。所以,windows1 頁頭視窗就可以直接使用工作區GS_HE_ITAB中的資料。如果該視窗放在了主視窗的前面,那麼至少第一頁中表頭會沒有資料,而且後面每一頁的表頭顯示的都是下一個表頭的內容。
注:雖然印表機輸出時,先列印WINDOWS1 頁頭,再列印MAIN主視窗,最後列印WINDOW2頁尾視窗,但是程式執行時,卻是按照上圖中樹結構從上到下進行處理的,是先處理MAIN主視窗,其次WINDOWS1 頁頭,最後WINDOW2頁尾視窗的邏輯順序。
下面詳細介紹整個邏輯流程和程式碼:
1.LOOP1表頭迴圈
作用:迴圈表頭內表中的資料,每次列印一個憑證的行專案資料。由於內表在這裡不能用,因此將每個表頭資料放置到工作區。
2.LOOP4與CODE4
作用獲取明細表有多少條資料,先loop符合條件的明細表,對這個表的資料計算有多少條行資料
3.CODE1初始化行記錄並計算一張憑證的頁數
用loop4得到的行資料作為判斷計算出一張憑證(表頭+明細)有幾頁
4.loop2迴圈明細資料
準備迴圈列印當前憑證的所有行專案
明細模板的設定
這裡就不做詳細介紹了對應的欄位
這裡的高度很重要
CODE5計算當前頁碼
作用:每輸出一行,計算當前行所在的頁碼,即為當前頁
5計算空行並列印空行
CODE3計算空行
作用:在當前憑證的所有有效資料行列印完畢以後,還需要計算需要列印多少空行,才能剛好列印滿一張紙。用計算的數量,填充內表IG_BLANKS,計算完畢以後,G_COUNT必須清0。
列印空行:
強制分頁設定
作用:在一個憑證列印完畢以後,將要進入列印下一個憑證之前,需要分頁,但是在列印完最後一個憑證的最後一頁以後,卻不能有分頁,否則最後會多一個空行。
當上面的條件相等的時候開始轉到page1重新執行一次
自動分頁的條件是“MAIN主視窗”的高度被列印滿了,因此一定要注意,主視窗的高度必須等於你需要的高度,不要多,也不要少,在本例中,高度為8行 x 8mm =64mm
下面就是程式碼介紹:
列印預覽:
附程式程式碼:
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. |