ABAP Smartform例項
Smartform網上有很詳細的例子,不過使用的版本都有點老了,有一些介面、操作不一樣。所以寫下來,特別會詳細講一些版本區別。SmartForm是sap用來設計列印單據的基於視覺化的一種技術,設計好後可以在程式裡呼叫,傳參,引數一般是內表。
smartform總的來說就3個主要步驟。1,設定表格介面,就是指定該form顯示哪個資料庫的資料;2,設計報表頭(也可以沒有),就是表單的上部分,一般用來放公司logo、日期、頁數這些資訊。 3.設計主視窗,也就是表單顯示資料的部分,主要工作就是設計表的列名和列名下面對應的表的欄位。程式呼叫時會先在資料庫中取數,然後填充到form。
事務程式碼:smartforms進入,可以去設計form的樣式,這裡就不講了,在表格處輸入一個名字建立一個表格。
進入後:
點選上方的“表格繪製器”可以顯示錶單,視覺化。在“全域性設定“->”表格介面“處定義引數ZLT_FLIGHT,關聯型別是ZLT_FLIGHT,這個是自己建立的一個數據庫表,這裡的form就是顯示zlt_flight的資料。
ZLT_FLIGHT結構如下:
在“實用程式”->“欄位列表開啟/關閉”可以開啟欄位列表,這時候可以看到zlt_flight表的欄位。
表頭設計就略過了。當我們建立了ZTEST_HXG_F3的時候,系統會預設的建立一個頁面“%PAGE 新頁面”。然後在MAIN 主視窗上點選右鍵,建立一個TABLE。
新建後系統會自動在table下建立3個專案:表頭,主要區域,腳標。
選中table,點選細節,可以設定錶行格式。這裡注意表的寬度一定要大於下面行型別的各個列加起來的寬度。行型別右邊的1,2,3這些是第一列第二列第三列,還有他們的長度單位。
然後點選“資料”,設計loop迴圈如下。就是說迴圈的讀取表資料填充到每一行裡。一般來說內部表裡第一個應該是介面定義的那個變數,第二個應該在全域性變數再定義一個。
表有多少列這些格式已經設計好了,現在來設計表頭,也就是列名。右鍵表頭->新建行。系統會自動的幫你在行下建立等量的cell(列)。
然後我們現在要為每一列新增上名字。選中第一個cell新列,右鍵新建“文字”。
如上圖,畫橫線處輸入列名,這裡注意的是第一個列的“開始“一定要選”新行“。因為第一列一開始要新起一行嘛。
接下來設定第二列的列名,同上新建文字,
這裡注意的是,“開始“處選擇直接新增意思就是接著第一列新增該文字。後面的列同理設定成直接新增。
做完了列名,接下來要設計每一列下面該顯示什麼資料了,也就是table下的”主要區域“。
和前面一樣,選中“主要區域“右鍵建立列,系統也會自動生成相應數量的cell,同理在第一個列右鍵新建文字,在右側出來的介面裡點選如下圖畫圈按鈕,選擇”一般屬性“。
出現如下圖介面,第一步和前面設定列一樣,第一個列的開始要是”新行”如圈圈1,第二部,在左下角的欄位名稱下找到ZLT_FLIGHT,將CARRID拖動到箭頭處,這樣在這列就會顯示這個欄位的值。
到了第二個列,“開始”選擇“直接新增”,拖動欄位到那片空白處。後面的列也是這樣設定。
實際上到了這裡,一個form基本完成了,但是Smartform的輸出不支援“QUAN”和”CURR”型別,這裡要轉換。這些都可以在Smartform內部實現(如果你們的欄位不是這兩個型別的,可以跳過這部分內容)。步驟如下:
1).在全域性變數增加一變數LPRICE來儲存PRICE轉換至,型別定義為字元型:CHAR18。
2)編寫程式碼,轉換引數型別。在主要區域price那一列,選擇右鍵建立—>流邏輯->程式行,建立轉換程式碼。如下圖:
到此已經建立完成,儲存,啟用,執行會生成一個funciton 模組。
在這樣我們就可以在程式中呼叫這個form了。程式碼:
*&---------------------------------------------------------------------*
*& Report ZLEARNING7_SMARTFORM
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZLEARNING7_SMARTFORM.
DATA: ZLT_FLIGHT LIKE STANDARD TABLE OF ZLT_FLIGHT WITH HEADER LINE.
DATA: L_OUTSET TYPE SSFCOMPOP.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE ZLT_FLIGHT
FROM SFLIGHT
AS A INNER JOIN SCARR AS B
ON A~CARRID = B~CARRID.
DELETE ADJACENT DUPLICATES FROM ZLT_FLIGHT.
*DATA: ctrl_param TYPE ssfctrlop,
* out_option TYPE ssfcompop.
*
*ctrl_param-preview = 'X'.
*out_option-tddest = 'LP01'. " in your case it is LOCL
*ctrl_param-no_dialog = 'X'.
L_OUTSET-TDDEST = 'CODE'.
L_OUTSET-TDIMMED = 'X'.
L_OUTSET-TDARMOD = 1.
CALL FUNCTION '/1BCDWB/SF00000026'
EXPORTING
OUTPUT_OPTIONS = L_OUTSET
USER_SETTINGS = ''
*EXPORTING
* control_parameters = ctrl_param
* output_options = out_option
* user_settings = space
TABLES
ZLT_FLIGHT = ZLT_FLIGHT.
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
執行後會彈出對話方塊,裝置輸入lp01,點選列印預覽,就可以出來結果了。還可以設定不彈出對話方塊直接預覽,方法是程式碼裡註釋掉的部分。
最後,可以通過實際的form名來實現報表的呼叫,不用smartform直接執行生成的funciton module名來呼叫。大概方法就是呼叫系統函式“SSF_FUNCTION_MODULE_NAME“來實現,這裡就不詳細敘述了。