ABAP Smart Forms&ScriptFrom


Smart Forms&ScriptFrom

 

Smart Forms(目錄)

文本模塊

節點元素

Page節點

窗口元素

文本節點

圖形節點SE78

模板節點

地址節點

樣式

小技巧:查看Form生成的函數

SmartForm強制分頁(抬頭、項目表都顯示)

打印參數控制

一次性輸出多張報表

SmartForm轉PDF亂碼問題

定義打印機紙張類型

Table節點循環問題

ScriptForm轉PDF並發送郵件

SmartForm轉PDF

Smartform中多套頁面之間的跳轉(強制分頁)

smartform輸出格式(輸入類型)設置

修改Smartform對象所在的包

ScriptForm導出與導入、拷貝

ScriptForm中調用Form

在程序中改變ScriptForm的起始頁

為ScriptForm增加后繼頁面

Script\SmartForms使用禁用Word編輯器

Smart Forms

Smart Forms是在SAPScript的基礎上產生的一種新的表單制作方式,它完全兼容SAPScript。但Smart Forms 更獨立,且使用起來更加方便,可以創建FORM的同時,生成該表單對應的功能塊(Function Module),從而為FORM和ABAP程序的交互提供參數接口

 

在中文環境下創建的Form,一般只在中文環境下打開來編輯,在英文環境中中文文本節點可能顯示不出

 

事務碼:SMARTFORMS

 

Form:表單版式            

Style:文本樣式            

Text Module:文本模塊

 

一個FORM往往是由頁面(PAGES)、輸出區域(OUTPUT AREAS即WINDOWS)、地址欄(ADRESS)、圖形(GRAPHICS,比如公司LOGO)、數據(DATA)、以及文本內容(TEXT)組成

文本模塊

Text Module:文本模塊,主要用於設置一段固定的文本信息,如報表頭名稱,或者是報表附加條款說明等信息。

 

 

像下面這此使用:

 

 

 

節點元素

FORM中元素的輸出順序由Pages and Windows中的后繼節點結構和順序來決定,導航樹中的第一個頁節點是FORM處理的起始頁,該節點在FORM創建過程中被自動創建。

節點類型決定了節點可能的處理過程,如打印節點內容(文本、地址、圖片等)、執行節點中的語句或根據規則執行當前節點的后繼循環節點。

導航樹中的所有節點,按照從上到下的順序依次進行處理(包括“Pages and Windows”節點之間)

除開“Pages and Windows”外,其它所有節點都是可以加上執行條件屬性設置的,也就是說,只要滿足設置條件時,該節點及子節點才被處理

Page節點

每一個Form至少包含一個頁(Page)節點

Page節點為“Pages and Windows”的子節點,如果某個Page內容超出一頁,則會將其他內容輸出到Pages節點的Next Page屬性所指定頁面,即多出一頁的內容會產生分頁,一般Next Page分頁默認為自己,因為一般報表的主體內容會使用分頁,並且這些分頁排版相同,所以此種Page的Next Page不會設置成其他Page。如果報表需要有封面與封底,則需要另外添加Page這樣的節點元素

注:要注意的是,這里的Page不是一頁的概念,它是指定頁面的一種統稱,具體輸出內容由它下面子節點元素來決定,且輸出內容可能會產生多頁

 

每Page頁面除了通過Next Pag靜態屬性來設置下一頁外,還可以在通過COMMAND節點的Go to New Page屬性來設置,當然,這種頁面跳轉是有條件的,所以COMMAND一般放在CONDITION條件節點里使用:

 

窗口元素

頁面中的包含主窗口(Main Windows)和子窗口(Secondary Windows),其中,主窗口中的數據可以在多個打印頁面中可連續輸出,即可跨頁面(分頁顯示)。每個頁面(PAGE)中只能包含一個主窗口,但可以有多個子窗口(分頁情況下,子窗口應該在每頁上都會顯示,就是頁眉頁腳一樣)。

一個FORM中只能定義一個主窗體;

不同PAGE上的主窗體必須寬度相同,但是高度可以不同;

一個沒有主窗體的PAGE指向的下一個頁面不能為它自己。

 

窗口中的模板的寬度與高度不要超過了窗口的高度與寬度,否則顯示不出

另外,表格式的寬度也不能比窗口的寬,否則編譯時出錯:

 

