Smart Form Tutorial(适用新手学习)
生活随笔
收集整理的這篇文章主要介紹了
Smart Form Tutorial(适用新手学习)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
發(fā)現(xiàn)Smart Form在ECC6中和4.6C相比改變了不少,最近重新研究了一下。help.sap.com上的文檔基本上是針對新特性的,不過例子卻還是舊的。做個筆記省的以后找不到最新的example。 最大的改變在Table上,現(xiàn)在table的header和footer比以前好做了。 還是用IDES自帶的SFLIGHT表做例子,先看一下打印出來的效果: Smart Form?相對SAP Script來說,系統(tǒng)給封裝了很多功能,這樣用戶在Form中的代碼寫的少了一些,更容易維護,如果把SAP Script比作匯編語言的話,Smart Form可以算上C++了,不過個人感覺對于復雜表單的設計來說,用SAP Script更容易實現(xiàn)。在Smart Form中調整表格邊線比較費勁。 1. Create a Form named 'ZBSUNTEST'
用TCode: SMARTFORMS創(chuàng)建一個空白的Form。雙擊左邊樹狀結構中的'Global Setting'->'Form Attributes'。在 里頭可以看到紙張的設置,默認是A4。這里還可以調正一頁中可以打印多少行。 2. Form Interface
我們生成一個Form的同時,系統(tǒng)也創(chuàng)建了一個相應的function module。Form與Application的數(shù)據(jù)交換就是通過function的interface來實現(xiàn)的。雙擊左邊樹狀結構中的'Global Setting'->'Form Interface',我們可以看到 ,這和我們在SE37中看到的function module的接口是一樣的。點擊'Table'這個tab,輸入如下:
3. Global Definition
這里定義的是在form中共用的全局變量,還可以定義subroutine。 是form初始化的時候調用的一個routine,可以在這里做一些data初始化的工作。 ?用來設置貨幣或者數(shù)量的單位關聯(lián)用的。
下面是'Global Data'里頭的定義:
上圖中的T_SUM類型是我在'Types'里頭定義的,其中PRICE, CURRENCY是用來做sum用的: TYPES:
? BEGIN OF T_SUM,
??? PRICE? TYPE S_PRICE,
??? CURRENCY?? TYPE S_CURRCODE,
? END OF T_SUM. 下面是Currecy & Quantity的單位關聯(lián)設置。這樣關聯(lián)之后Price會按照Currency的不同,輸出格式也不同:
? 4. Create a Style named 'Z_BSUN_TITEL01'
回過頭我們要創(chuàng)建一個給這個Form使用的Style。還是用SMARTFORMS這個TCode來創(chuàng)建。在這個Styel里頭我只創(chuàng)建了'Paragrah Format',真正的項目中'Character Format'肯定也是不可缺少的。這個Style使用在Step 1 中創(chuàng)建的Form所有的Output Option中。 M1: Aligned:left;Indent->left margin:0.20 CM;font family: Arial;font size: 12pt
M2: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 11pt
M3: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 12pt;font color:blue
T1: Aligned:center;font family: Arial;font size: 14pt;font style: Bold Italic 5.Creat a Page named 'FIRSTPG'
在 下創(chuàng)建一個名為'FIRSTPG'的page,并把它的next page設置為其本身。Page Format設置為'Portrait Format'。 6.Create Windows under 'FIRSTPG'
Windows的Position and Size如下(單位都是CM): HEADER:? L2.60, U0.20, W14.70, H2.00
MAIN: L2.00, U2.00, W16.00, H25.00
FOOTER:? L2.60, U27.20, W14.70, H2.00 7. Create Header's Text
在'HEADER' Window node下面創(chuàng)建一個Text,取名'TITLE'。Text type設置成'Text Element'。再PC Editor中點 ?輸入 。T1就是在Step 3里頭定義的Paragraph Format。 8. Create a table in 'MAIN' Window
在'MAIN' Window node下面創(chuàng)建一個Table, . Table下面自帶了三個node: header, main area, footer,顏色跟別的由用戶創(chuàng)建的node有區(qū)別。其中Table的header node下面我們可以放表頭。Table的footer node跟我們在Step 6創(chuàng)建的FOOTER Window有區(qū)別。FOOTER Window的位置是固定的,Table的footer是Table的line在哪里結束,它就緊跟在后面。文章開頭的打印結果中我們可以很直觀的看到這兩個的區(qū)別:FOOTER Window在每頁的最下面(打印了兩次,盡管內容不一樣),Table footer在第二頁中間只打印了一次。當然我們說的都是默認的情況。 9. Insert program line 'CODE_CLEAR' before 'MAIN' Window
Input Parameters:? G_TAB_DATA;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL, G_ITEMS_ONPAGE; REFRESH: G_TAB_TOTAL, G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL, G_REC_SUBTOTAL, G_ITEMS, G_ITEMS_ONPAGE.
DESCRIBE TABLE G_TAB_DATA LINES G_ITEMS. "Get total item number ?Programe Line中使用到的全局變量必須在Input/Output中定義,否則check不通過。 10. Create some line types in Table 'FLIGHTINFO'
Line Type是控制表格格式的,每一個Table Line都要指定一個Line Type
Layout如下圖,注意這些Line的border是框了線的
11. 'DATA' of Table 'FLIGHTINFO'
G_TAB_DATA是Step 2在Form Interface定義的一個內部表,也就是從Application傳過來準備給Form顯示的數(shù)據(jù)。我們還想讓顯示的數(shù)據(jù)排一下序,當然這可以在外部程序中SORT,不過這里的排序還有觸發(fā)event的作用,后面會講到。如果內部表已經(jīng)排好序了,只是想觸發(fā)類似LOOP的AT NEW/AT END OF這樣的功能,那么把 這個勾上就好。下面是SORT的設置,我們對CARRID(Airline),CONNID(Flight No.)排序,并且要觸發(fā)兩個events,用來做subtotal統(tǒng)計。
12. 'Calculation' of Table 'FLIGHTINFO'
是用來對Table的Fields做簡單計算的,包括'Number', 'Total', 'Mean Value'。如果不是涉及到貨幣或者數(shù)量的統(tǒng)計我們可以用'Total'這個Operation,具體使用可以參考help。我這里用了'Number'做一個每頁的Items統(tǒng)計,'Number'也可以用來做行號。
13. Insert a title in table header
在Table 'FLIGHTINFO'的header node下增加table line :HEADER_LINE。LINE TYPE選'Line1'。tablbe line自動帶出5個cell,cell的數(shù)目是根據(jù)LINE TYPE :'Line1'來的,Step 10里頭可以看到Line1是有5個cell的。我們在每一個cell下面添加一個Text,作為colum title,把paragraph format設置成M1。不過'Price'這個Column因為是數(shù)字,paragraph format設置成M3
P.S.Table自帶的header的Output Option->Print Time有兩個選項
at start of Table就不說了,不過at Page Break工作不正常,第2頁并沒有打印出來title,也不知道是不是我寫的問題。 14. Insert table line into table main area
Main Area是顯示Application傳進來的內部表的地方,和Step 13一樣增加一個Line Type=LINE1的Table Line,每個Cell下各增加一個Text,屬性設置成'Text Element'。
點PC Editor的 ,編輯Text內容,以CARRID為例: ? 15. Insert a Program Line Under 'DATA_LINES'
CURRENCY_DATA下的Programe Line: SUM,是為了做合計用的,按照Currecy的不同將Price合計。(當然單價Price的合計沒什么實際意義,權當是演示) Input Parameters:? G_REC_DATA, G_TAB_SUBTOTAL;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL; G_REC_TOTAL-PRICE = G_REC_DATA-PRICE.
G_REC_TOTAL-CURRENCY = G_REC_DATA-CURRENCY.
COLLECT G_REC_TOTAL INTO G_TAB_TOTAL.
COLLECT G_REC_TOTAL INTO G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL. 內部表'G_TAB_TOTAL','G_TAB_SUBTOTAL'保存的是合計和根據(jù)'Airline'進行小計的數(shù)據(jù)。 16.?Print 'Grand Total' in table footer
在table的footer node下增加一個loop node, ?。
Loop的DATA如下:
因為我只想在所有的記錄打印結束之后顯示總計,所以給這個loop增加一個condition。在Condition Tab里的Output Condition中增加一行:
G_ITEMS_ONPAGE在Step 12中被賦值Number, G_ITEM在Step 9被賦值內部表中的記錄數(shù),當這兩個值相等的時候也就是記錄輸出完畢的時候。再給loop node下一級增加一行table line,LINE TYPE : LINE3
GRANDTOTAL: M2 -> 'Grand total:'
PRICESUM_TAB: M2 -> &G_REC_TOTAL-PRICE&
CURR_TAB: M2->&G_REC_TOTAL-CURRENCY& 17. Print subtotal in table (1)
我們在Step 10里頭的Sort中勾選了CARRID字段的兩個事件之后就能夠發(fā)現(xiàn)table node 自動增加了兩個節(jié)點:
首先在'CARRID Event on Sort Begin'下一級增加一個Program Line:SUB_CLEAR,用來在CARRID改變的時候清空subtotal內部表。 Output Parameters: G_REC_SUBTOTAL; CLEAR: G_REC_SUBTOTAL.
REFRESH: G_TAB_SUBTOTAL. 然后在'CARRID Event on Sort End'下一級增加一個Program Line:CLEAR_SUBTITLE,用來清空一個打印標志。 Output Parameters: G_FLG_SUBTITLE; CLEAR: G_FLG_SUBTITLE. 每一個CARRID(Airline)下面可能會有多種不同的貨幣價格,這個標志的作用是為了限制下面的'Subtotal of &G_REC_SUBTOTAL-CARRID& is'這句話在小計的時候不至于print出來很多遍。 18. Print subtotal in table (2)
在'CARRID Event on Sort End'下一級增加一個Loop:PRINTSUBTOTAL:
Loop:PRINTSUBTOTAL:下一級增加一個table line:SUBTOTAL,LINE TYPE : LINE3
AIRLINE_NAME: M2 -> 'Subtotal of&G_REC_DATA-CARRID& is'
SUB_PRICE: M2 -> &G_REC_SUBTOTAL-PRICE&
SUB_CURR: M2->&G_REC_SUBTOTAL-CURRENCY& 其中AIRLINE_NAME是有顯示條件的:G_FLG_SUBTITLE沒有賦值的時候才顯示。
AIRLINE_NAME print出來之后我們在Program Line 'SET_SUBTITLE'中將G_FLG_SUBTITLE設置為'X'。 Output Parameters: G_FLG_SUBTITLE; G_FLG_SUBTITLE = 'X'. 19. Print 'Grand Total' in?page footer
在FOOTER Window的下一級添加一個Table Line: FTTABLE, Line Type:
DATA:
然后,在FTTABLE的Main?Area下增加一行Table Line: PRICESUM,?Line Type: LINE1?
為了控制在最后一頁的頁腳打印出來金額合計,要給PRICESUM增加一個條件。在Conditions Tab里頭的
And Additional Event中勾選'Only after end of main window'。'SUM'和'CURR'這兩個Text的設置如下: SUM: M2 -> &G_REC_TOTAL-PRICE&
CURR: M2->&G_REC_TOTAL-CURRENCY& 最后,在FTTABLE的Footer下增加一行Table Line: FOOTER,?Line Type: LINE1?
ITEMS: M2 -> ITEMS IN THIS PAGE:&G_ITEMS_ONPAGE(3)&
PAGE: M2->PAGE:&SFSY-PAGE& 20. Calling a?Smart Form from Application
生成smart form的同時系統(tǒng)會自動創(chuàng)建一個對應的funtion module,這個function的名字可以通過菜單Enviroment->Function Module Name得到。在程序中一般通過function 'SSF_FUNCTION_MODULE_NAME'來得到。下面是我們的測試這個smart form的代碼: *&---------------------------------------------------------------------*
*& Report? Z_SUN_SFORM
*&
*&---------------------------------------------------------------------* REPORT? Z_SUN_SFORM NO STANDARD PAGE HEADING LINE-SIZE 150 MESSAGE-ID ZBSUN.
************************************************************************
* D E C L A R A T I O N?? O F? I N T E R N A L??? T A B L E S
************************************************************************
DATA:
? G_TAB_OUTPUT?? TYPE STANDARD TABLE OF SFLIGHT. ************************************************************************
* D E C L A R A T I O N?? O F? V A R I A B L E S
************************************************************************
DATA:
? G_REC_OUTPUT????? TYPE SFLIGHT,
? G_REC_OPTIONS???? LIKE ITCPO,
? G_REC_RESULT????? TYPE ITCPP.
************************************************************************
* D E C L A R A T I O N?? O F? C O N S T A N T S
************************************************************************
CONSTANTS:
? G_CON_FLG_ON????? TYPE C VALUE 'X',
? G_CON_FORMNAME(8) TYPE C VALUE 'ZBSUN_01'. ************************************************************************
*??? S E L E C T I O N?? S C R E E N
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME.
SELECT-OPTIONS S_LINE FOR G_REC_OUTPUT-CARRID NO INTERVALS.
SELECT-OPTIONS S_DATE FOR G_REC_OUTPUT-FLDATE.
SELECTION-SCREEN END OF BLOCK BLOCK1. ************************************************************************
*? S T A R T - O F - S E L E C T I O N
************************************************************************
START-OF-SELECTION.
? PERFORM FRM_GET_DATA. ************************************************************************
*? E N D - O F - S E L E C T I O N
************************************************************************
END-OF-SELECTION.
? PERFORM FRM_OUTPUT. *&---------------------------------------------------------------------*
*&????? Form? FRM_GET_DATA
*&---------------------------------------------------------------------*
*?????? GET FLIGHT DATA
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
? SELECT *
??? INTO TABLE G_TAB_OUTPUT
??? FROM SFLIGHT
?? WHERE CARRID IN S_LINE
???? AND FLDATE IN S_DATE.
? IF SY-SUBRC <> 0.
??? MESSAGE E000.
*?? No data selected.
? ENDIF.
ENDFORM.??????????????????? " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&????? Form? FRM_OUTPUT
*&---------------------------------------------------------------------*
*?????? OUTPUT DATA
*----------------------------------------------------------------------*
FORM FRM_OUTPUT.
? DATA: FM_NAME TYPE RS38L_FNAM.
? CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
??? EXPORTING
????? FORMNAME???????????????? = 'ZBSUNTEST'
*???? VARIANT????????????????? = ' '
*???? DIRECT_CALL????????????? = ' '
?? IMPORTING
???? FM_NAME????????????????? = FM_NAME
*?? EXCEPTIONS
*???? NO_FORM????????????????? = 1
*???? NO_FUNCTION_MODULE?????? = 2
*???? OTHERS?????????????????? = 3
??????????? .
? IF SY-SUBRC <> 0.
*?? MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*?????????? WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
? ENDIF. ? CALL FUNCTION fm_name
*? EXPORTING
*?? ARCHIVE_INDEX =
*?? ARCHIVE_PARAMETERS =
*?? CONTROL_PARAMETERS =
*?? MAIL_APPL_OBJ =
*?? MAIL_RECIPIENT =
*?? MAIL_SENDER =
*?? OUTPUT_OPTIONS =
*?? USER_SETTINGS = 'X'
* IMPORTING
*?? DOCUMENT_OUTPUT_INFO =
*?? JOB_OUTPUT_INFO =
*?? JOB_OUTPUT_OPTIONS =
? TABLES
??? G_TAB_DATA = G_TAB_OUTPUT
? EXCEPTIONS
??? FORMATTING_ERROR = 1
??? INTERNAL_ERROR = 2
??? SEND_ERROR = 3
??? USER_CANCELED = 4
??? OTHERS = 5. IF SY-SUBRC <> 0.
*?? <error handling>
ENDIF. ENDFORM.??????????????????? " FRM_OUTPUT 到這里這個Tutorial就結束了,我們沒有用到的node還有Command, Alternative,Graphic,Complex Section等。其中Command主要用來插入分頁或者打印控制語句的;Alternative用來插入一個邏輯分支;Graphic插入圖片的;Complex Section我自己沒用過,看幫助文件說SAP不推薦使用。 在real project中的form不會有這么簡單,但是也不會脫離這些elements的組合。 ?
用TCode: SMARTFORMS創(chuàng)建一個空白的Form。雙擊左邊樹狀結構中的'Global Setting'->'Form Attributes'。在 里頭可以看到紙張的設置,默認是A4。這里還可以調正一頁中可以打印多少行。 2. Form Interface
我們生成一個Form的同時,系統(tǒng)也創(chuàng)建了一個相應的function module。Form與Application的數(shù)據(jù)交換就是通過function的interface來實現(xiàn)的。雙擊左邊樹狀結構中的'Global Setting'->'Form Interface',我們可以看到 ,這和我們在SE37中看到的function module的接口是一樣的。點擊'Table'這個tab,輸入如下:
3. Global Definition
這里定義的是在form中共用的全局變量,還可以定義subroutine。 是form初始化的時候調用的一個routine,可以在這里做一些data初始化的工作。 ?用來設置貨幣或者數(shù)量的單位關聯(lián)用的。
下面是'Global Data'里頭的定義:
上圖中的T_SUM類型是我在'Types'里頭定義的,其中PRICE, CURRENCY是用來做sum用的: TYPES:
? BEGIN OF T_SUM,
??? PRICE? TYPE S_PRICE,
??? CURRENCY?? TYPE S_CURRCODE,
? END OF T_SUM. 下面是Currecy & Quantity的單位關聯(lián)設置。這樣關聯(lián)之后Price會按照Currency的不同,輸出格式也不同:
? 4. Create a Style named 'Z_BSUN_TITEL01'
回過頭我們要創(chuàng)建一個給這個Form使用的Style。還是用SMARTFORMS這個TCode來創(chuàng)建。在這個Styel里頭我只創(chuàng)建了'Paragrah Format',真正的項目中'Character Format'肯定也是不可缺少的。這個Style使用在Step 1 中創(chuàng)建的Form所有的Output Option中。 M1: Aligned:left;Indent->left margin:0.20 CM;font family: Arial;font size: 12pt
M2: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 11pt
M3: Aligned:right;Indent->right margin:0.20 CM;font family: Arial;font size: 12pt;font color:blue
T1: Aligned:center;font family: Arial;font size: 14pt;font style: Bold Italic 5.Creat a Page named 'FIRSTPG'
在 下創(chuàng)建一個名為'FIRSTPG'的page,并把它的next page設置為其本身。Page Format設置為'Portrait Format'。 6.Create Windows under 'FIRSTPG'
Windows的Position and Size如下(單位都是CM): HEADER:? L2.60, U0.20, W14.70, H2.00
MAIN: L2.00, U2.00, W16.00, H25.00
FOOTER:? L2.60, U27.20, W14.70, H2.00 7. Create Header's Text
在'HEADER' Window node下面創(chuàng)建一個Text,取名'TITLE'。Text type設置成'Text Element'。再PC Editor中點 ?輸入 。T1就是在Step 3里頭定義的Paragraph Format。 8. Create a table in 'MAIN' Window
在'MAIN' Window node下面創(chuàng)建一個Table, . Table下面自帶了三個node: header, main area, footer,顏色跟別的由用戶創(chuàng)建的node有區(qū)別。其中Table的header node下面我們可以放表頭。Table的footer node跟我們在Step 6創(chuàng)建的FOOTER Window有區(qū)別。FOOTER Window的位置是固定的,Table的footer是Table的line在哪里結束,它就緊跟在后面。文章開頭的打印結果中我們可以很直觀的看到這兩個的區(qū)別:FOOTER Window在每頁的最下面(打印了兩次,盡管內容不一樣),Table footer在第二頁中間只打印了一次。當然我們說的都是默認的情況。 9. Insert program line 'CODE_CLEAR' before 'MAIN' Window
Input Parameters:? G_TAB_DATA;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL, G_ITEMS_ONPAGE; REFRESH: G_TAB_TOTAL, G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL, G_REC_SUBTOTAL, G_ITEMS, G_ITEMS_ONPAGE.
DESCRIBE TABLE G_TAB_DATA LINES G_ITEMS. "Get total item number ?Programe Line中使用到的全局變量必須在Input/Output中定義,否則check不通過。 10. Create some line types in Table 'FLIGHTINFO'
Line Type是控制表格格式的,每一個Table Line都要指定一個Line Type
Layout如下圖,注意這些Line的border是框了線的
11. 'DATA' of Table 'FLIGHTINFO'
G_TAB_DATA是Step 2在Form Interface定義的一個內部表,也就是從Application傳過來準備給Form顯示的數(shù)據(jù)。我們還想讓顯示的數(shù)據(jù)排一下序,當然這可以在外部程序中SORT,不過這里的排序還有觸發(fā)event的作用,后面會講到。如果內部表已經(jīng)排好序了,只是想觸發(fā)類似LOOP的AT NEW/AT END OF這樣的功能,那么把 這個勾上就好。下面是SORT的設置,我們對CARRID(Airline),CONNID(Flight No.)排序,并且要觸發(fā)兩個events,用來做subtotal統(tǒng)計。
12. 'Calculation' of Table 'FLIGHTINFO'
是用來對Table的Fields做簡單計算的,包括'Number', 'Total', 'Mean Value'。如果不是涉及到貨幣或者數(shù)量的統(tǒng)計我們可以用'Total'這個Operation,具體使用可以參考help。我這里用了'Number'做一個每頁的Items統(tǒng)計,'Number'也可以用來做行號。
13. Insert a title in table header
在Table 'FLIGHTINFO'的header node下增加table line :HEADER_LINE。LINE TYPE選'Line1'。tablbe line自動帶出5個cell,cell的數(shù)目是根據(jù)LINE TYPE :'Line1'來的,Step 10里頭可以看到Line1是有5個cell的。我們在每一個cell下面添加一個Text,作為colum title,把paragraph format設置成M1。不過'Price'這個Column因為是數(shù)字,paragraph format設置成M3
P.S.Table自帶的header的Output Option->Print Time有兩個選項
at start of Table就不說了,不過at Page Break工作不正常,第2頁并沒有打印出來title,也不知道是不是我寫的問題。 14. Insert table line into table main area
Main Area是顯示Application傳進來的內部表的地方,和Step 13一樣增加一個Line Type=LINE1的Table Line,每個Cell下各增加一個Text,屬性設置成'Text Element'。
點PC Editor的 ,編輯Text內容,以CARRID為例: ? 15. Insert a Program Line Under 'DATA_LINES'
CURRENCY_DATA下的Programe Line: SUM,是為了做合計用的,按照Currecy的不同將Price合計。(當然單價Price的合計沒什么實際意義,權當是演示) Input Parameters:? G_REC_DATA, G_TAB_SUBTOTAL;
Output Parameters: G_REC_TOTAL, G_TAB_TOTAL; G_REC_TOTAL-PRICE = G_REC_DATA-PRICE.
G_REC_TOTAL-CURRENCY = G_REC_DATA-CURRENCY.
COLLECT G_REC_TOTAL INTO G_TAB_TOTAL.
COLLECT G_REC_TOTAL INTO G_TAB_SUBTOTAL.
CLEAR: G_REC_TOTAL. 內部表'G_TAB_TOTAL','G_TAB_SUBTOTAL'保存的是合計和根據(jù)'Airline'進行小計的數(shù)據(jù)。 16.?Print 'Grand Total' in table footer
在table的footer node下增加一個loop node, ?。
Loop的DATA如下:
因為我只想在所有的記錄打印結束之后顯示總計,所以給這個loop增加一個condition。在Condition Tab里的Output Condition中增加一行:
G_ITEMS_ONPAGE在Step 12中被賦值Number, G_ITEM在Step 9被賦值內部表中的記錄數(shù),當這兩個值相等的時候也就是記錄輸出完畢的時候。再給loop node下一級增加一行table line,LINE TYPE : LINE3
GRANDTOTAL: M2 -> 'Grand total:'
PRICESUM_TAB: M2 -> &G_REC_TOTAL-PRICE&
CURR_TAB: M2->&G_REC_TOTAL-CURRENCY& 17. Print subtotal in table (1)
我們在Step 10里頭的Sort中勾選了CARRID字段的兩個事件之后就能夠發(fā)現(xiàn)table node 自動增加了兩個節(jié)點:
首先在'CARRID Event on Sort Begin'下一級增加一個Program Line:SUB_CLEAR,用來在CARRID改變的時候清空subtotal內部表。 Output Parameters: G_REC_SUBTOTAL; CLEAR: G_REC_SUBTOTAL.
REFRESH: G_TAB_SUBTOTAL. 然后在'CARRID Event on Sort End'下一級增加一個Program Line:CLEAR_SUBTITLE,用來清空一個打印標志。 Output Parameters: G_FLG_SUBTITLE; CLEAR: G_FLG_SUBTITLE. 每一個CARRID(Airline)下面可能會有多種不同的貨幣價格,這個標志的作用是為了限制下面的'Subtotal of &G_REC_SUBTOTAL-CARRID& is'這句話在小計的時候不至于print出來很多遍。 18. Print subtotal in table (2)
在'CARRID Event on Sort End'下一級增加一個Loop:PRINTSUBTOTAL:
Loop:PRINTSUBTOTAL:下一級增加一個table line:SUBTOTAL,LINE TYPE : LINE3
AIRLINE_NAME: M2 -> 'Subtotal of&G_REC_DATA-CARRID& is'
SUB_PRICE: M2 -> &G_REC_SUBTOTAL-PRICE&
SUB_CURR: M2->&G_REC_SUBTOTAL-CURRENCY& 其中AIRLINE_NAME是有顯示條件的:G_FLG_SUBTITLE沒有賦值的時候才顯示。
AIRLINE_NAME print出來之后我們在Program Line 'SET_SUBTITLE'中將G_FLG_SUBTITLE設置為'X'。 Output Parameters: G_FLG_SUBTITLE; G_FLG_SUBTITLE = 'X'. 19. Print 'Grand Total' in?page footer
在FOOTER Window的下一級添加一個Table Line: FTTABLE, Line Type:
DATA:
然后,在FTTABLE的Main?Area下增加一行Table Line: PRICESUM,?Line Type: LINE1?
為了控制在最后一頁的頁腳打印出來金額合計,要給PRICESUM增加一個條件。在Conditions Tab里頭的
And Additional Event中勾選'Only after end of main window'。'SUM'和'CURR'這兩個Text的設置如下: SUM: M2 -> &G_REC_TOTAL-PRICE&
CURR: M2->&G_REC_TOTAL-CURRENCY& 最后,在FTTABLE的Footer下增加一行Table Line: FOOTER,?Line Type: LINE1?
ITEMS: M2 -> ITEMS IN THIS PAGE:&G_ITEMS_ONPAGE(3)&
PAGE: M2->PAGE:&SFSY-PAGE& 20. Calling a?Smart Form from Application
生成smart form的同時系統(tǒng)會自動創(chuàng)建一個對應的funtion module,這個function的名字可以通過菜單Enviroment->Function Module Name得到。在程序中一般通過function 'SSF_FUNCTION_MODULE_NAME'來得到。下面是我們的測試這個smart form的代碼: *&---------------------------------------------------------------------*
*& Report? Z_SUN_SFORM
*&
*&---------------------------------------------------------------------* REPORT? Z_SUN_SFORM NO STANDARD PAGE HEADING LINE-SIZE 150 MESSAGE-ID ZBSUN.
************************************************************************
* D E C L A R A T I O N?? O F? I N T E R N A L??? T A B L E S
************************************************************************
DATA:
? G_TAB_OUTPUT?? TYPE STANDARD TABLE OF SFLIGHT. ************************************************************************
* D E C L A R A T I O N?? O F? V A R I A B L E S
************************************************************************
DATA:
? G_REC_OUTPUT????? TYPE SFLIGHT,
? G_REC_OPTIONS???? LIKE ITCPO,
? G_REC_RESULT????? TYPE ITCPP.
************************************************************************
* D E C L A R A T I O N?? O F? C O N S T A N T S
************************************************************************
CONSTANTS:
? G_CON_FLG_ON????? TYPE C VALUE 'X',
? G_CON_FORMNAME(8) TYPE C VALUE 'ZBSUN_01'. ************************************************************************
*??? S E L E C T I O N?? S C R E E N
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME.
SELECT-OPTIONS S_LINE FOR G_REC_OUTPUT-CARRID NO INTERVALS.
SELECT-OPTIONS S_DATE FOR G_REC_OUTPUT-FLDATE.
SELECTION-SCREEN END OF BLOCK BLOCK1. ************************************************************************
*? S T A R T - O F - S E L E C T I O N
************************************************************************
START-OF-SELECTION.
? PERFORM FRM_GET_DATA. ************************************************************************
*? E N D - O F - S E L E C T I O N
************************************************************************
END-OF-SELECTION.
? PERFORM FRM_OUTPUT. *&---------------------------------------------------------------------*
*&????? Form? FRM_GET_DATA
*&---------------------------------------------------------------------*
*?????? GET FLIGHT DATA
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
? SELECT *
??? INTO TABLE G_TAB_OUTPUT
??? FROM SFLIGHT
?? WHERE CARRID IN S_LINE
???? AND FLDATE IN S_DATE.
? IF SY-SUBRC <> 0.
??? MESSAGE E000.
*?? No data selected.
? ENDIF.
ENDFORM.??????????????????? " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&????? Form? FRM_OUTPUT
*&---------------------------------------------------------------------*
*?????? OUTPUT DATA
*----------------------------------------------------------------------*
FORM FRM_OUTPUT.
? DATA: FM_NAME TYPE RS38L_FNAM.
? CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
??? EXPORTING
????? FORMNAME???????????????? = 'ZBSUNTEST'
*???? VARIANT????????????????? = ' '
*???? DIRECT_CALL????????????? = ' '
?? IMPORTING
???? FM_NAME????????????????? = FM_NAME
*?? EXCEPTIONS
*???? NO_FORM????????????????? = 1
*???? NO_FUNCTION_MODULE?????? = 2
*???? OTHERS?????????????????? = 3
??????????? .
? IF SY-SUBRC <> 0.
*?? MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*?????????? WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
? ENDIF. ? CALL FUNCTION fm_name
*? EXPORTING
*?? ARCHIVE_INDEX =
*?? ARCHIVE_PARAMETERS =
*?? CONTROL_PARAMETERS =
*?? MAIL_APPL_OBJ =
*?? MAIL_RECIPIENT =
*?? MAIL_SENDER =
*?? OUTPUT_OPTIONS =
*?? USER_SETTINGS = 'X'
* IMPORTING
*?? DOCUMENT_OUTPUT_INFO =
*?? JOB_OUTPUT_INFO =
*?? JOB_OUTPUT_OPTIONS =
? TABLES
??? G_TAB_DATA = G_TAB_OUTPUT
? EXCEPTIONS
??? FORMATTING_ERROR = 1
??? INTERNAL_ERROR = 2
??? SEND_ERROR = 3
??? USER_CANCELED = 4
??? OTHERS = 5. IF SY-SUBRC <> 0.
*?? <error handling>
ENDIF. ENDFORM.??????????????????? " FRM_OUTPUT 到這里這個Tutorial就結束了,我們沒有用到的node還有Command, Alternative,Graphic,Complex Section等。其中Command主要用來插入分頁或者打印控制語句的;Alternative用來插入一個邏輯分支;Graphic插入圖片的;Complex Section我自己沒用過,看幫助文件說SAP不推薦使用。 在real project中的form不會有這么簡單,但是也不會脫離這些elements的組合。 ?
轉載于:https://www.cnblogs.com/duadu/archive/2007/07/23/6166698.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的Smart Form Tutorial(适用新手学习)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [导入]C#好书盘点【月儿原创】
- 下一篇: 察看linux内存使用情况