文本節點

一般使用文本節點在已經定義的窗口中添加各種類型的文本元素,唯一的例外是地址類型的文本元素也可以通過Address節點來添加。SAP Smart Form中含下列類型的文本:

①文本元素:使用Smart Form中的PC Editor在Form創建過程中編輯的新文本。

②文本模塊:獨立於Smart Form,可以直接添加至Form,或參照文本模塊生成Form文本元素。

③包含文本:已經插入設計好的SAPScript標准文本(在SO10中創建,可通過SE75查找),體現了二者之間的兼容性。

 

可以把一個文本節點直接添加到下列各種類型的節點下:

1、 主窗口(Main Window):文本可能在多頁中連續輸出

2、 子窗口(Secondary Window):將文本確切定義在指定頁中

3、 表格節點(Table):用於顯示表格的內容

4、 模板節點(Template):把文本定義在靜態表格的單元格中

5、 標題(Header)和腳注(Footer):用於顯示表格中總計數據等

6、 事件(Event)節點:用於顯示表格的小計數據

 

有以下系統字段可以直接引用

 

&SFSY-FORMPAGES&:返回Form中的總頁數,在一些報表中可能會出現總頁數為“*”號的問題,可以考慮使用參數壓縮輸出字符串,例如:&SFSY-FORMPAGES(3CZ)&

&SFSY-WINDOWNAME&:返回當前窗口的名稱 

&SFSY-PAGENAME&:返回當前頁的名稱

&SFSY-PAGEBREAK&:觸發分頁后該字段被賦值為 X

圖形節點SE78

圖開節點中的圖片可以直接使用服務器上已有的圖片,或者通過事務代碼SE78先將本地圖片上傳到SAP服務器后再使用:

 

模板節點

模板節點比表格節點要靈活,模板單元格中可以存儲圖片節點,可以顯示圖片,而不是只文本節點,另外,模板節點設置出的表格的行高是可以設置的,但表格節點是不能進行設置的。

 

 

所有單元格的總寬度一定要等於事個模板的寬度,否則編輯出錯

 

行定義中的“From”和“To”選項用於指定當前的設置應用於哪些行,行號的起始值為1,且行號不能出現間隔與重復。可以通過指定“Reference”的值將其他行的設置應用到當前行,指定引用號后,系統將自動拷貝該行的行高和列寬等設置到當前行

將文本等節點輸出到模板指定的單元格位置:

 

 

注意邊框線的寬度:默認為15TW。在實際工作中建議設置為20TW,用來適應針式打印機,激光打印機,噴墨打印機等。

邊框寬度:因為在實際工作中所使用的打印機不一樣,導致有的邊框線條打印不出來,所以建議設計成20TW(為臨界值)。

 

地址節點

地址是經常出現在各種信函中的文本,在SAPScript中,它是文本元素的一部分。通過地址的好處是保證地址是根據發信人國家的書寫規范輸出,使用地址節點有一個前提條件,即該用戶必須具有SAP CAA的管理員權限,否則只有通過文本節點進行地址添加

樣式

 

 

 

 

“表頭數據”是用來設置默認的字體及段落格式,其主要屬性包括如下內容:

 

創建新的“段落格式”與“字符格式”時,名稱最長不能超過兩位

SAP中的字體並非從當前操作系統的字體庫所取,除了一些默認的字體外,其他類型的主題還需要在SAP中額外安裝,通過SE73可以實現對字段基本屬性的維護

 

通過“字符格式”還可以指定字段樣式外,還可以定義成條形碼:

 

小技巧:查看Form生成的函數

在設計好一個 smartform 后,系統會自動生成一個相對應的 function module , 我們在調用smartform時實際上就是調用這個對應的 function

如下我們可以找到對應的function: 點擊菜單環境->功能模塊名

 

 

注意:程序調用Smart Form的時候,一定要用CALL FUNCTION  ' SSF_FUNCTION_MODULE_NAME '先根據Smart Form名稱得到它的函數名稱fm_name。然后再  CALL FUNCTION fm_name調用Smart Form。因為Smart Form的fm_name可以重新分配,是個不固定值

SmartForm強制分頁(抬頭、項目表都顯示)

一、如果是模板,強制分頁命令要放在循環中;

二、如果是表格,強制分頁命令要放在表的主要區域循環中,而不能放在表頭部分。

 

強制分頁可以控制每頁固定顯示的數據條數

 

SmartForm設計:

 

 

 

  

 

 

*該SMARTFORMS使用了強制分布技術,這樣確保了每頁只顯示有固定的行數,但單純的使用強制分布只是解決了“接下頁(%TEXT12、)”正確顯示的問題,這樣就可以在SMARTFORMS里對每小類(每條GT_HEAD)正確的進行小計,但強制分布同時會帶來兩個問題:一是強制分頁會在在最末頁多出一個空白頁(經后其研究發現,最末多出空白頁,是由於原本在最后一頁數據輸出后,沒有對分頁命令進行控制,所以在最末而數據輸入后,再執行了一次分頁命令,而不是由於本身使用了強制分頁這項技術導致的這個問題);第二個問題是使用強制分頁后Head與Item不同步(錯行讀取問題)(經后其研究發現,該問題也不是由於本身使用了強制分頁引起的,根本的原因是由於表節點循環問題引起的,具體請參考這里)。針對多出最后一個空白頁使用了有條件(在最后一條GT_HEAD數據讀取后不再執行分頁命令AGE_COMMAND,加上分頁條件:HEAD_INDEX <= HEAD_COUNTS,HEAD_COUNTS為*GT_HEAD總條數)的強制分頁解決了該問題;針對頭Head與Iteam錯行讀取問題使用了程序手動控制頭的讀取操作,而不是使用原有系統自動遍歷方式。

"分類小計
total_amount 
total_amount + gw_item-amount.

*是否最后一行標示

"如果不在%LOOP1里強制分頁,則會有錯行問題:即在讀取到每一小分類最后一行(帶 X 的行)時,系統還是讀取下一行(也就是下一個小分類數據的第一行),但又不顯示在頁面上,這會造成每一個小分類數據小計不准確(所以如果需要在SMARTFORMS里進行小計,則一定要實現強制分頁),既然要錯行讀取,所以先將gt_item-islastrow標示存儲到全局變量lastrow中,供PAGE_COMMAND命令使用,這樣不管是否錯行讀取,最后一行標示都會被正確使用if gw_item-islastrow 'X'.
*   lastrow = gw_item-islastrow .
endif.
"當使用強制分頁時,可以不用像上面那樣判斷 就可以給 lastrow 賦值,如果不使用
"強制分頁,則需要像上面那樣賦值
lastrow 
gw_item-islastrow .

if lastrow 'X' .
"下一頁所需讀取的gt_head數據的索引號
head_index 
head_index + 1.
endif.

"每頁數據的流水號
serial_number 
serial_number + 1.

DATA mod TYPE i.
mod serial_number mod 5.
if  mod  ."如果滿一頁時
"當前頁碼加一
current_page 
current_page + 1.
DISP_AUTO_PAGING_TXT 
'X'.
endif.


SmartForm源碼:

在中文環境下導入

主調程序:

REPORT  yjzj_smartform_control_paging.

DATABEGIN OF gt_head OCCURS 10,
  
class TYPE string,"班級名
  totalpages 
TYPE i,"每個小分類的總頁數
  
END OF gt_head.


DATABEGIN OF gt_item OCCURS 10,
  
class TYPE string,"班級名
  student 
TYPE string,"學生名
  amount 
TYPE i,"XX數量
  islastrow
,"標示是否為每一小分類的最后一行
  
END OF gt_item.


DATAg_rows TYPE i,"記錄已讀取的行數
       g_spacelines 
TYPE i,"不滿一頁時需要補充的空行行數
       g_tabix 
LIKE sy-tabix,
       flg 
.

START-OF-SELECTION.
  
PERFORM  initdata.

  
LOOP AT gt_head.
    
CLEARg_rows,flg.
    
LOOP AT gt_item  WHERE class  gt_head-class.
      flg 
'x'.
      g_tabix 
sy-tabix."記錄最后一行的索引號,后面可能會需要修改這條數據
      g_rows 
g_rows + 1.                                  "條數加1
      
IF g_rows 5."滿一頁后計數雙從零開始
        
"滿一頁數總頁數加一
        gt_head
-totalpages =  gt_head-totalpages + 1.
        
CLEARg_rows.
      
ENDIF.
    
ENDLOOP.

    
IF g_rows <> OR flg IS INITIAL."如果不滿一頁,或者無數據時
      
CLEARgt_item.
      gt_item
-class gt_head-class.
      g_spacelines 
g_rows."需要補的空白行數
      
DO g_spacelines TIMES.
        
APPEND gt_item.
        
"SY-TABIX為上面APPEND語句操作后所影響的索引號
        g_tabix 
sy-tabix."記錄最后一行的索引號,后面可能會需要修改這條數據
      
ENDDO.
      
"滿一頁數總頁數加一
      gt_head
-totalpages =  gt_head-totalpages + 1.
    
ENDIF.

    gt_item
-islastrow 'X'."最后一行標示
    
MODIFY gt_item  INDEX g_tabix TRANSPORTING islastrow.

    
MODIFY gt_head TRANSPORTING totalpages .
  
ENDLOOP.

  
PERFORM callsmartform.

FORM initdata.
  
DATAtimes TYPE i,
        classname TYPE string,
        number TYPE i VALUE 1,
        str TYPE string.

  DO 5 TIMES.
    str = sy-index.
    CONDENSE str.
    times = 4 + sy-index.
    CONCATENATE str `班` INTO gt_head-class RESPECTING BLANKS.
    APPEND gt_head.
    DO times TIMES.
      gt_item-class = gt_head-class.
      str = number.
      CONCATENATE   gt_head-class ` - 學生` str INTO gt_item-student.
      number =  number + 1.
      gt_item-amount = sy-index.
      APPEND gt_item.
    ENDDO.
  ENDDO.

  gt_head-class = '6 班'.
  APPEND gt_head.

ENDFORM.                    "initData

FORM callsmartform .
  DATA: lf_fm_name TYPE rs38l_fnam.

  "***********調用SMARTFORM程序生成函數
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'YJZJ_SMARTFORM_CONTROL_PAGING'
    IMPORTING
      fm_name            = lf_fm_name.

  "***********動態調用新生成的函數
  CALL FUNCTION lf_fm_name.
ENDFORM.                

 

 

 

打印參數控制

  DATA:lf_fm_name TYPE rs38l_fnam.
  DATA:l_output_options TYPE ssfcompop.
  DATA:l_control_parameters TYPE ssfctrlop.
  DATA:l_job_output_options TYPE ssfcresop.
  "********設置打印對話框中的參數
 "打印對話框中的參數可以與l_output_options 結構中的相關字段對應
  l_output_options-tddest = 'LP01'."打印設備
  l_output_options-tdpageslct = '1,2,4'."打印哪幾頁,多頁使用逗號分隔
  l_output_options-tdnoprev = 'X'."隱藏打印預覽按鈕
  "********控制打印對話框顯示與否,及直接打印預覽方式輸出
  l_control_parameters-no_dialog = 'X'."打印前不顯示打印設置對話框
  l_control_parameters-preview = 'X'."而是直接顯示預覽結果

  "***********調用SMARTFORM程序生成函數
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname = 'YJZJ_SMARTFORM_CONTROL_PAGING'
    IMPORTING
      fm_name  = lf_fm_name.

  "***********動態調用新生成的函數
  CALL FUNCTION lf_fm_name
    EXPORTING
      output_options     = l_output_options
      control_parameters = l_control_parameters
    IMPORTING      "獲取打印對話框中用戶選擇、輸入、操作的結果:如判斷用戶在
                "打印對話框中點擊的是打印預覽還是點擊的直接打印
      job_output_options = l_job_output_options.
  IF l_job_output_options-tdpreview = 'X'. "有些開發需求中需要控制報表的打印次數,可以通過該方法來統計操作結果,將打印記錄累加后存放於系統中,作為重復打印控制的依據。
    WRITE :'打印預覽模式'.
  ELSE.
    WRITE:'直接打印模式'.
  ENDIF.

 

一次性輸出多張報表

有時候可能需要一次性打印多張不同的報表,直接調用SmartForms時,每次打印一張后報表后,會在循環中反復出現打印對話框,影響程序執行效率。SAP打印控制提供了假脫機功能,允許將多張需要打印的報表緩存,最的再一次性提交打印請求。

FORM callsmartform .
  DATA:lf_fm_name TYPE rs38l_fnam.
  DATA:l_control_parameters TYPE ssfctrlop.
  DO 3 TIMES.
    CASE sy-index .
      WHEN 1.
        l_control_parameters-no_open = space."首次運行時打開打印對話框
        l_control_parameters-no_close = 'X'."並且不關閉假脫機請求
      WHEN 2.
        l_control_parameters-no_open = 'X'.
        l_control_parameters-no_close = 'X'."
      WHEN 3.
        l_control_parameters-no_open = 'X'.
        l_control_parameters-no_close = space."最后關閉假脫機准備打印
    ENDCASE.


    "***********調用SMARTFORM程序生成函數
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname = 'YJZJ_SMARTFORM_CONTROL_PAGING'
      IMPORTING
        fm_name  = lf_fm_name.

    "***********動態調用新生成的函數
    CALL FUNCTION lf_fm_name
      EXPORTING
        control_parameters = l_control_parameters.
  ENDDO.
ENDFORM.

SmartForm轉PDF亂碼問題

 如果將SmartForm輸出為PDF文件時,可能會出現亂碼,則使用SPAD(假脫機管理工具)設置打印設備的設備類型,設置為以CN開頭的設備類型即可,然后在程序中使用這個LP01打印設備

 

定義打印機紙張類型

關於打印紙張的定義,在國際上有很多通用的標准,如A5、A5等,這些通用的格式一般在Windows和SAP中都默認加載。但是,在實際應用中,經常會碰到一些不規范的紙張,對於這些非通用紙張,就需要用戶在系統中自己定義相關的紙張格式了。

1、 通過SPAD假脫機管理工具中的“設備類型->頁格式”可以自定義紙張,打開“設備類型”頁簽,在“頁格式”字段中輸入自定義名稱,然后點擊后面的“顯示”按鈕,顯示“頁面格式清單”頁面,再點擊“編輯”即可創建新的紙張:

 

2、 上面定義的紙張,下面再定義“格式類型”,“頁格式”選擇上面定義的ZF_PAGE,“類型”選擇 S SAPscript的格式類型,這樣就可以在SmartForm中進行調用了,如果是ALV,則要選擇 L ABAP列表的格式類型:

 

定義好頁格式和格式類型的,則需要將頁格式(即紙張)分配到指定的設備類型。SAP的假脫機操作中是需要指定輸出設備的,而每個輸出設備需要設定設備類型。所以當打印時,只有屬於該打印設備的頁格式才能被操作。若沒有維護的話,預覽不會存在問題,但在選擇打印時,系統提示錯誤。

目前對中文輸出所使用的設備類型大部分都默認為“CNSAPWIN”,在“設備類型”中輸入“CNSAPWIN”,再點擊“顯示”,出現以下界面:

 

點擊,將列出該設備所支持的所有格式類型:

 

輸入“格式化”名稱(注:這里輸入的其實是上面創建的“格式類型”,而不是“頁格式(即紙張)”),確認后如下:

 

需要對打印機操作維護基本的指令,沒維護指令時,操作該類型的報表數據可能會出現打印機不切紙或者不執行打印問題。需維護的指令和打印機的驅動存在關系,可以參照CNSAPWIN下已經維護好的格式類型來維護。

以SAP標准的A4紙張(DINA4)為例,一般需要維護操作包括:打印初始化、尾頁、行結束,如:

 

最后就可以在SmartForm編輯器里選擇上面自定義的“頁格式(紙張)”了:

 

Table節點循環問題

雖然表頭、主要區域、腳標三者都在 %TABLE1表里,但是只對主要區域節點進行循環,表頭、腳標在每一頁中只執行一次,所以,表頭節點里實質上還沒有開始對GT_HEAD內表進行循環,所以在表頭節點里是不能訪問到GW_HEAD工作區的數據的,因此,如果像下面那樣在表頭節點里讀取到GT_HEAD中的數據,只能像這樣手動根據head_index(該變量會在主要區域節點的某代碼片斷里進行賦值處理,即在每一個小分類處理完后,head_index設置為下一小分類,即GT_HEAD下一條數據)來讀取了(其實還會在主要區域節點里對GT_HEAD再讀取一次,這里為了提前讀取到數據,所以只能在表頭里手動讀取了)

 

ScriptForm轉PDF並發送郵件

 (轉PDF應該還可以使用此函數:SX_OBJECT_CONVERT_OTF_PDF

data: gt_otfdata  like itcoo occurs 0 with header line.

 以動態的方式獲取ScriptForm數據(沒有試過,可能獲取不到):

field-symbols: <fs> type any.
    data: l_tab_otfdata(30) value '(SAPLSTXC)OTF[]'.
    assign (l_tab_otfdata) to <fs>.
    if sy-subrc = 0.
      gt_otfdata[] = <fs>.
    endif.

如果上面這種方式取不到Form表單數據,則可以在CLOSEForm時得到:

  call function 'CLOSE_FORM'
    importing
      result  = result
    tables
      otfdata = gt_otfdata
    exceptions      
      others  = 1. 

CLOSE_FORM 的otfdata  作用:當調用PRINT_TEXT 或者 OPEN_FORM時,如果參數OPTIONS(結構類型為ITCPO)中的字段TDGETOTF值為'X' 時,將會通過參數OTFDATA以OTF的格式輸出,在這種情況下,打印輸出、屏幕顯示、傳真將不會被執行。

    itcpo-tdnoprint  = ' '.No printing from print preview
    itcpo-tdnoprev   = 'X'.No print preview
    itcpo-tdgetotf = 'X'.Return of OTF table. No printing, display, or faxing

下面開始將ScriptForm數據轉換成PDF格式的數據:

data: binfilesize type i.

data: i_tline type table of tline with header line,

* convert OTF to PDF
  call function 'CONVERT_OTF'
    exporting
      format                = 'PDF'
    importing
      bin_filesize          = binfilesize
    tables
      otf                   = gt_otfdata
      lines                 = i_tline
    exceptions
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      others                = 5.

經過上面的PDF的轉換,我們就可以將以上的PDF格式的數據直接存儲到文本中(此時下載或寫入文件時需要以二進制的方式進行傳輸),這個文本就是PDF。但如果還需要將這個PDF以附件的形式發送郵件,則還需要下一步轉換(其實就是將兩列的i_tline內表合並成一列的內表i_objbin):

 data:i_objbin  like solisti1 occurs 0 with header line.

call function 'QCE1_CONVERT'
      tables
        t_source_tab         = i_tline
        t_target_tab         = i_objbin
      exceptions
        convert_not_possible = 1
        others               = 2.

最后以附件的形式將i_objbin發送出去

SmartForm轉PDF

  DATA: job_output_options TYPE ssfcresop.
  DATA: ls_output  TYPE ssfcrescl.
  DATA: lt_lines TYPE TABLE OF tline WITH HEADER LINE,
        lt_docs TYPE TABLE OF docs WITH HEADER LINE,
        t_otfdata TYPE ssfcrescl,
        t_pdf_tab LIKE tline OCCURS 0 WITH HEADER LINE, " SAPscript: Text Lines
        t_otf TYPE itcoo OCCURS 0 WITH HEADER LINE.     " OTF Structure

  DATA: lv_filesize TYPE i.

DATA: control_parameters TYPE ssfctrlop,
  output_options     TYPE ssfcompop.
  control_parameters-no_dialog = 'X'. 
  control_parameters-getotf    = 'X'.

*output_options用來設置打印參數彈出對話框中的值
output_options-tddest = 'LP01'. "設備名稱 

......
  CALL FUNCTION fm_name
    EXPORTING
      control_parameters = control_parameters
      output_options     = output_options
    IMPORTING                                          "convert pof user 3
      job_output_info    = ls_output
      job_output_options = job_output_options
    TABLES
      gt_ekko            = gt_ekko
      gt_ekpo            = gt_ekpo
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
    IMPORTING
      bin_filesize          = lv_filesize
    TABLES
      otf                   = ls_output-otfdata
      lines                 = lt_lines
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      OTHERS                = 5.
*"還可以使用下面的CONVERT_OTF_2_PDF函數來替代上面CONVERT_OTF函數
*  DATA:it_docs TYPE STANDARD TABLE OF docs.
*  CALL FUNCTION 'CONVERT_OTF_2_PDF'
*    IMPORTING
*      bin_filesize   = lv_filesize
*    TABLES
*      otf            = ls_output-otfdata
*      doctab_archive = it_docs
*      lines          = lt_lines.


  g_path = 'C:\temp\test2.pdf'.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
       bin_filesize        = lv_filesize
      filename              = g_path
      "write_field_separator = cl_abap_char_utilities=>horizontal_tab
*      confirm_overwrite     = c_char_x
      filetype              = 'BIN'
      "codepage              = '8400'
    TABLES
      data_tab              = lt_lines.

 

Smartform中多套頁面之間的跳轉(強制分頁)

現在的SR是在當前Form上基礎之上加上第三套頁面,目前有兩套了:

 

每個頁中都需要有Main窗體,並且每個頁而中的Main窗體都是一樣的(每個頁中的其他頁窗體可有可無,也可不同)。從上圖看,雖然FIRST頁里的Main窗體中有強制分頁命令,但此分頁命令不一定在FIRST頁顯示后立刻執行(多頁情況下),而是要等到前面的ITEM內表顯示完后才執行

整體頁面走向如下:

 

每套頁面之間使用強制分頁,而每套頁面里是自動分頁的。

 

表格不能再套表格,但表格中還可以套循環(列中也可以套循環,如長文本多行輸出)

 

 

在Samrtform中,最好不要通過拷貝的方式來創建Page、Window、Template,這里的拷貝就像程序里的引用一樣,修改或刪除時會影響其他

 

SMARTFORM中定義內表:

 

smartform輸出格式(輸入類型)設置

 

 

Syntax

說明

&field+<offset>&

對於字符變量設置從何位置顯示數據,如果offset大於字符變量長度時,系統就不會顯示任何數據

&field(<length>)&

設置輸出長度.

&field(*)&

如果該字段類型是abap數據字典里定義的類型,系統將按照字典定義的長度設置輸出長度

&field(S)&

禁止輸出符號位

&field(<)&

符號位顯示在數據的左邊

&field(.<nat.number>)&

設置顯示小數的位數

&field(E<nat.number>)&

設置為科學標示法

&field(T)&

禁止千分位的顯示(適用於: DECCURRINTQUAN幾種數據類型).

&field(Z)&

禁止數字前導0的顯示

&field(I)&

禁止顯示空值

&field(K)&

禁止類型系統按數據字典定義的轉換函數進行輸出轉換

&field(R)&

右對齊(只有在定義了輸出長度時才有效)

&field(F<filler>)&

用<filler>指定的字符替換左邊的空格.

&field(L)&

將日期轉換為本地顯示格式,使用JDAT指定的格式

&field(C)&

該設置效果和ABAP的CONDENSE語句相同.

/: SET COUNTRY country_key

設置按某個國家顯示小數點,千位符和日期的格式

(注:這個包括下面兩個SET命令只能在ScriptForm使用)

/: SET DATE MASK = 'date_mask'

設置日期顯示格式
DD 天 (two digits) 
DDD天名稱(縮寫)
DDDD 天名稱 (全稱)
MM 月 (two digits) 
MMM 日期名稱 (縮寫)
MMMM 日期名稱 (全稱)
YY 年(two digits) 
YYYY 年 (four digits) 
LD 天 (formatted as for the L option)
LM 月 (formatted as for the L option)
LY 年 (formatted as for the L option)
示例
/: SET DATE MASK = 'Foster City, MM.DD.YY' 
&DATE& -> Foster City, 03.01.97 
&DATE(Z)& -> Foster City, 3.1.97 
/: SET DATE MASK = 'MMMM DD, YYYY' 
&DATE& -> March 01, 1997
取消設置
/: SET DATE MASK = ‘’

/: SET TIME MASK = 'time_mask'

時間設置
HH hours (two digits) 
MM minutes (two digits) 
SS seconds (two digits)
假設當前時間是10:08:12. 
&TIME& -> 10:08:12 
/: SET TIME MASK = 'HH:MM' 
&TIME& -> 10:08 
/: SET TIME MASK = 'HH hours MM minutes' &TIME& -> 10 hours 08 minutes
&TIME(Z)& -> 10 hours 8 minutes
取消設置:
/: SET TIME MASK = ' '

 

修改Smartform對象所在的包

 

ScriptForm導出與導入、拷貝

通過系統提供的報表程序:RSTXSCRP

 

 

如果是在同一機器上,直接通過拷貝比較方便:

 

ScriptForm中調用Form

 

FORM frm_bom_level TABLES
                input STRUCTURE itcsy
                output STRUCTURE itcsy .
  DATA: l_posnr LIKE resbd_p_tab-posnr,
        l_matnr LIKE resbd_p_tab-matnr,
        l_rspos LIKE resbd_p_tab-rspos,
        l_level(4) .
  DATA: l_wa LIKE LINE OF resbd_p_tab.
  READ TABLE input WITH KEY name = 'RESBD_P-POSNR'.
  l_posnr = input-value.
  READ TABLE input WITH KEY name = 'RESBD_P-MATNR'.
  l_matnr = input-value.
  READ TABLE input WITH KEY name = 'RESBD_P-RSPOS'.
  l_rspos  = input-value.

.....

  READ TABLE  output  WITH KEY name = 'L_LEVEL'.
  output-value = l_level.
  MODIFY output INDEX sy-tabix.
ENDFORM.

 

在程序中改變ScriptForm的起始頁

調用START_FORM函數,通過STARTPAGE可以指定起始頁,這樣可以跳過SE71中設置的頁面跳轉流。

為ScriptForm增加后繼頁面

目前有這樣一個需求:需要在當前已經做好的ScriptForm最后加上三個條款頁面。這里我先創建三個新的頁面“ZLAST1、ZLAST2、ZLAST3”,但不能簡單的將NEXT頁的NextPage屬性修改成指向ZLAST1新增的頁面,因為這里的NEXT頁是用來做分來使用的,這會導致分頁出問題。正確的做法參考下面:

(下圖中FIRST與NEXT是修改前版本就有了的:)

 

(MAIN窗體被各個窗體共享使用)

 

 

 

 

 

(先在MAIN窗體腳本中寫上跳轉新增頁面的腳本命令,每個新增頁面都需要寫)

 

(然后在打印程序中調用這些Element,調用的地方為MAIN窗體中最后一個Element調用之后,這里為END_VALUES)

 

 

ScriptForm的中英兩個版本的框架是一樣的,比如只要你修改某個版本的Windows尺寸,則另一個版本也會跟本改變,但窗體中的內容不會跟着變化,所以中英文的只是內容不同。

 

一個Form里只能有一個Main窗體,即多個Page頁面只能共用一個Main窗體。

每個頁面的Main窗體只需要寬度一樣,高度可以設置成不一樣。

 

語法:/: NEW-PAGE [page_name]

示例:

/: NEW-PAGE

當前頁結束,接下來的文本將新起一頁,並且這個頁面為WRITE_FORM時指定的page

/: NEW-PAGE S1

當前頁結束,接下來的文本顯示在S1頁面中

/: NEW-PAGE [page_name]只能寫在MAIN窗體腳本中(才起作用),並且跳轉的頁面page_name中一定要有MAIN窗口(否則調用時出錯)。

 

只有含有MAIN窗體的Page頁面,並且在MAIN窗體腳本中使用了NEW-PAGE指令指定跳轉到該頁面的頁面才可以正常顯示出來。

Script\SmartForms使用禁用Word編輯器

This document details the procedure in using Microsoft Word as editor in SAP Script / Smart Forms.

In normal case, when you try opening the editor in Smart Forms, the following editor would appear:

 

Click on the editor button. The following editor appears:

 

Now to change the above editor to MS Word, do the following:

Go to transaction I18N(Internationalization).

Click on I18N Menu àI18N Customizing à I18N System Configuration (as shown in the screenshot below)

 

The following screen appears:

 

If you would like to use MS Word Editor in both Script and Smartforms, then check the both checkboxes as shown below:

 

Click on Activate.

The following popup appears (related to SAPScript Editor):

 

Click on Yes. Now the following popup appears (related to Smartforms Editor):

 

Click on Yes to proceed.

Now the MS Word editor is available for both SAP Script and Smartforms.

Result: In the SmartForms:   

 

In SAP Script:

 

You can anyti me revert to old editor by deactivation MS Word editor option using the transaction I18N.

 

注:如果在使用I18N時,出現以下問題時:

 

出現這種情況,大家可以在SE38中運行RSCPSETEDITOR,勾掉SMARTFORMS和SAPSCRIPT前面的勾就可以了!
激活后SMARTFORM中的文本編輯器就改為SAP默認的了!

 

原文出自  江正軍 技術博客,博客鏈接: www.cnblogs.com/jiangzhengjun
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM